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运行的打包生成器。

它的工作流程很简单:

  1. CMake先完成项目的构建配置
  2. CPack读取CMake生成的打包信息
  3. 调用对应的打包工具(如NSIS、RPM、DEB等)生成安装包

我个人习惯把CPack理解成一个「打包调度器」。它自己不干活,但它知道该叫谁来干活。

1.3 为什么需要CPack?

没有CPack的时候,我们是怎么打包的?

平台 传统方式 问题
Windows 手写NSIS脚本 语法复杂,维护困难
Linux 手写spec文件 不同发行版差异大
macOS 手写dmg脚本 AppleScript让人抓狂

有了CPack之后呢?

  • 一套配置,多平台通用
  • 版本号、依赖信息集中管理
  • 自动调用平台原生打包工具
  • 支持一键生成多种格式

小技巧:我建议你在项目初期就引入CPack。别等到发布前才临时抱佛脚。我曾经有个项目,上线前三天才发现打包脚本有问题,那叫一个狼狈。

1.4 CPack在CMake生态中的位置

要理解CPack的位置,得先看看CMake的完整工具链:

CMake 核心 构建系统生成 (Make/Ninja/VS) CTest (测试) CPack (打包) CMake Install (安装) 测试报告 安装目录 安装包 配置 构建 安装 测试 打包

从这张图你能看出来,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的配置项,看看怎么定制出更专业的安装包。