Содержимое переменной CMake зависит от сборки / установки

С использованием $<INSTALL_INTERFACE:...> а также $<BUILD_INTERFACE:...> Генератор выражений Я могу установить для целевых свойств разные значения в зависимости от того, экспортируется ли цель в текущий каталог сборки или установлена ​​глобально. Я пишу пользовательский макрос, сопровождающий мой пакет и цели CMake, и хотел бы, чтобы макрос вел себя по-разному в зависимости от того, где он экспортирован (в каталоге сборки) или установлен. Макрос содержится в <package>-macros.cmake.in который входит в мой <package>-config.cmake файл и настроен в каталог сборки с помощью configure_file и позже установлен. Я попытался использовать выражения генератора в переменных, установленных с помощью configure_file команда, но, очевидно, они не предназначены для работы таким образом. Я предполагаю, что мои требования не так уж редки, как это обычно делается с использованием CMake?

1 ответ

Решение

Просто создай разные <package>-config.cmake файлы для export() и для install(EXPORT), В этих файлах у вас может быть переменная, которая их различает.

Вы можете даже создать оба файла из одного шаблона, используя configure_file команда с другой средой CMake (переменные):

-config.cmake.in:

set(IS_BUILD_INTERFACE @IS_BUILD_INTERFACE@)
# other commands, inclusion of other files, etc.

-macros.cmake:

if(IS_BUILD_INTERFACE)
    # Part of build interface
else()
    # Part of install interface
endif()

CMakeLists.txt:

# Prepare the file for build interface exporting
set(IS_BUILD_INTERFACE ON)
configure_file(<package>-config.cmake.in <package>-config.cmake @ONLY)
export(PACKAGE <package>)

# Prepare the file for install interface exporting
set(IS_BUILD_INTERFACE OFF)
configure_file(<package>-config.cmake.in <package>-config.cmake.install @ONLY)
install(FILES <package>-config.cmake.install DESTINATION cmake)
Другие вопросы по тегам