Заставить find_program игнорировать CMAKE_SYSROOT

#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