一个 CMake 项目创建两个 Debian 包

One CMake Project to create two Debian packages

我有一个看起来像这样的 CMake 项目:

-Project
|--ApplicationA
|     |---main.cpp
|     |---CMakeLists.txt
|--ApplicationB
|     |---main.cpp
|     |---CMakeLists.txt
|--CMakeLists.txt

有没有可能我可以 运行 "make packages" (CPack) 并且它会为 ApplicationA 创建一个 Debian 软件包,为 ApplicationB 创建一个?

您可以为安装命令指定组件。 CMake Components

我也在研究这个,但是很难找到信息,所以对于正在寻找这种解决方案的其他人来说,这就是我使用组件完成的方法,也是一个主要CMakeLists.txt 和子目录中的另外两个 CMakeLists.txt。对于这些 Debian 软件包,它只是为了获得正确的依赖关系(因此没有要构建的特定 cpp 文件)。

对于我的解决方案,这是主目录中 CMakeLists.txt 的内容:

cmake_minimum_required(VERSION 3.7.2)

project(EVSE-PACKAGE-GENERATOR VERSION 3.0.0)

set(CPACK_COMPONENTS_ALL <COMPONENT_1> <COMPONENT_2>)
set(CPACK_GENERATOR "DEB")
set(CPACK_DEBIAN_PACKAGE_MAINTAINER "Maintainer")
set(CPACK_DEB_COMPONENT_INSTALL ON)
set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE "...")

add_subdirectory(subdirectory1) #In this case "ApplicationA"

add_subdirectory(subdirectory2) #In this case "ApplicationB"

include(CPack)

组件 1 (ApplicationA) 的 CMakeLists.txt:

cmake_minimum_required(VERSION a.b.c)

project(<COMPONENT_1> VERSION x.y.z)

set(CPACK_COMPONENT_<COMPONENT_1>_DESCRIPTION "Component 1 description" PARENT_SCOPE)
set(CPACK_DEBIAN_<COMPONENT_1>_PACKAGE_FILE_NAME "comp1name")
set(CPACK_DEBIAN_<COMPONENT_1>_PACKAGE_NAME "prefix-${CPACK_DEBIAN_<COMPONENT_1>_PACKAGE_FILE_NAME}" PARENT_SCOPE)
set(CPACK_DEBIAN_<COMPONENT_1>_PACKAGE_DEPENDS "..." PARENT_SCOPE)

set(CPACK_<COMPONENT_1>_PACKAGE_VERSION "${PROJECT_VERSION}${PROJECT_VERSION_PRERELEASE}")
set(CPACK_DEBIAN_<COMPONENT_1>_PACKAGE_ARCHITECTURE "...")

string(TOLOWER "prefix-${CPACK_DEBIAN_<COMPONENT_1>_PACKAGE_FILE_NAME}_${CPACK_<COMPONENT_1>_PACKAGE_VERSION}_${CPACK_DEBIAN_<COMPONENT_1>_PACKAGE_ARCHITECTURE}.deb" DEBIAN_<COMPONENT_1>_FILENAME_STRING )
set(CPACK_DEBIAN_<COMPONENT_1>_FILE_NAME ${DEBIAN_<COMPONENT_1>_FILENAME_STRING} PARENT_SCOPE )
set(CPACK_DEBIAN_<COMPONENT_1>_PACKAGE_CONTROL_STRICT_PERMISSION TRUE PARENT_SCOPE)

和组件 2(应用程序 B):

cmake_minimum_required(VERSION a.b.c)

project(<COMPONENT_2> VERSION x.y.z)

set(CPACK_COMPONENT_<COMPONENT_2>_DESCRIPTION "Component 2 description" PARENT_SCOPE)
set(CPACK_DEBIAN_<COMPONENT_2>_PACKAGE_FILE_NAME "comp2name")
set(CPACK_DEBIAN_<COMPONENT_2>_PACKAGE_NAME "prefix-${CPACK_DEBIAN_<COMPONENT_2>_PACKAGE_FILE_NAME}" PARENT_SCOPE)
set(CPACK_DEBIAN_<COMPONENT_2>_PACKAGE_DEPENDS "..." PARENT_SCOPE)

set(CPACK_<COMPONENT_2>_PACKAGE_VERSION "${PROJECT_VERSION}${PROJECT_VERSION_PRERELEASE}" )
set(CPACK_DEBIAN_<COMPONENT_2>_PACKAGE_ARCHITECTURE "..." )

string(TOLOWER "prefix-${CPACK_DEBIAN_<COMPONENT_2>_PACKAGE_FILE_NAME}_${CPACK_<COMPONENT_2>_PACKAGE_VERSION}_${CPACK_DEBIAN_<COMPONENT_2>_PACKAGE_ARCHITECTURE}.deb" DEBIAN_<COMPONENT_2>_FILENAME_STRING )
set(CPACK_DEBIAN_<COMPONENT_2>_FILE_NAME ${DEBIAN_<COMPONENT_2>_FILENAME_STRING} PARENT_SCOPE )
set(CPACK_DEBIAN_<COMPONENT_2>_PACKAGE_CONTROL_STRICT_PERMISSION_PACKAGE_CONTROL_STRICT_PERMISSION TRUE PARENT_SCOPE)

希望这对以后的人有所帮助。 此外,我还有一些其他资源可能对调查此问题或类似问题的任何人有所帮助:

The Ultimate guide to modern CMake

Whosebug - 使用 CMake 和 CPack 的多个 debian 包的名称和描述

CPack: Create debian packge for each sub-project