【问题标题】:How to pass combined compiler options with target_compile_options in CMake?如何在 CMake 中将组合编译器选项与 target_compile_options 一起传递?
【发布时间】:2019-10-15 16:14:10
【问题描述】:

我正在使用定制的 clang/llvm 来构建我的项目。自定义基本上是添加优化通道。在我使用的 clang 编译时将选项传递给我的通行证:

clang [..] -mllvm -MyOption [..]

现在碰巧我需要以这种方式传递多个选项:

clang [..] -mllvm -MyOption -mllvm -MyOption2=value [..]

这与 CMake 的 target_compile_options() 结合停止工作,CMake 删除了第二个 -mllvm,因为它似乎认为它是重复的。

target_compile_options(vslib INTERFACE -mllvm -MyOption)
target_compile_options(vslib INTERFACE -mllvm -MyOption2=val)

我尝试将" 放在这两个选项周围,但不起作用。

有没有办法通过 CMake 实现这一点?

【问题讨论】:

    标签: cmake clang llvm


    【解决方案1】:

    https://cmake.org/cmake/help/v3.12/command/target_compile_options.html:

    对选项集进行重复数据删除以避免重复。虽然有利于单个选项,但重复数据删除步骤可以分解选项组。例如,-DA -DB 变为 -DA B。可以使用类似于 shell 的引用和 SHELL: 前缀来指定一组选项。 SHELL: 前缀被删除,其余的选项字符串是使用 separate_arguments() UNIX_COMMAND 模式解析的。 例如,“SHELL:-D A”“SHELL:-D B”变为-D A -D B。

    所以你的情况是:

    target_compile_options(vslib INTERFACE "SHELL:-mllvm -MyOption" "SHELL:-mllvm -MyOption2=val")
    

    【讨论】:

      【解决方案2】:

      试试:

      get_property(tmp TARGET vslib PROPERTY INTERFACE_COMPILE_OPTIONS)
      list(APPEND tmp -mllvm)
      list(APPEND tmp -MyOption)
      list(APPEND tmp -mllvm)
      list(APPEND tmp -MyOption2=value)
      set_property(TARGET vslib PROPERTY INTERFACE_COMPILE_OPTIONS "${tmp}")
      

      或者只是:

      set_property(TARGET vslib APPEND PROPERTY INTERFACE_COMPILE_OPTIONS -mllvm -MyOption)
      set_property(TARGET vslib APPEND PROPERTY INTERFACE_COMPILE_OPTIONS -mllvm -MyOption2=value)
      

      【讨论】:

        猜你喜欢
        • 2017-11-01
        • 1970-01-01
        • 2021-10-10
        • 2023-04-08
        • 2013-12-01
        • 2012-05-06
        • 2019-04-14
        相关资源
        最近更新 更多