Мне действительно нужно указать, что install-interface включает зависимости? - PullRequest
0 голосов
/ 15 января 2020

В моем пакете в настоящее время у меня есть:

include(GNUInstallDirs)
target_include_directories(
    mylib
    PUBLIC
    $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
    $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}> # ***
)

, а также:

install(
  TARGETS mylib
  EXPORT mylib
  RUNTIME DESTINATION  "${CMAKE_INSTALL_BINDIR}"
  ARCHIVE DESTINATION  "${CMAKE_INSTALL_LIBDIR}"
  LIBRARY DESTINATION  "${CMAKE_INSTALL_LIBDIR}"
  INCLUDES DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}" 
)

install(
  EXPORT mylib
  FILE "mylib-config.cmake"
  NAMESPACE mylib::
  DESTINATION "lib/cmake/mylib" )

, и я замечаю, что в установленном файле config.cmake я вижу каталог дважды :

set_target_properties(mylib::mylib PROPERTIES
  # etc. etc.
  INTERFACE_INCLUDE_DIRECTORIES "${_IMPORT_PREFIX}/include;${_IMPORT_PREFIX}/include"
)

Итак, в качестве эксперимента я удалил строку, помеченную *** выше, - и теперь в файле конфигурации есть включаемый каталог только один раз .

Так это безопасно? То есть действительно ли мне не нужно указывать каталоги включения install-interface, если я устанавливаю цель с параметром INCLUDES? Или - я что-то упустил?

1 Ответ

1 голос
/ 15 января 2020

Документация четко гласит, что обе target_include_directories команды с не- PRIVATE ключевым словом и ВКЛЮЧАЕТ ОПРЕДЕЛЕНИЕ предложение для install команды заполняет INTERFACE_INCLUDE_DIRECTORIES свойство.

Какой метод использовать, зависит от вас.

Обратите внимание, что одна и та же цель может быть установлена ​​несколько раз. target_include_directories влияет на все установки, но ВКЛЮЧАЕТ НАЗНАЧЕНИЕ влияет только на Speci c установки.


Документация для ВКЛЮЧАЕТ НАЗНАЧЕНИЕ предложение:

Этот параметр указывает список каталогов, которые будут добавлены в целевое свойство INTERFACE_INCLUDE_DIRECTORIES <targets> при экспорте по команде install(EXPORT). Если указан относительный путь, он обрабатывается как относительный к $<INSTALL_PREFIX>.

Документация для target_include_directories:

PUBLIC и INTERFACE элементы будут заполнять свойство INTERFACE_INCLUDE_DIRECTORIES <target>.

...