CMake快速制作RPM包

利用CMake中的cpack工具,可以非常快速的制作rpm安装包,方便环境迁移,程序部署,依赖安装等。

目前腾讯WeTest服务器性能测试已经正式对外开放点击链接:http://wetest.qq.com/gaps/立即体验!


简介

关于CMake介绍有很多,这里就不再CV一遍了。这里说的是CMake中包含的三个工具(cmake cpack ctest)中的cpack工具。他可以帮助快速的打包发布你的程序。Linux下可以用tar.gz、rpm、zip等格式。公司tlinux使用rpm。所以本文主要给出一个制作RPM的模板,当然也就支持了tar.gz和zip的发布方式,经过修改后可以用于项目当中。也可以用于自己的依赖环境管理,比如自己装了mysql++/hiredis/vim + 第三方插件等等,这样在之后的环境迁移情况下可以快速的安装好依赖环境。
ps: 即使当前使用的Makefile编译的,也可以单独使用cpack功能。但是如果本身就是CMake构建的,就更省事一些。如果没有CMake环境,安装一下。tlinux有2.8.12,源码安装也很简单。

yum install -y cmake

模版

直入主题,先给出模板。安装示例中,很挫的HelloWorld程序,hello.c中有helloworld函数,编译为静态库。main.c里面调用helloworld库函数。所以需要安装的有三个部分:

  • hello可执行程序
  • hello.a静态库
  • hello.h头文件

目录结构

构建模板,介绍请看注释

cmake_minimum_required(VERSION 2.8)
# 设置项目名称
project(HelloWorld)

# 设置安装路径, 默认/usr/local。也可以是idc经常安装的/data/home/user00/xxxserver等
# set(CPACK_PACKAGING_INSTALL_PREFIX /opt)

# 如果不是CMake构建的,设置CMAKE_CURRENT_BINARY_DIR为Makefile的构建目录
set(CMAKE_CURRENT_BINARY_DIR ..)

# 批量的安装指令,目录、程序、库文件、头文件等
install(PROGRAMS bin/hello DESTINATION bin)
install(FILES bin/hello.a DESTINATION lib)
install(FILES src/hello.h DESTINATION include)

# 以下为RPM信息的设置,包名,概述,供应者,版本, 分组等等信息,通过其变量名称可以知道意思
set(CPACK_PACKAGE_NAME "wetest-helloworld")
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Simple CPack HelloWorld")
set(CPACK_PACKAGE_VENDOR "WeTest")
set(CPACK_PACKAGE_VERSION "1.0.0")
set(CPACK_PACKAGE_VERSION_MAJOR "1")
set(CPACK_PACKAGE_VERSION_MINOR "0")
set(CPACK_PACKAGE_VERSION_PATCH "0")
set(CPACK_RPM_PACKAGE_GROUP "WeTest")
set(CPACK_RPM_PACKAGE_URL "http://wetest.qq.com")
set(CPACK_RPM_PACKAGE_DESCRIPTION "WeTest Server Dependencies")
set(CPACK_PACKAGE_RELEASE 1)
set(CPACK_RPM_PACKAGE_LICENSE "WeTest Licence")

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

# 安装前和安装后执行的shell脚本, 会打包到RPM中,安装时执行。这里可扩展性很强, 放在源码目录下即可
# set(CPACK_RPM_PRE_INSTALL_SCRIPT_FILE ${CMAKE_CURRENT_SOURCE_DIR}/pre_script.sh)
# set(CPACK_RPM_POST_INSTALL_SCRIPT_FILE ${CMAKE_CURRENT_SOURCE_DIR}/post_script.sh)

# 引入CPack模块,必须的
include(CPack)

高能注意

注意不要自己有Makefile的目录下执行cmake,这样会覆盖掉自己的Makefile,也会污染环境。建立build目录后执行。

构建

$ cd helloworld
$ make
$ mkdir build && cd build
$ cmake ..
$ cpack

其中capck支持其他的打包格式,比如tar.gz和zip,只需要执行cpack -G TGZ 或者 cpack -G ZIP就可打包成相应的格式。

结果

包描述: rpm -qip wetest-helloworld-1.0.0-Linux.rpm

包中文件:rpm -qlp wetest-helloworld-1.0.0-Linux.rpm

