gpt4 book ai didi

cmake - 如何区分clang和clang-cl?

转载 作者:行者123 更新时间:2023-12-03 13:33:21 28 4
gpt4 key购买 nike

我是 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_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 - 如何区分clang和clang-cl?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49480535/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com