プログラム内でsvnバージョン番号を動的に取得


ライン上で使用されるプログラムは、現在開発中のコードライブラリよりも古いことが多く、プログラムにバグが発生した場合、プログラムに対応するバージョンを追跡できるように、コードライブラリに対応するバージョン番号をプログラム内に記録する必要があります.この文書では、svnバージョン番号をプログラム内で動的に取得する方法について説明します.
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])