CPack

配置二进制安装程序和源软件包的生成器。

简介

CPack 模块生成配置文件 CPackConfig.cmakeCPackSourceConfig.cmake。它们旨在用于后续运行 cpack 程序,其中它们指导安装程序或/和源软件包的生成。

根据 CMake 生成器,CPack 模块可能还会添加两个新的构建目标 packagepackage_source。有关详细信息,请参见下面的打包目标章节。

生成的二进制安装程序将包含通过 CMake 的 install() 命令(以及已弃用的命令 install_files()install_programs()以及 install_targets())安装的所有文件。注意,install() 命令的 DESTINATION 选项必须是相对路径;否则,CPack 将忽略已安装的文件。

可以配置某些种类的二进制安装程序,以便用户可以选择要安装的各个应用程序组件。有关更多详细信息,请参见CPackComponent模块。

源软件包(通过 CPackSourceConfig.cmake 配置并通过 CPack Archive Generator 生成)将包含项目目录中的所有源文件,但 CPACK_SOURCE_IGNORE_FILES中指定的文件除外。

CPack 生成器

CPACK_GENERATOR变量在不同的上下文中具有不同的含义。在一个CMakeLists.txt文件中,CPACK_GENERATOR是一个生成器列表:当cpack在没有其他参数的情况下运行时,它将迭代该列表并为每个生成器生成一个包。在CPACK_PROJECT_CONFIG_FILE中,CPACK_GENERATOR是一个字符串,指定单个生成器名称。如果您需要每个cpack生成器的逻辑来控制其他cpack设置,那么您将需要一个CPACK_PROJECT_CONFIG_FILE。如果已设置,CPACK_PROJECT_CONFIG_FILE会根据每个生成器自动包含。它只需要包含改写内容。

以下是它的工作原理

  • cpack运行

  • 它包含CPackConfig.cmake

  • 它迭代由-G命令行选项给出的生成器,或者如果没有指定此类选项,则迭代CPackConfig.cmake输入文件中设置的CPACK_GENERATOR变量给出的生成器列表。

  • 对每个生成器,然后

这是要点:对于中列出的每个生成器CPACK_GENERATOR in CPackConfig.cmake,cpack 将在内部将CPACK_GENERATOR重置当前正在使用的那一个,然后包含CPACK_PROJECT_CONFIG_FILE

要查看可用生成器的列表,请参阅cpack-generators(7)

目标 package 和 package_source

如果使用 Makefile、Ninja 或 Xcode 生成器运行 CMake,则 include(CPack) 将生成目标 package。这使得可以从 CMake、Make 或 Ninja 中构建二进制安装程序:可以调用 cmake --build . --target packagemake packageninja package,而不是 cpack。VS 生成器将创建大写目标 PACKAGE

如果使用 Makefile 或 Ninja 生成器运行 CMake,则 include(CPack) 还将生成目标 package_source。要构建源程序包,可以调用 cmake --build . --target package_sourcemake package_sourceninja package_source,而不是 cpack -G TGZ --config CPackSourceConfig.cmake

所有 CPack 生成器通用的变量

在将此 CPack 模块包含在 CMakeLists.txt 文件中之前,可设置各种变量来自定义最终的安装程序。最常用的变量是

CPACK_PACKAGE_NAME

程序包(或应用程序)的名称。如果未指定,则默认为项目名称。

CPACK_PACKAGE_VENDOR

程序包供应商的名称。(例如,“Kitware”)。默认值为“Humanity”。

CPACK_PACKAGE_DIRECTORY

CPack 正在进行打包的目录。如果未设置,这将(在内部)默认值为构建目录。这个变量可以在 CPack 配置文件中定义或从cpack命令行选项 -B中定义。如果已设置,则命令行选项将覆盖在配置文件中找到的值。

CPACK_PACKAGE_VERSION_MAJOR

包主版本。此变量将始终设置,但其默认值取决于是否向顶级 CMakeLists.txt 文件中的 project() 命令提供了版本详细信息。如果提供了版本详细信息,默认值将是 CMAKE_PROJECT_VERSION_MAJOR。如果没有提供任何版本详细信息,将假定一个默认版本 0.1.1,导致 CPACK_PACKAGE_VERSION_MAJOR 的默认值为 0。

CPACK_PACKAGE_VERSION_MINOR

包次版本。默认值根据是否向顶级 CMakeLists.txt 文件中的 project() 命令提供了版本详细信息来确定。如果提供了版本详细信息,默认值将是 CMAKE_PROJECT_VERSION_MINOR,但是如果没有指定次版本组件,则将不设置 CPACK_PACKAGE_VERSION_MINOR。如果根本没有提供项目版本,将假定一个默认版本 0.1.1,导致 CPACK_PACKAGE_VERSION_MINOR 的默认值为 1。

