3. CPack变量体系:核心变量详解

说实话,我刚接触CPack那会儿,也被这堆变量搞得有点晕。CPACK_PACKAGE_NAME、CPACK_PACKAGE_VERSION、CPACK_PACKAGE_VENDOR……名字都挺像,但各自管的事儿完全不同。今天我就带你把这些核心变量彻底捋清楚。

3.1 CPACK_PACKAGE_NAME:你的包叫什么?

这个变量最简单,就是定义你的软件包叫什么名字。我习惯把它设成和项目名一致,但也不绝对。

set(CPACK_PACKAGE_NAME "MyAwesomeApp")

它会直接影响生成的文件名。比如在Linux上生成deb包,文件名就会是 MyAwesomeApp_1.0.0_amd64.deb。Windows上的NSIS安装包也一样。

小技巧: 我个人习惯把包名设成全小写,不带空格。为什么呢?因为有些Linux发行版对包名大小写敏感,空格更是麻烦。比如 my-awesome-app 就比 My Awesome App 省心得多。

3.2 CPACK_PACKAGE_VERSION:版本号的艺术

版本号这事儿,看着简单,坑可不少。CPack默认会从 PROJECT_VERSION 继承版本号,但你也可以单独设置。

set(CPACK_PACKAGE_VERSION "2.1.0")

这里有个细节——CPack其实把版本号拆成了三部分:

变量名 说明 示例
CPACK_PACKAGE_VERSION_MAJOR 主版本号 2
CPACK_PACKAGE_VERSION_MINOR 次版本号 1
CPACK_PACKAGE_VERSION_PATCH 补丁版本号 0

为什么要拆开?因为有些包格式需要单独处理这些字段。比如RPM包就要求版本号里不能有连字符,但补丁号可以单独放。

注意: 我曾经遇到过一个坑——在Windows上用WiX生成MSI包时,版本号格式必须是 X.X.X 三段,少一段都不行。如果你的项目只用两段版本号,记得补上第三段,否则CPack会报错。

3.3 CPACK_PACKAGE_VENDOR:谁做的包?

这个变量定义的是供应商信息。说白了就是告诉用户:「这包是谁家出的」。

set(CPACK_PACKAGE_VENDOR "My Company Inc.")

不同包格式对这个字段的处理方式不太一样:

  • deb包:会写入 Maintainer 字段
  • RPM包:对应 Vendor 标签
  • NSIS安装包:显示在安装界面的标题栏上

嗯,这里要注意——有些包格式对供应商信息有字符限制。比如deb包的Maintainer字段,官方建议格式是 姓名 <邮箱>。我一般会这样写:

set(CPACK_PACKAGE_VENDOR "Zhang San <zhangsan@example.com>")

3.4 其他核心变量一览

除了上面三个,还有几个变量我几乎每个项目都会用到:

变量名 作用 我的建议值
CPACK_PACKAGE_DESCRIPTION_SUMMARY 简短描述(一行) "A powerful tool for data processing"
CPACK_PACKAGE_DESCRIPTION 详细描述(多行) 用 \\n 分隔段落
CPACK_PACKAGE_CONTACT 联系方式 邮箱或网址
CPACK_PACKAGE_ICON 图标路径 建议用PNG格式
核心原则: 这些变量不是孤立存在的。它们共同决定了用户看到的包信息。你想想看,如果 CPACK_PACKAGE_NAME 写的是 "MyApp",但 CPACK_PACKAGE_VENDOR 写的是 "Other Company",用户会怎么想?

3.5 实战:一个完整的配置示例

说了这么多,不如直接看一个我实际项目中的配置:

# 基础信息
set(CPACK_PACKAGE_NAME "data-analyzer")
set(CPACK_PACKAGE_VERSION "3.2.1")
set(CPACK_PACKAGE_VENDOR "DataTech Inc. <support@datatech.com>")

# 描述信息
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "High-performance data analysis tool")
set(CPACK_PACKAGE_DESCRIPTION "Data Analyzer is a command-line tool for processing large datasets.\\nIt supports CSV, JSON, and Parquet formats.")

# 其他配置
set(CPACK_PACKAGE_CONTACT "support@datatech.com")
set(CPACK_PACKAGE_ICON "${CMAKE_SOURCE_DIR}/icons/app.png")

这个配置我用了快两年,在Ubuntu、CentOS和Windows上都跑得挺好。说白了,CPack的变量体系就像搭积木——你把这些核心变量设对了,后面的打包工作就顺了。

避坑指南: 我曾经在 CPACK_PACKAGE_DESCRIPTION 里用了中文,结果在英文系统上生成的deb包描述全是乱码。后来我学乖了——描述信息统一用英文,或者用 \\n 手动控制换行。

3.6 变量优先级:谁覆盖谁?

最后聊一个容易忽略的点——变量优先级。CPack的变量可以从多个地方设置:

  1. CMakeLists.txt 中直接 set
  2. 通过 -D 命令行参数传入
  3. CPack配置文件(CPackConfig.cmake)

优先级顺序是:命令行 > CPackConfig.cmake > CMakeLists.txt。我建议把核心变量放在CMakeLists.txt里,把平台相关的覆盖放到CPackConfig.cmake中。这样结构清晰,也方便维护。

好了,核心变量就这些。记住一点——这些变量不是摆设,每个都对应着最终包里的具体字段。设对了,用户拿到包就能看懂;设错了,轻则信息不对,重则包都打不出来。下一节我们聊聊更高级的变量用法,到时候你会发现,这些基础变量玩熟了,后面的东西就水到渠成了。