首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何区分clang和clang?

如何区分clang和clang?
EN

Stack Overflow用户
提问于 2018-03-25 20:20:07
回答 1查看 3.9K关注 0票数 10

我刚接触过CMake,在这里遇到了一些小麻烦,我想知道这个问题是否有一个“优雅”的解决方案,或者可能只是一个简单的解决方案。

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

代码语言:javascript
复制
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作为编译器进行构建,即:

代码语言:javascript
复制
cmake .. -G "Visual Studio 15 2017 Win64" -T "LLVM-vs2014"

CXX ID被报告为Clang (毕竟它是clang ),但我不想使用Clang标志,实际上我想使用MSVC标志,因为clang是用来替换MSVC的,因此只接受MSVC样式的标志。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-26 04:03:51

这是我目前的“解决方案”。我找到了CMAKE_CXX_SIMULATE_ID变量,它保存了我想要的信息--尽管这对我来说还是有点脏。

代码语言:javascript
复制
# 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">
)
票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49480535

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档