【问题标题】:CMake compiler settings specific to the local working copy特定于本地工作副本的 CMake 编译器设置
【发布时间】:2012-04-14 21:28:35
【问题描述】:

目前为了在使用 gcc 时更改编译器标志,我为构建目标编辑 CMakeLists.txt:

if (UNIX)
    add_definitions(-Wall)
    add_definitions(-g)
    #add_definitions(-O2)
endif (UNIX)

问题在于 git 获取了更改。如果我继续提交此更改,我会惹恼其他希望使用 -O2 而不是 -g 的开发人员,但是当他们拉取不相关的更改时,他们会得到我的版本。通常,我可以从我的提交中排除此更改,但是当我对 CMakeLists.txt 文件进行实际更改时,无法避免推高我个人选择的编译标志。

有没有办法告诉 CMake 在 build/ 目录中创建一个文件(特定于每个工作副本,因此特定于每个开发人员),个人可以根据自己的意愿进行修改,而无需触及项目文件(除了 build /)。自然,我们的 build/ 不会提交到 git 存储库。

请注意,当使用 Visual Studio 而不是 gcc 时,IDE 会通过其 UI 为我们处理此问题,该 UI 会修改 build/.xml 中的 VS 解决方案文件。问题是我们在使用 GNU Makefiles 时没有这样的机制。

我们的项目是这样组织的:

ourproject/
    bin/
    build/ <-- CMake-generated stuff goes here
    lib/
    src/
        abuildtarget/
        anotherbuildtarget/
            source.cpp
            source.h
            CMakeLists.txt

【问题讨论】:

    标签: cmake


    【解决方案1】:

    您在这里错误地使用了 CMake。 add_definitions 函数不能像您那样添加编译器选项;而是添加add_definitions(-DDEBUG)等预处理器定义。

    您要做的是在配置为所需选项时设置CMAKE_&lt;language&gt;_FLAGS。如果有您需要的标准集,则将其放入 CMakeLists.txt 文件中,例如:

    if(${CMAKE_Fortran_COMPILER_ID} STREQUAL "Intel")                                   
      set(CMAKE_Fortran_FLAGS_RELEASE "-O2 -xhost" CACHE STRING "" FORCE)
    
      set(CMAKE_Fortran_FLAGS_NODEBUG "-O0" CACHE STRING "" FORCE)
      mark_as_advanced(CMAKE_Fortran_FLAGS_NODEBUG)
    
      set(CMAKE_Fortran_FLAGS_PROFILING "-O2 -xhost -p" CACHE STRING "" FORCE)
      mark_as_advanced(CMAKE_Fortran_FLAGS_PROFILING)
    
      set(CMAKE_Fortran_FLAGS_DEBUG
          "-DDEBUG -g -check noarg_temp_created -C -traceback" CACHE STRING "" FORCE)
    endif()
    

    其中Fortran 可以替换为CXXC

    在这种情况下,CMAKE_&lt;language&gt;_FLAGS_&lt;build type&gt; 基于CMAKE_BUILD_TYPE 变量设置标志。如果设置为Release,则使用CMAKE_Fortran_FLAGS_RELEASE。我们添加了其他几种可能的构建类型。如果用户想要的东西不是标准构建类型之一,那么他们在配置时将CMAKE_&lt;language&gt;_FLAGS 设置为他们想要的任何东西,它会覆盖构建类型设置并改用用户定义的标志。

    【讨论】:

    • 我认为你不应该只是 set 标志 - 它会覆盖预先放入其中的任何内容(例如,用户在命令行上指定 -DCMAKE_Fortran_FLAGS=...)。我宁愿做set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} new_stuff")
    • @Ela782 我认为最好的做法是像在我的示例中那样设置CMAKE_Fortran_FLAGS_&lt;build type&gt; 标志,因为这些标志应该由代码而不是用户设置。用户始终可以通过命令行或ccmake 界面设置CMAKE_Fortran_FLAGS 来覆盖其中的任何一个。您的选项的问题是当用户指定与new_stuff 冲突的内容时。有些编译器可能会抱怨有冲突的选项,有些可能只是选择一个而不告诉你他们选择了哪个。
    • 一般来说,'CMAKE__FLAGS` 变量不应由开发者在 CMake 文件中设置;开发人员应该只设置构建配置,并让用户指定是否需要其他东西的通用选项。
    • 好的,我现在看到了通用CMake_&lt;language&gt;_FLAGS 和附加_&lt;build type&gt; 之间的区别!谢谢你:)
    【解决方案2】:

    虽然几乎可以肯定有更好的方法利用cmake 来解决您的问题,但您的这部分问题很容易解决:

    但是当我对 CMakeLists.txt 文件进行实际更改时,无法避免推高我个人选择的编译标志。

    只有当您提交您的特定个人文件更改到您的本地存储库时,这才是正确的,即使这样,您也可以在制作要推送的补丁时git-revert,或者在两者之间使用过滤器您的 developmentready-to-push-to-other-developers 分支 - 粗略的想法可以在 here 中找到,尽管您必须对其进行大量编辑以从问题示例中删除有问题的个人行。

    那么,更好的选择是不提交个人更改。从答案here,您可以轻松地提交对文件的特定更改。

    但是,需要注意的是,如果您对未忽略的文件进行了未提交的更改,您最终会得到一个永久脏的工作树;这可能是也可能不是问题,具体取决于您的合并工作流程等。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-06
      • 1970-01-01
      • 2013-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多