Qt Creator自動使用svn原始碼版本號編譯
阿新 • • 發佈:2019-01-27
有時我們想在編譯工程時,使用 svn 的原始碼版本號來作為 build 的一個子版本號;或者只是為了識別某個釋出版本,與原始碼對應起來。
在 Linux 下面有很多的解決方案,使用 svn 工具和一些 shell 命令再加上 -D 選項就可以達到上述目的。
在 Windows 下,使用 Qt Creator 作為開發環境,使用 TortoiseSVN 作為程式碼管理的客戶端工具,該如何實現這個功能呢?
其實主要有兩個步驟:一步是如何自動獲取 svn 版本號;另一步是如何使用這個版本號,讓其自動進入編譯過程,在生成的可執行程式中可以訪問。
自動獲取 svn 控制的原始碼版本號
TortoiseSVN 有個工具 SubWCRev 可以獲取到 working copy 的版本號,具體命令細節可以使用 SubWCRev /? 來檢視。
下面是我寫的一個 Windows 指令碼,自動幹這個事情。
@echo off for /f "delims=" %%t in ('SubWcRev %CD% -f ^| findstr "Updated to revision"') do set version=%%t if "%version%" equ "" ( for /f "delims=" %%t in ('SubWcRev %CD% -f ^| findstr "Mixed revision range"') do set version=%%t if "%version%" equ "" ( echo "version string was empty" goto ERROR_EXIT ) else ( echo "version:" %version% ) ) else ( echo "version:" %version% ) REM REM version = "Updated to revision 12345" , or, "Mixed revision range 34046:34064" REM for /f "tokens=4,*" %%a in ("%version%") do ( REM echo %%a set version=%%a if "%version%" equ "" ( echo "version number was empty" goto ERROR_EXIT ) goto FIND_VERSION ) :FIND_VERSION REM REM generate version.h REM echo #ifndef VERSION_H > version.h echo #define VERSION_H >> version.h echo #define SOURCE_CODE_VERSION "%version%" >> version.h echo #endif >> version.h exit 0 :ERROR_EXIT REM REM generate version.h with #error to tell C compiler stop REM echo "generate #error to stop C compiler" echo #ifndef VERSION_H > version.h echo #define VERSION_H >> version.h echo #error "could not extract source code version" >> version.h echo #endif >> version.h exit 1
在上面的指令碼中, 做了幾件事情:
- 呼叫 SubWCRev 獲取 working copy 版本資訊
- 根據 "Updated to revision" 或者 "Mixed revision range" 來定位版本資訊,提取對應的行
- 分析版本字串,提取數字版本號
- 生成標頭檔案 version.h
具體就不再贅述,看指令碼應該很清楚,for、if 等指令碼命令語法不清楚的,可以搜尋,或者以 /? 為引數檢視幫助。
將原始碼版本號編譯進可執行檔案
我們在前面獲取 svn 原始碼版本號的指令碼中生成了一個頭檔案 version.h ,定義了 SOURCE_CODE_VERSION 這個巨集,只要在需要使用版本號的地方,直接使用這個巨集即可;當然前提是包含 version.h 標頭檔案,這樣在編譯時就把原始碼版本號帶進來了。
這個過程,可以結合 Qt Creator ,變成自動的。只需下面幾個步驟:
- 將指令碼檔案 get_svn_version.bat 放到工程目錄下
- 選擇 Qt Creator 左側的專案標籤,選擇右側的構建,新增自定義步驟(參考 Windows下Qt for Android 編譯安卓C語言可執行程式),選擇 get_svn_version.bat 作為命令,工作目錄設定為工程所在目錄(version.h將被放在這裡)
- 把剛新增的自定義步驟順序調整到最上面
- 在 main.c(.cpp) 中包含 version.h ,使用 SOURCE_CODE_VERSION 巨集