Добавить целевые свойства в существующую импортированную библиотеку в CMake - PullRequest
0 голосов
/ 09 марта 2019

Внешний проект создается CMake и устанавливается в каталог, видимый через CMAKE_PREFIX_PATH.Поскольку это проект CMake, он устанавливает правильные .cmake файлы.В этих автоматически сгенерированных файлах создается цель EXPORTED и устанавливаются все необходимые свойства.

Что я хотел бы сделать, это - без изменения оригинала CMakeLists.txt - добавить определение компиляции, чтобыМне нужно для того, чтобы правильно включить заголовок из этой библиотеки.

До сих пор я пробовал два подхода:

Повторно добавить библиотеку и указать определения обычно

add_library(_external_lib_name_ INTERFACE IMPORTED)
target_compile_definitions(_external_lib_name_ INTERFACE FOO_BAR)

Это не работает, поскольку все уже установленные свойства цели (например, включающие каталоги) игнорируются.

Просто добавьте определения

target_compile_definitions(_external_lib_name_ INTERFACE FOO_BAR)

На этот раз CMake жалуется:

CMake Error at foo.cmake:1 (target_compile_definitions):
  Cannot specify compile definitions for target "_external_lib_name_" which is not built by this project.

В настоящее время я думаю о цели прокси:

add_library(_proxy_target_ INTERFACE)
target_link_libraries(_proxy_target_ INTERFACE _external_lib_name_)
target_compile_definitions(_proxy_target_ INTERFACE FOO_BAR)

Хотя это может сработать, кто-нибудь знает, есть ли лучший способизменения импортированных целей?

Обновление :

Используя ответ Цыварева, я смог заставить его работать, но есть другая проблема: для того, чтобы цель была должным образоммодифицированный, мне нужно include файл тСначала шляпа find_package, а потом set_property.Если я не использую include, но стандартные CMakeLists.txt и add_subdirectory, цель содержит старые свойства.

1 Ответ

1 голос
/ 10 марта 2019

Команда target_compile_definitions с ключевым словом INTERFACE добавляется к свойству INTERFACE_COMPILE_DEFINITIONS , но не работает с IMPORTED целями. Вам нужно использовать команду, которая напрямую работает с целевыми свойствами:

set_property(TARGET _external_lib_name_ APPEND PROPERTY INTERFACE_COMPILE_DEFINITIONS FOO_BAR)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...