CMake顶级项目与多个子项目创建包

问题描述:

我有多个CMake项目,每个创建一个debian包。我一直在尝试创建一个顶级项目,在每个“子项目”上调用add_subdirectory()。所有的子项目都会构建,但“make project”会创建一个包含最后一个子项目规范的项目,并包含来自所有其他项目的文件。CMake顶级项目与多个子项目创建包

基本上,每个集合(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) 
+0

你能分享子目录CMakeLists的摘录.txt文件?也就是说,'set(CPACK _...)'实际上是如何发生的? – Antonio 2015-03-26 14:34:43

+0

我刚刚编辑了我的原始文章,并添加了每个'child'项目的CMakeLists.txt包含的片段。 – DKLind 2015-03-26 16:25:45

+0

我认为这不仅仅是一个CMake问题,这是一个CPack问题(我不知道,对不起)。搜索“cpack多个软件包”有几个想法... – Antonio 2015-03-27 12:21:08

在每个子项目的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