CMake快速制作RPM包

简介

关于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快速制作RPM包_第1张图片

构建模板,介绍请看注释

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

CMake快速制作RPM包_第2张图片

包中文件: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(
    [VERSION [.[.[.]]]]
    [LANGUAGES ...])
  • install: 安装指令。是cpack主要依赖的指令,有很多的安装形式,支持了可执行程序、普通文件(头文件)、目录等等、CMake的构建目标(需要使用CMake编译的程序)。
install(TARGETS targets... [EXPORT ]
    [[ARCHIVE|LIBRARY|RUNTIME|FRAMEWORK|BUNDLE|
      PRIVATE_HEADER|PUBLIC_HEADER|RESOURCE]
     [DESTINATION ]
     [PERMISSIONS permissions...]
     [CONFIGURATIONS [Debug|Release|...]]
     [COMPONENT ]
     [OPTIONAL] [NAMELINK_ONLY|NAMELINK_SKIP]
    ] [...]
    [INCLUDES DESTINATION [ ...]]
    )
  • set: 变量赋值set(key value) cpack不用深究后面的作用域PARENT_SCOPE
set( ... [PARENT_SCOPE])
  • include: 引入模块,这里不用多用。只要引入CPack模块即可,include(CPack)
include( [OPTIONAL] [RESULT_VARIABLE ]
                  [NO_POLICY_SCOPE])

你可能感兴趣的:(linux)