#cmake
Вопрос:
Я скомпилирую STM32MP157 с помощью cmake.
Я написал файл набора инструментов. Соответствующие выдержки приводятся ниже:
set(OSTL_TARGET_SYSROOT /opt/st/stm32mp1/3.1-openstlinux-5.4-dunfell-mp1-20-06-24/sysroots/cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi)
set(OSTL_HOST_TOOLS /opt/st/stm32mp1/3.1-openstlinux-5.4-dunfell-mp1-20-06-24/sysroots/x86_64-ostl_sdk-linux)
set(STM32_TARGET_TRIPLET "arm-ostl-linux-gnueabi")
set(CMAKE_SYSROOT ${OSTL_TARGET_SYSROOT})
set(CMAKE_PROGRAM_PATH /usr/bin)
LIST(APPEND CMAKE_PROGRAM_PATH ${OSTL_HOST_TOOLS}/usr/bin )
find_program(CMAKE_AR NAMES ${STM32_TARGET_TRIPLET}-ar PATHS ${CMAKE_PROGRAM_PATH} NO_DEFAULT_PATH)
Это приводит к тому, что CMAKE_AR загружается из целевого каталога sysroot, а не из каталога ${OSTL_HOST_TOOLS}/usr/bin.
Как я могу заставить find_program искать только в заданных путях, а не в любом каталоге по умолчанию? Я уже использовал опцию «NO_DEFAULT_PATH». Но это не работает.
Если я изменю порядок программы таким образом, что CMAKE_SYSROOT будет установлен позже, это сработает.
Комментарии:
1. Перед
find_program
вызовом вы могли бы установить переменную CMAKE_FIND_ROOT_PATH_MODE_PROGRAM вNEVER
значение , чтобы CMake не добавлял к вашим ПУТЯМ корень системы. Не забудьте восстановить заданную переменную после вашего звонка, чтобы у пользователя вашей цепочки инструментов был правильно настроенный поиск.
Ответ №1:
Просто добавьте NO_CMAKE_FIND_ROOT_PATH
аргумент к вашему find_program
звонку.
find_program(
CMAKE_AR
NAMES ${STM32_TARGET_TRIPLET}-ar
PATHS ${CMAKE_PROGRAM_PATH}
NO_DEFAULT_PATH
NO_CMAKE_FIND_ROOT_PATH
)
Из документов:
CMAKE_SYSROOT
Переменную также можно использовать для указания ровно одного каталога, который будет использоваться в качестве префикса. НастройкаCMAKE_SYSROOT
также имеет другие эффекты. Дополнительные сведения см. в документации по этой переменной.Эти переменные особенно полезны при перекрестной компиляции, чтобы указать на корневой каталог целевой среды, и CMake также будет искать там. По умолчанию сначала выполняется поиск в каталогах, перечисленных в
CMAKE_FIND_ROOT_PATH
, затем выполняется поиск вCMAKE_SYSROOT
каталоге, а затем будет выполнен поиск в некорневых каталогах. Поведение по умолчанию можно настроить с помощью настройкиCMAKE_FIND_ROOT_PATH_MODE_PROGRAM
. Это поведение может быть переопределено вручную для каждого вызова с помощью опций:[…]
NO_CMAKE_FIND_ROOT_PATH
Не используйте переменную CMAKE_FIND_ROOT_PATH.
https://cmake.org/cmake/help/latest/command/find_program.html