CMake add_subdirectory заставляет CPack создавать только исходный каталог - PullRequest
0 голосов
/ 14 января 2019

Я пилотирую cmake 3.11 для своей команды. Среди вещей, которые я хочу продемонстрировать, есть прототипы для управления нашими внутренними / внешними зависимостями. Я также должен распространять наш набор исполняемых файлов и библиотек среди клиентов, которые могут иметь или не иметь подключения к Интернету, и которые могут иметь или не иметь возможности доступа к нашему хранилищу.

В настоящее время я разработал шаблоны для использования со всеми внутренними проектами, которые имеют следующие ситуации:

FetchContent из репозитория для получения зависимости от локальной сети

FetchContent_Declare(
    internaldependency
    GIT_REPOSITORY git@repo.net:ProductFamily/Project.git
)
FetchContent_GetProperties(internaldependency)
if(NOT internaldependency_POPULATED)
    FetchContent_Populate(internaldependency)
    add_subdirectory(${internalproject_SOURCE_DIR} ${internalproject_BINARY_DIR} )

Это шаблон, который я разработал для всех проектов, экспортируемых для установки / cpack, в идеале, чтобы клиенты могли включать библиотеки в наше семейство продуктов из всего, что они могут разработать:

include(CPack)
set(CPACK_GENERATOR "TGZ")
include(GNUInstallDirs)
install(TARGETS ourlibrary EXPORT ourlibrary_export
    ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)
install(DIRECTORY include/ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
install(EXPORT  ourlibrary_export
    FILE ourlibraryTargets.cmake
    NAMESPACE productfamily
    DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/ourlibrary
)
include(CMakePackageConfigHelpers)
write_basic_package_version_file(
    ${CMAKE_CURRENT_BINARY_DIR}/ourlibraryConfigVersion.cmake
    VERSION ${PROJECT_VERSION}
    COMPATIBILITY AnyNewerVersion
)
configure_package_config_file(
    ${CMAKE_CURRENT_LIST_DIR}/CMake/ourlibraryConfig.cmake.in # It's a package init and an inclusion to ourlibraryTargets.cmake
    ${CMAKE_CURRENT_BINARY_DIR}/ourlibraryConfig.cmake
    INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/ourlibrary
)
install(FILES
    ${CMAKE_CURRENT_BINARY_DIR}/ourlibraryConfigVersion.cmake
    ${CMAKE_CURRENT_BINARY_DIR}/ourlibraryConfig.cmake
    DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/ourlibrary
)
install(DIRECTORY
    ${CMAKE_CURRENT_BINARY_DIR}/etc/ourlibrary
    DESTINATION ${CMAKE_INSTALL_SYSCONFDIR}
)

Учитывая ситуацию, когда у меня есть MainLibrary и DependencyLibrary, оба из которых включают вышеуказанный целевой шаблон установки в свои сценарии сборки: если MainLibrary включает DependencyLibrary в виде FetchContent + add_subdirectory, cpack всегда архивирует исходный каталог как исходный дистрибутив, когда я только хочу, чтобы он производил дистрибутив выпуска на основе целей установки. Установка ведет себя как нужно, и cpack также будет вести себя как нужно, если я использую find_packages, чтобы включить DependencyLibrary в основной файл, но add_subdirectories заставляет CPack только когда-либо захотеть заархивировать исходный каталог.

Почему это происходит и как я могу предотвратить это?

1 Ответ

0 голосов
/ 16 января 2019

Оказывается, проблема была в расположении include(CPack). Так как оператор сам по себе отвечает за генерацию конфигураций CPack, вызывая его еще раньше, я сгенерировал эти конфигурации, прежде чем определил все необходимое для них.

Шаблон для установки целей установки был изменен следующим образом:

set(CPACK_GENERATOR "ZIP")
include(GNUInstallDirs)
install(TARGETS ourlibrary EXPORT ourlibrary_export
    ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)
install(DIRECTORY include/ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
install(EXPORT  ourlibrary_export
    FILE ourlibraryTargets.cmake
    NAMESPACE productfamily
    DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/ourlibrary
)
include(CMakePackageConfigHelpers)
write_basic_package_version_file(
    ${CMAKE_CURRENT_BINARY_DIR}/ourlibraryConfigVersion.cmake
    VERSION ${PROJECT_VERSION}
    COMPATIBILITY AnyNewerVersion
)
configure_package_config_file(
    ${CMAKE_CURRENT_LIST_DIR}/CMake/ourlibraryConfig.cmake.in # It's a package init and an inclusion to ourlibraryTargets.cmake
    ${CMAKE_CURRENT_BINARY_DIR}/ourlibraryConfig.cmake
    INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/ourlibrary
)
install(FILES
    ${CMAKE_CURRENT_BINARY_DIR}/ourlibraryConfigVersion.cmake
    ${CMAKE_CURRENT_BINARY_DIR}/ourlibraryConfig.cmake
    DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/ourlibrary
)
install(DIRECTORY
    ${CMAKE_CURRENT_BINARY_DIR}/etc/ourlibrary
    DESTINATION ${CMAKE_INSTALL_SYSCONFDIR}
)
include(CPack)

Перемещая include до тех пор, пока не будут определены цели установки, моя проблема была решена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...