【问题标题】:Adding a compilation flag with CMake while avoiding duplicates使用 CMake 添加编译标志,同时避免重复
【发布时间】: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


【解决方案1】:

CMake 中有许多标志来源,但并非所有这些都暴露给 CMakeLists.txt 作者(例如 MSVC 上的 /SUBSYSTEM:... 标志)。

某些来源(例如目标属性)会自动删除重复数据,因此无需担心。在链接器标志的情况下,重复数据删除实际上可能是一个问题,因此在调用target_link_options保留标志有一个特殊的语法:前缀FLAGSHELL:,如@987654325 @。

另一方面,如果您想避免在CMAKE_<LANG>_FLAGS[_<CONFIG>] 中添加标志,那么您可以在添加标志之前进行正则表达式检查;例如:

if (NOT CMAKE_CXX_FLAGS MATCHES "-flag")
  string(APPEND CMAKE_CXX_FLAGS " -flag")
endif ()

但不幸的是,没有通用的方法来检查 CMake 在配置期间将添加到目标命令行中的每个标志(如果没有其他原因,由于延迟评估生成器表达式)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-16
    • 1970-01-01
    相关资源
    最近更新 更多