如何让 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”包非常好;但是,我想使用 cmake
和 cpack
生成多个包,但我不确定最好的方法是什么。
例如,我如何为所有支持的 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 :)
假设我有以下基本 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”包非常好;但是,我想使用 cmake
和 cpack
生成多个包,但我不确定最好的方法是什么。
例如,我如何为所有支持的 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 :)