Ответ 1
Как упоминается в другом ответе, инструментальные цепочки обнаруживаются системой makefile ndk-build в $(NDK_ROOT)/toolchains/
, и вы можете отражать идеи, которые там видите. Но есть несколько дополнительных концепций для поддержки целевых платформ, отличных от Android, которые интересны, хотя они могут скоро устаревать, поскольку ndk-build начинает явно поддерживать другие платформы, такие как mingw-таргетинг win32 (или другие компиляторы gcc, нацеленные на простой Linux-сервер).
В config.mk
:
TOOLCHAIN_ABIS := (list of ABIs that the toolchain supports)
Это важное определение, потому что вы можете использовать это имя в своем Application.mk для сборки с использованием инструментальной цепочки для конкретного ABI. Одним из преимуществ искажения использования этого определения является то, что ndk-build может одновременно создавать несколько ABI. Он всегда предполагает, что платформа Android, но если вы хотите нацелить win32 с помощью инструментальной цепочки на основе mingw, вы можете определить "ABI" как x86-win32
, а затем использовать этот ABI в своем Application.mk
, чтобы выбрать его как дополнительный target через APP_ABI:= x86-win32
Затем в ваших файлах Android.mk
вы можете использовать определение TARGET_ARCH_ABI
, чтобы выбрать источники данных Win32 и включить пути, например:
ifeq ($(TARGET_ARCH_ABI),x86-win32)
LOCAL_SRC_FILES += my_win32_file.c
LOCAL_CFLAGS += -DSOME_WIN32_SPECIFIC
endif
Последняя часть состоит в том, что в setup.mk
для вашей инструментальной цепочки может быть недостаточно взглянуть на другие инструментальные цепочки в качестве примеров, потому что для setup.mk
для конкретной инструментальной цепочки действительно выполняется переопределение настроек сборки в default-build-commands.mk
, так что вы хотите это проверить этот файл и переопределить в нем вещи, которые вам не нравятся.
Следуя предыдущему примеру, mingw не поддерживает флаг noexec в двоичных файлах, и вы можете избавиться от этой функции, добавив следующие строки в setup.mk
:
# These flags are used to enforce the NX (no execute) security feature in the
# generated machine code. This adds a special section to the generated shared
# libraries that instruct the Linux kernel to disable code execution from
# the stack and the heap.
TARGET_NO_EXECUTE_CFLAGS := # our platform doesn't support this flag!
TARGET_NO_EXECUTE_LDFLAGS := # our platform doesn't support this flag!
# These flags disable the above security feature
TARGET_DISABLE_NO_EXECUTE_CFLAGS := # our platform doesn't support this flag!
TARGET_DISABLE_NO_EXECUTE_LDFLAGS := # our platform doesn't support this flag!
Это всего лишь один из примеров многих функций в default-build-commands.mk
, которые, возможно, необходимо переопределить, и, конечно же, важно предоставить TOOLCHAIN_NAME
, чтобы инструментальная цепочка была выбрана с помощью переменной NDK_TOOLCHAIN
внутри вашего Application.mk
файл в дополнение к методологии ABI, о которой я упоминал выше.