mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
This should repair the Windows build after #29451. The quoting behaviour was incorrect and was constructing an invalid compiler invocation. Solve the issue by using `target_include_directories` instead. However, since this needs the target, hoist the flag computation to the local sites. This replicates more logic because of the custom build trying to replicate the CMake build logic in CMake.
105 lines
3.7 KiB
CMake
105 lines
3.7 KiB
CMake
|
|
include(SwiftUtils)
|
|
|
|
function(swift_windows_arch_spelling arch var)
|
|
if(${arch} STREQUAL i686)
|
|
set(${var} x86 PARENT_SCOPE)
|
|
elseif(${arch} STREQUAL x86_64)
|
|
set(${var} x64 PARENT_SCOPE)
|
|
elseif(${arch} STREQUAL armv7)
|
|
set(${var} arm PARENT_SCOPE)
|
|
elseif(${arch} STREQUAL aarch64)
|
|
set(${var} arm64 PARENT_SCOPE)
|
|
else()
|
|
message(FATAL_ERROR "do not know MSVC spelling for ARCH: `${arch}`")
|
|
endif()
|
|
endfunction()
|
|
|
|
function(swift_windows_include_for_arch arch var)
|
|
set(paths
|
|
"${VCToolsInstallDir}/include"
|
|
"${UniversalCRTSdkDir}/Include/${UCRTVersion}/ucrt"
|
|
"${UniversalCRTSdkDir}/Include/${UCRTVersion}/shared"
|
|
"${UniversalCRTSdkDir}/Include/${UCRTVersion}/um")
|
|
set(${var} ${paths} PARENT_SCOPE)
|
|
endfunction()
|
|
|
|
function(swift_windows_lib_for_arch arch var)
|
|
swift_windows_arch_spelling(${arch} ARCH)
|
|
|
|
set(paths)
|
|
|
|
# NOTE(compnerd) provide compatibility with VS2015 which had the libraries in
|
|
# a directory called "Lib" rather than VS2017 which normalizes the layout and
|
|
# places them in a directory named "lib".
|
|
if(IS_DIRECTORY "${VCToolsInstallDir}/Lib")
|
|
if(${ARCH} STREQUAL x86)
|
|
list(APPEND paths "${VCToolsInstallDir}/Lib/")
|
|
else()
|
|
list(APPEND paths "${VCToolsInstallDir}/Lib/${ARCH}")
|
|
endif()
|
|
else()
|
|
list(APPEND paths "${VCToolsInstallDir}/lib/${ARCH}")
|
|
endif()
|
|
|
|
list(APPEND paths
|
|
"${UniversalCRTSdkDir}/Lib/${UCRTVersion}/ucrt/${ARCH}"
|
|
"${UniversalCRTSdkDir}/Lib/${UCRTVersion}/um/${ARCH}")
|
|
|
|
set(${var} ${paths} PARENT_SCOPE)
|
|
endfunction()
|
|
|
|
function(swift_windows_get_sdk_vfs_overlay overlay)
|
|
get_filename_component(VCToolsInstallDir ${VCToolsInstallDir} ABSOLUTE)
|
|
get_filename_component(UniversalCRTSdkDir ${UniversalCRTSdkDir} ABSOLUTE)
|
|
set(UCRTVersion ${UCRTVersion})
|
|
|
|
# TODO(compnerd) use a target to avoid re-creating this file all the time
|
|
configure_file("${SWIFT_SOURCE_DIR}/utils/WindowsSDKVFSOverlay.yaml.in"
|
|
"${CMAKE_CURRENT_BINARY_DIR}/windows-sdk-vfs-overlay.yaml"
|
|
@ONLY)
|
|
set(${overlay} ${CMAKE_CURRENT_BINARY_DIR}/windows-sdk-vfs-overlay.yaml
|
|
PARENT_SCOPE)
|
|
endfunction()
|
|
|
|
function(swift_verify_windows_VCVAR var)
|
|
if (NOT DEFINED "${var}" AND NOT DEFINED "ENV{${var}}")
|
|
message(FATAL_ERROR "${var} environment variable must be set")
|
|
endif()
|
|
endfunction()
|
|
|
|
function(swift_windows_cache_VCVARS)
|
|
swift_verify_windows_VCVAR(VCToolsInstallDir)
|
|
swift_verify_windows_VCVAR(UniversalCRTSdkDir)
|
|
swift_verify_windows_VCVAR(UCRTVersion)
|
|
|
|
set(VCToolsInstallDir $ENV{VCToolsInstallDir} CACHE STRING "")
|
|
set(UniversalCRTSdkDir $ENV{UniversalCRTSdkDir} CACHE STRING "")
|
|
set(UCRTVersion $ENV{UCRTVersion} CACHE STRING "")
|
|
endfunction()
|
|
|
|
# NOTE(compnerd) we use a macro here as this modifies global variables
|
|
macro(swift_swap_compiler_if_needed target)
|
|
if(NOT CMAKE_C_COMPILER_ID MATCHES Clang)
|
|
if(CMAKE_SYSTEM_NAME STREQUAL CMAKE_HOST_SYSTEM_NAME)
|
|
if(SWIFT_BUILT_STANDALONE)
|
|
get_target_property(CLANG_LOCATION clang LOCATION)
|
|
get_filename_component(CLANG_LOCATION ${CLANG_LOCATION} DIRECTORY)
|
|
else()
|
|
set(CLANG_LOCATION ${LLVM_RUNTIME_OUTPUT_INTDIR})
|
|
endif()
|
|
|
|
if("${CMAKE_C_COMPILER_ID}" STREQUAL "MSVC" OR "${CMAKE_C_SIMULATE_ID}" STREQUAL "MSVC")
|
|
set(CMAKE_C_COMPILER ${CLANG_LOCATION}/clang-cl${CMAKE_EXECUTABLE_SUFFIX})
|
|
set(CMAKE_CXX_COMPILER ${CLANG_LOCATION}/clang-cl${CMAKE_EXECUTABLE_SUFFIX})
|
|
else()
|
|
set(CMAKE_C_COMPILER ${CLANG_LOCATION}/clang${CMAKE_EXECUTABLE_SUFFIX})
|
|
set(CMAKE_CXX_COMPILER ${CLANG_LOCATION}/clang++${CMAKE_EXECUTABLE_SUFFIX})
|
|
endif()
|
|
else()
|
|
message(SEND_ERROR "${target} requires a clang based compiler")
|
|
endif()
|
|
endif()
|
|
endmacro()
|
|
|