我刚接触过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作为编译器进行构建,即:
cmake .. -G "Visual Studio 15 2017 Win64" -T "LLVM-vs2014"CXX ID被报告为Clang (毕竟它是clang ),但我不想使用Clang标志,实际上我想使用MSVC标志,因为clang是用来替换MSVC的,因此只接受MSVC样式的标志。
那么,在不创建一些混乱的代码的情况下,对此有什么好的解决方案呢?我知道我可能会执行一堆if()检查并设置一些变量,但是我试图坚持“现代的cmake”约定,因此我开始使用生成器表达式。
发布于 2018-03-26 04:03:51
这是我目前的“解决方案”。我找到了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">
)https://stackoverflow.com/questions/49480535
复制相似问题