CMake特定于本地工作副本的编译器设置

目前,在使用gcc时要更改一个编译器标志,我编辑构建目标的CMakeLists.txt:

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

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

有没有办法告诉CMake在build /目录中创建一个文件(针对每个工作副本,因此对每个开发人员),个人可以根据自己的心愿修改而不触及项目文件(除build /之外的所有内容)。 当然,我们的构建/并没有被委托给git仓库。

注意当使用Visual Studio而不是gcc时,IDE可能会通过它的用户界面修改VS中的VS解决方案文件来处理这个问题。 问题是我们在使用GNU Makefiles时没有这样的机制。

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

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

您在这里错误地使用了CMake。 add_definitions函数不适用于像您所做的那样添加编译器选项; 相反,它是添加预处理器定义,如add_definitions(-DDEBUG)

当你配置你想要的选项时,你想要做的是设置CMAKE_<language>_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()

CXXC可以替换Fortran

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


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

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

这只有在您将特定的个人文件更改提交到本地存储库时才是正确的,即使此时您可以在制作补丁程序时进行git-revert ,也可以在developmentready-to-push-to-other-developers之间使用筛选器ready-to-push-to-other-developers分支 - 大概的想法可以在这里找到,尽管你必须对它进行相当严格的编辑才能从问题示例中删除违规的个人行。

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

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

链接地址: http://www.djcxy.com/p/4191.html

上一篇: CMake compiler settings specific to the local working copy

下一篇: How do I selectively revert some changes in a single commit to a single file?