生产线上使用的程序往往比当前正在开发的代码库旧,当程序出现bug时,为了可以追踪到程序对应的版本,需要在程序内记录代码库对应的版本号。本文说明怎么在程序内动态获取svn版本号。
1,在Makefile自动生成版本号到version.cpp
2,version.cpp代码:
3. 调用代码:
3,运行结果
1,在Makefile自动生成版本号到version.cpp
app : version.o app.o
g++ -o testapp version.cpp app.cpp
force:
version.cpp: force
@$(SHELL) -ec 'sed -i "s|RELEASE_VERSION|1.1|g" version.cpp'
@$(SHELL) -ec 'sed -i "s|BUILD_OS|`uname`|g" version.cpp'
@$(SHELL) -ec 'sed -i "s|BUILD_DATE|`date +%y%m%d`|g" version.cpp'
# @$(SHELL) -ec 'sed -i "s|SVN_VERSION|1234|g" version.cpp'
@$(SHELL) -ec 'sed -i "s|SVN_VERSION|`LANG=C;LC_ALL=C;export LC_ALL;svn info .. | grep "Last Changed Rev: " | sed -e "s/Last Changed Rev: //g"`|g" version.cpp'
2,version.cpp代码:
const char * g_lpszReleaseVersion = "RELEASE_VERSION";
const char * g_lpszBuildOS = "BUILD_OS";
const char * g_lpszBuildDate = "BUILD_DATE";
const char * g_lpszSvnVersion = "SVN_VERSION";
void getVersion(const stdstring & strAppName, stdstring & strVersion)
{
stdstring strReleaseVersion = g_lpszReleaseVersion;
#ifdef RELEASEVERSION
strReleaseVersion = RELEASEVERSION;
#endif
stdstring strBuildOS = g_lpszBuildOS;
#ifdef BUILDOS
strBuildOS = BUILDOS;
#endif
stdstring strBuildDate = g_lpszBuildDate;
#ifdef BUILDDATE
strBuildDate = BUILDDATE;
#endif
stdstring strSvnVersion = g_lpszSvnVersion;
#ifdef SVNVERSION
strSvnVersion = SVNVERSION;
#endif
strVersion = FormatString("% version %(Build %-%[%])").arg(strAppName).arg(strReleaseVersion)
.arg(strBuildOS).arg(strBuildDate).arg(strSvnVersion).str();
}
3. 调用代码:
extern void getVersion(const stdstring & strAppName, stdstring & strVersion);
stdstring strVersion;
getVersion("testapp", strVersion);
std::cout << strVersion << std::endl;
3,运行结果
testapp version 1.1(Build Linux-120909[2292])