在CMake中更改CMAKE_CXX_FLAGS_DEBUG和朋友的默认值

我想在CMake中更改CMAKE_CXX_FLAGS_RELEASECMAKE_CXX_FLAGS_DEBUG的默认值。 基本上,我有一些项目的默认设置与CMake的不同(比如发布版本)略有不同,我不应该问自己:“哦,当添加add_compile_options时,它们的-O3或者-O2是否优先。

现在,我知道如何设置这些值,但我不知道如何使用户可以通过以下两种常用方式进行编辑:在命令行上使用DCMAKE_CXX_FLAGS_DEBUG=yourflags ,或者使用ccmake或CMakeSetup对其进行configuration。

问题是CMAKE设置和caching它们自己的默认值,如果你不使用FORCE来覆盖variables,那么“默认值”是不会改变的。 如果在我的set命令中使用FORCE: set(CMAKE_CXX_FLAGS_DEBUG blah CACHE STRING "" FORCE) ,每次脚本运行时都会覆盖它,消除了用户如果希望更改它的可能性。

我设法通过执行以下操作来破解它与CCMAKE一起工作,但是这仍然不能与cmake -DCMAKE_CXX_FLAGS_DEBUG因为它会在完成之后覆盖用户更改:

 set(DEFAULTS_SET FALSE CACHE BOOL "") set(CMAKE_CXX_FLAGS_DEBUG "-this -that" CACHE STRING "" FORCE) set(DEFAULTS_SET TRUE CACHE BOOL "" FORCE) 

显然,这是一个讨厌的黑客攻击,并不完全工作(在cmake的情况下 – 这是什么= thisorthat)。 我也可以添加其他的构buildtypes,但是我不明白为什么只需要改变一些简单的东西就可以。

编辑2015年3月1日:

我已经创build了一个可行的解决scheme,但是我仍然对我所要做的事情不感到兴奋。 我看过其他的解决设置CMAKE_CXX_FLAGS_DEBUG和朋友的问题,但是这个解决scheme对我来说并不适用,因为我试图根据正在使用的编译器来select它们。 编译器不确定,但是,直到它已经填充我的variables。 我使用的技巧如下。 在项目命令之前,必须将标志variables设置为“特殊”。

 set(CMAKE_CXX_FLAGS_DEBUG "_UNSET" CACHE STRING "") project(your_project C CXX) if(${CMAKE_CXX_FLAGS_DEBUG} STREQUAL "_UNSET") # Do some compiler switching here and then set your flags with FORCE. set(CMAKE_CXX_FLAGS_DEBUG "-ggdb3 -O0" CACHE STRING "" FORCE) endif() 

现在,我可以通过命令行使用-D或cmake-gui来select完全可以覆盖的默认值。

我只是想增加我看到的四种可能性:

  1. 拥有自己的工具链文件,其中包含您支持的每个编译器的预设:

    GNUToolchain.cmake

     set(CMAKE_CXX_FLAGS_DEBUG "-ggdb3 -O0" CACHE STRING "") 

    然后用它

     cmake -DCMAKE_TOOLCHAIN_FILE:string=GNUToolchain.cmake ... 
  2. 您可以尝试通过检查CMAKE_GENERATOR (在project()命令之前有效project()来确定编译器:

    的CMakeLists.txt

     if("${CMAKE_GENERATOR}" MATCHES "Makefiles" OR ("${CMAKE_GENERATOR}" MATCHES "Ninja" AND NOT WIN32)) set(CMAKE_CXX_FLAGS_DEBUG "-ggdb3 -O0" CACHE STRING "") endif() project(your_project C CXX) 
  3. 您可以使用CMAKE_USER_MAKE_RULES_OVERRIDE为您的脚本提供自己的..._INIT值:

    它在CMake的内置编译器和平台信息模块已经被加载之后,但是在信息被使用之前加载。 该文件可以设置平台信息variables来覆盖CMake的默认值。

    MyInitFlags.cmake

     # Overwrite the init values choosen by CMake if (CMAKE_COMPILER_IS_GNUCXX) set(CMAKE_CXX_FLAGS_DEBUG_INIT "-ggdb3 -O0") endif() 

    的CMakeLists.txt

     set(CMAKE_USER_MAKE_RULES_OVERRIDE "MyInitFlags.cmake") project(your_project C CXX) 
  4. 你可以从3月1日起通过检查编译器标志variables的..._INIT变体来简化你的解决scheme:

    的CMakeLists.txt

     project(your_project C CXX) if (DEFINED CMAKE_CXX_FLAGS_DEBUG_INIT AND "${CMAKE_CXX_FLAGS_DEBUG_INIT}" STREQUAL "${CMAKE_CXX_FLAGS_DEBUG}") # Overwrite the init values choosen by CMake if (CMAKE_COMPILER_IS_GNUCXX) set(CMAKE_CXX_FLAGS_DEBUG "-ggdb3 -O0" CACHE STRING "" FORCE) endif() endif() 

评论

我更喜欢和使用工具链变体。 但我承认它有手动给予工具链文件的缺点(如果你不通过脚本/batch file调用cmake )。

参考文献

  • CMake:parsing文件的哪个Order(Cache,Toolchain,…)?
  • cmake – 全局链接器标志设置(用于目录中的所有目标)
  • 使用CMake在GCC和Clang / LLVM之间切换