在 CMake 中,如何仅在尚未使用编译器标志时添加它?

In CMake, how do I add to a compiler flag only if it isn't used already?

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

现在,我使用:

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

...但是如果已经有一个 -DFOO 标志,我会把它加倍,这可能是无害的,但我宁愿避免它。假设我无法控制是否有一个 -DFOO 开始 - 我怎么能 "add a flag only if it's missing" 这样的标志变量?

备注:

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

if(<variable|string> MATCHES regex)  

根据文档 (https://cmake.org/cmake/help/v3.0/command/if.html) 的计算结果为

True if the given string or variable’s value matches the given regular expression.

复制您的最小工作示例:

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()语句中作为解决方案。