2010-11-16 38 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。