1 Preface

最近对框架进行了改造,支持yaml格式的配置文件, 使用到了 yaml-cpp 这个第三方库, yum官方提供的是 0.5.1 版本(依赖boost),看到最新版 0.6.3 已经去除了boost的依赖, 于时想自己做一个包。

制作 rpm 包通用的方式是:

直接使用rpm-build, 编写project.spec,这样就需要了解spec的语法规则。

今天不经意在网上搜到,可以用CMake来制作RPM包(因为我们的 C++ 项目也是采用 CMake 进行编译的)。 CMake打包的基本原理是:CMake内部有一个cpack工具,支持调用不同的打包工具(比如 rpmbuild)

下面我们就基于Centos7,尝试使用CMake制作了一个yaml-cpp的RPM包:

2 添加项目打包信息

在一个项目的 CMakeList.txt 文件尾部, 追加以下内容:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
set(CPACK_SET_DESTDIR ON)
#以下为RPM信息的设置,包名,概述,供应者,版本,分组等信息,通过其变量名称可以知道意思
set(CPACK_PACKAGE_NAME "yaml-cpp")
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "A YAML parser and emitter for C++")
set(CPACK_PACKAGE_VENDOR "Xone Project")
set(CPACK_PACKAGE_VERSION "0.6.3")
set(CPACK_PACKAGE_VERSION_MAJOR "0")
set(CPACK_PACKAGE_VERSION_MINOR "6")
set(CPACK_PACKAGE_VERSION_PATCH "3")
# set(CPACK_RPM_PACKAGE_GROUP "unknown")
set(CPACK_RPM_PACKAGE_URL "https://github.com/jbeder/yaml-cpp")
set(CPACK_RPM_PACKAGE_DESCRIPTION "yaml-cpp is a YAML parser and emitter in C++ matching the YAML 1.2 spec.")
set(CPACK_RPM_PACKAGE_LICENSE "MIT")
set(CPACK_RPM_PACKAGE_EPOCH 1)
# [可选] release 默认为 1
set(CPACK_RPM_PACKAGE_RELEASE 1)
# [可选] 指定生成的 rpm 文件名称
set(CPACK_RPM_FILE_NAME "${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}-${CPACK_RPM_PACKAGE_RELEASE}.el7.centos.${CMAKE_SYSTEM_PROCESSOR}.rpm")

# 设置默认生成器,RPM生成器会构建RPM安装包,其它还有TGZ/ZIP等
set(CPACK_GENERATOR "RPM")

# 从rpm包中,排除某些路径和文件 (主要为了防止和其他安装包冲突)
list(APPEND CPACK_RPM_EXCLUDE_FROM_AUTO_FILELIST_ADDITION "/usr/lib/systemd" "/usr/lib/systemd/system")
# 引入CPack模块,放在CMakeList最后,不能少
include(CPack)

3 编译打包

由于是制作RPM包,cpack 工具需要调用 rpmbuild 程序;

yum install rpm-build

下面开始编译打包:

1
2
3
4
5
$ mkdir build && cd build
$ cmake ..
$ make -j5
# 生成安装包
$ cpack

注意:对于yaml-cpp这个项目,我们制定了如下 CMake 选项:

cmake -DYAML_CPP_BUILD_TOOLS=OFF -DYAML_CPP_BUILD_TESTS=OFF -DYAML_BUILD_SHARED_LIBS=ON -DCMAKE_INSTALL_PREFIX=/usr ..

4 验证安装包

最后验证一下,我们制作的安装包信息:

1
2
3
4
# 查看包描述
$ rpm -qip yaml-cpp-0.6.3-1.el7.centos.x86_64.rpm
# 查看包中文件
$ rpm -qlp yaml-cpp-0.6.3-1.el7.centos.x86_64.rpm

总结

基于已有的 CMake 文件,制作安装包的步骤非常简洁、高效。

现在github上开源C++项目,很多都提供了CMake文件,站在 CMake 的肩膀上, 我们不用去学习多个平台的打包脚本,就可以快速的制作一些简单的安装包(多个平台)。