CPACK_PACKAGE_VERSION_PATCH

包修补版本。默认值根据是否向顶级 CMakeLists.txt 文件中的 project() 命令提供了版本详细信息来确定。如果提供了版本详细信息,默认值将是 CMAKE_PROJECT_VERSION_PATCH,但是如果没有指定修补版本组件,则将不设置 CPACK_PACKAGE_VERSION_PATCH。如果根本没有提供项目版本,将假定一个默认版本 0.1.1,导致 CPACK_PACKAGE_VERSION_PATCH 的默认值为 1。

CPACK_PACKAGE_DESCRIPTION

项目的说明,用于诸如 CPack 生成的 Windows 安装程序简介屏幕之类的区域。如果没有设置,此变量的值将由 CPACK_PACKAGE_DESCRIPTION_FILE 命名的文件设定。

CPACK_PACKAGE_DESCRIPTION_FILE

在未明确设置CPACK_PACKAGE_DESCRIPTION时,描述项目的文本文件。 CPACK_PACKAGE_DESCRIPTION_FILE的默认值指向内置模板文件 Templates/CPack.GenericDescription.txt

CPACK_PACKAGE_DESCRIPTION_SUMMARY

项目的简短描述(仅含几个单词)。如果设置了 CMAKE_PROJECT_DESCRIPTION 变量,则将其用作默认值,否则,默认值为由 CMake 根据 CMAKE_PROJECT_NAME 生成的字符串。

CPACK_PACKAGE_HOMEPAGE_URL

项目主页 URL。默认值取自 CMAKE_PROJECT_HOMEPAGE_URL 变量,该变量由顶层 project() 命令设置,或者,如果未向 project() 提供 URL,则默认值为空。

CPACK_PACKAGE_FILE_NAME

要生成的包文件的名称,不包括扩展名。例如, cmake-2.6.1-Linux-i686。默认值为

${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}-${CPACK_SYSTEM_NAME}
CPACK_PACKAGE_INSTALL_DIRECTORY

目标系统上的安装目录。某些 CPack 生成器(如 NSIS)可能会使用此目录来创建安装目录,例如在安装前缀下名为“CMake 2.5”的目录。所有已安装元素均将放入此目录中。

CPACK_PACKAGE_ICON

将在安装程序内显示的品牌图片(由 GUI 安装程序使用)。

CPACK_PACKAGE_CHECKSUM

已在版本 3.7 中添加。

用于生成一个额外文件的算法,其中包含包的校验和。输出文件名将为

${CPACK_PACKAGE_FILE_NAME}.${CPACK_PACKAGE_CHECKSUM}

支持的算法为 string(<HASH>) 命令中所列的算法。

CPACK_PROJECT_CONFIG_FILE

用于 CPack 时的项目 CPack 配置文件。此文件在 CPack 时期(在 CPack 设置 CPACK_GENERATOR 为实际使用的生成器之后)包含一次。它允许在 CPack 时期根据生成器设置 CPACK_* 变量。

CPACK_RESOURCE_FILE_LICENSE

嵌入在安装程序中的许可证。它通常会在安装之前由生成的安装程序(图形化安装程序中通常带有一个显式的“Accept”按钮)向用户显示。此许可证文件不会添加到已安装文件中,但会被一些 CPack 生成器(如 NSIS)使用。如果要使用 UTF-8 字符,则需要使用 UTF-8 BOM 对文件进行编码。如果要连同您的项目一起安装一个许可证文件(可能是与这个文件相同的许可证),您必须在 CMakeLists.txt 中添加一个恰当的 CMake install() 命令。

CPACK_RESOURCE_FILE_README

嵌入在安装程序中的自述文件。在安装期间,此文件通常会详细介绍此项目的用途。并非所有 CPack 生成器都会使用此文件。

CPACK_RESOURCE_FILE_WELCOME

嵌入在安装程序中的欢迎文件。它对用户对此安装程序表示欢迎。通常用于 Windows 和 Mac OS X 上的图形化安装程序中。

CPACK_MONOLITHIC_INSTALL

禁用基于组件的安装机制。设置后,将忽略组件规范,并且所有已安装项目都将放到一个单个的“MONOLITHIC”包中。一些 CPack 生成器默认进行整体打包,而通过将 CPACK_<GENNAME>_COMPONENT_INSTALL 设置为 TRUE,可请求这些生成器执行组件打包。

CPACK_GENERATOR

