Я пилотирую 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 только когда-либо захотеть заархивировать исходный каталог.
Почему это происходит и как я могу предотвратить это?