前言:
学习笔记,随时更新。如有谬误,欢迎指正。
说明:
- 红色字体为较为重要部分。
- 绿色字体为个人理解部分。
14 使用 CPack 打包
CPack 是一个功能强大、易于使用的跨平台软件打包工具。它使用 CMake 中的生成器概念来抽象特定平台上的包的生成。它可以与 CMake 一起使用,也可以不与 CMake 一起使用,但它可能依赖于系统上安装的某些软件。使用简单的配置文件或使用 CMake 模块,项目的作者可以将复杂的项目打包到简单的安装程序中。本章将描述如何将 CPack 应用到 CMake 项目中。
14.1 CPack 基础
软件的用户可能并不总是想要或能够为了安装软件而构建软件。软件可能是闭源的,或者需要很长时间来编译,或者对于终端用户应用程序,用户可能对构建应用程序不感兴趣。对于这些情况,需要一种方法在一台机器上构建软件,然后将安装树移动到另一台机器上。最基本的方法是使用 DESTDIR 环境变量将软件安装到一个临时位置,然后 tar 或 zip 该目录并将其移动到另一台计算机。但是, DESTDIR 方法在 Windows 上不太管用,原因很简单,路径名通常以驱动器号( C:/ )开头,你无法简单地在一个完整路径前面加上另一个完整路径的前缀,从而得到一个有效的路径名。另一种更强大的方法是使用 CMake 中包含的 CPack 。
CPack 是 CMake 中包含的一个工具,它可以用于为项目创建安装程序和包。 CPack 可以创建两种基本类型的包:源码包和二进制包。 CPack 的工作方式与 CMake 构建软件的工作方式非常相似。它的目标不是取代本机打包工具,而是为各种工具提供单一接口。目前 CPack 支持使用 NullSoft 的 NSIS 或 WiX 程序安装器来创建 Windows 安装程序、 Mac OS X PackageMaker 工具、 OS X Drag&Drop 、 OS X X11 Drag&Drop 、 Cygwin 安装包、 Debian 包、RPMs 、 .tar.gz 、 .sh (自解压 .tar.gz 文件)和 .zip 压缩文件。 CPack 的实现与 CMake 的工作方式类似。对于支持的每种打包工具,都有一个用 C++ 编写的 CPack 生成器,用于运行本机工具和创建包。对于简单的基于 tar 的包, CPack 包含一个 tar 的库版本,不需要在系统上安装 tar 。对于许多其他安装程序,必须提供本机工具才能使 CPack 发挥作用。
对于源码包, CPack 会复制源码树并创建一个 zip 或 tar 文件。对于二进制包, CPack 的使用与项目中正常工作的安装命令绑定在一起。在设置安装命令时,第一步是确保文件进入具有正确权限的正确目录结构。下一步是确保软件是可重新定位的,并且可以在已安装的树中运行。这可能需要更改软件本身,对于不同的环境,有许多技术可以做到这一点,这些超出了本书的范围。基本上,可执行程序应该能够使用安装位置的相对路径找到数据或其他文件。 CPack 将软件安装到一个临时目录中,并将安装树复制为本机打包工具的格式。将安装命令添加到项目后,在最简单的情况下启用 CPack 的方式是
直接包含 CPack.cmake 文件到项目中。
14.1.1 简单例子
最基本的 CPack 项目如下所示:
cmake_minimum_required(VERSION 3.20)
project(CoolStuff)
add_executable(coolstuff coolstuff.cxx)
install(TARGETS coolstuff RUNTIME DESTINATION bin)
include(CPack)
在 CoolStuff 项目中,创建一个可执行文件并将其安装到 bin 目录中。然后,该项目将包含 CPack 文件。此时,项目 CoolStuff 将启用 CPack 。要为 CoolStuff 运行 CPack ,首先要像构建任何其他 CMake 项目一样构建该项目。 CPack 将几个目标添加到生成的项目中。在 Makefiles 中的这些目标是 package 和 package_source ,在 Visual Studio 和 Xcode 中的 PACKAGE 。例如,要使用 Makefile 生成器为 CoolStuff 构建一个源码和二进制包,可以运行以下命令:
mkdir build
cd build
cmake ../CoolStuff
make
make package
make package_source
这将创建一个名为 CoolStuff-0.1.1-Source.zip 的源压缩文件,一个名为 CoolStuff-0.1.1-win32.exe 的 NSIS 安装程序,以及一个名为 CoolStuff-0.1.1-win32.zip 的二进制压缩文件。使用 CPack 命令行也可以完成同样的工作。
cd build
cpack --config CPackConfig.cmake
cpack --config CPackSourceConfig.cmake
14.1.2 当 CPack.cmake 被包含进来时发生了什么?
当执行 include(CPack) 命令时, CPack.cmake 文件被包含在项目中。默认情况下,这将使用 configure_file 命令在项目的二进制树中创建 CPackConfig.cmake 和 CPackSourceConfig.cmake 。这些文件包含一系列 set 命令,用于设置在打包步骤中运行 CPack 时使用的变量。由 CPack.cmake 文件配置的文件名可以通过这两个变量来自定义: CPACK_OUTPUT_CONFIG_FILE ,默认为CPackConfig.cmake,以及 CPACK_SOURCE_OUTPUT_CONFIG_FILE ,默认为 CPackSourceConfig.cmake 。
这些文件的源代码可以在 Templates/CPackConfig.cmake.in 中找到。该文件包含一些注释和一个由 CPack.cmake 设置的变量。该文件包含这行 CMake 代码:
@_CPACK_OTHER_VARIABLES_@
如果项目在源码树的顶层含有 CPackConfig.cmake.in 文件,那么将使用该文件而不是 Templates 目录中的文件。如果项目包含文件 CPackSourceConfig.cmake.in ,那么该文件将用于创建CPackSourceConfig.cmake 。
CPack.cmake 创建的配置文件将包含当前项目中所有以“ CPACK_ ”开头的变量。这是通过以下命令来完成的:
get_cmake_property(res VARIABLES)
上面的命令获取为当前 CMake 项目定义的所有变量。然后,一些 CMake 代码查找所有以“ CPACK_ ”开头的变量,找到的每个变量都作为 CMake 代码配置到两个配置文件中。例如,如果在 CMake 项目中设置了这样一个变量:
set(CPACK_PACKAGE_NAME "CoolStuff")
在 CPackConfig.cmake 和 CPackSourceConfig.cmake 中也会有相同的东西:
set(CPACK_PACKAGE_NAME "CoolStuff")
一定要记住, CPack 是在项目上的 CMake 之后运行的。 CPack 使用与 CMake 相同的解析器,但不具有与 CMake 项目相同的变量值。它将只有以 CPACK_ 开头的变量,并且这些变量将被 CMake 配置到配置文件中。如果变量的值使用转义字符,这可能会导致一些错误和混乱。因为它们被 CMake 语言解析了两次,所以它们需要两倍的转义级别。例如,如果你的 CMake 项目中有以下内容:
set(CPACK_PACKAGE_VENDOR "Cool \"Company\"")
生成的 CPack 文件将包含以下内容:
set(CPACK_PACKAGE_VENDOR "Cool "Company"")
这并不是你想要的或你所期望的。事实上,这是行不通的。要解决这个问题,有两种解决方案。第一个是在原始的 set 命令中添加额外级别的转义,像这样:
set(CPACK_PACKAGE_VENDOR "Cool \\\"Company\\\"")
这将导产生正确的 set 命令,如下所示:
set(CPACK_PACKAGE_VENDOR "Cool \"Company\"")
对转义问题的第二个解决方案是使用一个 CPack 项目配置文件,这将在下一节中解释。
14.1.3 添加自定义 CPack 选项
为了避免转义问题,可以指定项目特定的 CPack 配置文件。此文件将在 CPackConfig.cmake 或 CPackSourceConfig.cmake 被加载后由 CPack 加载,并且 CPACK_GENERATOR 将被设置为正在运行的 CPack 生成器。该文件中设置的变量只需要一级 CMake 转义。这个文件可以配置,也可以不配置,它包含常规的 CMake 代码。在上面的例子中,你可以将 CPACK_FOOBAR 移动到文件 MyCPackOptions.cmake.in 中,并将该文件配置到项目的构建树中。然后像这样设置项目配置文件路径:
configure_file ("${PROJECT_SOURCE_DIR}/MyCPackOptions.cmake.in"
"${PROJECT_BINARY_DIR}/MyCPackOptions.cmake"
@ONLY)
set (CPACK_PROJECT_CONFIG_FILE
"${PROJECT_BINARY_DIR}/MyCPackOptions.cmake")
其中 MyCPackOptions.cmake.in 包含:
set(CPACK_PACKAGE_VENDOR "Cool \"Company\"")
CPACK_PROJECT_CONFIG_FILE 变量应该包含项目的 CPack 配置文件的完整路径,如上例所示。这有一个额外的好处, CMake 代码可以包含基于 CPACK_GENERATOR 值的 if 语句,因此可以为项目设置特定于打包器的值。例如, CMake 项目在这个文件中设置了安装程序的图标:
set (CPACK_NSIS_MUI_ICON
"@CMake_SOURCE_DIR@/Utilities/Release\\CMakeLogo.ico")
注意,除了最后一部分,该路径由正向斜杠作为路径分隔符。因为在编写本书时, NSIS 需要路径的最后一部分具有 Windows 样式的斜杠。如果你不这样做,你可能会得到以下错误:
File: ".../Release/CMakeLogo.ico" -> no files found.
Usage: File [/nonfatal] [/a] ([/r] [/x filespec [...]]
filespec [...] | /oname=outfile one_file_only)
14.1.4 CPack 添加的选项
除了创建两个配置文件外, CPack.cmake 将为你的项目添加一些高级选项。添加的选项取决于运行 CMake 的环境和操作系统,并控制由 CPack 创建的默认包。这些选项的形式为 CPACK_<CPack Generator Name> ,其中每个平台上可用的生成器名称如下表所示:
Windows | Cygwin | Linux/UNIX | Mac OS X |
---|---|---|---|
NSIS | CYGWIN_BINARY | DEB | PACKAGEMAKER |
ZIP | SOURCE_CYGWIN | RPM | DRAGNDROP |
SOURCE_ZIP | STGZ | BUNDLE | |
TBZ2 | OSXX11 | ||
TGZ | |||
TZ | |||
SOURCE_TGZ | |||
SOURCE_TZ |
打开或关闭这些选项会影响不带选项运行 CPack 时创建的包。如果该选项在项目的 CMakeCache.txt 文件中是关闭的,你仍然可以通过在 CPack 命令行中指定 -G 选项来构建该包类型。
14.2 CPack 源码包
CPack 中的源包只是将项目的整个源码树复制到包文件中,并且不像在二进制包中那样使用安装规则。应该使用源代码外构建,以避免额外的二进制文件污染源代码包。如果源码树中的文件或目录不需要放在源码包中,可以使用变量 CPACK_SOURCE_IGNORE_FILES 从包中排除一些内容。这个变量包含一个正则表达式列表。任何与该列表中的正则表达式匹配的文件或目录都将从源文件中排除。默认设置如下:
"/CVS/;/\\\\\\\\.svn/;\\\\\\\\.swp$;\\\\\\\\.#;/#"
默认值中使用了多级别的转义,因为 CMake 会对该变量进行一次解析,然后 CPack 会再对其进行一次解析。重要的是要认识到源码树不会使用任何安装命令,它只是将整个源码树减去它被告知要忽略的文件复制到包中。为了避免多重转义,应该使用 CPACK_PROJECT_CONFIG_FILE 指向的文件来设置这个变量。该表达式是一个正则表达式而不是通配符语句,有关 CMake 正则表达式的更多信息,请参阅第 4 章。
14.3 CPack 安装器命令
由于二进制包要求 CPack 与被打包项目的安装规则交互,本节将介绍 CPack 提供的与项目的安装规则交互的一些选项。CPack 可以与 CMake 的安装脚本或外部安装命令一起工作。
14.3.1 CPack 和 CMake 安装命令
在大多数 CMake 项目中,使用 CMake 安装规则就足以创建所需的包。默认情况下, CPack 将运行当前项目的安装规则。但是,如果你有一个更复杂的项目,你可以使用变量 CPACK_INSTALL_CMAKE_PROJECTS 指定子项目和安装目录。这个变量应该包含安装目录、安装项目名称、安装组件和安装子目录的四胞胎。例如,如果你有一个项目,它有一个名为 MySub 的子项目,被编译到一个名为 SubProject 的目录中,你想安装它的所有组件,你应该这样写:
SET(CPACK_INSTALL_CMAKE_PROJECTS "SubProject;MySub;ALL;/")
14.3.2 CPack 和 DESTDIR
默认情况下, CPack 在安装阶段不使用 DESTDIR 选项。相反,它将 CMAKE_INSTALL_PREFIX 设置为 CPack 用于暂存安装包的临时目录的完整路径。这可以通过设置 CPACK_SET_DESTDIR 为 on 来改变。如果 CPACK_SET_DESTDIR 选项是打开的, CPack 将使用 CPACK_INSTALL_PREFIX 的项目缓存值,并将 DESTDIR 设置为临时暂存区。这允许在临时目录下安装绝对路径。相对路径被安装到 DESTDIR/${项目的CMAKE_INSTALL_PREFIX} 中,其中 DESTDIR 被设置为临时暂存区域。
如前所述,当安装规则通过以驱动器号( C:/)开头的 Windows 全路径来使用文件时, DESTDIR 方法不起作用。
在为包进行非 DESTDIR 安装时,这是默认设置,任何绝对路径都将安装到绝对目录中,而不是安装到包中。因此,不使用 DESTDIR 选项的项目不能在安装规则中使用任何绝对路径。相反,使用绝对路径的项目必须使用 DESTDIR 选项。
另一个变量可用于控制安装项目的根路径,即 CPACK_PACKAGING_INSTALL_PREFIX 。默认情况下,许多生成器都安装到 /usr 目录中。可以使用该变量将其更改为任何目录,包括 /. 。
14.3.3 CPack 和其他安装目录
如果项目不是基于 CMake 的,也可以运行其他安装规则。这可以通过使用变量 CPACK_INSTALL_COMMANDS 和 CPACK_INSTALLED_DIRECTORIES 来实现。 CPACK_INSTALL_COMMANDS 是将要在打包的安装阶段运行的命令。 CPACK_INSTALLED_DIRECTORIES 应该包含目录和子目录对( pair )。子目录可以是’ . ',这将安装到安装操作的顶层目录中。每个目录中的文件将被复制到 CPack 暂存目录的相应子目录中,并与其余文件打包。
14.4 Windows 安装程序 NSIS 的 CPack
为了创建基于 Windows 风格向导的安装程序, CPack 使用 NSIS ( NullSoft Scriptable Install System )。更多关于 NSIS 的信息可以在 NSIS 主页上找到( http://nsis.sourceforge.net/ )。 NSIS 是一个强大的工具,带有一种用于创建专业 Windows 安装程序的脚本语言。要用 CPack 创建 Windows 安装程序,需要在机器上安装 NSIS 。
CPack 使用配置好的模板文件控制 NSIS 。在创建 NSIS 安装程序期间,有两个由 CPack 配置的文件。这两个文件都可以在 CMake 的 Modules 目录中找到。Modules/NSIS.template.in 是 NSIS 脚本模板, Modules/NSIS.InstallOptions.ini.in 是 NSIS 使用的现代用户界面或 MUI 的模板。安装选项文件包含有关安装向导中使用的页面的信息。介绍如何配置 CPack 来创建 NSIS 安装向导。
14.4.1 CMake 使用的关于 NSIS 的 CPack 变量
本节包含来自 CMake NSIS 安装向导的屏幕截图。对于可以从 CPack 更改或控制的安装程序的每个部分,都给出了所使用的变量和值。
用户在 Windows中 看到的安装程序的第一件事是安装程序可执行文件本身的图标。默认情况下,安装程序将具有 Null Soft installer 图标,如下图中 20071023 CMake 安装程序所示。这个图标可以通过设置变量 CPACK_NSIS_MUI_ICON 来更改。同一图中 20071025 的程序安装器显示了被程序安装器所使用的 CMake 图标。

用户在 Windows 中看到的安装程序的最后一件事是卸载可执行文件的图标,如下图所示。这个选项可以通过 CPACK_NSIS_MUI_UNIICON 变量来设置。安装和卸载图标必须是相同的大小和格式,且是一个可以被 Windows 资源管理器使用的有效的 Windows .ico 文件。图标是这样设置的:
# 设置安装程序本身使用的安装/卸载图标
set (CPACK_NSIS_MUI_ICON
"${CMake_SOURCE_DIR}/Utilities/Release\\CMakeLogo.ico")
set (CPACK_NSIS_MUI_UNIICON
"${CMake_SOURCE_DIR}/Utilities/Release\\CMakeLogo.ico")

在 Windows 上,还可以使用控制面板上的添加或删除程序工具删除程序,如下图所示。这个图标应该嵌入到一个已安装的可执行文件中。可以这样设置:
# 使用已安装的可执行文件设置添加/删除程序的图标
SET(CPACK_NSIS_INSTALLED_ICON_NAME "bin\\cmake-gui.exe")


在运行安装程序时,安装导向的第一个页面如上图所示。在此页面中,你可以控制显示在屏幕上两个位置的项目名称。项目使用的名称由变量 CPACK_PACKAGE_INSTALL_DIRECTORY 或 CPACK_NSIS_PACKAGE_NAME 控制。在这个例子中,它被设置为“ CMake 2.5 ”,就像这样:
set (CPACK_PACKAGE_INSTALL_DIRECTORY "CMake
${CMake_VERSION_MAJOR}.${CMake_VERSION_MINOR}")
或者这样
set (CPACK_NSIS_PACKAGE_NAME "CMake
${CMake_VERSION_MAJOR}.${CMake_VERSION_MINOR}")

安装向导的第二个页面如上图所示。这个页面包含许可协议,在这个页面上可以配置一些东西。“许可证协议”标签左侧的横幅位图由变量 CPACK_PACKAGE_ICON 控制,如下所示:
set (CPACK_PACKAGE_ICON
"${CMake_SOURCE_DIR}/Utilities/Release\\CMakeInstall.bmp")
在此页上所有看到文本“ CMake 2.5 ”的地方会都再次使用 CPACK_PACKAGE_INSTALL_DIRECTORY 。许可协议的文本被设置为 CPACK_RESOURCE_FILE_LICENSE 变量中指定的文件的内容。 CMake 做以下工作:
set (CPACK_RESOURCE_FILE_LICENSE
"${CMAKE_CURRENT_SOURCE_DIR}/Copyright.txt")

程序安装器的第三个页面如上图所示。只有当 CPACK_NSIS_MODIFY_PATH 设置为 on 时,此页面才会显示。如果你选中“创建 xxx 桌面图标”按钮,并将可执行名称放在变量 CPACK_CREATE_DESKTOP_LINKS 中,那么将会为这个可执行程序创建一个桌面图标。例如,为 CMake 的 cmake-gui 程序创建一个桌面图标,如下所示:
set (CPACK_CREATE_DESKTOP_LINKS cmake-gui)
如果应用程序包含多个可执行文件,则可以创建多个桌面链接。链接将被创建到开始菜单项,因此CPACK_PACKAGE_EXECUTABLES也必须包含应用程序,以便创建桌面链接,这将在本节后面部分进行讲述。

程序安装器的第四页如上图所示,使用变量 CPACK_PACKAGE_INSTALL_DIRECTORY 在 Program Files 中指定默认的目标文件夹。下面的 CMake 代码用来设置默认值:
set (CPACK_PACKAGE_INSTALL_DIRECTORY "CMake
${CMake_VERSION_MAJOR}.${CMake_VERSION_MINOR}")
安装程序向导的其余页面不使用任何额外的 CPack 变量,也不包括在本节中。 NSIS CPack 生成器可以设置的另一个重要选项是使用的注册表键。有几个 CPack 变量控制所使用的默认键。该键在 NSIS.template.in 文件中定义如下:
!define MUI_STARTMENUPAGE_REGISTRY_KEY
"Software\@CPACK_PACKAGE_VENDOR@\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@"
其中 CPACK_PACKAGE_VENDOR 值默认为 Humanity , CPACK_PACKAGE_INSTALL_REGISTRY_KEY 默认为 ${CPACK_PACKAGE_NAME} ${CPACK_PACKAGE_VERSION} 。
所以对于 CMake 2.5.20071025 来说,注册表键看起来是这样的:
HKEY_LOCAL_MACHINE\SOFTWARE\Kitware\CMake 2.5.20071025
14.4.2 在开始菜单中创建 Windows快捷方式
有两个变量控制由 NSIS 在 Windows 开始菜单中创建的快捷方式。变量包含成对的列表,并且必须有偶数个元素才能正确工作。第一个是 CPACK_PACKAGE_EXECUTABLES ,它应该包含后面跟着快捷文本名称的可执行文件名称。例如,对于 CMake ,可执行文件被称为 cmake -gui ,但快捷方式被命名为“ CMake ”。CMake执行以下操作来创建快捷方式:
set (CPACK_PACKAGE_EXECUTABLES "cmake-gui" "CMake" )
第二个是 CPACK_NSIS_MENU_LINKS 。此变量包含到安装树或到外部网页的任意链接。第一个总是现有的源文件或位置,第二个是将显示在开始菜单中的名称。要添加 cmake-gui 帮助文件的链接和 CMake web 页面的链接,请添加以下内容:
set (CPACK_NSIS_MENU_LINKS
"doc/cmake-${VERSION_MAJOR}.${VERSION_MINOR}/cmake-gui.html"
"cmake-gui Help" "http://www.cmake.org" "CMake Web Site")
14.4.3 高级 NSIS CPack 选项
除了已经讨论过的变量之外, CPack 还提供了一些直接配置到 NSIS 脚本文件中的附加变量。这些变量可用于将 NSIS 脚本片段添加到用于创建安装程序的最终 NSIS 脚本中。它们如下:
CPACK_NSIS_EXTRA_INSTALL_COMMANDS
- 安装过程中使用的额外命令。
CPACK_NSIS_EXTRA_UNINSTALL_COMMANDS
- 卸载过程中使用的额外命令。
CPACK_NSIS_CREATE_ICONS_EXTRA
- 脚本中图标部分的额外 NSIS 命令。
CPACK_NSIS_DELETE_ICONS_EXTRA
脚本中删除图标部分的额外 NSIS 命令。
当使用这些变量时,应该参考 NSIS 文档,且使用者应该查看 NSIS.template.in 文件,以确定变量的确切位置。
14.4.4 设置文件扩展名与 NSIS 的关联
使用额外的安装命令可以做的一个有用的事情是创建从文件扩展名到已安装应用程序的关联。例如,如果你有一个应用程序 CoolStuff 可以打开扩展名 为.cool 的文件,你将可以设置以下额外的安装和卸载命令:
set (CPACK_NSIS_EXTRA_INSTALL_COMMANDS "
WriteRegStr HKCR '.cool' '' 'CoolFile'
WriteRegStr HKCR 'CoolFile' '' 'Cool Stuff File'
WriteRegStr HKCR 'CoolFile\\shell' '' 'open'
WriteRegStr HKCR 'CoolFile\\DefaultIcon' \\
'' '$INSTDIR\\bin\\coolstuff.exe,0'
WriteRegStr HKCR 'CoolFile\\shell\\open\\command' \\
'' '$INSTDIR\\bin\\coolstuff.exe \"%1\"'
WriteRegStr HKCR \"CoolFile\\shell\\edit' \\
'' 'Edit Cool File'
WriteRegStr HKCR 'CoolFile\\shell\\edit\\command' \\
'' '$INSTDIR\\bin\\coolstuff.exe \"%1\"'
System::Call \\
'Shell32::SHChangeNotify(i 0x8000000, i 0, i 0, i 0)'
")
set (CPACK_NSIS_EXTRA_UNINSTALL_COMMANDS "
DeleteRegKey HKCR '.cool'
DeleteRegKey HKCR 'CoolFile'
")
这将创建一个与所有以 .cool 结尾的文件的 Windows 关联,因此当用户双击 .cool 文件时, coolstuff.exe 将以文件的完整路径作为参数运行。这也建立了从 Windows 右键菜单编辑文件到相同 coolstuff.exe 程序的关联。该文件的 Windows 资源管理器图标被设置为在 coolstuff.exe 可执行文件中找到的图标。当它被卸载时,注册表项将被删除。由于必须对双引号和 Windows 路径分隔符进行转义,因此最好将此代码放入项目的 CPACK_PROJECT_CONFIG_FILE 中。
configure_file(
${CoolStuff_SOURCE_DIR}/CoolStuffCPackOptions.cmake.in
${CoolStuff_BINARY_DIR}/CoolStuffCPackOptions.cmake @ONLY)
set (CPACK_PROJECT_CONFIG_FILE
${CoolStuff_BINARY_DIR}/CoolStuffCPackOptions.cmake)
include (CPack)
14.4.5 安装 Microsoft 运行时库
尽管严格来说这不是 NSIS CPack 命令,但如果你使用 Microsoft 编译器在 Windows 上创建应用程序,则很可能希望将 Microsoft 的运行时库与项目一起发布。在 CMake 中,你需要做如下操作:
include (InstallRequiredSystemLibraries)
这将把编译器运行时库作为安装文件添加到应用程序的 bin 目录中。如果你不希望库进入 bin 目录,你可以这样做:
set (CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS_SKIP TRUE)
include (InstallRequiredSystemLibraries)
install (PROGRAMS ${CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS}
DESTINATION mydir)
重要的是要注意,运行时库必须紧挨着包的可执行文件,以便 Windows 能够找到它们。在 Visual Studio 2005 和 2008 中,在发布运行时库时,还需要与应用程序一起安装并列的清单文件。如果你想打包一个调试版本的软件,你需要在 include 之前将 CMAKE_INSTALL_DEBUG_LIBRARIES 设置为 ON 。但是请注意,许可条款可能禁止你再次发布调试库。在决定将 CMAKE_INSTALL_DEBUG_LIBRARIES 设置为 ON 之前,请仔细检查你正在使用的 Visual Studio 版本的许可条款。
14.4.6 CPack 对组件安装的支持
默认情况下, CPack 的程序安装器将项目安装的所有文件视为一个单一的整体单元:要么安装全部文件集,要么不安装任何文件。然而,对于许多项目,将安装细分为不同的、用户可选择的组件是有意义的。有些用户可能只想安装项目的命令行工具,而其他用户可能想安装 GUI 或头文件。
本节描述如何配置 CPack 以生成基于组件的程序安装器,允许用户选择他们希望安装的项目组件集。例如,将为一个库创建一个简单的安装程序,该库有三个组件:一个二进制库、一个简单应用程序和一个 C++ 头文件。完成后, Windows 和 Mac OS X 的程序安装器如下图所示。

我们将使用的简单示例如下:它有一个库和一个可执行文件。使用的 CPack 命令前面已经介绍过了。
cmake_minimum_required(VERSION 3.20 FATAL_ERROR)
project(MyLib)
add_library(mylib mylib.cpp)
add_executable(mylibapp mylibapp.cpp)
target_link_libraries(mylibapp mylib)
install(TARGETS mylib ARCHIVE DESTINATION lib)
install(TARGETS mylibapp RUNTIME DESTINATION bin)
install(FILES mylib.h DESTINATION include)
# 项目中添加 CPack
set(CPACK_PACKAGE_NAME "MyLib")
set(CPACK_PACKAGE_VENDOR "CMake.org")
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY
"MyLib - CPack Component Installation Example")
set(CPACK_PACKAGE_VERSION "1.0.0")
set(CPACK_PACKAGE_VERSION_MAJOR "1")
set(CPACK_PACKAGE_VERSION_MINOR "0")
set(CPACK_PACKAGE_VERSION_PATCH "0")
set(CPACK_PACKAGE_INSTALL_DIRECTORY "CPack Component Example")
# 此句代码必须在所有 CPACK\_\* 变量被定义之后
include(CPack)
14.4.6.1 指定组件
构建基于组件的安装的第一步是识别可安装组件集。在本例中,将创建三个组件:二进制文库、应用程序和头文件。组件的决策是任意的,而且是特定于项目的,但是一定要确定与用户重要的功能单元相对应的组件,而不是将组件建立在程序的内部结构上。
对于这些组件中的每一个,我们需要确定每个安装的文件属于哪个组件。对于 CMakeLists.txt 中的每个 install 命令,添加一个适当的 COMPONENT 参数,以说明所安装的文件将与哪个组件关联:
install(TARGETS mylib
ARCHIVE
DESTINATION lib
COMPONENT libraries)
install(TARGETS mylibapp
RUNTIME
DESTINATION bin
COMPONENT applications)
install(FILES mylib.h
DESTINATION include
COMPONENT headers)
注意, install 命令的 COMPONENT 参数并不是新的,它已经是 CMake 的安装操作的一部分。如果你使用任何旧的安装命令( install_targets 、 install_files 等),你需要将它们转换为 install 命令,以便使用组件。
下一步是通过为包中的每个组件调用 cpack_add_component 函数来告知 CPack 你的项目中所有组件的名称:
cpack_add_component(applications)
cpack_add_component(libraries)
cpack_add_component(headers)
此时,你可以使用 CPack 构建一个基于组件的安装程序,它将允许你独立安装 MyLib 的应用程序、库和头文件。 Windows 和 Mac OS X 安装程序将与下图类似。

14.4.6.2 命名组件
此时,你可能已经注意到安装程序中实际组件的名称并不是非常具有描述性:它们只是说“应用程序”、“库”或“头文件”,就像组件名称中指定的那样。这些名称可以通过使用 cpack_add_component 函数中的 DISPLAY_NAME 选项来改进:
cpack_add_component(applications DISPLAY_NAME
"MyLib Application")
cpack_add_component(libraries DISPLAY_NAME "Libraries")
cpack_add_component(headers DISPLAY_NAME "C++ Headers")
任何以 CPACK_COMPONENT_${COMPNAME} 为前缀的宏,其中 ${COMPNAME} 是组件的大写名称,用于在程序器中设置该组件的特定属性。在这里,我们设置每个组件的 DISPLAY_NAME 属性,以便获得人类可读的名称。这些名称将列在选择框中,而不是内部组件名称“应用程序”、“库”、“头文件”。

14.4.6.3 添加组件描述
还有其他几个与组件相关的属性,包括使组件在默认情况下隐藏、必需或禁用,从而提供额外的描述性信息的能力。特别需要注意的是 DESCRIPTION 属性,它为组件提供一些描述性文本。该描述文本将显示在安装程序中单独的“说明”框中,当用户将鼠标悬停在相应组件的名称上( Windows )或当用户单击组件( Mac OS X )时将更新。我们将为每个组件添加如下描述:
cpack_add_component(applications DISPLAY_NAME "MyLib Application"
DESCRIPTION
"An extremely useful application that makes use of MyLib"
)
cpack_add_component(libraries DISPLAY_NAME "Libraries"
DESCRIPTION
"Static libraries used to build programs with MyLib"
)
cpack_add_component(headers DISPLAY_NAME "C++ Headers"
DESCRIPTION "C/C++ header files for use with MyLib"
)
一般来说,描述应该为用户提供足够的信息来决定是否安装组件,但是描述本身的长度不应该超过几行(安装程序中的“描述”框往往很小)。下图显示了 Windows 和 Mac OS X 安装程序的描述显示。

14.4.6.4 组件的相互依赖性
在大多数项目中,各个组成部分并不是完全独立的。例如,一个应用程序组件可能依赖于另一个组件中的共享库才能正确执行,因此在安装应用程序组件时不使用相应的共享库将导致不可用的安装。 CPack 允许你表示组件之间的依赖关系,这样,只有当组件所依赖的所有其他组件也被安装时,该组件才会被安装。
为了说明组件依赖关系,我们将对基于组件的安装程序设置一个简单的限制。因为我们没有在安装程序中提供源代码,所以我们发布的 C++ 头文件实际上只能在用户也安装库二进制文件以链接他们的程序时使用。因此,“ headers ”组件依赖于“ libraries ”组件的可用性。我们可以通过设置 HEADERS 组件的 DEPENDS 属性来表达这个概念:
cpack_add_component(headers DISPLAY_NAME "C++ Headers"
DESCRIPTION
"C/C++ header files for use with MyLib"
DEPENDS libraries
)
组件的 DEPENDS 属性实际上是一个列表,因为这样的组件可以依赖于其他几个组件。通过以这种方式表示所有组件依赖关系,你可以确保用户在安装时选择的一定是完整的组件集。
14.4.6.5 组件分组
当项目中的组件数量增加时,你可能需要为组件列表提供额外的组织。为了帮助进行这种组织, CPack 包含了组件组的概念。组件组只是一种为一组相关组件提供名称的方法。在用户界面中,组件组有自己的名称,在该组下面是该组中所有组件的名称。用户可以通过通过一次单机或者展开组来选择单个组件来选择(或取消选择)组中所有组件的安装。
我们将扩展我们的示例,将它的三个组件“应用程序”、“库”和“头文件”分为“运行时”和“开发”组。通过使用 cpack_add_component 函数的 GROUP 选项,我们可以将一个组件放入一个组中,如下所示:
cpack_add_component(applications
DISPLAY_NAME "MyLib Application"
DESCRIPTION
"An extremely useful application that makes use of MyLib"
GROUP Runtime)
cpack_add_component(libraries
DISPLAY_NAME "Libraries"
DESCRIPTION
"Static libraries used to build programs with MyLib"
GROUP Development)
cpack_add_component(headers
DISPLAY_NAME "C++ Headers"
DESCRIPTION "C/C++ header files for use with MyLib"
GROUP Development
DEPENDS libraries
)
与组件一样,组件组也有各种可以自定义的属性,包括 DISPLAY_NAME 和 DESCRIPTION 。例如,下面的代码向“ Development ”组添加了一个扩展的描述:
cpack_add_component_group(Development
EXPANDED
DESCRIPTION
"All of the tools you'll ever need to develop software")
一旦你按照自己的喜好定制了组件组,重新构建二进制安装程序以查看新的组织: MyLib 应用程序将显示在新的“ Runtime ”组下,而 MyLib 库和 C++ 头将显示在新的“ Development ”组下。可以使用程序安装器的 GUI 轻松地打开/关闭组中的所有组件。这可以在下图中看到。

14.4.6.6 安装类型(仅 NSIS )
当项目包含大量组件时, Windows 程序安装器通常会根据特定的用户需求提供预先选择的组件集。例如,一个希望根据库来开发软件的用户将需要一组组件,而一个最终用户可能使用完全不同的一组组件。 CPack 通过安装类型来支持预先选择组件集的概念。安装类型只是一组组件。当用户选择一个安装类型时,正是选择了该组件集。然后允许用户根据需要进一步定制他们的安装。目前只有 Windows NSIS 生成器支持这一点。
对于我们的简单示例,我们将创建两种安装类型:一种是包含所有组件的“ Full ”安装类型,另一种是只包含库和头文件的“ Developer ”安装类型。为此,我们使用函数 cpack_add_install_type 来添加类型。
cpack_add_install_type(Full DISPLAY_NAME "Everything")
cpack_add_install_type(Developer)
接下来,我们设置每个组件的 INSTALL_TYPES 属性,以指定哪个安装类型将包含该组件。这是通过 cpack_add_component 函数的 INSTALL_TYPES 选项完成的。
cpack_add_component(libraries DISPLAY_NAME "Libraries"
DESCRIPTION
"Static libraries used to build programs with MyLib"
GROUP Development
INSTALL_TYPES Developer Full)
cpack_add_component(applications
DISPLAY_NAME "MyLib Application"
DESCRIPTION
"An extremely useful application that makes use of MyLib"
GROUP Runtime
INSTALL_TYPES Full)
cpack_add_component(headers
DISPLAY_NAME "C++ Headers"
DESCRIPTION "C/C++ header files for use with MyLib"
GROUP Development
DEPENDS libraries
INSTALL_TYPES Developer Full)
组件可以列在任意数量的安装类型下。如果你重新构建 Windows 安装程序,组件页面将包含一个组合框,该组合框允许你选择安装类型,从而选择相应的组件集,如下图所示。

14.4.6.7 控制 CPack 组件的变量
函数 cpack_add_install_type 、 cpack_add_component_group 和 cpack_add_component 只是设置 CPACK_ 变量。这些变量描述如下:
CPACK_COMPONENTS_ALL
- 这是应该由 CPack 安装的包含所有组件名称一个的列表。这个宏的出现表明 CPack 应该构建一个基于组件的程序安装器。与此处未列出的任何组件相关的文件,或与任何组件不相关的任何安装命令将不会被安装。
CPACK_COMPONENT_${COMPNAME}_DISPLAY_NAME
- 组件显示的名称 ${COMPNAME} ,在图形化的程序安装器中用于显示组件名称。该值可以是任何字符串。
CPACK_COMPONENT_${COMPNAME}_DESCRIPTION
- 组件 ${COMPNAME} 的扩展描述,在图形化的程序安装器中用于向用户提供关于该组件的附加信息。描述可以使用“ n ”作为行分隔符来跨越多行。
CPACK_COMPONENT_${COMPNAME}_HIDDEN
- 一个标志,表示此组件将在图形化的程序安装器中处于隐藏状态,因而不能被选择或安装。只适用于 NSIS 。
CPACK_COMPONENT_${COMPNAME}_REQUIRED
- 一个标志,表示此组件是必需的,因此将始终安装该组件。它将在图形化的程序安装器中显示,但不能取消选择。
CPACK_COMPONENT_${COMPNAME}_DISABLED
- 一个标志,表示默认情况下该组件应该被禁用(未选中)。用户可以自由选择该组件进行安装。
CPACK_COMPONENT_${COMPNAME}_DEPENDS
- 列出了此组件所依赖的组件。如果选中了此组件,则列出的每个组件都会被选择中。
CPACK_COMPONENT_${COMPNAME}_GROUP
- 命名此组件所属的组件组。如果没有提供,该组件将是一个独立的组件,而不是任何组件组的一部分。
CPACK_COMPONENT_${COMPNAME}_INSTALL_TYPES
- 列出了此组件所属的安装类型。当选择其中这种安装类型时,将自动选择此组件。只适用于 NSIS 。
CPACK_COMPONENT_GROUP_${GROUPNAME}_DISPLAY_NAME
- 组件组的显示名称 ${GROUPNAME} ,在图形化的程序安装器中用于显示组件组的名称。该值可以是任何字符串。
CPACK_COMPONENT_GROUP_${GROUPNAME}_DESCRIPTION
- 组件组 ${GROUPNAME} 的扩展描述,在图形化安装程序中用于向用户提供关于该组中包含的组件的附加信息。描述可以使用“ n ”作为行分隔符来跨越多行。
CPACK_COMPONENT_GROUP_${GROUPNAME}_BOLD_TITLE
- 一个标志,表示组标题是否应以粗体显示的。只适用于 NSIS 。
CPACK_COMPONENT_GROUP_${GROUPNAME}_EXPANDED
- 一个标志,表示组是否应该从“扩展”开始,显示其组成部分。否则,在用户单击组之前,只显示组名本身。只适用于 NSIS 。
CPACK_INSTALL_TYPE_${INSTNAME}_DISPLAY_NAME
- 安装类型的显示名称。该值可以是任何字符串。
14.5 Cygwin 安装程序的 CPack
Cygwin ( http://www.cygwin.com/ )是一个类 linux 的 Windows 环境,由一个运行时 DLL 和一组工具组成。要向官方 cygwin 添加工具,需要使用 cygwin 安装程序。设置工具对要包含的源代码和二进制树有非常具体的布局。 CPack 可以创建源文件和二进制 tar 文件,并正确地 bzip 它们,以便将它们上传到 cygwin 镜像站点。当然,在此之前,你必须让你的包被 cygwin 社区接受。由于包的布局比其他打包工具更具限制性,你可能必须更改项目的一些安装选项。
cygwin 安装程序要求将所有文件安装到 /usr/bin 、 /usr/share/package-version 、 /usr/share/man 和 /usr/share/doc/package-version 中。 cygwin CPack生成器将自动将 /usr 添加到项目的安装目录中。项目必须将文件安装到 /share 和 /bin 中, CPack 会自动添加 /usr 前缀。
Cygwin 还要求你提供一个 shell 脚本,该脚本可用于从源代码创建包。包所需的任何特定于 cygwin 的补丁也必须在 diff 文件中提供。可以使用 CMake 的 configure_file 命令为项目创建这两个文件。由于 CMake 是一个 cygwin 包,用于为 cygwin CPack 生成器配置 CMake 的 CMake 代码如下所示:
set (CPACK_PACKAGE_NAME CMake)
# 设置 cygwin 包的名称
set (CPACK_PACKAGE_FILE_NAME
"${CPACK_PACKAGE_NAME}-${CMake_VERSION}")
#源代码与二进制文件具有相同的名称
set (CPACK_SOURCE_PACKAGE_FILE_NAME ${CPACK_PACKAGE_FILE_NAME})
# 创建 cygwin 版本号,以防 cygwin 的修改没有反映在 CMake 之上
set (CPACK_CYGWIN_PATCH_NUMBER 1)
# 如果我们在 cygwin 上,并且有 CPack ,那么需要强制修改 doc 、 data 和 man 目录为符合 cygwin 风格的目录
set (CMAKE_DOC_DIR "/share/doc/${CPACK_PACKAGE_FILE_NAME}")
set (CMAKE_DATA_DIR "/share/${CPACK_PACKAGE_FILE_NAME}")
set (CMAKE_MAN_DIR "/share/man")
# 这些文件是 cmCPackCygwinSourceGenerator 需要的,这些文件放在发版的 tar 文件中。
set (CPACK_CYGWIN_BUILD_SCRIPT
"${CMake_BINARY_DIR}/@CPACK_PACKAGE_FILE_NAME@-
@CPACK_CYGWIN_PATCH_NUMBER@.sh")
set (CPACK_CYGWIN_PATCH_FILE
"${CMake_BINARY_DIR}/@CPACK_PACKAGE_FILE_NAME@-
@CPACK_CYGWIN_PATCH_NUMBER@.patch")
# 包含 cygwin 发布版的子目录
include (Utilities/Release/Cygwin/CMakeLists.txt)
# 在打包源代码时,确保排除 .build 目录
set (CPACK_SOURCE_IGNORE_FILES
"/CVS/" "/\\\\.build/" "/\\\\.svn/" "\\\\.swp$" "\\\\.#" "/#" "~$")
Utilities/Release/Cygwin/CMakeLists.txt:
# 创建 cygwin 的 setup.hint 文件
configure_file (
"${CMake_SOURCE_DIR}/Utilities/Release/Cygwin/cygwin-setup.hint.in"
"${CMake_BINARY_DIR}/setup.hint")
configure_file (
"${CMake_SOURCE_DIR}/Utilities/Release/Cygwin/README.cygwin.in"
"${CMake_BINARY_DIR}/Docs/@CPACK_PACKAGE_FILE_NAME@-
@CPACK_CYGWIN_PATCH_NUMBER@.README")
install_files (/share/doc/Cygwin FILES
${CMake_BINARY_DIR}/Docs/@CPACK_PACKAGE_FILE_NAME@-
@CPACK_CYGWIN_PATCH_NUMBER@.README)
# 创建可以构建项目的 shell 脚本
configure_file (
"${CMake_SOURCE_DIR}/Utilities/Release/Cygwin/cygwin-package.sh.in"
${CPACK_CYGWIN_BUILD_SCRIPT})
# 为项目创建 cygwin 所需的补丁
configure_file (
"${CMake_SOURCE_DIR}/Utilities/Release/Cygwin/cygwin-patch.diff.in"
${CPACK_CYGWIN_PATCH_FILE})
文件 Utilities/Release/Cygwin/ Cygwin-package.sh.in 可以在 CMake 源代码树中找到。它是一个 shell 脚本,可用于从源代码重建 cygwin 包。对于其他项目,可以在 Templates/cygwin-package.sh.in 中找到模板安装脚本。该脚本应该能够配置和打包任何基于 cygwin 的 CPack 项目,并且所有官方 cygwin 包都需要它。
另一个重要的 cygwin 二进制文件是 share/doc/cygwin/package-version.README 。这个文件应该包含 cygwin 所需的关于项目的信息。在使用 CMake 的情况下,该文件被配置,以包含正确的版本信息。例如,该文件用于CMake的部分看起来像这样:
Build instructions:
unpack CMake-2.5.20071029-1-src.tar.bz2
if you use setup to install this src package, it will be
unpacked under /usr/src automatically
cd /usr/src
./CMake-2.5.20071029-1.sh all
This will create:
/usr/src/CMake-2.5.20071029.tar.bz2
/usr/src/CMake-2.5.20071029-1-src.tar.bz2
14.6 Mac OS X PackageMaker 的 CPack
在 Apple Mac OS X 操作系统上, CPack 提供了使用系统 PackageMaker 工具的能力。本节将展示用户在 OS X 上安装 CMake 包时看到的 CMake 应用程序安装界面。为更改安装程序中的文本而设置的 CPack 变量将在程序安装器的每个界面中展示出来。

在上图中,可以看到在 Mac OS X 的 CPack 包生成器创建的 .dmg 磁盘映像中找到的 .pkg 文件。该文件的名称由 CPACK_PACKAGE_FILE_NAME 变量控制。如果没有设置, CPack 将使用基于包名和版本设置的默认名称。

当 .pkg 文件运行时,包向导将从上图所示的界面开始。此窗口中的文本由 CPACK_RESOURCE_FILE_WELCOME 变量所指向的文件控制。

上图显示了包向导的 read me 部分。这个窗口的文本是通过使用 CPACK_RESOURCE_FILE_README 变量定制的。它应该包含一个文件的路径,该文件包含应该在此界面上显示的文本。

上图包含包的许可证文本。用户必须接受许可证才能继续安装过程。许可证的文本来自 CPACK_RESOURCE_FILE_LICENSE 变量所指向的文件。
安装过程中的其他界面不能从 CPack 中定制。要更改此安装程序的更高级功能,你可以修改两个 CPack 模板: Modules/CPack.info.plist.in 和 Modules/CPack.Description.plist.in 。通过使用 CMAKE_MODULE_PATH 变量来指向项目中的一个目录,该目录包含其中一个或全部两个的修改副本,可以替换这些文件。
14.7 Mac OS X Drag and Drop 的 CPack
CPack 还支持为 Mac 创建拖放程序安装器。在这种情况下,将创建一个 .dmg 磁盘映像。该映像既包含指向 /Applications 目录的符号链接,也包含项目安装树的副本。在这种情况下,最好使用 Mac 应用程序包或包含可重定位安装的单个文件夹作为项目的唯一安装目标。变量 CPACK_PACKAGE_EXECUTABLES 用于指向项目的应用程序包。


14.8 Mac OS X X11 应用程序的 CPack
CPack 还包含一个 OS X X11 包生成器。这可以用来打包基于 X11 的应用程序,也通过将它们包装在一个脚本中,允许用户像运行任何本地 OS X 应用程序一样运行它们,使它们更像本地 OS X 应用程序。与 OS X PackeMaker 生成器非常类似, OS X X11 生成器创建一个磁盘映像 .dmg 文件。在本例中, OS X X11 CPack 生成器打包一个名为 KWPolygonalObjectViewerExample 的 X11 应用程序。

上图显示了创建的磁盘映像。在本例中, CPACK_PACKAGE_NAME 被设置为 KWPolygonalObjectViewerExample ,版本信息保留了 CPack 的默认值 0.1.1 。变量CPACK_PACKAGE_EXECUTABLES被设置为一对(a pair) KWPolygonalObjectViewerExample 和 KWPolygonalObjectViewerExample ,安装的 X11 应用程序称为 KWPolygonalObjectViewerExample 。

上图显示了单击 CPack 创建的 .dmg 文件后用户将看到的内容。 Mac OS X 正在将此磁盘映像挂载为磁盘。

上图显示挂载的磁盘映像。它将包含指向系统 /Applications 目录的符号链接,并且它将包含 CPACK_PACKAGE_EXECUTABLES 中找到的每个可执行文件的应用程序包。然后,用户可以将应用程序拖放到 Applications 文件夹中,如下图所示。

CPack 实际上提供了一个基于 C++ 的可执行文件,它可以通过 Apple 脚本语言运行 X11 应用程序。当用户双击 KWPolygonalObjectViewerExample 时,安装的应用程序包将运行该转发应用程序。这个脚本将确保启动 X11 服务器。运行的脚本可以在 CMake/Modules/cpack.runtimesscript.in 中找到。脚本启动器 C++ 程序的源代码可以在 Source/CPack/OSXScriptLauncher.cxx 中找到。
14.9 Debian 包的 CPack
Debian 包 .deb 只是一个“ ar ”归档文件。 CPack 包含 Debian 包所需要的 BSD 风格 ar 的代码。 Debian 打包器使用标准的 CPack 变量集合来初始化一组特定于 Debian 的变量。这些可以在 CPACK_PROJECT_CONFIG_FILE 中被覆盖。生成器的名称为“ DEB ”。 DEB 生成器使用的变量如下:
CPACK_DEBIAN_PACKAGE_NAME
- 默认为小写的 CPACK_PACKAGE_NAME 。
CPACK_DEBIAN_PACKAGE_ARCHITECTURE
- 默认为 i386 。
CPACK_DEBIAN_PACKAGE_DEPENDS
- 这必须设置为此包所依赖的其他包,如果为空则会发出警告。
CPACK_DEBIAN_PACKAGE_MAINTAINER
- 默认为 CPACK_PACKAGE_CONTACT 的值。
CPACK_DEBIAN_PACKAGE_DESCRIPTION
- 默认为 CPACK_PACKAGE_DESCRIPTION_SUMMARY 的值。
CPACK_DEBIAN_PACKAGE_SECTION
- 默认为 devl 。
CPACK_DEBIAN_PACKAGE_PRIORITY
- 默认为 optional 。
14.10 RPM 的 CPack
CPack 支持创建 Linux RPM 文件。在 CPACK_GENERATOR 中设置的生成器的名称是“ RPM ”。 RPM 包功能要求在机器上安装 rpmbuild ,并且在 PATH 中。 RPM 打包器使用标准的 CPack 变量集来初始化 RPM 特定的变量。 RPM 的具体变量如下:
CPACK_RPM_PACKAGE_SUMMARY
- 默认为 CPACK_PACKAGE_DESCRIPTION_SUMMARY 。
CPACK_RPM_PACKAGE_NAME
- 默认为小写的 CPACK_PACKAGE_NAME 。
CPACK_RPM_PACKAGE_VERSION
- 默认为 CPACK_PACKAGE_VERSION 。
CPACK_RPM_PACKAGE_ARCHITECTURE
- 默认为 i386 。
CPACK_RPM_PACKAGE_RELEASE
- 默认值为 1 。这是 RPM 文件的版本,而不是打包的软件的版本。
CPACK_RPM_PACKAGE_GROUP
- 默认为 none 。
CPACK_RPM_PACKAGE_VENDOR
- 默认为 CPACK_PACKAGE_VENDOR 。
14.11 CPack 文件
CPack 使用的许多文件对于了解更多关于 CPack 如何工作以及可以设置哪些选项可能很有用。这些文件还可以用作 CPack 的其他生成器的起点。这些文件大多可以在 CMake 的 Modules 和 Templates 目录中找到,通常以 CPack 前缀开头。从 2.8.8 版本开始,你还可以使用 cpack ——help-variable-list 和 cpack ——help-variable 来获取已记录的 CPACK_* 变量的完整集合。