要使用的 CPack 生成器列表。如果没有指定,CPack 将按照命名模式 CPACK_BINARY_<GENNAME>(例如 CPACK_BINARY_NSIS)创建一个选项集,允许用户启用/禁用各个生成器。如果在 cpack 命令行上提供 -G 选项,它将覆盖此变量和任何 CPACK_BINARY_<GENNAME> 选项。

CPACK_OUTPUT_CONFIG_FILE

CPack 二进制配置文件的名称。此文件是 CPack 模块为二进制安装程序生成的 CPack 配置。默认为 CPackConfig.cmake

CPACK_PACKAGE_EXECUTABLES

列出用于创建“开始”菜单快捷方式的每个可执行文件和关联文本标签。例如,将此项设置为列表 ccmake;CMake 将创建一个名为“CMake”的快捷方式来执行已安装的可执行文件 ccmake。并非所有 CPack 生成器都会使用它(至少 NSIS、Inno Setup 和 WIX 使用它)。

CPACK_STRIP_FILES

要移除的文件列表。从 CMake 2.6.0 开始,CPACK_STRIP_FILES 将成为一个布尔变量,用于移除所有文件(在 CMake 中,文件列表评估为 TRUE,因此此项更改是兼容的)。

CPACK_VERBATIM_VARIABLES

在版本 3.4 中添加。

如果设置为 TRUE,将在写入配置文件之前转义以 CPACK_ 为前缀的变量的值,以便 cpack 程序完全按照指定内容接收它们。如果没有,引用和反斜杠之类的字符可能会导致解析错误或更改 cpack 程序接收的值。出于向后兼容性的考虑,默认为 FALSE

CPACK_THREADS

在版本 3.20 中添加。

在执行并行操作(例如压缩安装程序包)时要使用的线程数。

CPack 生成器(例如 Debian 或 Archive)使用的一些压缩方法可能会利用多个 CPU 核心来加快压缩速度。可以设置 CPACK_THREADS 以指定用于压缩的线程数。

可以用正整数来指定确切的所需线程数。

如果给定一个负整数,CPack 会将绝对值用作上限,但根据可用的硬件并发性可能会选择一个较低的值。

在给定 0 的情况下,CPack 会尝试使用所有可用的 CPU 核心。

默认情况下,CPACK_THREADS 设置为 1

以下压缩方法可能会利用多个核心

xz

如果 CMake 使用支持并行压缩的 liblzma 构建,则支持。

在版本 3.21 中添加: 现在 cmake.org 上提供的官方 CMake 二进制文件随附支持并行压缩的 liblzma。旧版本没有。

zstd

在版本 3.24 中添加。

如果 CMake 使用 libarchive 3.6 或更高版本构建,则支持。它支持在 cmake.org 上提供的官方 CMake 二进制文件。

其他压缩方法会忽略此值,并且只使用一个线程。

源代码包生成器的变量

以下 CPack 变量特定于源代码包,并且不会影响二进制包

CPACK_SOURCE_PACKAGE_FILE_NAME

源包的名称。例如 cmake-2.6.1

CPACK_SOURCE_STRIP_FILES

源树中将被剥离的文件列表。从 CMake 2.6.0 开始,CPACK_SOURCE_STRIP_FILES 将是一个布尔变量,该变量将剥离所有文件(文件列表在 CMake 中计算为 TRUE,因此此更改是兼容的)。

CPACK_SOURCE_GENERATOR

用于源包的生成器列表。与 CPACK_GENERATOR 中一样,如果没有指定,则 CPack 将创建一组选项(例如 CPACK_SOURCE_ZIP),允许用户选择要生成的包。

CPACK_SOURCE_OUTPUT_CONFIG_FILE

CPack 源配置文件的名称。此文件是 CPack 模块为源安装程序生成的 CPack 配置文件。默认为 CPackSourceConfig.cmake

CPACK_SOURCE_IGNORE_FILES

构建源包时不会打包的源树中文件的模式。这是一组正则表达式模式(必须具有正确的转义字符),例如 /CVS/;/\\.svn/;\\.swp$;\\.#;/#;.*~;cscope.*

用于高级用途的变量

以下变量用于 CPack 的高级用途

CPACK_CMAKE_GENERATOR

如果项目是一个 CMake 项目,则应该使用哪种 CMake 生成器。默认为 CMAKE_GENERATOR 的值。很少有用户需要更改此设置。

CPACK_INSTALL_CMAKE_PROJECTS

指定要安装哪个项目的四个值列表。这四个值是:构建目录、项目名称、项目组件、目录。如果省略,CPack 将构建一个安装程序来安装所有内容。

