【问题标题】:How to differentiate between clang and clang-cl?如何区分clang和clang-cl?
【发布时间】:2018-03-25 20:20:07
【问题描述】:

我是 CMake 的新手,在这里遇到了一些障碍,想知道是否有针对此问题的“优雅”解决方案,或者可能只是一个简单的解决方案。

例如,为了设置编译器标志,我正在执行以下操作:

target_compile_options(${PROJECT_NAME}
    PUBLIC
        $<$<CXX_COMPILER_ID:GNU>:"-some_gnu_flag">
        $<$<CXX_COMPILER_ID:Clang>:"-some_clang_flag">
        $<$<CXX_COMPILER_ID:MSVC>:"/some_msvc_flag">
)

这完全符合预期,除非我尝试使用 clang-cl 作为编译器进行构建,即:

cmake .. -G "Visual Studio 15 2017 Win64" -T "LLVM-vs2014"

CXX ID 报告为 Clang(毕竟是 clang)但我不想使用 Clang 标志,我实际上想使用 MSVC 标志,因为 clang-cl 是设计的作为 MSVC 的替代品 cl - 因此只接受 MSVC 样式标志。

那么有什么好的解决方案而不创建一些混乱的代码呢?我知道我可能会做一堆 if() 检查并设置一些变量,但我试图坚持“现代 cmake”约定,因此我开始使用生成器表达式。

【问题讨论】:

标签: cmake


【解决方案1】:

这是我目前的“解决方案”。我找到了包含我想要的信息的 CMAKE_CXX_SIMULATE_ID 变量——尽管这对我来说仍然感觉有点脏。

# Get compiler info
set(CXX_FLAGS_STYLE_GNU OFF)
set(CXX_FLAGS_STYLE_MSVC OFF)
set(CXX_FLAGS_STYLE_CLANGCL OFF)
if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
    set(CXX_FLAGS_STYLE_GNU ON)
elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
    if ("${CMAKE_CXX_SIMULATE_ID}" STREQUAL "MSVC")
        set(CXX_FLAGS_STYLE_CLANGCL ON)
    else ()
        set(CXX_FLAGS_STYLE_GNU ON)
    endif ()
elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC")
    set(CXX_FLAGS_STYLE_MSVC ON)
else ()
    message(FATAL_ERROR "Unsupported compiler!")
endif ()

# Compiler flags
target_compile_options(${PROJECT_NAME}
    PRIVATE
        ## GCC/Clang Flags
        $<$<BOOL:${CXX_FLAGS_STYLE_GNU}>:"-someflag">
        ## MSVC flags
        $<$<BOOL:${CXX_FLAGS_STYLE_MSVC}>:"/someflag">
        ## CLANG-CL flags
        $<$<BOOL:${CXX_FLAGS_STYLE_CLANGCL}>:"-someflag">
)

【讨论】:

  • 对,CMAKE_CXX_COMPILER_IDCMAKE_CXX_SIMULATE_ID 是要走的路。
  • 只有两种风格:GNU 和 MSVC。因此,为了保持一致性,应删除 STYLE_CLANGCL 或 STYLE_MSVC。请注意,最近版本的 CMake 建议为此使用 CMAKE__COMPILER_FRONTEND_VARIANT 而不是 SIMULATE_ID。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-06-11
  • 1970-01-01
  • 1970-01-01
  • 2012-12-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-17
相关资源
最近更新 更多