Files
swift-mirror/cmake/modules/SwiftWindowsSupport.cmake
Saleem Abdulrasool a1c971907b build: repair the Windows build
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.
2020-01-27 22:35:28 -08:00

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()