2010-11-16 58 views
3

我在尋找一些提示來實現binary --version,它可以提供關於它編譯的版本的好信息。尋找一種方法來存儲從git repo編譯的二進制版本

該項目使用autotools構建系統,並存儲在一個充當SVN前端的git倉庫中。

我想什麼有二進制裏面是:

  • 編譯時間
  • SVN提交這個作爲基礎
  • 最後混帳如果可能的最後一次提交該提交ID和時間
  • 影響這個特定的二進制文件

回答

3

你可能想編寫你的源代碼來使用#defined常量版本字符串。然後,您可以通過-DMY_VERSION=...選項通過構建。這樣可以讓你在代碼中嵌入一個默認值,並且包裹在#ifndef中,以防萬一!

#ifndef MY_VERSION 
#define MY_VERSION 0.0.1-alpha 
#endif 

print_version() { 
    printf("my product: %s\n", MY_VERSION); 
} 

一個很好的方法來處理這在構建過程側,使中間產物生成這簡直是一個生成文件片斷像MY_VERSION = "..."。這又通過讓您分發已經創建的版本文件的項目來增加冗餘,以便構建不必依賴於SCM的存在。

然後你可以,只要你喜歡創建版本字符串,例如:

echo -n 'MY_VERSION = "' > VERSION_FILE 
git describe >> VERSION_FILE 
echo "Compiled on $(date)" >> VERSION_FILE 
... 
echo '"' >> VERSION_FILE 

然後在你的主生成文件,包括片段,並添加-DMY_VERSION='"$(MY_VERSION)"'到構建標誌爲合適的對象。

稍有不同:使生成的文件純粹爲版本字符串,然後將該值拉入makefile中的相應變量。

如果您需要特定git命令的幫助來獲得所需的輸出,請隨時發表評論。儘管如此,git describe是一款出色的產品。默認輸出是當前提交的最接近的標記祖先,連字符,自標記以來的提交數,連字符和縮寫提交哈希。

+0

+1,'git describe'在歷史中至少需要一個標記,或者它保存。 – richq 2010-11-16 20:56:37

+1

@rq:當然。假設你正在標記你的版本 - 你絕對應該這樣做! – Cascabel 2010-11-16 21:13:57

0

需求VERSION_FILE(見其他答案)在Makefile.am被標記爲BUILT_SOURCES也爲它成功地使用myprog_SOURCES,如果你使用automake。