1

目前要在使用 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/. 问题是我们在使用 GNU Makefiles 时没有这样的机制。

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

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

2 回答 2

4

您在这里错误地使用了 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()

哪里Fortran可以用CXXor代替C

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

于 2012-04-14T01:25:21.260 回答
1

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

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

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

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

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

于 2012-04-14T13:28:35.263 回答