c打包html,cmake使⽤教程(⼗⼀)-使⽤cpack打包源码并编
写⾃动化脚本上传到仓库...
【cmake系列使⽤教程】
在前边的⽂章中已经讲过了如何使⽤cpack,但是那只是⼀个官⽅的简版教程,这次讲解的是我在实际开发Linux c中遇到的⼀些cpakc的问题。
简介
CPack是作为⼀个模块出现在cmake构建系统中的,它是⼀个⾮常强⼤的打包⼯具,可以⽤来打包⼆进制⽂件或者源码。打包好的⼆进制⽂件中包含了所有的cmake install命令需要的安装⽂件。在打包源码时,也可以⽣成对应的压缩包。
cpack可以依赖cmake构建⽣成的config⽂件,也可以⾃⼰编写配置⽂件。我属于⽐较懒的类型,直接使⽤cmake⽣成的config⽂件吧。generator是⼀个⽐较重要的东西,它算是你要⽣成的打包⽂件的类型,cpack默认提供了⼀个列表来指定这个东西。
主要⼯作流程:
cpack执⾏
寻ake⽂件
cmake如何使用遍历命令⾏ -G传⼊的generator参数,假如没有传⼊参数,则检查ake⽂件或者ake⽂件中的CPAKC_GENERATOR变量,注意这个优先级的问题,命令⾏参数会覆盖配置⽂件的参数。
为每⼀个generator来⽣成对应的打包⽂件
流程就是如此简单。
具体配置
这⾥以我⾃⼰的⼀个开源项⽬为例⼦来讲解--Sweather,这是个 c语⾔ 的获取天⽓的命令⾏⼯具。地址: github/rangaofei/S…
⾸先看⼀下⼯程⽬录结构:
.
├──
├──
├── PIC
├── README.md
├── assets
├── build
├── cmake-build-debug
├── logfile
├── pack
├── sakabrew.sh
└── src
复制代码
<是cmake执⾏的⼊⼝⽂件
<是协议信息
PIC是我⾃⼰截的图
README.md是说明⽂件
assets是资源⽂件件
build是外部构建的⽂件夹
cmake-build-debug这个是CLion⾃动⽣成的⽂件夹
src是主要的c⽂件⽬录
pack是打包⽂件的⽂件夹
sakabrew.sh是我⾃⼰编写的⾃动化⽂件
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")
这⾥有⼀个对应的关系:
7Z-7Zzip-(.7z)
TBZ2(tar.bz2)
TGZ(.)
TXZ(.)
TZ(.tar.Z)
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脚本,主要流程:
寻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 --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
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论