【问题标题】:Why does CMake split arguments differently for add_compile_options and target_compile_options?为什么 CMake 对 add_compile_options 和 target_compile_options 的参数拆分方式不同?
【发布时间】:2020-08-09 11:50:09
【问题描述】:

我正在尝试在 CMake 项目中启用警告。使用类似于this answer 中建议的target_compile_options 可以正常工作:

target_compile_options(mytarget PRIVATE $<$<CXX_COMPILER_ID:GNU,Clang>:-Wall -Wextra -pedantic>)

我有很多目标,我想将这些设置应用于所有目标。所以,我尝试改用add_compile_options

add_compile_options($<$<CXX_COMPILER_ID:GNU,Clang>:-Wall -Wextra -pedantic>)

但是,当我使用它时,我看到编译器传递了"\$&lt;1:-Wall" -Wextra "-pedantic&gt;",好像在扩展生成器表达式之前发生了空间分割。这会使编译器感到困惑并且构建失败。

我尝试将参数引用到add_compile_commands

add_compile_options("$<$<CXX_COMPILER_ID:GNU,Clang>:-Wall -Wextra -pedantic>")

但是当我这样做时,编译器会被传递一个 "-Wall -Wextra -pedantic" 参数,这也会混淆它并导致构建失败。

我可以像这样“分发”生成器表达式:

add_compile_options(
    $<$<CXX_COMPILER_ID:GNU,Clang>:-Wall>
    $<$<CXX_COMPILER_ID:GNU,Clang>:-Wextra>
    $<$<CXX_COMPILER_ID:GNU,Clang>:-pedantic>
)

这很好用,解决了我眼前的问题……

...但是,问题仍然存在:是什么导致add_compile_optionstarget_compile_options 的工作方式不同?他们的字符串拆分语义不应该相同吗?

【问题讨论】:

    标签: cmake


    【解决方案1】:

    也就是说,因为add_compile_options 用于将编译选项添加到COMPILE_OPTIONS 列表,一个分号分隔的列表,而add_target_options 将选项添加到数据类型为propertyINTERFACE_COMPILE_OPTIONS

    你离得太近了!只要您用分号替换空格,您的代码就可以工作:

    add_compile_options("$<$<CXX_COMPILER_ID:GNU,Clang>:-Wall;-Wextra;-pedantic>")
    

    是的!我还认为,这种行为是不一致的,add_compile_options 应该更类似于target_compile_options。也许其他人可以进一步详细说明它的历史,但是当我发现[^_]COMPILE_OPTIONS[^_] 在代码中出现的频率比[^_]INTERFACE_COMPILE_OPTIONS[^_] 更频繁时,我的好奇心得到了满足:这意味着 d231f429f10e9 的 121/40!据我推测,它存在的时间更长,并且改变它的实现方式很可能会破坏某些用户的现有构建链,而没有人想要这样。

    【讨论】:

      猜你喜欢
      • 2019-12-29
      • 2022-10-19
      • 1970-01-01
      • 2015-01-04
      • 2013-01-12
      • 1970-01-01
      • 1970-01-01
      • 2020-09-16
      • 2022-01-07
      相关资源
      最近更新 更多