Qt Creator自动使用svn源代码版本号编译

    有时我们想在编译工程时,使用 svn 的源代码版本号来作为 build 的一个子版本号;或者只是为了识别某个发布版本,与源代码对应起来。

    在 Linux 下面有很多的解决方案,使用 svn 工具和一些 shell 命令再加上 -D 选项就可以达到上述目的。

    在 Windows 下,使用 Qt Creator 作为开发环境,使用 TortoiseSVN 作为代码管理的客户端工具,该如何实现这个功能呢?

    其实主要有两个步骤:一步是如何自动获取 svn 版本号;另一步是如何使用这个版本号,让其自动进入编译过程,在生成的可执行程序中可以访问。

    自动获取 svn 控制的源码版本号

    TortoiseSVN 有个工具 SubWCRev 可以获取到 working copy 的版本号,具体命令细节可以使用 SubWCRev /? 来查看。

    下面是我写的一个 Windows 脚本,自动干这个事情。

@echo off

for /f "delims=" %%t in ('SubWcRev %CD% -f ^| findstr "Updated to revision"') do set version=%%t

if "%version%" equ "" (
  for /f "delims=" %%t in ('SubWcRev %CD% -f ^| findstr "Mixed revision range"') do set version=%%t 
  if "%version%" equ "" (
    echo "version string was empty"
    goto ERROR_EXIT
  ) else (
    echo "version:" %version%
  )
) else (
  echo "version:" %version%
)

REM
REM version = "Updated to revision 12345" , or,  "Mixed revision range 34046:34064"
REM 
for /f "tokens=4,*" %%a in ("%version%") do (
  REM echo %%a
  set version=%%a

  if "%version%" equ "" (
    echo "version number was empty"
    goto ERROR_EXIT
  )
  
  goto FIND_VERSION
)

:FIND_VERSION


REM
REM generate version.h
REM 
echo #ifndef VERSION_H > version.h
echo #define VERSION_H >> version.h
echo #define SOURCE_CODE_VERSION "%version%" >> version.h
echo #endif >> version.h

exit 0

:ERROR_EXIT

REM
REM generate version.h with #error to tell C compiler stop
REM 
echo "generate #error to stop C compiler"
echo #ifndef VERSION_H > version.h
echo #define VERSION_H >> version.h
echo #error "could not extract source code version" >> version.h
echo #endif >> version.h

exit 1

    在上面的脚本中, 做了几件事情:

  • 调用 SubWCRev 获取 working copy 版本信息
  • 根据 "Updated to revision" 或者 "Mixed revision range" 来定位版本信息,提取对应的行
  • 分析版本字符串,提取数字版本号
  • 生成头文件 version.h 

    具体就不再赘述,看脚本应该很清楚,for、if 等脚本命令语法不清楚的,可以搜索,或者以 /? 为参数查看帮助。


将源码版本号编译进可执行文件

    我们在前面获取 svn 源码版本号的脚本中生成了一个头文件 version.h ,定义了 SOURCE_CODE_VERSION 这个宏,只要在需要使用版本号的地方,直接使用这个宏即可;当然前提是包含 version.h 头文件,这样在编译时就把源码版本号带进来了。

    这个过程,可以结合 Qt Creator ,变成自动的。只需下面几个步骤:

  1. 将脚本文件 get_svn_version.bat 放到工程目录下
  2. 选择 Qt Creator 左侧的项目标签,选择右侧的构建,添加自定义步骤(参考 Windows下Qt for Android 编译安卓C语言可执行程序),选择 get_svn_version.bat 作为命令,工作目录设定为工程所在目录(version.h将被放在这里)
  3. 把刚添加的自定义步骤顺序调整到最上面
  4. 在 main.c(.cpp) 中包含 version.h ,使用 SOURCE_CODE_VERSION 宏
   -------- 
   好啦, 经过上面两步的处理,我们就可以在每次编译时把我们的 working copy 的版本信息带入到可执行程序中了,有了这个版本信息,可以给问题排查、兼容性处理带来一些帮助。

你可能感兴趣的:(Qt)