【cmake系列使用教程】git
cmake使用教程(一)-起步github
cmake使用教程(二)-添加庫正則表達式
在前邊的文章中已經講過了如何使用cpack,可是那只是一個官方的簡版教程,此次講解的是我在實際開發Linux c中遇到的一些cpakc的問題。
CPack是做爲一個模塊出如今cmake構建系統中的,它是一個很是強大的打包工具,能夠用來打包二進制文件或者源碼。打包好的二進制文件中包含了全部的cmake install命令須要的安裝文件。在打包源碼時,也能夠生成對應的壓縮包。 cpack能夠依賴cmake構建生成的config文件,也能夠本身編寫配置文件。我屬於比較懶的類型,直接使用cmake生成的config文件吧。generator是一個比較重要的東西,它算是你要生成的打包文件的類型,cpack默認提供了一個列表來指定這個東西。
主要工做流程:
流程就是如此簡單。
這裏以我本身的一個開源項目爲例子來說解--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_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")
這裏有一個對應的關係:
我選擇的是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文件夾下生成了上邊設置好的文件。
上傳到github不難,可是修改rb文件上傳至本身的homebrew-saka倉庫是比較麻煩的,須要修改下載地址和SHA256碼。因此我本身寫了一個自動化構建上傳的shell腳本,主要流程:
主要代碼以下:
#!/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…
最後的最後,再寫一點我最近的感想,否極不必定會泰來。我這條鹹魚應該翻身無望了,備受打擊以後我感受只能作一條最鹹的鹹魚。