如何让 CMake/CPack 为每个 OS 中的不同 OS 和不同架构生成多个包?

How to get CMake/CPack to generate multiple packages for different OSs and different architectures within each OS?

假设我有以下基本 CMakeLists.txt 文件。

target_include_directories( addnum
    PUBLIC
        "${CMAKE_CURRENT_SOURCE_DIR}/include"
)

add_executable(addnumapp src/main.cpp)
target_link_libraries(addnumapp addnum)

SET(CPACK_GENERATOR "DEB")
set(CPACK_DEBIAN_PACKAGE_DEPENDS "g++ (>= 7), libffi-dev, libncurses5-dev, libsqlite3-dev, mcpp, zlib1g-dev")

SET(CPACK_DEBIAN_PACKAGE_MAINTAINER "Some person")
INCLUDE(CPack)

为了创建“deb”包,我创建了一个 build 目录和 运行 以下命令来构建我的项目:

cmake -S . -B ./build

然后我从 build 目录中 运行 cpack 命令并生成一个“.deb”包。生成单个“.deb”包非常好;但是,我想使用 cmakecpack 生成多个包,但我不确定最好的方法是什么。

例如,我如何为所有支持的 Debian 架构生成“.deb”包?

根据我的研究,我知道以下命令,它允许您指定架构:

set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE, "i386")

但是,这仅在您通过我上面概述的方法生成单个 Debian 软件包时才有效。如何为所有不同的架构生成多个 Debian 软件包?

我的第二个问题是关于为不同的操作系统生成多个包。例如,上面的 CMakeLists.txt 文件只是生成了一个 Debian 包;但是,我还想为 MacOS 和 Windows.

生成包

根据我的研究,我知道我的 CMakeLists.txt 文件的以下编辑理论上应该是我为 MacOS 生成“.dmg”包所需的最小更改除了 Debian 包我还想生成。

...
SET(CPACK_GENERATOR "DEB;DragNDrop") # modification here
set(CPACK_DEBIAN_PACKAGE_DEPENDS "g++ (>= 7), libffi-dev, libncurses5-dev, libsqlite3-dev, mcpp, zlib1g-dev")
SET(CPACK_DEBIAN_PACKAGE_ARCHITECTURE i386)

SET(CPACK_DEBIAN_PACKAGE_MAINTAINER "Some person") #required
INCLUDE(CPack)
INCLUDE(CPackDMG) # addition here

但是,当我 运行 cmake -S . -B ./build 这个修改后的 CMakeLists.txt 文件(来自 Ubuntu OS)时,我收到以下错误:

CMake Error at CMakeLists.txt:28 (INCLUDE): INCLUDE could not find requested file:

CPackDMG

-- Configuring incomplete, errors occurred!

这个错误是因为我试图从 Ubuntu 生成 MacOS“dmg”包还是因为我缺少一些 cpack 依赖项?

此外,这是为不同平台生成不同包的最佳方式吗?

总而言之,我的两个问题是(1)如何为不同的架构生成多个包以及(2)如何为不同的平台生成多个包?(请耐心等待请注意,我是 C++、CMake 和 CPack 的新手。)

(1) 如何为不同的架构生成多个包

只需使用不同的构建环境(硬件、docker 容器、虚拟机等)或使用交叉编译和工具链文件。

(2)如何为不同平台生成多个包?

CPackDMG 是一个内部 CPack 模块。您不需要包含它。您的 CMakeLists.txt 应该只使用 CPack 并在之前设置所需的变量。将 CPACK_GENERATOR 设置为所需的包类型列表和特定于生成器的变量。但是,一些生成器使用外部工具——例如,要构建 RPM 包,您的环境需要工作 rmbuild 工具...这意味着很难在 Debian 发行版中构建 RPM 包 %) 换句话说,您在 Linux/Windows 中构建包时很可能无法构建 DMG :)