我就是这样做的。注意:获取修订的 Python 代码来自this 帖子。
BuildInfo.hpp
#ifndef BUILDINFO_HPP_
#define BUILDINFO_HPP_
struct BuildInfo
{
static const char Name[];
static const char GitRevision[];
};
#endif
(自动生成)BuildInfo.cpp
#include "BuildInfo.hpp"
const char BuildInfo::Name[] = "MyAppNAme";
const char BuildInfo::GitRevision[] = "5e854351b342acff6a3481d9106076df379c449a";
生成BuildInfo.py。用于生成 BuildInfo.cpp 的 Python 脚本。请注意,这可以很容易地适应获取短或长的修订号或其他存储库信息。它也可以转换为生成 C 代码而不是 cpp,因此两者都兼容。
import sys
import os
import subprocess
#args: [0]: this script path [1]: Output file name [2]: Application name string
# Return the git revision as a string
def git_version():
def _minimal_ext_cmd(cmd):
# construct minimal environment
env = {}
for k in ['SYSTEMROOT', 'PATH']:
v = os.environ.get(k)
if v is not None:
env[k] = v
# LANGUAGE is used on win32
env['LANGUAGE'] = 'C'
env['LANG'] = 'C'
env['LC_ALL'] = 'C'
out = subprocess.Popen(cmd, stdout = subprocess.PIPE, env=env).communicate()[0]
return out
try:
out = _minimal_ext_cmd(['git', 'rev-parse', 'HEAD'])
GIT_REVISION = out.strip().decode('ascii')
except OSError:
GIT_REVISION = "Unknown"
return GIT_REVISION
if len(sys.argv) < 2 :
exit("No output file name argument provided")
elif len(sys.argv) >= 3 :
name = sys.argv[2]
else :
name = ""
revision = git_version()
if (revision == "Unknown") :
exit("Cant get git revision")
with open(sys.argv[1], "w") as f :
f.write('#include "BuildInfo.hpp"\r\n\r\n')
f.write('const char BuildInfo::Name[] = "' + name + '";\r\n')
f.write('const char BuildInfo::GitRevision[] = "' + revision + '";\r\n')
f.close()
使用构建信息
#include "BuildInfo.hpp"
...
PrintRevision(BuildInfo::GitRevision);
要生成 BuildInfo.cpp,在我调用的后期构建步骤中(在本例中来自 eclipse IDE)
python ${ProjDirPath}/build/GenerateBuildInfo.py ${ProjDirPath}/src/BuildInfo.cpp ${ProjName}