Skip to content

Commit 53fbe23

Browse files
committed
clang: introduce CMAKE_<lang>_COMPILER_FRONTEND_VARIANT
This variable is set to GNU on Windows when clang.exe ar clang++.exe is used, and set to MSVC for clang-cl.exe. CMAKE_<lang>_SIMULATE_ID is set to MSVC in both cases, as clang defaults to -fms-compatibility for all command lines on windows.
1 parent 66efdbd commit 53fbe23

File tree

5 files changed

+30
-38
lines changed

5 files changed

+30
-38
lines changed

Modules/CMakeCCompiler.cmake.in

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ set(CMAKE_C11_COMPILE_FEATURES "@CMAKE_C11_COMPILE_FEATURES@")
1212

1313
set(CMAKE_C_PLATFORM_ID "@CMAKE_C_PLATFORM_ID@")
1414
set(CMAKE_C_SIMULATE_ID "@CMAKE_C_SIMULATE_ID@")
15+
set(CMAKE_C_COMPILER_FRONTEND_VARIANT "@CMAKE_C_COMPILER_FRONTEND_VARIANT@")
1516
set(CMAKE_C_SIMULATE_VERSION "@CMAKE_C_SIMULATE_VERSION@")
1617
@_SET_CMAKE_C_COMPILER_ARCHITECTURE_ID@
1718
@SET_MSVC_C_ARCHITECTURE_ID@

Modules/CMakeCXXCompiler.cmake.in

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ set(CMAKE_CXX20_COMPILE_FEATURES "@CMAKE_CXX20_COMPILE_FEATURES@")
1414

1515
set(CMAKE_CXX_PLATFORM_ID "@CMAKE_CXX_PLATFORM_ID@")
1616
set(CMAKE_CXX_SIMULATE_ID "@CMAKE_CXX_SIMULATE_ID@")
17+
set(CMAKE_CXX_COMPILER_FRONTEND_VARIANT "@CMAKE_CXX_COMPILER_FRONTEND_VARIANT@")
1718
set(CMAKE_CXX_SIMULATE_VERSION "@CMAKE_CXX_SIMULATE_VERSION@")
1819
@_SET_CMAKE_CXX_COMPILER_ARCHITECTURE_ID@
1920
@SET_MSVC_CXX_ARCHITECTURE_ID@

Modules/CMakeDetermineCCompiler.cmake

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,6 @@ if(NOT CMAKE_C_COMPILER_ID_RUN)
111111

112112
include(${CMAKE_ROOT}/Modules/CMakeDetermineCompilerId.cmake)
113113
CMAKE_DETERMINE_COMPILER_ID(C CFLAGS CMakeCCompilerId.c)
114-
CMAKE_DIAGNOSE_UNSUPPORTED_CLANG(C CC)
115114

116115
# Set old compiler and platform id variables.
117116
if(CMAKE_C_COMPILER_ID STREQUAL "GNU")

Modules/CMakeDetermineCXXCompiler.cmake

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,6 @@ if(NOT CMAKE_CXX_COMPILER_ID_RUN)
106106

107107
include(${CMAKE_ROOT}/Modules/CMakeDetermineCompilerId.cmake)
108108
CMAKE_DETERMINE_COMPILER_ID(CXX CXXFLAGS CMakeCXXCompilerId.cpp)
109-
CMAKE_DIAGNOSE_UNSUPPORTED_CLANG(CXX CXX)
110109

111110
# Set old compiler and platform id variables.
112111
if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")

Modules/CMakeDetermineCompilerId.cmake

Lines changed: 28 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,31 @@ function(CMAKE_DETERMINE_COMPILER_ID lang flagvar src)
103103
set(CMAKE_${lang}_CL_SHOWINCLUDES_PREFIX "")
104104
endif()
105105

