【发布时间】:2019-05-24 23:27:05
【问题描述】:
我正在为我的一个项目写一个CMakeLists.txt,我需要(在某些在这里无关紧要的条件下)向$CMAKE_CXX_FLAGS 添加一个编译器标志(它是C++ 没关系,它可以是 C,或 Fortran 或其他)。现在,我可以这样做:
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${EXTRA_FLAG_HERE}")
或者,更现代:
string(APPEND CMAKE_CXX_FLAGS " ${EXTRA_FLAG_HERE}")
但如果标志已经存在,我不想添加两次。现在,我可以做
if(NOT string(FIND CMAKE_CXX_FLAGS "${EXTRA_FLAG_HERE}")
string(APPEND CMAKE_CXX_FLAGS " ${EXTRA_FLAG_HERE}")
endif()
编辑: 但正如@Fred 指出的那样,如果该标志是由 CMake 引入的,而不是通过 $CMAKE_CXX_FLAGS 引入,这实际上不会避免重复。
我希望有一些“内置”的东西可以添加一个标志,同时确保不重复(包括更强大地防止出现在另一个标志的参数中的 ${EXTRA_FLAG},例如在 -D 标志中)。
那么,我该怎么办?
【问题讨论】:
-
哪个编译器标志?
-
@CinderBiscuits:不是
--std或您使用特殊 CMake 变量设置的那些东西之一。 -
你有什么理由避免
target_compile_options? CMake 的现代方法是通过属性对您的需求进行建模,这些属性可以限定范围并避免变量。 -
您可以添加一个带有根据您的条件添加的给定属性的接口,并将其链接到给定的目标。通过这种方式,无需管理标志列表即可传播属性。
-
@einpoklum 没有内置方法可以防止标记被添加两次。如果它是由
CMake自动添加为默认标志的标志,则您的方法将不起作用。
标签: build cmake duplicates command-line-arguments idioms