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")

这样写,每次发版都要手动改。你想想看,项目大了,十几个子模块,每个都要改一遍?不现实。

我建议的做法是:

  1. 在项目根目录的 CMakeLists.txt 里定义版本号变量
  2. 用 project() 命令的 VERSION 参数
  3. 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 三个变量的关系

这三个变量组合起来,就构成了安装包的基本身份信息。我画个图帮你理解:

CPACK_PACKAGE_NAME 包名:MyApp CPACK_PACKAGE_VERSION 版本:2.1.3 CPACK_PACKAGE_DESCRIPTION_SUMMARY 描述:轻量HTTP服务器 MyApp-2.1.3-Linux.deb

你看,三个变量拼在一起,就得到了最终的安装包文件名。这个文件名,就是用户下载后看到的第一个东西。所以,别马虎。

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 配置就成功了一半。下一节,咱们聊聊更高级的打包选项。