跟踪可执行文件中的代码版本

时间:2011-09-07 01:02:26

标签: c++ git build waf

我有一个用C ++编写的合理大小(大约40k行)的机器学习系统。这仍在积极开发中,我需要定期运行实验,即使我对代码进行了更改。

我的实验输出是在简单的文本文件中捕获的。在查看这些结果时,我想要做的是找出生成它的代码的确切版本。我通常会同时运行大约5到6个实验,每个实验的代码版本略有不同。

我想知道,例如,通过编译文件A的版本1,文件B的版本2等获得了一组结果(我只需要一些标识符,“git describe”的输出在这里就可以了)

我的想法是在编译二进制文件时以某种方式包含此信息。这样,这可以与结果一起打印出来。

任何建议如何以一种很好的方式完成这项工作。特别是,用git做这个的好方法?

2 个答案:

答案 0 :(得分:3)

我生成一个源文件作为构建过程的一部分,如下所示:

static const char version_cstr[] = "93f794f674 (" __DATE__ ")";
const char * version()
{
  return version_cstr;
}

然后很容易在启动时记录版本。

我最初在命令行上使用了DEFINE,但这意味着每个版本都会更改构建系统重新编译的所有内容 - 对于大型项目来说并不好用。

这是我用来生成它的scons片段,也许你可以根据自己的需要调整它。

# Lets get the version from git
# first get the base version
git_sha = subprocess.Popen(["git","rev-parse","--short=10","HEAD"], stdout=subprocess.PIPE ).communicate()[0].strip()
p1 = subprocess.Popen(["git", "status"], stdout=subprocess.PIPE )
p2 = subprocess.Popen(["grep", "Changed but not updated\\|Changes to be committed"], stdin=p1.stdout,stdout=subprocess.PIPE)
result = p2.communicate()[0].strip()

if result!="":
  git_sha += "[MOD]"

print "Building version %s"%git_sha


def version_action(target,source,env):
  """
  Generate file with current version info
  """
  fd=open(target[0].path,'w')
  fd.write( "static const char version_cstr[] = \"%s (\" __DATE__ \")\";\nconst char * version()\n{\n  return version_cstr;\n}\n" % git_sha )
  fd.close()
  return 0

build_version = env.Command( 'src/autogen/version.cpp', [], Action(version_action) )
env.AlwaysBuild(build_version)

答案 1 :(得分:1)

您可以在源文件中使用$Id:$,如果您在.gitattributes中使用“ident”选项添加包含此短语的文件,Git会将其替换为sha1哈希值(请参阅{{ 3}})。