1、CPack入门:什么是CPack?为什么需要CPack?CPack在CMake生态中的位置。
1.1 从一个打包痛点说起
先聊个我自己的经历。几年前我参与一个跨平台项目,要在Windows、Linux、macOS上分发。CMake构建没问题,但到了打包环节——嗯,简直是一场噩梦。
Windows上要用NSIS,Linux上要打deb包,macOS得做dmg。每个平台一套脚本,语法完全不同。更糟的是,每次更新版本号,我得改四个地方。你想想看,这多容易出错?
后来我发现了CPack。说白了,它就是CMake官方提供的打包工具。你只需要在CMakeLists.txt里写几行配置,CPack就能帮你生成各种格式的安装包。
一句话总结:CPack = CMake + Packaging。它把构建和打包统一起来了。
1.2 CPack到底是什么?
CPack是CMake家族的一员。它不是一个独立的工具,而是依附于CMake运行的打包生成器。
它的工作流程很简单:
- CMake先完成项目的构建配置
- CPack读取CMake生成的打包信息
- 调用对应的打包工具(如NSIS、RPM、DEB等)生成安装包
我个人习惯把CPack理解成一个「打包调度器」。它自己不干活,但它知道该叫谁来干活。
1.3 为什么需要CPack?
没有CPack的时候,我们是怎么打包的?
| 平台 | 传统方式 | 问题 |
|---|---|---|
| Windows | 手写NSIS脚本 | 语法复杂,维护困难 |
| Linux | 手写spec文件 | 不同发行版差异大 |
| macOS | 手写dmg脚本 | AppleScript让人抓狂 |
有了CPack之后呢?
- 一套配置,多平台通用
- 版本号、依赖信息集中管理
- 自动调用平台原生打包工具
- 支持一键生成多种格式
小技巧:我建议你在项目初期就引入CPack。别等到发布前才临时抱佛脚。我曾经有个项目,上线前三天才发现打包脚本有问题,那叫一个狼狈。
1.4 CPack在CMake生态中的位置
要理解CPack的位置,得先看看CMake的完整工具链:
从这张图你能看出来,CPack和CTest是平级的。它们都依赖于CMake的构建结果,但各自负责不同的阶段。
- CMake:负责配置和生成构建系统
- CTest:负责运行测试
- CPack:负责生成安装包
这三者构成了CMake的完整工作流:配置 → 构建 → 测试 → 打包。
注意:CPack不是万能的。它依赖CMake的install()命令来知道要打包哪些文件。如果你没写install(),CPack打包出来的东西就是空的。我曾经犯过这个错,折腾了半天才发现是install()没写全。
1.5 CPack支持的打包格式
CPack支持很多打包格式。我列几个常用的:
| 生成器名称 | 适用平台 | 输出格式 |
|---|---|---|
| NSIS | Windows | .exe 安装程序 |
| WIX | Windows | .msi 安装包 |
| DEB | Debian/Ubuntu | .deb 包 |
| RPM | RedHat/Fedora | .rpm 包 |
| DragNDrop | macOS | .dmg 镜像 |
| TGZ | 跨平台 | .tar.gz 压缩包 |
| ZIP | 跨平台 | .zip 压缩包 |
你可能会问:「这么多格式,我该选哪个?」
我的建议是:
- 如果只做内部测试,用TGZ或ZIP就够了
- 面向Windows用户,优先考虑NSIS
- 面向Linux用户,根据发行版选DEB或RPM
- 面向macOS用户,DragNDrop最友好
1.6 一个最简单的例子
光说不练假把式。来看一个最简配置:
# CMakeLists.txt
cmake_minimum_required(VERSION 3.15)
project(MyApp VERSION 1.0.0)
# 添加可执行文件
add_executable(myapp main.cpp)
# 安装规则
install(TARGETS myapp DESTINATION bin)
# CPack配置
set(CPACK_PACKAGE_NAME "MyApp")
set(CPACK_PACKAGE_VERSION "1.0.0")
set(CPACK_PACKAGE_VENDOR "MyCompany")
set(CPACK_GENERATOR "TGZ")
include(CPack)
然后运行:
mkdir build && cd build
cmake ..
cpack
你就会得到一个 MyApp-1.0.0-Linux.tar.gz 文件。
提示:注意最后一行 include(CPack)。这行代码必须放在所有CPack变量设置之后。我刚开始用的时候把它放前面了,结果变量全没生效——嗯,这是个很容易踩的坑。
1.7 本章小结
到这,你应该对CPack有了基本认识:
- CPack是CMake的打包工具,帮你生成各种格式的安装包
- 它解决了跨平台打包脚本不统一的问题
- 在CMake生态中,它和CTest平级,位于构建阶段之后
- 配置简单,几行代码就能跑起来
下一章,我们会深入CPack的配置项,看看怎么定制出更专业的安装包。