如何使用CMake和SVN控制源外构建目录的版本

时间:2015-10-19 08:19:57

标签: svn build cmake

CMake建议使用源外构建。通常我所拥有的是每个构建的小构建脚本,因此我不必手动执行CMake命令。例如,我的构建目录可能如下所示:

build
|--linux
|  |--build.sh
|--arm
   |--build.sh

arm/build.sh可能如下所示:

cmake \
    -D CMAKE_CXX_COMPILER=${CROSS_COMPILE}g++ \
    -D CMAKE_C_COMPILER=${CROSS_COMPILE}gcc \
    -D CMAKE_CXX_FLAGS="-mcpu=cortex-a9" \
    -D CMAKE_C_FLAGS="-mcpu=cortex-a9" \
    -D CMAKE_BUILD_TYPE="" \
    -G "Unix Makefiles" ../..

我喜欢这种方法如何通知开发人员支持哪些平台,总体来说还不错 - 直到我想对版本控制build.sh脚本。我遇到的问题是,当我向版本控件添加build时,我会获取所有CMake构建文件并构建目录。我知道我可以"忽略"相关的目录和文件,但考虑如果我添加一个新的构建或添加一个新的库到我的顶层会发生什么 - 然后我每次都为每个构建更新SVN中的ignore属性。

这并不是非常易于维护,我确信这是一种更好的方法。有没有人建议为每个版本编写CMake命令的脚本,同时保持一个“干净”的版本。构建后的SVN状态?

3 个答案:

答案 0 :(得分:2)

如果我正确地理解了你的问题(“我会在树中有很多文件,但是想要只对它的小预定义子集进行版本化”),你可以使用lazy-way

  1. 忽略build目录
  2. 中的所有
  3. 手动添加svn add FILE仅需要的文件
  4. 出现新配置时重复上一步
  5. 因此,随着时间的推移,您将永久保持svn:ignore并且所有build-articacts 都不会出现在回购

答案 1 :(得分:1)

您应该将构建脚本或脚本放在源代码所在的位置。如果您正在进行源外构建,则可重用的构建脚本属于源代码(就像makefile,CMakeLists.txt一样)并不重要。

答案 2 :(得分:1)

Cmake发行版通常在FindSubversion.cmake文件夹中附带Modules。你只需使用它:

   find_package( Subversion )
   if( SUBVERSION_FOUND )
     Subversion_WC_INFO( ${CMAKE_CURRENT_SOURCE_DIR} MyProj )
     add_definitions( -DSVN_WC_REVISION=${MyProj_WC_REVISION}" )
   endif( SUBVERSION_FOUND )

现在,您已在源代码中将SVN_WC_REVISION定义为预处理器宏。它可用于您的"关于"对话框或.rc文件,您可以在其中向DLL添加元数据属性。此外,您在构建后没有遗留的本地修改文件。 就这么简单!

以下是分布式FindSubversion.cmake中的一些参考资料:

The minimum required version of Subversion can be specified using the
standard syntax, e.g.  find_package(Subversion 1.4)

If the command line client executable is found two macros are defined:
   Subversion_WC_INFO(<dir> <var-prefix>)
   Subversion_WC_LOG(<dir> <var-prefix>)

Subversion_WC_INFO extracts information of a subversion working copy
at a given location.  This macro defines the following variables:
   <var-prefix>_WC_URL - url of the repository (at <dir>)
   <var-prefix>_WC_ROOT - root url of the repository
   <var-prefix>_WC_REVISION - current revision
   <var-prefix>_WC_LAST_CHANGED_AUTHOR - author of last commit
   <var-prefix>_WC_LAST_CHANGED_DATE - date of last commit
   <var-prefix>_WC_LAST_CHANGED_REV - revision of last commit
   <var-prefix>_WC_INFO - output of command `svn info <dir>'

Subversion_WC_LOG retrieves the log message of the base revision of a
subversion working copy at a given location.  This macro defines the
variable:
   <var-prefix>_LAST_CHANGED_LOG - last log of base revision

Example usage:

   find_package(Subversion)
   if(SUBVERSION_FOUND)
     Subversion_WC_INFO(${PROJECT_SOURCE_DIR} Project)
     message("Current revision is ${Project_WC_REVISION}")
     Subversion_WC_LOG(${PROJECT_SOURCE_DIR} Project)
     message("Last changed log is ${Project_LAST_CHANGED_LOG}")
   endif()

我知道这有点晚了,但是我希望这可以帮助你或其他人像我在研究答案时那样偶然发现你的问题(只是在我自己的Cmake机器上找到答案) modules folder)。