在 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" 这样的标志变量?
备注:
- 我想,关于将元素添加到 space-separated-list 变量的答案通常就足够了。
- 我的
CMakeLists.txt
至少需要CMake v2.8;但是如果你有一个需要更新版本的答案(3.x?),那也是相关的。
您似乎可以使用以下语法:
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()
语句中作为解决方案。
我正在使用 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" 这样的标志变量?
备注:
- 我想,关于将元素添加到 space-separated-list 变量的答案通常就足够了。
- 我的
CMakeLists.txt
至少需要CMake v2.8;但是如果你有一个需要更新版本的答案(3.x?),那也是相关的。
您似乎可以使用以下语法:
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()
语句中作为解决方案。