使用CMake获取SVN分支对应HEAD版本号异常问题咨询
解决CMake获取SVN分支版本号不准确的问题
首先得明确一个关键点:CMake内置的subversion_wc_info函数获取的是本地SVN工作副本的最后修订版本,也就是你本地文件最后被更新/提交的那个版本号,而不是远程分支的HEAD版本。你遇到的问题大概率是下面两个原因之一:
- 切换分支后没有执行
svn update拉取分支的最新代码,本地工作副本依然停留在主干的旧版本状态; - CMake缓存了之前获取到的SVN版本变量,即使你更新了工作副本,旧的缓存值依然在生效。
下面是具体的解决方案,按优先级排序:
1. 确保本地工作副本是分支的最新状态
先在项目根目录执行SVN更新命令,拉取分支的最新代码:
svn update
执行完成后,你的本地工作副本就会同步到分支的HEAD版本#355,此时重新运行CMake应该就能获取到正确的版本号了。
2. 清除CMake缓存,重新生成构建文件
CMake会缓存SUBVERSION_FOUND、${PROJECT_NAME}_WC_REVISION这类变量,所以即使你更新了SVN工作副本,旧的缓存值还会被复用。你需要:
- 删除构建目录下的
CMakeCache.txt文件; - 或者直接删除整个构建目录,重新创建并运行
cmake ..生成新的构建文件。
3. 直接调用SVN命令行获取远程分支HEAD版本(进阶方案)
如果你需要绕过本地工作副本状态,直接获取远程分支的最新HEAD版本,可以用CMake的execute_process调用SVN命令行工具解析输出。示例代码如下:
find_package(Subversion) if(SUBVERSION_FOUND) execute_process( COMMAND ${Subversion_SVN_EXECUTABLE} info ${PROJECT_SOURCE_DIR} OUTPUT_VARIABLE SVN_INFO_OUTPUT RESULT_VARIABLE SVN_INFO_RESULT OUTPUT_STRIP_TRAILING_WHITESPACE ) if(SVN_INFO_RESULT EQUAL 0) # 解析SVN info输出中的"Last Changed Rev"字段,适配大多数SVN版本 string(REGEX MATCH "Last Changed Rev: ([0-9]+)" _ ${SVN_INFO_OUTPUT}) set(${PROJECT_NAME}_VERSION_REVISION ${CMAKE_MATCH_1}) # 如果你的SVN版本输出是"Revision: XXXX",可以把上面的正则改成"Revision: ([0-9]+)" endif() endif()
这种方式直接从SVN服务器获取当前分支的最新版本号,不受本地工作副本更新状态的影响,适合需要精准展示分支最新版本的场景。
4. 添加缓存刷新逻辑(可选)
为了避免后续再次出现缓存问题,可以在CMake中添加逻辑,当SVN工作副本状态变化时自动刷新版本信息:
set(SVN_INFO_CACHE "${CMAKE_BINARY_DIR}/.svn_cache_timestamp") # 检查SVN工作副本的entries文件是否比缓存文件新 if(NOT EXISTS ${SVN_INFO_CACHE} OR ${PROJECT_SOURCE_DIR}/.svn/entries IS_NEWER_THAN ${SVN_INFO_CACHE}) # 在这里执行SVN版本获取逻辑(不管是用内置模块还是命令行) # ... # 更新缓存文件的时间戳 file(TOUCH ${SVN_INFO_CACHE}) endif()
内容的提问来源于stack exchange,提问作者MarKS
相关产品推荐
相关产品推荐

