1. 程式人生 > >將 svn 版本修訂號寫入程式版本資訊

將 svn 版本修訂號寫入程式版本資訊

tsvn 帶有一個命令列程式 subwcrev.exe. 可以對一個指定檔案進行一些巨集替換, 比如: 將 $WCREV$ 替換成當前版本號. 這個是最有用的. 詳細幫助見  
 
http://tortoisesvn.net/docs/nightly/TortoiseSVN_zh_CN/tsvn-subwcrev-keywords.html
以 vc6 為例, 檔案的版本資訊儲存在 rc 檔案. 編譯成 res 檔案, 然後和其他 obj 一起 link. 現在的思路就是. 編輯 rc 檔案, 將版本號比如 2.2.4.0 改成 2.2.4.$WCREV$, 在每次 link 之前, 先用 subwcrev.exe 處理 rc 檔案, 進行巨集替換. 然後呼叫 rc.exe 編譯替換後的新檔案. 生成 res 之後一起 link.

. 修改 rc 檔案的 versioninfo 段成如下:
 #ifdef _AUTOVERSION
  FILEVERSION 2,2,4,$WCREV$
  PRODUCTVERSION 2,2,4,$WCREV$
 #else
  FILEVERSION 2,2,4,0
  PRODUCTVERSION 2,2,4,0
 #endif
 ...
 #ifdef _AUTOVERSION
    VALUE "FileVersion", "2, 2, 4, $WCREV$/0"
    VALUE "ProductVersion", "2, 2, 4, $WCREV$/0"
 #else
    VALUE "FileVersion", "2, 2, 4, 0/0"
    VALUE "ProductVersion", "2, 2, 4, 0/0"
 #endif           

其實也就是加上了條件編譯. 預設情況下沒有定義 _AUTOVERSION, 則使用原來的 fileversion, productversion. 如果定義了 _AUTOVERSION, 則使用新的版本資訊.

. 在專案屬性找到 pre-link 頁. 在其中增加:
subwcrev/subwcrev.exe . myprogram.rc myprogram.rc_
rc.exe /l 0x804 /fo"/release/myprogram.res" /d "_AUTOVERSION" /d "_AFXDLL" "myprogram.rc_"

第一條命令處理 myprogram.rc , 生成 myprogram.rc_
第二條命令編譯 myprogram.rc_ 為 myprogram.res, 注意它的路徑. 這裡是 release 版的預設路徑.  原則就是這裡生成的 res 替換原來的 res 檔案.

按 f7, build. 現在版本資訊已經重新整理了. 每次向 svn 提交. 版本都會更新.

不過我們還可以更進一步. 將版本資訊, 編譯時間等寫入到關於對話方塊中. 其實關鍵還是 pre-link.
. 建立一個檔案 buildtime.cpp, 內容如下:
 const char*szBuildTime = "Build on $WCNOW$";
 const char*szFullVersion="MyProgram 2.2.4.$WCREV$$WCMODS?+:$$WCMIXED?#:$";

. 在關於對話方塊 OnInitDialog() 中加入:
 extern const char* szBuildTime;
 extern const char* szFullVersion;
 SetDlgItemText(IDC_BUILDTIME, szBuildTime);
 SetDlgItemText(IDC_VERSION, szFullVersion);

. 在 pre-link 再加上兩條:
 subwcrev/subwcrev.exe . buildtime.cpp buildtime_.cpp
 cl /c /nologo /Fo/Release/buildtime.obj /MT buildTime_.cpp

原理和 rc 檔案一樣. 先替換, 後編譯. 同樣要保證生成的 buildtime.obj 覆蓋原來的 buildtime.obj

大功告成.
不過有一點要注意. vc6 的資源編輯器在每次編輯資源之後都重新生成 rc 檔案. 也就是說, 會刪除我們對 rc 的修改. 還沒有找到好的辦法, 現在只能是每次編輯資源之後再手工新增一下條件編譯的部分. 建議在專案進入 beta 之後再加上版本資訊. 因為這個時候程式的資源一般都不會變動了.

另外, 雖然這裡是以 vc6 為例, 但也可以應用到 vc2003, vc2005 等編譯環境.

後記: 還可以考慮用程式自動修改. 找到 FILEVERSION, 將後面的版本替換成 FILEVERSION 2,2,4,$WCREV$, 然後再用 subwcrev 替換. 再用 rc 編譯. 這樣還不用定義 _AUTOVERSION 巨集.