106+
set(_variant "")
107+
if("x${CMAKE_${lang}_COMPILER_ID}" STREQUAL "xClang")
108+
if(CMAKE_HOST_WIN32 AND "x${CMAKE_${lang}_SIMULATE_ID}" STREQUAL "xMSVC")
109+
if(CMAKE_GENERATOR MATCHES "Visual Studio")
110+
set(CMAKE_${lang}_COMPILER_FRONTEND_VARIANT "MSVC")
111+
else()
112+
# Test whether an MSVC-like command-line option works.
113+
execute_process(COMMAND "${CMAKE_${lang}_COMPILER}" -?
114+
RESULT_VARIABLE _clang_result
115+
OUTPUT_VARIABLE _clang_stdout
116+
ERROR_VARIABLE _clang_stderr)
117+
if(_clang_result EQUAL 0)
118+
set(CMAKE_${lang}_COMPILER_FRONTEND_VARIANT "MSVC")
119+
else()
120+
set(CMAKE_${lang}_COMPILER_FRONTEND_VARIANT "GNU")
121+
endif()
122+
endif()
123+
set(_variant " with ${CMAKE_${lang}_COMPILER_FRONTEND_VARIANT}-like command-line")
124+
else()
125+
set(CMAKE_${lang}_COMPILER_FRONTEND_VARIANT "GNU")
126+
endif()
127+
else()
128+
set(CMAKE_${lang}_COMPILER_FRONTEND_VARIANT "")
129+
endif()
130+
106131
# Display the final identification result.
107132
if(CMAKE_${lang}_COMPILER_ID)
108133
if(CMAKE_${lang}_COMPILER_VERSION)
@@ -116,9 +141,10 @@ function(CMAKE_DETERMINE_COMPILER_ID lang flagvar src)
116141
set(_archid "")
117142
endif()
118143
message(STATUS "The ${lang} compiler identification is "
119-
"${CMAKE_${lang}_COMPILER_ID}${_archid}${_version}")
144+
"${CMAKE_${lang}_COMPILER_ID}${_archid}${_version}${_variant}")
120145
unset(_archid)
121146
unset(_version)
147+
unset(_variant)
122148
else()
123149
message(STATUS "The ${lang} compiler identification is unknown")
124150
endif()
@@ -137,6 +163,7 @@ function(CMAKE_DETERMINE_COMPILER_ID lang flagvar src)
137163
PARENT_SCOPE)
138164
set(CMAKE_${lang}_XCODE_ARCHS "${CMAKE_${lang}_XCODE_ARCHS}" PARENT_SCOPE)
139165
set(CMAKE_${lang}_CL_SHOWINCLUDES_PREFIX "${CMAKE_${lang}_CL_SHOWINCLUDES_PREFIX}" PARENT_SCOPE)
166+
set(CMAKE_${lang}_COMPILER_FRONTEND_VARIANT "${CMAKE_${lang}_COMPILER_FRONTEND_VARIANT}" PARENT_SCOPE)
140167
set(CMAKE_${lang}_COMPILER_VERSION "${CMAKE_${lang}_COMPILER_VERSION}" PARENT_SCOPE)
141168
set(CMAKE_${lang}_COMPILER_VERSION_INTERNAL "${CMAKE_${lang}_COMPILER_VERSION_INTERNAL}" PARENT_SCOPE)
142169
set(CMAKE_${lang}_COMPILER_WRAPPER "${CMAKE_${lang}_COMPILER_WRAPPER}" PARENT_SCOPE)
@@ -838,38 +865,3 @@ function(CMAKE_DETERMINE_MSVC_SHOWINCLUDES_PREFIX lang userflags)
838865
set(CMAKE_${lang}_CL_SHOWINCLUDES_PREFIX "" PARENT_SCOPE)
839866
endif()
840867
endfunction()
841-
842-
function(CMAKE_DIAGNOSE_UNSUPPORTED_CLANG lang envvar)
843-
if(NOT CMAKE_HOST_WIN32 OR CMAKE_GENERATOR MATCHES "Visual Studio" OR
844-
NOT "${CMAKE_${lang}_COMPILER_ID};${CMAKE_${lang}_SIMULATE_ID}" STREQUAL "Clang;MSVC")
845-
return()
846-
endif()
847-
848-
# Test whether an MSVC-like command-line option works.
849-
execute_process(COMMAND "${CMAKE_${lang}_COMPILER}" -?
850-
RESULT_VARIABLE _clang_result
851-
OUTPUT_VARIABLE _clang_stdout
852-
ERROR_VARIABLE _clang_stderr)
853-
if(_clang_result EQUAL 0)
854-
return()
855-
endif()
856-
857-
# Help the user configure the environment to use the MSVC-like Clang.
858-
string(CONCAT _msg
859-
"The Clang compiler tool\n"
860-
" \"${CMAKE_${lang}_COMPILER}\"\n"
861-
"targets the MSVC ABI but has a GNU-like command-line interface. "
862-
"This is not supported. "
863-
"Use 'clang-cl' instead, e.g. by setting '${envvar}=clang-cl' in the environment."
864-
)
865-
execute_process(COMMAND rc -help
866-
RESULT_VARIABLE _rc_result
867-
OUTPUT_VARIABLE _rc_stdout
868-
ERROR_VARIABLE _rc_stderr)
869-
if(NOT _rc_result EQUAL 0)
870-
string(APPEND _msg " "
871-
"Furthermore, use the MSVC command-line environment."
872-
)
873-
endif()
874-
message(FATAL_ERROR "${_msg}")
875-
endfunction()

0 commit comments

Comments
 (0)