对于源码SVN受控的项目,很希望SVN版本号作为软件版本的一部分,在Linux使用shell脚本很容易搞定这个事情,但在windows下的嵌入式项目就么有那么容易。最近在IAR中成功使用pre-build功能搞定了这个事情,具体见如下的步骤:
1. 首先保证你的svn客户端支持控制台命令,我使用的是tortoiseSVN,在安装时注意勾选tortoiseSVN的命令行支持;
2. 编写一个windows脚本ProduceVersion.bat放到IAR的工程目录下(也即和*.eww同一个目录),该脚本的内容如下:
echo // This file is automatically generated or updated^, please don't edit it. > %1\SVNVersion.h
echo #pragma once >> %1\SVNVersion.h
echo #define SVN_VERSION \>> %1\SVNVersion.h
svnversion %1^" >> %1\SVNVersion.h
exit
3. 在IAR的Proj->Options->Build Actions->Pre-Build command line中写入:cmd /c start $PROJ_DIR$\ProduceVersion.bat $PROJ_DIR$
4. 在编译的时候IAR就会先调用ProduceVersion.bat,它将生成一个SVNVersion.h的文件,该文件的内容为:
// This file is automatically generated or updated, please don't edit it.
#pragma once
#define SVN_VERSION \
171M
5. 在程序中我们就可以包含SVNVersion.h这个文件,并且使用SVN_VERSION这个宏了。细心的你应该发现问题了吧,SVN_VERSION定义成了171M,171M既不是又不是字符串也不是整数,那么问题来了,如何使用这个结果?关键的来了!见下面的代码片段:
#define __MY_STR(V) ""#V""
#define MY_STR(V) __MY_STR(V)
static const char svnVersion[] = {MY_STR(SVN_VERSION)};
这样你就可以在你的代码中使用svnVersion这个数组了。