寻找一种方法来存储从git repo编译的二进制文件中的版本

时间:2010-11-16 16:10:43

标签: svn git versioning autotools

我正在寻找一些实施binary --version的技巧,这些技巧可以提供有关其编译版本的完整信息。

该项目正在使用autotools构建系统,并存储在充当SVN前端的git仓库中。

我希望在二进制文件中包含:

  • 编译时间
  • 作为基础的SVN提交
  • 最后一个git提交ID和时间
  • 如果可能的话,影响此特定二进制文件的最后一次提交

2 个答案:

答案 0 :(得分: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 = "..."这样的makefile片段。通过让您使用已创建的版本文件分发项目,这再次增加了冗余,因此构建不必依赖于SCM的存在。

然后您可以根据需要创建版本字符串,例如:

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

然后在您的主要makefile中,包含该代码段,并将-DMY_VERSION='"$(MY_VERSION)"'添加到相应对象的构建标志中。

稍有不同:将生成的文件纯粹作为版本字符串,然后将该值拉入makefile中的相应变量。

如果您需要有关特定git命令的帮助以获得所需的输出,请随时发表评论。 git describe是一个很棒的人,但对于这种事情来说意味着什么。默认输出是当前提交的最接近的标记祖先,连字符,自标记,连字符和缩写提交哈希以来的提交次数。

答案 1 :(得分:0)

如果您使用automake,VERSION_FILE(请参阅其他答案)也需要在BUILT_SOURCES中标记为Makefile.am,以便成功与myprog_SOURCES一起使用。