我正在使用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?)的答案,那也是相关的。答案 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()
语句中作为解决方案。