4. CPack核心配置:CPACK_PACKAGE_NAME、CPACK_PACKAGE_VERSION、CPACK_PACKAGE_DESCRIPTION_SUMMARY
好,咱们进入正题。CPack 的配置,说白了就是告诉打包工具:「你要打的包叫什么名字?版本号是多少?给别人看的时候怎么介绍?」
这三个变量,是 CPack 配置里最基础、也最容易被忽略的。我见过不少项目,打包出来的安装包名字乱起八糟,版本号写死,描述就一行「My Project」。嗯,这样其实也能用,但到了正式发布的时候,你就知道有多坑了。
4.1 CPACK_PACKAGE_NAME:包的名字,别乱取
这个变量决定了最终安装包的文件名。比如你设成 MyApp,那 Linux 下可能生成 MyApp-1.0.0-Linux.deb,Windows 下就是 MyApp-1.0.0-win64.exe。
我个人习惯,包名尽量和项目名保持一致。但要注意几点:
- 不要带空格。虽然某些平台支持,但跨平台打包时容易出幺蛾子。
- 不要用中文。不是歧视,是很多打包工具对 Unicode 支持不好。
- 区分大小写。Linux 下大小写敏感,Windows 不敏感,但建议统一用小写。
重要:包名一旦确定,尽量不要改。否则用户升级时会遇到「旧包没卸载,新包装不上」的尴尬。
举个例子,我在做一个跨平台工具链时,一开始包名叫 ToolChain,后来改成 toolchain,结果 RPM 包管理器直接报冲突。从那以后,我都是先想好名字,再写 CMakeLists.txt。
4.2 CPACK_PACKAGE_VERSION:版本号,别写死
版本号这东西,看起来简单,但坑不少。很多人直接在 CMakeLists.txt 里写:
set(CPACK_PACKAGE_VERSION "1.0.0")
这样写,每次发版都要手动改。你想想看,项目大了,十几个子模块,每个都要改一遍?不现实。
我建议的做法是:
- 在项目根目录的
CMakeLists.txt里定义版本号变量 - 用
project()命令的 VERSION 参数 - CPack 配置里直接引用
# 项目根 CMakeLists.txt
project(MyApp VERSION 2.1.3)
# CPack 配置
set(CPACK_PACKAGE_VERSION "${PROJECT_VERSION}")
这样改一处,全局生效。我曾经在一个嵌入式项目里,因为版本号写死,导致固件和上位机版本不匹配,调试了整整两天。嗯,从那以后我再也不敢写死版本号了。
4.3 CPACK_PACKAGE_DESCRIPTION_SUMMARY:一句话说清楚
这个变量是给用户看的。在安装包的信息面板、包管理器的描述里,都会显示它。
别写「This is my project」这种废话。要写清楚:
- 这个软件是干什么的
- 主要功能是什么
- 目标用户是谁
小技巧:描述控制在 80 个字符以内。太长了,包管理器会截断。
比如:
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "A lightweight HTTP server for embedded systems")
而不是:
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "My project")
说白了,这个描述就是你的软件名片。用户第一眼看到的就是它。我见过一个项目,描述写的是「A tool」,结果下载量惨淡。改成「A CLI tool for automated code review」之后,下载量翻了三倍。别小看这一行字。
4.4 三个变量的关系
这三个变量组合起来,就构成了安装包的基本身份信息。我画个图帮你理解:
你看,三个变量拼在一起,就得到了最终的安装包文件名。这个文件名,就是用户下载后看到的第一个东西。所以,别马虎。
4.5 实战配置模板
最后,给你一个我常用的配置模板。直接复制过去改改就能用:
# 项目信息
set(CPACK_PACKAGE_NAME "myapp")
set(CPACK_PACKAGE_VERSION "${PROJECT_VERSION}")
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "A fast and reliable file synchronization tool")
# 可选但推荐
set(CPACK_PACKAGE_VENDOR "My Company")
set(CPACK_PACKAGE_CONTACT "support@mycompany.com")
set(CPACK_PACKAGE_HOMEPAGE_URL "https://mycompany.com")
注意:如果 CPACK_PACKAGE_VERSION 没设置,CPack 会尝试从 PROJECT_VERSION 读取。但为了保险,还是显式设置一下比较好。
好了,这一节就到这里。记住这三个变量的作用,你的 CPack 配置就成功了一半。下一节,咱们聊聊更高级的打包选项。