1. 程式人生 > >Qt Creator自動使用svn原始碼版本號編譯

Qt Creator自動使用svn原始碼版本號編譯

    有時我們想在編譯工程時,使用 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 ,變成自動的。只需下面幾個步驟:

  1. 將指令碼檔案 get_svn_version.bat 放到工程目錄下
  2. 選擇 Qt Creator 左側的專案標籤,選擇右側的構建,新增自定義步驟(參考 Windows下Qt for Android 編譯安卓C語言可執行程式),選擇 get_svn_version.bat 作為命令,工作目錄設定為工程所在目錄(version.h將被放在這裡)
  3. 把剛新增的自定義步驟順序調整到最上面
  4. 在 main.c(.cpp) 中包含 version.h ,使用 SOURCE_CODE_VERSION 巨集
   --------    好啦, 經過上面兩步的處理,我們就可以在每次編譯時把我們的 working copy 的版本資訊帶入到可執行程式中了,有了這個版本資訊,可以給問題排查、相容性處理帶來一些幫助。