我想更改默认值CMAKE_CXX_FLAGS_RELEASE
or CMAKE_CXX_FLAGS_DEBUG
在 CMake 中。基本上,我有一些项目默认值与 CMake 的默认值略有不同(例如,对于发布),我不应该问自己“哦,当使用 add_compile_options 添加时,他们的 -O3 还是我们的 -O2 优先。”
现在,我知道如何设置这些值,但我不知道如何使用户可以通过两种常用方式编辑它们:通过使用 -DCMAKE_CXX_FLAGS_DEBUG=yourflags
在命令行上或通过使用 ccmake 或 CMakeSetup 进行配置。
问题在于 CMAKE 设置并缓存其自己的默认值,如果您尝试在不使用 FORCE 的情况下覆盖变量,则“默认值”永远不会更改。如果我在 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 -Dwhatever=thisorthat 的情况下)。我也可以添加其他构建类型,但我真的不明白为什么仅仅为了改变一些简单的事情就需要这样做。
2015年3月1日编辑:
我已经创建了一个有效的解决方案,尽管我仍然对我必须做的事情不太兴奋。我看过其他解决设置问题的评论CMAKE_CXX_FLAGS_DEBUG
和朋友,而不让它们被破坏,但这最初对我不起作用,因为我试图根据正在使用的编译器来选择它们。然而,编译器直到它已经为我填充了变量才确定。我使用的技巧如下。您必须在项目命令之前将标志变量设置为“特殊”。
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 中完全覆盖的默认值。