cmake使⽤教程(⼗⼀)-使⽤cpack打包源码并编写⾃动化脚
本上传到仓库
【cmake系列使⽤教程】
在前边的⽂章中已经讲过了如何使⽤cpack,但是那只是⼀个官⽅的简版教程,这次讲解的是我在实际开发Linux c中遇到的⼀些cpakc的问题。
简介
CPack是作为⼀个模块出现在cmake构建系统中的,它是⼀个⾮常强⼤的打包⼯具,可以⽤来打包⼆进制⽂件或者源码。打包好的⼆进制⽂件中包含了所有的cmake install命令需要的安装⽂件。在打包源码时,也可以⽣成对应的压缩包。 cpack可以依赖cmake构建⽣成的config⽂件,也可以⾃⼰编写配置⽂件。我属于⽐较懒的类型,直接使⽤cmake⽣成的config⽂件吧。generator是⼀个⽐较重要的东西,它算是你要⽣成的打包⽂件的类型,cpack默认提供了⼀个列表来指定这个东西。
主要⼯作流程:
1. cpack执⾏
2. 寻ake⽂件
3. 遍历命令⾏ -G传⼊的generator参数,假如没有传⼊参数,则检查ake⽂件或者ake⽂件
中的CPAKC_GENERATOR变量,注意这个优先级的问题,命令⾏参数会覆盖配置⽂件的参数。
4. 为每⼀个generator来⽣成对应的打包⽂件
流程就是如此简单。
具体配置
这⾥以我⾃⼰的⼀个开源项⽬为例⼦来讲解--Sweather,这是个c语⾔的获取天⽓的命令⾏⼯具。地址:
⾸先看⼀下⼯程⽬录结构:
.
├──
├──
├── PIC
├── README.md
├── assets
├── build
├── cmake-build-debug
├── logfile
├── pack
├── sakabrew.sh
└── src
复制代码
1. 是cmake执⾏的⼊⼝⽂件
2. 是协议信息
3. PIC是我⾃⼰截的图
4. README.md是说明⽂件
5. assets是资源⽂件件
6. build是外部构建的⽂件夹
7. cmake-build-debug这个是CLion⾃动⽣成的⽂件夹
8. src是主要的c⽂件⽬录
9. pack是打包⽂件的⽂件夹
10. sakabrew.sh是我⾃⼰编写的⾃动化⽂件
11. logfile是sakabrew.sh⽂件⽣成的⽇志。
主要的配置如下:
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}/")
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}/)
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}/")
可以通过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}/)
复制代码
这个地⽅需要注意,最好不要⽤正则表达式,容易发⽣错误,这⾥吧所有不需要的⽂件都排除在了外边,当然这种简洁的⽅式是简历在外部构建的基础上的。在构建的时候进⼊buid⽂件夹执⾏build命令,就可以不污染源⽂件。
设置⽣成器
set(CPACK_SOURCE_GENERATOR "TGZ")
这⾥有⼀个对应的关系:
1. 7Z-7Zzip-(.7z)
2. TBZ2(tar.bz2)
3. TGZ(.)
4. TXZ(.)
5. TZ(.tar.Z)
6. ZIP(.zip)
我选择的是TGZ,所以⽣成的⽂件的扩展名称将会是.,这个后缀将会在下边介绍的打包名称后添加。
设置⽂件打包⽂件名称
set(PROJECT_VERSION_FULL ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH})
set(CPACK_SOURCE_PACKAGE_FILE_NAME sweather-${PROJECT_VERSION_FULL})
复制代码
打包⽂件名称不需要设置后缀,系统会⾃动根据generator来⽣成后缀。 在我这个⽂件中⽣成的打包⽂件名称将会是sweather-
1.3.。
这样我们就完成了主要的配置,然后进⼊build⽂件夹,执⾏cmake ..即可⽣成cpack需要的配置⽂件,
此处我要打包源⽂件,所以继续执
⾏cpack --ake,这样就在pack⽂件夹下⽣成了上边设置好的⽂件。
⾃动化构建上传到brew仓库
上传到github不难,但是修改rb⽂件上传⾄⾃⼰的homebrew-saka仓库是⽐较⿇烦的,需要修改下载地址和SHA256码。所以我⾃⼰写了⼀个⾃动化构建上传的shell脚本,主要流程:
1. 寻build⽂件夹,没有就⽣成
2. 进⼊build⽂件夹,清空该⽂件夹下的所有⽂件
3. 执⾏cmake ..外部构建程序
4. 执⾏打包命令并写⼊⽇志⽂件
5. 读取⽇志⽂件中最后⼀⾏⽣成的⽂件名称,版本名称,校验码存⼊变量
6. ⾃动⽣成的⽂件需要添加值git仓库,上传⾄远程仓库
7. 进⼊homebrew --repo rangaofei/saka⽬录,进⼊程序脚本⽂件夹
为什么现在都用cmake
8. 替换对应的ruby脚本(sweather.rb)中的下载地址和SHA256.
9. 添加⽂件,上传⾄远程仓库
主要代码如下:
#!/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 --ake
}
# 读取⽇志⽂件,读⼊⽂件名称
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仓库,远程提交
# 本地提交⾄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 "ake" ];then
echo "未到打包⽂件,请重新执⾏此脚本"
else
echo "已⽣成打包⽂件,即将开始打包"
name=`cmakePackage`
echo "------------------------------"
echo "$name"| tee -a ../logfile
fi
cd ..
readLogFile
#commitToGitHub
commitToBrew
复制代码
这样就完成了所有的⼯作,下次只需要执⾏. ./sakabrew.sh即可⾃动构建⽂件并上传⾄仓库了。
最后,附上以前的⽂章地址和github地址
github地址:
HomeBrew常规使⽤教程:
最后的最后,再写⼀点我最近的感想,否极不⼀定会泰来。我这条咸鱼应该翻⾝⽆望了,备受打击之后我感觉只能做⼀条最咸的咸鱼。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。