【问题标题】:How to version control out-of-source build directory using CMake and SVN如何使用 CMake 和 SVN 对源代码外构建目录进行版本控制
【发布时间】:2017-07-20 02:29:09
【问题描述】:

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 中的忽略属性。

这感觉不太容易维护,我相信有更好的方法。是否有人对为每个构建编写 CMake 命令脚本,同时在构建后保持“干净”的 SVN 状态有任何建议?

【问题讨论】:

    标签: svn build cmake


    【解决方案1】:

    如果我正确理解了您的问题(“我将在树中有很多文件,但只想对其中的一小部分预定义子集进行版本化”),您可以使用惰性方式

    1. 忽略build目录中的all
    2. 手动添加 svn add FILE 仅需要的文件
    3. 出现新配置时重复上一步

    因此,随着时间的推移,您将获得永久的 svn:ignore 并且所有构建-articacts 不会出现在 repo 中

    【讨论】:

      【解决方案2】:

      您应该将构建脚本或脚本放在源代码所在的位置。是否进行源外构建无关紧要,可重用的构建脚本属于源代码(就像 makefiles、CMakeLists.txt 一样)。

      【讨论】:

      【解决方案3】:

      Cmake 发行版通常在Modules 文件夹中附带一个FindSubversion.cmake。您只需像这样使用它:

         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 模块文件夹中本地找到答案) .

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-05-07
        • 1970-01-01
        • 2019-10-28
        • 1970-01-01
        • 1970-01-01
        • 2012-03-24
        • 2015-10-09
        • 2014-06-13
        相关资源
        最近更新 更多