3

使用 CMake 快速制作 RPM 安装包

 2 years ago
source link: https://forrestsu.github.io/posts/cpp/build-rpm-package-use-cmake/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

使用 CMake 快速制作 RPM 安装包

2020年1月16日
| 字数 2093
| CPP
| 阅读 130

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 文件尾部, 追加以下内容:

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

下面开始编译打包:

$ 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 验证安装包

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

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK