在CMake中,如何仅在尚未使用的情况下添加到编译器标志?

时间:2017-01-09 10:23:17

标签: cmake duplicates compiler-flags

我正在使用CMake,我想在某些flags变量中添加一个编译标志。例如,我想将-DFOO添加到CMAKE_CXX_FLAGS_RELEASE变量。

现在,我使用:

set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -DFOO" )

...但是如果已经有一个-DFOO标志,我会把它加倍,这可能是无害的,但我宁愿避免它。假设我无法控制是否有一个-DFOO开始 - 我怎么能“只在它丢失时”添加一个标志到这样的标志变量?

备注:

  • 一般来说,关于向空格分隔列表变量添加元素的答案就足够了,我猜。
  • 我的CMakeLists.txt至少需要CMake v2.8;但如果你有一个需要更新版本(3.x?)的答案,那也是相关的。

1 个答案:

答案 0 :(得分:1)

您似乎可以使用以下语法:

if(<variable|string> MATCHES regex)  

根据文档(https://cmake.org/cmake/help/v3.0/command/if.html)评估为

  

如果给定的字符串或变量的值与给定的常规值匹配,则为true   表达

复制你的最小工作示例:

cmake_minimum_required(VERSION 2.8)

set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -DFOO" )
if( CMAKE_CXX_FLAGS_RELEASE MATCHES "-DFOO")
        message("matching -DFOO")
        message("${CMAKE_CXX_FLAGS_RELEASE}")
else( CMAKE_CXX_FLAGS_RELEASE MATCHES "-DFOO")
        message("no -DFOO!!!")
        message("${CMAKE_CXX_FLAGS_RELEASE}")
endif()

将打印

matching -DFOO
-O3 -DNDEBUG -DFOO

而以下

cmake_minimum_required(VERSION 2.8)

set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}" )
if( CMAKE_CXX_FLAGS_RELEASE MATCHES "-DFOO")
        message("matching -DFOO")
        message("${CMAKE_CXX_FLAGS_RELEASE}")
else( CMAKE_CXX_FLAGS_RELEASE MATCHES "-DFOO")
        message("no -DFOO!!!")
        message("${CMAKE_CXX_FLAGS_RELEASE}")
endif()

将打印

no -DFOO!!!
-O3 -DNDEBUG

您可以通过以下方式获得类似的结果:

string(REGEX MATCH <regular_expression> <output variable> <input>)  

string(FIND <string> <substring> <output variable>)  

@ usr1234567之前在评论中提出的最后一个。

所以你可以
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -DFOO" )  

if()语句中作为解决方案。