CPACK_SYSTEM_NAME

系统名称,默认为 CMAKE_SYSTEM_NAME 的值,但在 Windows 上将是 win32win64

CPACK_PACKAGE_VERSION

软件包的完整版,供内部使用。默认情况下,这是从 CPACK_PACKAGE_VERSION_MAJORCPACK_PACKAGE_VERSION_MINORCPACK_PACKAGE_VERSION_PATCH 构建的。

CPACK_TOPLEVEL_TAG

已安装文件的目录。

CPACK_INSTALL_COMMANDS

安装组件的额外命令。在执行过程中,环境变量 CMAKE_INSTALL_PREFIX 被设置为临时安装目录。

CPACK_INSTALL_SCRIPTS

已在第 3.16 版中添加。

本地暂存安装期间 CPack 执行的额外 CMake 脚本。在安装要打包的文件之前执行它们。独立安装(例如:make install)不会调用这些脚本。对于每个脚本,将设置以下变量:CMAKE_CURRENT_SOURCE_DIRCMAKE_CURRENT_BINARY_DIRCMAKE_INSTALL_PREFIX(将其设置为暂存安装目录)。单数形式 CMAKE_INSTALL_SCRIPT 受支持,作为替代变量,出于历史原因,但是如果 CMAKE_INSTALL_SCRIPTS 已设置且会发出警告,则将忽略其值。

另请参阅 CPACK_PRE_BUILD_SCRIPTSCPACK_POST_BUILD_SCRIPTS,可用于指定将在打包过程中稍后执行的脚本。

CPACK_PRE_BUILD_SCRIPTS

已在第 3.19 版中添加。

在 CPack 将要打包的文件安装到临时目录并使用这些文件生成包之前执行 CMake 脚本的列表。另请参阅 CPACK_INSTALL_SCRIPTSCPACK_POST_BUILD_SCRIPTS

CPACK_POST_BUILD_SCRIPTS

已在第 3.19 版中添加。

在 CPack 生成结果包之前并且将结果包复制回构建目录之前执行 CMake 脚本的列表。另请参阅 CPACK_INSTALL_SCRIPTSCPACK_PRE_BUILD_SCRIPTSCPACK_PACKAGE_FILES

CPACK_PACKAGE_FILES

已在第 3.19 版中添加。

以绝对路径形式创建位于临时目录中的包文件列表。此变量由 CPack 在调用 CPACK_POST_BUILD_SCRIPTS 中列出的构建后脚本之前填充。对于构建后脚本而言,这是了解待操作包文件集的首选方式。项目不应尝试自行设置此变量。

CPACK_INSTALLED_DIRECTORIES

需安装的其他目录。

CPACK_PACKAGE_INSTALL_REGISTRY_KEY

安装此项目时使用的注册表项。此项仅由适用于 Windows 的安装程序使用。默认值基于安装目录。

要创建的桌面链接列表。每个桌面链接需要一个由 CPACK_PACKAGE_EXECUTABLES 创建的对应的开始菜单快捷方式。

CPACK_BINARY_<GENNAME>

CPack 为二进制生成器生成了选项。当CPACK_GENERATOR(没有设置)时,CPack.cmake 模块生成一组 CMake 选项(参见 CMake option() 命令),这些选项随后可用于选择在构建 package 目标或在未带 -G 选项的情况下运行 cpack 时要使用的 CPack 生成器。

CPACK_READELF_EXECUTABLE

在版本 3.25 中添加了该选项。

指定 CPack 使用的 readelf 可执行路径。如果已设置 CMAKE_READELF 变量(可能已由内部 CMake 模块填充),则会从该变量中获取默认值。如果未设置 CMAKE_READELF,则 CPack 将使用find_program()在需要时确定readelf路径。

CPACK_OBJCOPY_EXECUTABLE

在版本 3.25 中添加了该选项。

指定 CPack 使用的 objcopy 可执行路径。如果已设置 CMAKE_OBJCOPY 变量(可能已由内部 CMake 模块填充),则会从该变量中获取默认值。如果未设置 CMAKE_OBJCOPY,则 CPack 将使用 find_program() 在需要时确定 objcopy 路径。

CPACK_OBJDUMP_EXECUTABLE

在版本 3.25 中添加了该选项。

指定 CPack 使用的 objdump 可执行路径。如果已设置 CMAKE_OBJDUMP 变量(可能已由内部 CMake 模块填充),则会从该变量中获取默认值。如果未设置 CMAKE_OBJDUMP,则 CPack 将使用 find_program() 在需要时确定 objdump 路径。