Skip to content

Commit e6df6b4

Browse files
compnerdlxbndr
andauthored
Build fixes for Windows (#42138)
* 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. * [cmake] Add support for external clang/clang-cl We need an option to pass external host clang location in case we can't use just-built clang, e.g. when we are building for different target architecture. Also, this adds target options for clang-cl, enabling us to build for arm64 on Windows@amd64. * build: adjust the flags addition for the standard library The standard library cannot be built with MSVC's compiler. However, if it is built with the toolchain which uses MSVC, it would fail to add this flag. With recent VS2022 toolsets, this is a problem as we would fail to be able to use the `offsetof` macro. Unconditionally apply the definition when building the standard library. Co-authored-by: Alexander Smarus <[email protected]>
1 parent 4e118a1 commit e6df6b4

File tree

3 files changed

+51
-27
lines changed

3 files changed

+51
-27
lines changed

cmake/modules/AddSwift.cmake

Lines changed: 33 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -118,13 +118,19 @@ function(_add_host_variant_c_compile_link_flags name)
118118
set(DEPLOYMENT_VERSION ${SWIFT_ANDROID_API_LEVEL})
119119
endif()
120120

121-
# MSVC, clang-cl, gcc don't understand -target.
122-
if(CMAKE_C_COMPILER_ID MATCHES "Clang" AND NOT SWIFT_COMPILER_IS_MSVC_LIKE)
121+
# MSVC and gcc don't understand -target.
122+
# clang-cl understands --target.
123+
if(CMAKE_C_COMPILER_ID MATCHES "Clang")
123124
get_target_triple(target target_variant "${SWIFT_HOST_VARIANT_SDK}" "${SWIFT_HOST_VARIANT_ARCH}"
124125
MACCATALYST_BUILD_FLAVOR ""
125126
DEPLOYMENT_VERSION "${DEPLOYMENT_VERSION}")
126-
target_compile_options(${name} PRIVATE $<$<COMPILE_LANGUAGE:C,CXX,OBJC,OBJCXX>:-target;${target}>)
127-
target_link_options(${name} PRIVATE $<$<COMPILE_LANGUAGE:C,CXX,OBJC,OBJCXX>:-target;${target}>)
127+
if("${CMAKE_C_COMPILER_FRONTEND_VARIANT}" STREQUAL "MSVC") # clang-cl options
128+
target_compile_options(${name} PRIVATE $<$<COMPILE_LANGUAGE:C,CXX,OBJC,OBJCXX>:--target=${target}>)
129+
target_link_options(${name} PRIVATE $<$<COMPILE_LANGUAGE:C,CXX,OBJC,OBJCXX>:--target=${target}>)
130+
else()
131+
target_compile_options(${name} PRIVATE $<$<COMPILE_LANGUAGE:C,CXX,OBJC,OBJCXX>:-target;${target}>)
132+
target_link_options(${name} PRIVATE $<$<COMPILE_LANGUAGE:C,CXX,OBJC,OBJCXX>:-target;${target}>)
133+
endif()
128134
endif()
129135

130136
if (CMAKE_Swift_COMPILER)
@@ -558,16 +564,24 @@ function(add_swift_host_library name)
558564
559565
if(NOT ${CMAKE_C_COMPILER_ID} STREQUAL MSVC)
560566
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-
)
567+
# Both clang and clang-cl on Windows set CMAKE_C_SIMULATE_ID to MSVC.
568+
# We are using CMAKE_C_COMPILER_FRONTEND_VARIANT to detect the correct
569+
# way to pass -Xclang arguments.
570+
if ("${CMAKE_C_COMPILER_FRONTEND_VARIANT}" STREQUAL "MSVC")
571+
target_compile_options(${name} PRIVATE
572+
$<$<COMPILE_LANGUAGE:C,CXX>:SHELL:/clang:-Xclang /clang:-ivfsoverlay /clang:-Xclang /clang:${ASHL_VFS_OVERLAY}>)
573+
else()
574+
target_compile_options(${name} PRIVATE
575+
$<$<COMPILE_LANGUAGE:C,CXX,OBJC,OBJCXX>:"SHELL:-Xclang -ivfsoverlay -Xclang ${ASHL_VFS_OVERLAY}">)
576+
577+
# MSVC doesn't support -Xclang. We don't need to manually specify
578+
# the dependent libraries as `cl`/`clang-cl` does so.
579+
target_compile_options(${name} PRIVATE
580+
$<$<COMPILE_LANGUAGE:C,CXX,OBJC,OBJCXX>:"SHELL:-Xclang --dependent-lib=oldnames">
581+
# TODO(compnerd) handle /MT, /MTd
582+
$<$<COMPILE_LANGUAGE:C,CXX,OBJC,OBJCXX>:"SHELL:-Xclang --dependent-lib=msvcrt$<$<CONFIG:Debug>:d>">
583+
)
584+
endif()
571585
endif()
572586
573587
set_target_properties(${name} PROPERTIES
@@ -978,9 +992,12 @@ function(add_swift_host_tool executable)
978992
target_include_directories(${executable} SYSTEM PRIVATE
979993
${${SWIFT_HOST_VARIANT_ARCH}_INCLUDE})
980994
981-
if(NOT ${CMAKE_C_COMPILER_ID} STREQUAL MSVC)
995+
# On Windows both clang-cl and clang simulate MSVC.
996+
# We are using CMAKE_C_COMPILER_FRONTEND_VARIANT to distinguish
997+
# clang from clang-cl.
998+
if(NOT "${CMAKE_C_COMPILER_ID}" STREQUAL "MSVC" AND NOT "${CMAKE_C_COMPILER_FRONTEND_VARIANT}" STREQUAL "MSVC")
982999
# MSVC doesn't support -Xclang. We don't need to manually specify
983-
# the dependent libraries as `cl` does so.
1000+
# the dependent libraries as `cl`/`clang-cl` does so.
9841001
target_compile_options(${executable} PRIVATE
9851002
$<$<COMPILE_LANGUAGE:C,CXX,OBJC,OBJCXX>:"SHELL:-Xclang --dependent-lib=oldnames">
9861003
# TODO(compnerd) handle /MT, /MTd

cmake/modules/SwiftWindowsSupport.cmake

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -83,21 +83,30 @@ macro(swift_swap_compiler_if_needed target)
8383
if(NOT CMAKE_C_COMPILER_ID MATCHES Clang)
8484
if(CMAKE_SYSTEM_NAME STREQUAL CMAKE_HOST_SYSTEM_NAME AND CMAKE_SYSTEM_PROCESSOR STREQUAL CMAKE_HOST_SYSTEM_PROCESSOR)
8585
if(SWIFT_BUILT_STANDALONE)
86-
get_target_property(CLANG_LOCATION clang LOCATION)
87-
get_filename_component(CLANG_LOCATION ${CLANG_LOCATION} DIRECTORY)
86+
get_target_property(SWIFT_CLANG_LOCATION clang LOCATION)
87+
get_filename_component(SWIFT_CLANG_LOCATION ${SWIFT_CLANG_LOCATION} DIRECTORY)
8888
else()
89-
set(CLANG_LOCATION ${LLVM_RUNTIME_OUTPUT_INTDIR})
89+
set(SWIFT_CLANG_LOCATION ${LLVM_RUNTIME_OUTPUT_INTDIR})
9090
endif()
91+
endif()
9192

93+
if (DEFINED SWIFT_CLANG_LOCATION)
9294
if("${CMAKE_C_COMPILER_ID}" STREQUAL "MSVC" OR "${CMAKE_C_SIMULATE_ID}" STREQUAL "MSVC")
93-
set(CMAKE_C_COMPILER ${CLANG_LOCATION}/clang-cl${CMAKE_EXECUTABLE_SUFFIX})
94-
set(CMAKE_CXX_COMPILER ${CLANG_LOCATION}/clang-cl${CMAKE_EXECUTABLE_SUFFIX})
95+
set(CMAKE_C_COMPILER ${SWIFT_CLANG_LOCATION}/clang-cl${CMAKE_EXECUTABLE_SUFFIX})
96+
set(CMAKE_CXX_COMPILER ${SWIFT_CLANG_LOCATION}/clang-cl${CMAKE_EXECUTABLE_SUFFIX})
97+
set(CMAKE_C_SIMULATE_ID MSVC)
98+
set(CMAKE_C_COMPILER_FRONTEND_VARIANT MSVC)
99+
set(CMAKE_CXX_SIMULATE_ID MSVC)
100+
set(CMAKE_CXX_COMPILER_FRONTEND_VARIANT MSVC)
95101
else()
96-
set(CMAKE_C_COMPILER ${CLANG_LOCATION}/clang${CMAKE_EXECUTABLE_SUFFIX})
97-
set(CMAKE_CXX_COMPILER ${CLANG_LOCATION}/clang++${CMAKE_EXECUTABLE_SUFFIX})
102+
set(CMAKE_C_COMPILER ${SWIFT_CLANG_LOCATION}/clang${CMAKE_EXECUTABLE_SUFFIX})
103+
set(CMAKE_CXX_COMPILER ${SWIFT_CLANG_LOCATION}/clang++${CMAKE_EXECUTABLE_SUFFIX})
98104
endif()
105+
set(CMAKE_C_COMPILER_ID Clang)
106+
set(CMAKE_CXX_COMPILER_ID Clang)
107+
message(STATUS "C/C++ compiler for ${target} is set to: ${CMAKE_C_COMPILER}")
99108
else()
100-
message(SEND_ERROR "${target} requires a clang based compiler")
109+
message(SEND_ERROR "${target} requires a clang based compiler. Please set SWIFT_CLANG_LOCATION.")
101110
endif()
102111
endif()
103112
endmacro()

stdlib/cmake/modules/AddSwiftStdlib.cmake

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -215,9 +215,7 @@ function(_add_target_variant_c_compile_flags)
215215
list(APPEND result "-DLLVM_ON_WIN32")
216216
list(APPEND result "-D_CRT_SECURE_NO_WARNINGS")
217217
list(APPEND result "-D_CRT_NONSTDC_NO_WARNINGS")
218-
if(NOT "${CMAKE_C_COMPILER_ID}" STREQUAL "MSVC")
219-
list(APPEND result "-D_CRT_USE_BUILTIN_OFFSETOF")
220-
endif()
218+
list(APPEND result "-D_CRT_USE_BUILTIN_OFFSETOF")
221219
# TODO(compnerd) permit building for different families
222220
list(APPEND result "-D_CRT_USE_WINAPI_FAMILY_DESKTOP_APP")
223221
if("${CFLAGS_ARCH}" MATCHES arm)

0 commit comments

Comments
 (0)