【问题标题】:How to get CMake/CPack to generate multiple packages for different OSs and different architectures within each OS?如何让 CMake/CPack 为每个操作系统内的不同操作系统和不同架构生成多个包?
【发布时间】:2021-09-12 09:27:04
【问题描述】:

假设我有以下基本 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

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

CMakeLists.txt:28 (INCLUDE) 处的 CMake 错误:找不到 INCLUDE 请求的文件:

CPackDMG

-- 配置不完整,出现错误!

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

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

总而言之,我的两个问题是(1)如何为不同的架构生成多个包和(2)如何为不同的平台生成多个包?(请记住,我是对 C++、CMake 和 CPack 非常陌生。)

【问题讨论】:

    标签: makefile cmake package cpack


    【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-08-09
      • 1970-01-01
      • 1970-01-01
      • 2014-10-22
      • 1970-01-01
      • 2011-06-21
      • 2017-08-15
      相关资源
      最近更新 更多