注意:这个对于单配置生成器是有效的,对于多配置生成器(例如Visual Studio)是无效的。因此在 Windows 平台,通过 MSYS 环境进行演示。

默认情况下(Linux平台),CMake 的一个构建目录(build dir)只包含一个配置,可以是 Debug、Release、MinSizeRel 或 RelWithDebInfo。但是,可以通过设置 CPack 来绑定多个构建目录,并构造一个包含同一项目的多个配置的发行包。

首先,我们希望确保 DebugRelease 构建对将要安装的可执行文件和库使用不同的名称。让我们使用 d 作为 Debug 可执行文件和库的后缀。在顶层 CMakeLists.txt 的开始部分添加 CMAKE_DEBUG_POSTFIX

# 设置项目名称和版本
project(Tutorial VERSION 3.1)

# 设置 CMAKE_DEBUG_POSTFIX,指定后缀为 d 
set(CMAKE_DEBUG_POSTFIX d)

然后在 Tutorial 可执行文件上添加属性 DEBUG_POSTFIX

# 添加源码文件和生成的目标文件的名称
add_executable(Tutorial main.cpp)
# And the DEBUG_POSTFIX property on the tutorial executable
set_target_properties(Tutorial PROPERTIES DEBUG_POSTFIX ${CMAKE_DEBUG_POSTFIX})

MathFunctions 库添加版本号信息,在 Mathfunctions/CMakelists.txt 中,设置 VERSIONSOVERSION 属性:

# add the library that runs
add_library(MathFunctions MathFunctions.cxx)

# 添加 版本信息
set_property(TARGET MathFunctions PROPERTY VERSION "1.0.0")
set_property(TARGET MathFunctions PROPERTY SOVERSION "1")

接下来分别对 Debug 和 Release 分别进行构建,在 build 时使用 CMAKE_BUILD_TYPE 参数设置配置类型:

mkdir debug
mkdir release
cd debug
cmake -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=Debug ..
cmake --build .
cd ../release
cmake -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=Release ..
cmake --build .

现在我们可以使用一个自定义的配置文件将两个构建包打包到一个单独的发行包中。在顶层目录创建 MultiCPackConfig.cmake 文件,首先包含由 cmake 创建的默认配置文件,接下来,使用 CPACK_INSTALL_CMAKE_PROJECTS 变量来指定要安装的项目。在本例中,我们希望同时安装 debug 和 release。

include("release/CPackConfig.cmake")

set(CPACK_INSTALL_CMAKE_PROJECTS
    "debug;Tutorial;ALL;/"
    "release;Tutorial;ALL;/"
)

最后在顶层目录中,运行 cpack,使用 config 选项指定我们的自定义配置文件:

cpack --config MultiCPackConfig.cmake

注:可能会需要安装 nsis

pacman -S mingw-w64-ucrt-x86_64-nsis

在顶层目录会生成一个可安装发行包:

多版本发行包

安装后的目录结构:

多版本发行包安装目录树