tsvn 带有一个命令行程序 subwcrev.exe. 可以对一个指定文件进行一些宏替换, 比如: 将 $WCREV$ 替换成当前版本号. 这个是最有用的. 详细帮助见
http://tortoisesvn.net/docs/nightly/TortoiseSVN_zh_CN/tsvn-subwcrev-keywords.html
以 vc6 为例, 文件的版本信息保存在 rc 文件. 编译成 res 文件, 然后和其他 obj 一起 link. 现在的思路就是. 编辑 rc 文件, 将版本号比如 2.2.4.0 改成 2.2.4.$WCREV$, 在每次 link 之前, 先用 subwcrev.exe 处理 rc 文件, 进行宏替换. 然后调用 rc.exe 编译替换后的新文件. 生成 res 之后一起 link.
. 修改 rc 文件的 versioninfo 段成如下:
#ifdef _AUTOVERSION
FILEVERSION 2,2,4,$WCREV$
PRODUCTVERSION 2,2,4,$WCREV$
#else
FILEVERSION 2,2,4,0
PRODUCTVERSION 2,2,4,0
#endif
...
#ifdef _AUTOVERSION
VALUE "FileVersion", "2, 2, 4, $WCREV$/0"
VALUE "ProductVersion", "2, 2, 4, $WCREV$/0"
#else
VALUE "FileVersion", "2, 2, 4, 0/0"
VALUE "ProductVersion", "2, 2, 4, 0/0"
#endif
其实也就是加上了条件编译. 默认情况下没有定义 _AUTOVERSION, 则使用原来的 fileversion, productversion. 如果定义了 _AUTOVERSION, 则使用新的版本信息.
. 在项目属性找到 pre-link 页. 在其中增加:
subwcrev/subwcrev.exe . myprogram.rc myprogram.rc_
rc.exe /l 0x804 /fo"/release/myprogram.res" /d "_AUTOVERSION" /d "_AFXDLL" "myprogram.rc_"
第一条命令处理 myprogram.rc , 生成 myprogram.rc_
第二条命令编译 myprogram.rc_ 为 myprogram.res, 注意它的路径. 这里是 release 版的默认路径. 原则就是这里生成的 res 替换原来的 res 文件.
按 f7, build. 现在版本信息已经刷新了. 每次向 svn 提交. 版本都会更新.
不过我们还可以更进一步. 将版本信息, 编译时间等写入到关于对话框中. 其实关键还是 pre-link.
. 创建一个文件 buildtime.cpp, 内容如下:
const char*szBuildTime = "Build on $WCNOW$";
const char*szFullVersion="MyProgram 2.2.4.$WCREV$$WCMODS?+:$$WCMIXED?#:$";
. 在关于对话框 OnInitDialog() 中加入:
extern const char* szBuildTime;
extern const char* szFullVersion;
SetDlgItemText(IDC_BUILDTIME, szBuildTime);
SetDlgItemText(IDC_VERSION, szFullVersion);
. 在 pre-link 再加上两条:
subwcrev/subwcrev.exe . buildtime.cpp buildtime_.cpp
cl /c /nologo /Fo/Release/buildtime.obj /MT buildTime_.cpp
原理和 rc 文件一样. 先替换, 后编译. 同样要保证生成的 buildtime.obj 覆盖原来的 buildtime.obj
大功告成.
不过有一点要注意. vc6 的资源编辑器在每次编辑资源之后都重新生成 rc 文件. 也就是说, 会删除我们对 rc 的修改. 还没有找到好的办法, 现在只能是每次编辑资源之后再手工添加一下条件编译的部分. 建议在项目进入 beta 之后再加上版本信息. 因为这个时候程序的资源一般都不会变动了.
另外, 虽然这里是以 vc6 为例, 但也可以应用到 vc2003, vc2005 等编译环境.
后记: 还可以考虑用程序自动修改. 找到 FILEVERSION, 将后面的版本替换成 FILEVERSION 2,2,4,$WCREV$, 然后再用 subwcrev 替换. 再用 rc 编译. 这样还不用定义 _AUTOVERSION 宏.