mirror of
https://gitlab.kitware.com/cmake/cmake.git
synced 2026-10-01 04:03:24 +03:00
Clang: Diagnose unsupported GNU-like clang targeting MSVC ABI
The LLVM/Clang installer on Windows provides a `LLVM/bin` directory containing `clang.exe` and `clang++.exe` command-line tools that have a GNU-like command-line but target the MSVC ABI (instead of MinGW). We do not support this combination, so diagnose and reject it explicitly. Tell users what to do to use the `clang-cl.exe` tool instead. Issue: #16439
This commit is contained in:
1 parent
a91eb5e41f
commit
b6d3a1c09a
3 files changed
+37
No files matched your search
@@ -110,6 +110,7 @@ if(NOT CMAKE_C_COMPILER_ID_RUN)
|
||||
|
||||
include(${CMAKE_ROOT}/Modules/CMakeDetermineCompilerId.cmake)
|
||||
CMAKE_DETERMINE_COMPILER_ID(C CFLAGS CMakeCCompilerId.c)
|
||||
CMAKE_DIAGNOSE_UNSUPPORTED_CLANG(C CC)
|
||||
|
||||
# Set old compiler and platform id variables.
|
||||
if(CMAKE_C_COMPILER_ID STREQUAL "GNU")
|
||||
|
||||
@@ -105,6 +105,7 @@ if(NOT CMAKE_CXX_COMPILER_ID_RUN)
|
||||
|
||||
include(${CMAKE_ROOT}/Modules/CMakeDetermineCompilerId.cmake)
|
||||
CMAKE_DETERMINE_COMPILER_ID(CXX CXXFLAGS CMakeCXXCompilerId.cpp)
|
||||
CMAKE_DIAGNOSE_UNSUPPORTED_CLANG(CXX CXX)
|
||||
|
||||
# Set old compiler and platform id variables.
|
||||
if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
|
||||
|
||||
@@ -735,3 +735,38 @@ function(CMAKE_DETERMINE_MSVC_SHOWINCLUDES_PREFIX lang userflags)
|
||||
set(CMAKE_${lang}_CL_SHOWINCLUDES_PREFIX "" PARENT_SCOPE)
|
||||
endif()
|
||||
endfunction()
|
||||
|
||||
function(CMAKE_DIAGNOSE_UNSUPPORTED_CLANG lang envvar)
|
||||
if(NOT CMAKE_HOST_WIN32 OR CMAKE_GENERATOR MATCHES "Visual Studio" OR
|
||||
NOT "${CMAKE_${lang}_COMPILER_ID};${CMAKE_${lang}_SIMULATE_ID}" STREQUAL "Clang;MSVC")
|
||||
return()
|
||||
endif()
|
||||
|
||||
# Test whether a GNU-like command-line option works.
|
||||
execute_process(COMMAND "${CMAKE_${lang}_COMPILER}" --version
|
||||
RESULT_VARIABLE _clang_result
|
||||
OUTPUT_VARIABLE _clang_stdout
|
||||
ERROR_VARIABLE _clang_stderr)
|
||||
if(NOT _clang_result EQUAL 0)
|
||||
return()
|
||||
endif()
|
||||
|
||||
# Help the user configure the environment to use the MSVC-like Clang.
|
||||
string(CONCAT _msg
|
||||
"The Clang compiler tool\n"
|
||||
" \"${CMAKE_${lang}_COMPILER}\"\n"
|
||||
"targets the MSVC ABI but has a GNU-like command-line interface. "
|
||||
"This is not supported. "
|
||||
"Use 'clang-cl' instead, e.g. by setting '${envvar}=clang-cl' in the environment."
|
||||
)
|
||||
execute_process(COMMAND rc -help
|
||||
RESULT_VARIABLE _rc_result
|
||||
OUTPUT_VARIABLE _rc_stdout
|
||||
ERROR_VARIABLE _rc_stderr)
|
||||
if(NOT _rc_result EQUAL 0)
|
||||
string(APPEND _msg " "
|
||||
"Furthermore, use the MSVC command-line environment."
|
||||
)
|
||||
endif()
|
||||
message(FATAL_ERROR "${_msg}")
|
||||
endfunction()
|
||||
Reference in new issue
Block a user