安装: sudo rpm -iv wetest-helloworld-1.0.0-Linux.rpm

卸载: sudo rpm -e wetest-helloworld

执行:

结论

以上主要是用cpack打包开发程序,其实可以针对很多东西制作rpm包,比如很多依赖已经用源码安装好的开发坏境,也可以打包,公司tlinux的提供了兼容性。比如mysql++已经装在系统/usr/local/当中,替换模板中的描述和install指令如下即可:

file(GLOB mysqlppso /usr/local/lib/libmysqlpp*)
install(DIRECTORY /usr/local/include/mysql++ DESTINATION include)
install(PROGRAMS ${mysqlppso} DESTINATION lib)

希望能够帮助大家快速部署,也推荐使用CMake来完成构建任务,如果有用的话之后介绍下ctest + boost unit test做单元测试。

文中用到的指令


cmake的指令忽略大小写。使用起来很简单command(arguments…),可以参照官方文档看具体doc。

  • cmake_minimum_required(VERSION 2.8) 指定CMake运行最低版本,这里涉及到CMake的版本兼容特性引入和屏蔽,无需关心,设置自己的版本即可。
  • project: 指定项目的名称,版本和语言(默认CXX)。 例如project(HelloWorld),复杂就是project(HelloWorld VERSION 1.0.0 LANGUAGES CXX)
project(<PROJECT-NAME>
    [VERSION <major>[.<minor>[.<patch>[.<tweak>]]]]
    [LANGUAGES <language-name>...])
  • install: 安装指令。是cpack主要依赖的指令,有很多的安装形式,支持了可执行程序、普通文件(头文件)、目录等等、CMake的构建目标(需要使用CMake编译的程序)。
install(TARGETS targets... [EXPORT <export-name>]
    [[ARCHIVE|LIBRARY|RUNTIME|FRAMEWORK|BUNDLE|
      PRIVATE_HEADER|PUBLIC_HEADER|RESOURCE]
     [DESTINATION <dir>]
     [PERMISSIONS permissions...]
     [CONFIGURATIONS [Debug|Release|...]]
     [COMPONENT <component>]
     [OPTIONAL] [NAMELINK_ONLY|NAMELINK_SKIP]
    ] [...]
    [INCLUDES DESTINATION [<dir> ...]]
    )
  • set: 变量赋值set(key value) cpack不用深究后面的作用域PARENT_SCOPE
set(<variable> <value>... [PARENT_SCOPE])
  • include: 引入模块,这里不用多用。只要引入CPack模块即可,include(CPack)
include(<file|module> [OPTIONAL] [RESULT_VARIABLE <VAR>]
                  [NO_POLICY_SCOPE])

目前腾讯WeTest服务器性能测试已经正式对外开放点击链接:http://wetest.qq.com/gaps/立即体验!

最新文章
1客户案例研究:专家安全扫描,守护金融银行小程序安全和私密性 WeTest私有化部署的定制扫描平台让金融银行客户能无成本接入扫描系统并迅速上手使用。客户能方便快捷地根据定制手册进行自助扫描,根据生成的扫描报告,详细洞察漏洞,快速识别并准确定位问题根源。
2客户案例研究:专家渗透测试,洞察电子商务小程序重大交易漏洞 通过WeTest渗透测试服务,某知名零售公司旗下的在线购物类小程序中发现了8处安全风险,我们的安全专家为客户提供了详细的漏洞报告,提供了较为清晰完整的安全加固方案。在回归测试中,中危以上风险均被解决。
3自查小程序4大安全隐患!文末免费赠送小程序安全扫描专业版! 腾讯WeTest现面向小程序开发者开放免费申请使用小程序安全扫描专业版,助您提前发现全面的安全漏洞。扫描文中问卷二维码或点击问卷链接,即可报名参与免费领取活动。
4浅谈渗透测试服务在泛互行业带来的价值 在泛互联网行业中,渗透测试服务对于保障企业的网络安全至关重要。
5云手机卡顿/无特定设备/商店登录受限怎么办?WeTest专有云帮您解决! 公有云满足了大量小微企业、个人的测试需求;随着客户深入使用,也遇到了一系列新问题。本篇将对几个常见问题予以解答
购买
客服
反馈