内容简介:【cmake系列使用教程】
【cmake系列使用教程】
在前边的文章中已经讲过了如何使用cpack,但是那只是一个官方的简版教程,这次讲解的是我在实际开发Linux c中遇到的一些cpakc的问题。
简介
CPack是作为一个模块出现在cmake构建系统中的,它是一个非常强大的打包工具,可以用来打包二进制文件或者源码。打包好的二进制文件中包含了所有的cmake install命令需要的安装文件。在打包源码时,也可以生成对应的压缩包。 cpack可以依赖cmake构建生成的config文件,也可以自己编写配置文件。我属于比较懒的类型,直接使用cmake生成的config文件吧。generator是一个比较重要的东西,它算是你要生成的打包文件的类型,cpack默认提供了一个列表来指定这个东西。
主要工作流程:
- cpack执行
- 寻找CPackConfig.cmake文件
- 遍历命令行 -G传入的generator参数,假如没有传入参数,则检查CPackConfig.cmake文件或者CPackSourceConfig.cmake文件中的CPAKC_GENERATOR变量,注意这个优先级的问题,命令行参数会覆盖配置文件的参数。
- 为每一个generator来生成对应的打包文件
流程就是如此简单。
具体配置
这里以我自己的一个开源项目为例子来讲解--Sweather,这是个 c语言 的获取天气的命令行工具。地址: github.com/rangaofei/S…
首先看一下工程目录结构:
. ├── CMakeLists.txt ├── License.txt ├── PIC ├── README.md ├── assets ├── build ├── cmake-build-debug ├── logfile ├── pack ├── sakabrew.sh └── src 复制代码
- CMakeLists.txt是cmake执行的入口文件
- License.txt是协议信息
- PIC是我自己截的图
- README.md是说明文件
- assets是资源文件件
- build是外部构建的文件夹
- cmake-build-debug这个是CLion自动生成的文件夹
- src是主要的c文件目录
- pack是打包文件的文件夹
- sakabrew.sh是我自己编写的自动化文件
- logfile是sakabrew.sh文件生成的日志。
主要的CMakeLists.txt配置如下:
CMAKE_MINIMUM_REQUIRED(VERSION 3.8) set(CMAKE_C_STANDARD 99) project(SWeather C) set(VERSION_MAJOR 1) set(VERSION_MINOR 3) set(VERSION_PATCH 1) #采用debug模式时启用'ENABLE_DEBUG' IF (CMAKE_BUILD_TYPE STREQUAL Debug) ADD_DEFINITIONS(-DENABLE_DEBUG) ENDIF (CMAKE_BUILD_TYPE STREQUAL Debug) add_subdirectory(src) include(InstallRequiredSystemLibraries) set(CPACK_PACKAGE_DIRECTORY ${PROJECT_SOURCE_DIR}/pack) set(CPACK_RESOURCE_FILE_LICENSE "${PROJECT_SOURCE_DIR}/License.txt") set(CPACK_PACKAGE_VERSION_MAJOR "${VERSION_MAJOR}") set(CPACK_PACKAGE_VERSION_MINOR "${VERSION_MINOR}") set(CPACK_PACKAGE_VERSION_PATCH "${VERSION_PATCH}") set(PROJECT_VERSION_FULL ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}) set(CPACK_SOURCE_IGNORE_FILES ${PROJECT_SOURCE_DIR}/build ${PROJECT_SOURCE_DIR}/cmake-build-debug ${PROJECT_SOURCE_DIR}/pack ${PROJECT_SOURCE_DIR}//.idea ${PROJECT_SOURCE_DIR}/.DS_Store ${PROJECT_SOURCE_DIR}/.git ${PROJECT_SOURCE_DIR}/.gitignore ${PROJECT_SOURCE_DIR}/.vscode ${PROJECT_SOURCE_DIR}/.PIC ${PROJECT_SOURCE_DIR}/assets/city.txt) set(CPACK_SOURCE_GENERATOR "TGZ") set(CPACK_SOURCE_PACKAGE_FILE_NAME sweather-${PROJECT_VERSION_FULL}) include(CPack) 复制代码
设置打包文件生成位置和协议信息
set(CPACK_PACKAGE_DIRECTORY ${PROJECT_SOURCE_DIR}/pack)
set(CPACK_RESOURCE_FILE_LICENSE "${PROJECT_SOURCE_DIR}/License.txt")
可以通过 CPACK_PACKAGE_DIRECTORY
变量配置,我设置的是根目录下的pack文件夹,这样生成的所有文件都会在这里,不会污染其他文件夹。
CPACK_RESOURCE_FILE_LICENSE
可以用来指定协议信息
设置版本信息
set(CPACK_PACKAGE_VERSION_MAJOR "${VERSION_MAJOR}") set(CPACK_PACKAGE_VERSION_MINOR "${VERSION_MINOR}") set(CPACK_PACKAGE_VERSION_PATCH "${VERSION_PATCH}") 复制代码
这个也比较简单,版本信息采用cmake中设置的版本信息,后边将会用来生成文件名字。
设置忽略文件
set(CPACK_SOURCE_IGNORE_FILES ${PROJECT_SOURCE_DIR}/build ${PROJECT_SOURCE_DIR}/cmake-build-debug ${PROJECT_SOURCE_DIR}/pack ${PROJECT_SOURCE_DIR}/.idea ${PROJECT_SOURCE_DIR}/.DS_Store ${PROJECT_SOURCE_DIR}/.git ${PROJECT_SOURCE_DIR}/.gitignore ${PROJECT_SOURCE_DIR}/.vscode ${PROJECT_SOURCE_DIR}/.PIC ${PROJECT_SOURCE_DIR}/assets/city.txt) 复制代码
这个地方需要注意,最好不要用正则表达式,容易发生错误,这里吧所有不需要的文件都排除在了外边,当然这种简洁的方式是简历在外部构建的基础上的。在构建的时候进入buid文件夹执行build命令,就可以不污染源文件。
设置生成器
set(CPACK_SOURCE_GENERATOR "TGZ")
这里有一个对应的关系:
- 7Z-7Zzip-(.7z)
- TBZ2(tar.bz2)
- TGZ(.tar.gz)
- TXZ(.tar.xz)
- TZ(.tar.Z)
- ZIP(.zip)
我选择的是TGZ,所以生成的文件的扩展名称将会是.tar.gz,这个后缀将会在下边介绍的打包名称后添加。
设置文件打包文件名称
set(PROJECT_VERSION_FULL ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}) set(CPACK_SOURCE_PACKAGE_FILE_NAME sweather-${PROJECT_VERSION_FULL}) 复制代码
打包文件名称不需要设置后缀,系统会自动根据generator来生成后缀。
在我这个文件中生成的打包文件名称将会是 sweather-1.3.1.tar.gz
。
这样我们就完成了主要的配置,然后进入build文件夹,执行 cmake ..
即可生成cpack需要的配置文件,此处我要打包源文件,所以继续执行 cpack --config CPackSourceConfig.cmake
,这样就在pack文件夹下生成了上边设置好的文件。
自动化构建上传到brew仓库
上传到github不难,但是修改rb文件上传至自己的homebrew-saka仓库是比较麻烦的,需要修改下载地址和SHA256码。所以我自己写了一个自动化构建上传的 shell 脚本,主要流程:
- 寻找build文件夹,没有就生成
- 进入build文件夹,清空该文件夹下的所有文件
- 执行cmake ..外部构建程序
- 执行打包命令并写入日志文件
- 读取日志文件中最后一行生成的文件名称,版本名称,校验码存入变量
- 自动生成的文件需要添加值git仓库,上传至远程仓库
- 进入homebrew --repo rangaofei/saka目录,进入程序脚本文件夹
- 替换对应的 ruby 脚本(sweather.rb)中的下载地址和SHA256.
- 添加文件,上传至远程仓库
主要代码如下:
#!/usr/bin/env bash # 寻找build文件夹,不存在就创建 function findBuild(){ if [ ! -d "./build" ];then mkdir ./build else echo "build文件夹已经存在" fi } # 进入build文件夹,清除所有的缓存文件 function cmakeOutBuild(){ cd ./build echo "进入build文件夹,即将清除文件缓存" rm -rf ./* echo "build文件夹缓存清理完毕,即将执行外部构建" cmake .. echo "外部构建执行完成" } # 打包文件 function cmakePackage(){ cpack --config CPackSourceConfig.cmake } # 读取日志文件,读入文件名称 function readLogFile(){ if [ -e "logfile" ];then tmp_path=`echo $(pwd) | sed -n "s#/#\\\\\/#gp"` echo "$tmp_path" package_name=`sed -n '$p' logfile |sed -n "s/.*CPack:.*\($tmp_path.*tar\.gz\).*generated./\1/gp"` package_version=`echo "${package_name}" | sed -n 's/.*pack\/\(.*\)\.tar\.gz/\1/gp'|sed -n 's/\./\\\\./gp'` echo "---name:${package_name}\n---version:${package_version}\n" else echo "file not found" fi } # 本地提交git仓库,然后推送至远程仓库 function commitToGitHub(){ if [ ! -n "$package_name" ];then echo "不能提交" else git add ${package_name} git commit -m "new version" git push fi } # 本地提交至brew仓库,远程提交 function commitToBrew(){ if [ ! -n "$package_name" ];then echo "不能提交到brew" else fileSHA256=`openssl dgst -sha256 ${package_name}|sed -n "s/.*= \(.*\)/\1/gp"` echo "$fileSHA256" cd $(brew --repo rangaofei/saka)/Formula sed -i -n "s/sweather-[0-9]\.[0-9]\.[0-9]/sweather-1\.3\.1/g" sweather.rb sed -i -n "s/sha256 \".*\"/sha256 \"$fileSHA256\"/g" sweather.rb git add sweather.rb git commit -m "new version:$package_version" git push cd - fi } findBuild cmakeOutBuild if [ ! -e "CPackSourceConfig.cmake" ];then echo "未找到打包文件,请重新执行此脚本" else echo "已生成打包文件,即将开始打包" name=`cmakePackage` echo "------------------------------" echo "$name"| tee -a ../logfile fi cd .. readLogFile #commitToGitHub commitToBrew 复制代码
这样就完成了所有的工作,下次只需要执行 . ./sakabrew.sh
即可自动构建文件并上传至仓库了。
最后,附上以前的文章地址和github地址
github地址: github.com/rangaofei/S…
HomeBrew常规使用教程: juejin.im/post/5a559b…
最后的最后,再写一点我最近的感想,否极不一定会泰来。我这条咸鱼应该翻身无望了,备受打击之后我感觉只能做一条最咸的咸鱼。
以上所述就是小编给大家介绍的《cmake使用教程(十一)-使用cpack打包源码并编写自动化脚本上传到仓库》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- 使用 fastlane 进行 iOS 打包
- 使用Fastlane实现自动化打包
- iOS使用fastlane一键打包审核
- iOS使用fastlane自动化打包
- 使用webpack打包多页jquery项目
- 使用DllPlugin和DllReferencePlugin提高打包速度
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Game Engine Architecture, Second Edition
Jason Gregory / A K Peters/CRC Press / 2014-8-15 / USD 69.95
A 2010 CHOICE outstanding academic title, this updated book covers the theory and practice of game engine software development. It explains practical concepts and techniques used by real game studios,......一起来看看 《Game Engine Architecture, Second Edition》 这本书的介绍吧!