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 的肩膀上,
我们不用去学习多个平台的打包脚本,就可以快速的制作一些简单的安装包(多个平台)。