Проект верхнего уровня CMake с несколькими дочерними проектами, создающими пакеты

У меня есть несколько проектов CMake, каждый из которых создает пакет Debian. Я пытался создать проект верхнего уровня, который вызывает add_subdirectory() для каждого «дочернего» проекта. Все дочерние проекты строятся, но make project создает проект со спецификациями последнего дочернего проекта и включает файлы из всех других проектов.

По сути, каждый набор (CPACK_...) перезаписывается следующим проектом до тех пор, пока не будет накоплен последний и вызовы install(). Как я могу отделить создание пакета при использовании проекта верхнего уровня?

Изменить: добавлен фрагмент. Все «дочерние» проекты похожи.

# build a CPack driven installer package
if(CMAKE_BUILD_TYPE STREQUAL "release")
    set(CPACK_STRIP_FILES TRUE)
endif()
set(CPACK_GENERATOR DEB)
set(CPACK_PACKAGE_NAME ${PROJECT_NAME})
set(CPACK_PACKAGE_VENDOR Acme)
set(CPACK_DEBIAN_PACKAGE_MAINTAINER "acme <[email protected]>")
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Acme daemon")
message(STATUS "CPACK_PACKAGE_DESCRIPTION_SUMMARY: " ${CPACK_PACKAGE_DESCRIPTION_SUMMARY})
if(CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64")
    set(SYSTEM_PROCESSOR amd64)
elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "arm")
    set(SYSTEM_PROCESSOR armhf)
else()
    message(FATAL_ERROR "CMAKE_SYSTEM_PROCESSOR: " ${CMAKE_SYSTEM_PROCESSOR})
endif()
set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE ${SYSTEM_PROCESSOR})
message(STATUS "CPACK_DEBIAN_PACKAGE_ARCHITECTURE: " ${CPACK_DEBIAN_PACKAGE_ARCHITECTURE})
include(InstallRequiredSystemLibraries)
set(CPACK_PACKAGE_VERSION_MAJOR ${${PROJECT_NAME}_VERSION_MAJOR})
set(CPACK_PACKAGE_VERSION_MINOR ${${PROJECT_NAME}_VERSION_MINOR})
set(CPACK_PACKAGE_VERSION_PATCH ${${PROJECT_NAME}_VERSION_PATCH})
set(CPACK_PACKAGE_VERSION ${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH})
set(CPACK_PACKAGE_FILE_NAME ${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}-${CMAKE_SYSTEM_NAME}-${SYSTEM_PROCESSOR})
message(STATUS "CPACK_PACKAGE_FILE_NAME: " ${CPACK_PACKAGE_FILE_NAME})
set(CPACK_DEBIAN_PACKAGE_PRIORITY optional)
include(CPack)

person DKLind    schedule 25.03.2015    source источник
comment
Можете ли вы поделиться выдержкой из файлов CMakeLists.txt подкаталога? А именно, как на самом деле происходит set(CPACK_... )?   -  person Antonio    schedule 26.03.2015
comment
Я только что отредактировал свой исходный пост и добавил фрагмент того, что содержит CMakeLists.txt каждого «дочернего» проекта.   -  person DKLind    schedule 26.03.2015
comment
Я думаю, что это больше, чем проблема CMake, это проблема CPack (которую я не знаю, извините). При поиске нескольких пакетов cpack есть пара идей...   -  person Antonio    schedule 27.03.2015


Ответы (1)


В CMakeLists.txt каждого дочернего проекта вы можете установить переменную CPACK_OUTPUT_CONFIG_FILE. Например, для проекта Child_1 в его файле cmake вы указываете:

set(CPACK_OUTPUT_CONFIG_FILE "${CMAKE_BINARY_DIR}/CPackConfigChild_1.cmake")

Затем, после создания проекта верхнего уровня, вы можете сделать:

cpack -G DEB --config CPackConfigChild_1.cmake
# the same for all other child projects
person Andrey G.A    schedule 13.07.2015