`
cloudmail
  • 浏览: 271040 次
  • 来自: 广州
社区版块
存档分类
最新评论

在程序内动态获取svn版本号

阅读更多
生产线上使用的程序往往比当前正在开发的代码库旧,当程序出现bug时,为了可以追踪到程序对应的版本,需要在程序内记录代码库对应的版本号。本文说明怎么在程序内动态获取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])

分享到:
评论
1 楼 cloudmail 2012-09-09  
补充方法1:
在Makefile添加变量,在cpp代码通过宏可获得版本号:
-DRELEASEVERSION=$(RELEASEVERSION) -DBUILDOS=$(BUILDOS) -DBUILDDATE=$(BUILDDATE) -SVNVERSION=$(SVNVERSION)


补充方法2:
在c++代码中添加
static const char g_pRevision[] __attribute__((used)) = { "$Id: $" };


svn propset svn:keywords "Id" svnversion.cpp


svn提交后,g_pRevision 自动变成
static const char g_pRevision[] __attribute__((used)) = { "$Id: svnversion.cpp 922 2012-02-02 13:23:30Z example-username $" };


关键点:
__attribute__((used))不能去掉,否则 gcc 看到这个变量没人使用,会进行优化,从而去掉。

更多参考:
gcc attribute:http://gcc.gnu.org/onlinedocs/gcc-3.1.1/gcc/Variable-Attributes.html
svn 关键字替换:http://svnbook.red-bean.com/en/1.4/svn.advanced.props.special.keywords.html

相关推荐

    获取svn最新版本号示例 以及svn常用命令

    本文将深入探讨如何获取svn的最新版本号,并介绍一些常用的svn命令。 首先,获取svn的最新版本号通常是为了确保你正在使用的代码是最新的,避免因版本过旧而遇到已解决的问题或错过新功能。有几种方法可以获取: 1...

    自动化的在程序中显示svn版本_附件

    1. **获取SVN版本信息**:你可以使用SVN命令行工具(如`svn info`)来获取项目当前的版本号。这个命令会返回包括URL、修订版本号、作者等在内的多种信息。 2. **脚本化过程**:为了自动化这个过程,你可以编写一个...

    VS编译发布根据SVN自动更新版本号

    2. **获取SVN版本信息**:利用SVN插件提供的API或者通过执行SVN命令行工具,可以获取当前代码库的最新版本号。例如,`svn info`命令会返回包含版本号的信息。 3. **自定义MSBuild脚本**:VS使用MSBuild作为其构建...

    SVN生成版本号

    在VS项目中获取SVN版本号,一般有两种常见方法: 1. **使用预构建事件命令**:在项目的属性页中,我们可以设置预构建事件命令行。这里可以添加一个批处理脚本,该脚本调用SVN命令行工具(如`svn info`),获取仓库...

    自动化运维之用Zabbix+mysql制作 监控SVN主从版本号是否一致的脚本.zip

    在我们的案例中,Zabbix将作为监控平台,通过自定义的监控项(key)来获取SVN版本信息。 1. **在Zabbix定义一个key**:在Zabbix中,每个监控项都有一个独特的key,用于标识和收集特定的数据。在描述中提到的`svn...

    linux编译加入编译时间和svn版本号借鉴.pdf

    Linux 编译期加入编译时间和 SVN 版本号是非常重要的功能,特别是在程序开发时需要频繁地编译和更新代码。下面我们将详细介绍如何在 Linux 编译期加入编译时间和 SVN 版本号。 加入编译时间的方法 加入编译时间有...

    自动获取svn代码并且编译发布

    标题和描述中提到的“自动获取svn代码并且编译发布”是一种常见的持续集成(CI)实践,它涉及自动化从版本控制系统获取源代码、构建应用程序、并进行发布的过程。以下是这个流程涉及的关键知识点: 1. **Subversion ...

    VS2008插件SVN修改版本号

    标题中的“VS2008插件SVN修改版本号”指的是一个针对Visual Studio 2008(VS2008)开发的插件,该插件的主要功能是在编译过程中自动更新RC资源文件中的版本信息。RC资源文件是Windows应用程序中用于存储用户界面元素...

    SVN安装程序包64位

    同样,版本号与主安装程序相同,意味着语言包与主程序兼容,确保所有功能都能正常显示和使用。 安装这两个MSI文件的步骤通常是先安装`TortoiseSVN_1.8.8.25755_x64.msi`,然后根据需要安装`LanguagePack_1.8.8....

    SVN版本冲突解决详解

    假设 A、B 两个用户都在版本号为 100 的时候,修改了 kingtuns.txt 这个文件,A 用户在修改完成之后提交 kingtuns.txt 到服务器,这个时候提交成功,这个时候 kingtuns.txt 文件的版本号已经变成 101 了。...

    SVN版本控制器 + 语言安装包 (Win)

    标题中的"SVN版本控制器 + 语言安装包 (Win)"指的是包含了SVN版本控制器的TortoiseSVN客户端以及语言包,适合在Windows操作系统上使用。TortoiseSVN的版本号为1.11.1,构建号为28492,且是64位版本。语言包则是...

    使用SVN实现版本号自增

    火龙果软件工程技术中心 在《介绍一下SVN》一文中,我提到了自动递增版本号的功能,现在就来具体说明一下实现方法。虽然标题中说的是“使用SVN”,但我们实际用的是SVN的客户端工具TortoiseSVN中的SubWCRev程序。...

    获取本机svn帐号密码工具

    SVN(Subversion)是一种广泛使用的版本控制系统,用于管理对文件和目录的修改历史。它允许用户协同工作,跟踪文件的变化,并恢复过去的版本。在使用SVN时,通常需要设置用户名和密码以便验证身份,确保只有授权的...

    svn控制版本svn控制版本

    ### SVN版本控制系统详解 #### 一、SVN简介与核心概念 版本控制系统是软件开发过程中不可或缺的工具之一,它能够帮助团队有效地管理源代码的变化历史,实现多人协作下的代码版本同步与冲突解决。Subversion(简称...

    SVN取版本工具

    使用这类工具,用户可以创建一个包含所需文件名和对应版本号的列表,然后工具会自动处理剩下的工作,这样既提高了效率,也减少了出错的可能性。此外,这样的工具可能还具备其他高级功能,比如批量导出、版本对比、...

    版本管理工具-SVN

    3. **版本(Revision)**:每次提交都会增加一个新的版本号,记录下每次修改的内容。 4. **提交(Commit)**:将本地工作副本的更改上传到仓库,会创建一个新的版本。 5. **更新(Update)**:获取仓库中的最新...

    SVN程序管理软件 非常好

    TortoiseSVN-1.3.3.6219-svn-1.3.1.msi是这个客户端的安装文件,版本号为1.3.3,表明它是2007年左右发布的较早版本。 使用SVN进行版本控制有以下关键操作: 1. **Checkout**:从仓库获取最新的工作副本,这是开始...

    svn3.6.1、3.6.3版本

    版本号的提升通常意味着修复了已知问题、提升了性能或添加了新功能。在3.6系列中,可能包括对客户端和服务器端的改进,比如增强的安全性、更高效的冲突解决机制以及对大文件和分支操作的优化。不过,没有提供具体的...

    TSvnPwd-svn查看本地账密信息程序(windows版本)

    总结起来,“TSvnPwd-svn查看本地账密信息程序(windows版本)”是一个实用工具,它解决了在Windows环境下SVN用户忘记密码的问题。通过运行TSvnPwd.exe,用户可以轻松获取被系统保存的SVN认证信息,有效地提高了工作...

    SVN版本控制系统操作文档

    ### SVN版本控制系统操作文档知识点详解 #### 一、SVN简介与重要性 **SVN**(Subversion)是一个开源的版本控制系统,旨在替代早期流行的**CVS**(Concurrent Versions System)系统。相比于CVS,SVN引入了更先进的...

Global site tag (gtag.js) - Google Analytics