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安装包也一样。
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包就要求版本号里不能有连字符,但补丁号可以单独放。
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的变量可以从多个地方设置:
- CMakeLists.txt 中直接 set
- 通过
-D命令行参数传入 - CPack配置文件(CPackConfig.cmake)
优先级顺序是:命令行 > CPackConfig.cmake > CMakeLists.txt。我建议把核心变量放在CMakeLists.txt里,把平台相关的覆盖放到CPackConfig.cmake中。这样结构清晰,也方便维护。
好了,核心变量就这些。记住一点——这些变量不是摆设,每个都对应着最终包里的具体字段。设对了,用户拿到包就能看懂;设错了,轻则信息不对,重则包都打不出来。下一节我们聊聊更高级的变量用法,到时候你会发现,这些基础变量玩熟了,后面的东西就水到渠成了。