在CMake中更改CMAKE_CXX_FLAGS_DEBUG和朋友的默认值
我想在CMake中更改CMAKE_CXX_FLAGS_RELEASE
或CMAKE_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完全可以覆盖的默认值。
我只是想增加我看到的四种可能性:
-
拥有自己的工具链文件,其中包含您支持的每个编译器的预设:
GNUToolchain.cmake
set(CMAKE_CXX_FLAGS_DEBUG "-ggdb3 -O0" CACHE STRING "")
然后用它
cmake -DCMAKE_TOOLCHAIN_FILE:string=GNUToolchain.cmake ...
-
您可以尝试通过检查
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)
-
您可以使用
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)
-
你可以从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之间切换