3C科技 娛樂遊戲 美食旅遊 時尚美妝 親子育兒 生活休閒 金融理財 健康運動 寰宇綜合

Zi 字媒體

2017-07-25T20:27:27+00:00
加入好友
身為一個韌體工程師,做好韌體的版本控制是非常重要的一環,而版本控制最好要能做到自動化不但可以減少因人員產生的錯誤,還可以減少工作負擔。因此如何透過 Git 搭配 GitHub/GitLab 來達到版本控制與 commit message rule 可以參考之前的文章:半自動化版本控制與 git commit message 標準化流程而今天要讓自動化更加成長茁壯!!! 透過之前建立的 git version tags 來產生版本資訊並輸出成 “version.h” 來讓 firmware c/c++ code include 整個過程需要做到下列幾項事情: 從 Git 上抓取 version-tag 將 version-tag 拆成 major, minor and patch 產生 “version.h” file 然後將 major, minor and patch 寫入 用 git describe --abbrev=0 --always --tags 來抓取離當前提交的內容最近的 tag,並且用 –abbrev=0 將 tag 後的描述資訊隱藏起來。 接著透過 windows command line 的 delims 命令以字元 ‘.’ 來區隔開 major, minor and patch。 最後透過 echo and >> %1 來將資料以定義好的格式寫入文件中就完成了! 然後為了讓每次要做的事情簡單單一且可重複,將上述指令寫成批次檔來處理,以後就只需要呼叫批次檔就可以了: 1234567891011121314151617181920212223242526 @echo offif "%1"=="" ( echo Usage: %0 ^ goto :eof)for /F "usebackq" %%v in (`"git describe --abbrev=0 --always --tags"`) DO ( echo #ifndef __VERSION_H__ > %1 echo #define __VERSION_H__ >> %1 echo.>> %1 for /f "tokens=1,2,3 delims=." %%i in ("%%v") DO ( echo #define VERSION_MAJOR %%i >> %1 echo #define VERSION_MINOR %%j >> %1 echo #define VERSION_PATCH %%k >> %1 ) for /F "usebackq" %%d in (`"git show -s --format=format:%� --date=short"`) DO ( for /f "tokens=1,2,3 delims=-" %%i in ("%%d") DO ( echo #define BUILD_DATE_YEAR %%i - 2000 >> %1 echo #define BUILD_DATE_MONTH %%j >> %1 echo #define BUILD_DATE_DAY %%k >> %1 ) ) echo.>> %1 echo #endif /* __VERSION_H__ */ >> %1 echo.>> %1 echo /*** (C^) COPYRIGHT LEOLI ***/ >> %1) 接著在 windows 中受到 Git 管控並且有提交過 sem-ver 格式的 tag 的資料夾路徑內建一個文件並在該文件內貼上上述內容,並將檔名改成 “filename.bat”。然後在該路徑打開終端機執行 filename.bat "version.h" 就會自動執行上述指令並在 “version.h” 檔案內寫入上述資訊囉。 只要將批次檔加入受到 Git 管控的 code 內,並透過編譯器(compiler) 的 pre-build command 在編譯之前呼叫產生 “version.h” 並 include 就可以在每次 build code 前自動更新 version information 並同步囉!如何在編譯器(compiler)中加入編譯前/編譯後的動作,以及一些坑! 完整的 sample code 我放在 github 上了,歡迎下載玩玩看! github sample code:https://github.com/leoli-git/VersionAutoGen

本文由leotalk-engineerlifecom提供 原文連結

寫了 5860316篇文章,獲得 23313次喜歡
精彩推薦