Skip to content

Commit 8eaaace

Browse files
committed
cmake: Windows, adjust compiler identification on compiler swap
The latest CMake on Windows doesn't add `_CRT_USE_BUILTIN_OFFSETOF` flag after we swap the compiler to clang-cl for targets like SourceKit. Also `_add_host_variant_c_compile_flags` doesn't do so, because compiler identification still points to MSVC compiler. `_CRT_USE_BUILTIN_OFFSETOF` flag is necessary for `offsetof` calls to be accepted as an integral constant expression. This patch adjusts compiler identification on compiler swap and also addresses some configuration issues related to clang-cl.
1 parent 4fc9d01 commit 8eaaace

File tree

2 files changed

+31
-12
lines changed

2 files changed

+31
-12
lines changed

cmake/modules/AddSwift.cmake

Lines changed: 23 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -558,16 +558,24 @@ function(add_swift_host_library name)
558558
559559
if(NOT ${CMAKE_C_COMPILER_ID} STREQUAL MSVC)
560560
swift_windows_get_sdk_vfs_overlay(ASHL_VFS_OVERLAY)
561-
target_compile_options(${name} PRIVATE
562-
$<$<COMPILE_LANGUAGE:C,CXX,OBJC,OBJCXX>:"SHELL:-Xclang -ivfsoverlay -Xclang ${ASHL_VFS_OVERLAY}">)
563-
564-
# MSVC doesn't support -Xclang. We don't need to manually specify
565-
# the dependent libraries as `cl` does so.
566-
target_compile_options(${name} PRIVATE
567-
$<$<COMPILE_LANGUAGE:C,CXX,OBJC,OBJCXX>:"SHELL:-Xclang --dependent-lib=oldnames">
568-
# TODO(compnerd) handle /MT, /MTd
569-
$<$<COMPILE_LANGUAGE:C,CXX,OBJC,OBJCXX>:"SHELL:-Xclang --dependent-lib=msvcrt$<$<CONFIG:Debug>:d>">
570-
)
561+
# Both clang and clang-cl on Windows set CMAKE_C_SIMULATE_ID to MSVC.
562+
# We are using CMAKE_C_COMPILER_FRONTEND_VARIANT to detect the correct
563+
# way to pass -Xclang arguments.
564+
if ("${CMAKE_C_COMPILER_FRONTEND_VARIANT}" STREQUAL "MSVC")
565+
target_compile_options(${name} PRIVATE
566+
$<$<COMPILE_LANGUAGE:C,CXX>:SHELL:/clang:-Xclang /clang:-ivfsoverlay /clang:-Xclang /clang:${ASHL_VFS_OVERLAY}>)
567+
else()
568+
target_compile_options(${name} PRIVATE
569+
$<$<COMPILE_LANGUAGE:C,CXX,OBJC,OBJCXX>:"SHELL:-Xclang -ivfsoverlay -Xclang ${ASHL_VFS_OVERLAY}">)
570+
571+
# MSVC doesn't support -Xclang. We don't need to manually specify
572+
# the dependent libraries as `cl`/`clang-cl` does so.
573+
target_compile_options(${name} PRIVATE
574+
$<$<COMPILE_LANGUAGE:C,CXX,OBJC,OBJCXX>:"SHELL:-Xclang --dependent-lib=oldnames">
575+
# TODO(compnerd) handle /MT, /MTd
576+
$<$<COMPILE_LANGUAGE:C,CXX,OBJC,OBJCXX>:"SHELL:-Xclang --dependent-lib=msvcrt$<$<CONFIG:Debug>:d>">
577+
)
578+
endif()
571579
endif()
572580
573581
set_target_properties(${name} PROPERTIES
@@ -978,9 +986,12 @@ function(add_swift_host_tool executable)
978986
target_include_directories(${executable} SYSTEM PRIVATE
979987
${${SWIFT_HOST_VARIANT_ARCH}_INCLUDE})
980988
981-
if(NOT ${CMAKE_C_COMPILER_ID} STREQUAL MSVC)
989+
# On Windows both clang-cl and clang simulate MSVC.
990+
# We are using CMAKE_C_COMPILER_FRONTEND_VARIANT to distinguish
991+
# clang from clang-cl.
992+
if(NOT "${CMAKE_C_COMPILER_ID}" STREQUAL "MSVC" AND NOT "${CMAKE_C_COMPILER_FRONTEND_VARIANT}" STREQUAL "MSVC")
982993
# MSVC doesn't support -Xclang. We don't need to manually specify
983-
# the dependent libraries as `cl` does so.
994+
# the dependent libraries as `cl`/`clang-cl` does so.
984995
target_compile_options(${executable} PRIVATE
985996
$<$<COMPILE_LANGUAGE:C,CXX,OBJC,OBJCXX>:"SHELL:-Xclang --dependent-lib=oldnames">
986997
# TODO(compnerd) handle /MT, /MTd

cmake/modules/SwiftWindowsSupport.cmake

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,9 +92,17 @@ macro(swift_swap_compiler_if_needed target)
9292
if("${CMAKE_C_COMPILER_ID}" STREQUAL "MSVC" OR "${CMAKE_C_SIMULATE_ID}" STREQUAL "MSVC")
9393
set(CMAKE_C_COMPILER ${CLANG_LOCATION}/clang-cl${CMAKE_EXECUTABLE_SUFFIX})
9494
set(CMAKE_CXX_COMPILER ${CLANG_LOCATION}/clang-cl${CMAKE_EXECUTABLE_SUFFIX})
95+
set(CMAKE_C_COMPILER_ID Clang)
96+
set(CMAKE_C_SIMULATE_ID MSVC)
97+
set(CMAKE_C_COMPILER_FRONTEND_VARIANT MSVC)
98+
set(CMAKE_CXX_COMPILER_ID Clang)
99+
set(CMAKE_CXX_SIMULATE_ID MSVC)
100+
set(CMAKE_CXX_COMPILER_FRONTEND_VARIANT MSVC)
95101
else()
96102
set(CMAKE_C_COMPILER ${CLANG_LOCATION}/clang${CMAKE_EXECUTABLE_SUFFIX})
97103
set(CMAKE_CXX_COMPILER ${CLANG_LOCATION}/clang++${CMAKE_EXECUTABLE_SUFFIX})
104+
set(CMAKE_C_COMPILER_ID Clang)
105+
set(CMAKE_CXX_COMPILER_ID Clang)
98106
endif()
99107
else()
100108
message(SEND_ERROR "${target} requires a clang based compiler")

0 commit comments

Comments
 (0)