gpt4 book ai didi

svn - 使用CMake获取构建时Subversion修订版

转载 作者:行者123 更新时间:2023-12-03 13:17:16 26 4
gpt4 key购买 nike

使用CMake,我可以使用Subversion_WC_INFO获得Subversion修订版。但是,这仅在配置时发生-每个后续make将使用此缓存的修订版。

我想在构建时(即每次运行Make时)获得svn修订版。我怎样才能做到这一点?

最佳答案

这比需要做的事更痛苦。您可以在构建时运行程序以从Subversion提取版本信息。 CMake本身可以使用其脚本语言用作此程序。您可以使用-P命令行标志运行任何CMake脚本。这是一段代码(将放置在文件getsvn.cmake中):

# the FindSubversion.cmake module is part of the standard distribution
include(FindSubversion)
# extract working copy information for SOURCE_DIR into MY_XXX variables
Subversion_WC_INFO(${SOURCE_DIR} MY)
# write a file with the SVNVERSION define
file(WRITE svnversion.h.txt "#define SVNVERSION ${MY_WC_REVISION}\n")
# copy the file to the final header only if the version changes
# reduces needless rebuilds
execute_process(COMMAND ${CMAKE_COMMAND} -E copy_if_different
svnversion.h.txt svnversion.h)


这将提取Subversion修订信息并将其写入头文件。仅在需要时才更新此头文件,以避免一直重新编译。在您的程序中,您将包括该头文件以获取SVNVERSION定义。

您需要运行脚本的 CMakeLists.txt文件是这样的:

# boilerplate
cmake_minimum_required(VERSION 2.8)
project(testsvn)

# the test executable
add_executable(test main.c ${CMAKE_CURRENT_BINARY_DIR}/svnversion.h)

# include the output directory, where the svnversion.h file is generated
include_directories(${CMAKE_CURRENT_BINARY_DIR})

# a custom target that is always built
add_custom_target(svnheader ALL
DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/svnheader.h)

# creates svnheader.h using cmake script
add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/svnheader.h
COMMAND ${CMAKE_COMMAND} -DSOURCE_DIR=${CMAKE_CURRENT_SOURCE_DIR}
-P ${CMAKE_CURRENT_SOURCE_DIR}/getsvn.cmake)

# svnversion.h is a generated file
set_source_files_properties(${CMAKE_CURRENT_BINARY_DIR}/svnversion.h
PROPERTIES GENERATED TRUE
HEADER_FILE_ONLY TRUE)

# explicitly say that the executable depends on the svnheader
add_dependencies(test svnheader)


您需要使用 add_custom_targetadd_custom_command,因为svnheader.h文件没有输入,它“从无处显示”到cmake。我已经在getsvn.cmake文件中处理了不必要的重建问题,因此,如果未更改Subversion修订版,则重建“ svnheader”目标基本上是不可行的。

最后,一个示例 main.c文件:

#include "svnversion.h"

int main(int argc, const char *argv[])
{
printf("%d\n", SVNVERSION);
return 0;
}

关于svn - 使用CMake获取构建时Subversion修订版,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3780667/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com