# Variable that tracks the set of configured SDKs. # # Each element in this list is an SDK for which the various # SWIFT_SDK_${name}_* variables are defined. Swift libraries will be # built for each variant. set(SWIFT_CONFIGURED_SDKS) include(SwiftWindowsSupport) # Report the given SDK to the user. function(_report_sdk prefix) message(STATUS "${SWIFT_SDK_${prefix}_NAME} SDK:") if("${prefix}" STREQUAL "WINDOWS") message(STATUS " UCRT Version: $ENV{UCRTVersion}") message(STATUS " UCRT SDK Dir: $ENV{UniversalCRTSdkDir}") message(STATUS " VC Dir: $ENV{VCToolsInstallDir}") if("${CMAKE_BUILD_TYPE}" STREQUAL "DEBUG") message(STATUS " ${CMAKE_BUILD_TYPE} VC++ CRT: MDd") else() message(STATUS " ${CMAKE_BUILD_TYPE} VC++ CRT: MD") endif() foreach(arch ${SWIFT_SDK_${prefix}_ARCHITECTURES}) swift_windows_include_for_arch(${arch} ${arch}_INCLUDE) swift_windows_lib_for_arch(${arch} ${arch}_LIB) message(STATUS " ${arch} INCLUDE: ${${arch}_INCLUDE}") message(STATUS " ${arch} LIB: ${${arch}_LIB}") endforeach() else() foreach(arch ${SWIFT_SDK_${prefix}_ARCHITECTURES}) message(STATUS " ${arch} Path: ${SWIFT_SDK_${prefix}_ARCH_${arch}_PATH}") endforeach() endif() message(STATUS " Version: ${SWIFT_SDK_${prefix}_VERSION}") message(STATUS " Build number: ${SWIFT_SDK_${prefix}_BUILD_NUMBER}") message(STATUS " Deployment version: ${SWIFT_SDK_${prefix}_DEPLOYMENT_VERSION}") message(STATUS " Library subdir: ${SWIFT_SDK_${prefix}_LIB_SUBDIR}") message(STATUS " Version min name: ${SWIFT_SDK_${prefix}_VERSION_MIN_NAME}") message(STATUS " Triple name: ${SWIFT_SDK_${prefix}_TRIPLE_NAME}") message(STATUS " Architectures: ${SWIFT_SDK_${prefix}_ARCHITECTURES}") message(STATUS " Object Format: ${SWIFT_SDK_${prefix}_OBJECT_FORMAT}") foreach(arch ${SWIFT_SDK_${prefix}_ARCHITECTURES}) if(SWIFT_SDK_${prefix}_ARCH_${arch}_LINKER) message(STATUS " Linker (${arch}): ${SWIFT_SDK_${prefix}_ARCH_${arch}_LINKER}") else() message(STATUS " Linker (${arch}): ${CMAKE_LINKER}") endif() endforeach() foreach(arch ${SWIFT_SDK_${prefix}_ARCHITECTURES}) message(STATUS " Triple for ${arch} is ${SWIFT_SDK_${prefix}_ARCH_${arch}_TRIPLE}") endforeach() message(STATUS "") endfunction() # Configure an SDK # # Usage: # configure_sdk_darwin( # prefix # Prefix to use for SDK variables (e.g., OSX) # name # Display name for this SDK # deployment_version # Deployment version # xcrun_name # SDK name to use with xcrun # version_min_name # The name used in the -mOS-version-min flag # triple_name # The name used in Swift's -triple # architectures # A list of architectures this SDK supports # ) # # Sadly there are three OS naming conventions. # xcrun SDK name: macosx iphoneos iphonesimulator (+ version) # -mOS-version-min: macosx ios ios-simulator # swift -triple: macosx ios ios # # This macro attempts to configure a given SDK. When successful, it # defines a number of variables: # # SWIFT_SDK_${prefix}_NAME Display name for the SDK # SWIFT_SDK_${prefix}_VERSION SDK version number (e.g., 10.9, 7.0) # SWIFT_SDK_${prefix}_BUILD_NUMBER SDK build number (e.g., 14A389a) # SWIFT_SDK_${prefix}_DEPLOYMENT_VERSION Deployment version (e.g., 10.9, 7.0) # SWIFT_SDK_${prefix}_LIB_SUBDIR Library subdir for this SDK # SWIFT_SDK_${prefix}_VERSION_MIN_NAME Version min name for this SDK # SWIFT_SDK_${prefix}_TRIPLE_NAME Triple name for this SDK # SWIFT_SDK_${prefix}_ARCHITECTURES Architectures (as a list) # SWIFT_SDK_${prefix}_ARCH_${ARCH}_TRIPLE Triple name macro(configure_sdk_darwin prefix name deployment_version xcrun_name version_min_name triple_name architectures) # Note: this has to be implemented as a macro because it sets global # variables. # Find the SDK set(SWIFT_SDK_${prefix}_PATH "" CACHE PATH "Path to the ${name} SDK") if(NOT SWIFT_SDK_${prefix}_PATH) execute_process( COMMAND "xcrun" "--sdk" "${xcrun_name}" "--show-sdk-path" OUTPUT_VARIABLE SWIFT_SDK_${prefix}_PATH OUTPUT_STRIP_TRAILING_WHITESPACE) if(NOT EXISTS "${SWIFT_SDK_${prefix}_PATH}/System/Library/Frameworks/module.map") message(FATAL_ERROR "${name} SDK not found at ${SWIFT_SDK_${prefix}_PATH}.") endif() endif() if(NOT EXISTS "${SWIFT_SDK_${prefix}_PATH}/System/Library/Frameworks/module.map") message(FATAL_ERROR "${name} SDK not found at ${SWIFT_SDK_${prefix}_PATH}.") endif() # Determine the SDK version we found. execute_process( COMMAND "defaults" "read" "${SWIFT_SDK_${prefix}_PATH}/SDKSettings.plist" "Version" OUTPUT_VARIABLE SWIFT_SDK_${prefix}_VERSION OUTPUT_STRIP_TRAILING_WHITESPACE) execute_process( COMMAND "xcodebuild" "-sdk" "${SWIFT_SDK_${prefix}_PATH}" "-version" "ProductBuildVersion" OUTPUT_VARIABLE SWIFT_SDK_${prefix}_BUILD_NUMBER OUTPUT_STRIP_TRAILING_WHITESPACE) # Set other variables. set(SWIFT_SDK_${prefix}_NAME "${name}") set(SWIFT_SDK_${prefix}_DEPLOYMENT_VERSION "${deployment_version}") set(SWIFT_SDK_${prefix}_LIB_SUBDIR "${xcrun_name}") set(SWIFT_SDK_${prefix}_VERSION_MIN_NAME "${version_min_name}") set(SWIFT_SDK_${prefix}_TRIPLE_NAME "${triple_name}") set(SWIFT_SDK_${prefix}_ARCHITECTURES "${architectures}") set(SWIFT_SDK_${prefix}_OBJECT_FORMAT "MACHO") foreach(arch ${architectures}) # On Darwin, all archs share the same SDK path. set(SWIFT_SDK_${prefix}_ARCH_${arch}_PATH "${SWIFT_SDK_${prefix}_PATH}") set(SWIFT_SDK_${prefix}_ARCH_${arch}_TRIPLE "${arch}-apple-${SWIFT_SDK_${prefix}_TRIPLE_NAME}") endforeach() # Add this to the list of known SDKs. list(APPEND SWIFT_CONFIGURED_SDKS "${prefix}") _report_sdk("${prefix}") endmacro() macro(configure_sdk_unix prefix name lib_subdir triple_name architectures triple sdkpath) # Note: this has to be implemented as a macro because it sets global # variables. set(SWIFT_SDK_${prefix}_NAME "${name}") set(SWIFT_SDK_${prefix}_VERSION "don't use") set(SWIFT_SDK_${prefix}_BUILD_NUMBER "don't use") set(SWIFT_SDK_${prefix}_DEPLOYMENT_VERSION "") set(SWIFT_SDK_${prefix}_LIB_SUBDIR "${lib_subdir}") set(SWIFT_SDK_${prefix}_VERSION_MIN_NAME "") set(SWIFT_SDK_${prefix}_TRIPLE_NAME "${triple_name}") set(SWIFT_SDK_${prefix}_ARCHITECTURES "${architectures}") if("${prefix}" STREQUAL "CYGWIN") set(SWIFT_SDK_${prefix}_OBJECT_FORMAT "COFF") else() set(SWIFT_SDK_${prefix}_OBJECT_FORMAT "ELF") endif() foreach(arch ${architectures}) set(SWIFT_SDK_${prefix}_ARCH_${arch}_PATH "${sdkpath}") set(SWIFT_SDK_${prefix}_ARCH_${arch}_TRIPLE "${triple}") endforeach() # Add this to the list of known SDKs. list(APPEND SWIFT_CONFIGURED_SDKS "${prefix}") _report_sdk("${prefix}") endmacro() macro(configure_sdk_windows prefix sdk_name environment architectures) # Note: this has to be implemented as a macro because it sets global # variables. set(SWIFT_SDK_${prefix}_NAME "${sdk_name}") set(SWIFT_SDK_${prefix}_VERSION "NOTFOUND") set(SWIFT_SDK_${prefix}_BUILD_NUMBER "NOTFOUND") set(SWIFT_SDK_${prefix}_DEPLOYMENT_VERSION "") set(SWIFT_SDK_${prefix}_LIB_SUBDIR "windows") set(SWIFT_SDK_${prefix}_VERSION_MIN_NAME "NOTFOUND") set(SWIFT_SDK_${prefix}_TRIPLE_NAME "Win32") set(SWIFT_SDK_${prefix}_ARCHITECTURES "${architectures}") set(SWIFT_SDK_${prefix}_OBJECT_FORMAT "COFF") foreach(arch ${architectures}) if(arch STREQUAL armv7) set(SWIFT_SDK_${prefix}_ARCH_${arch}_TRIPLE "thumbv7-unknown-windows-${environment}") else() set(SWIFT_SDK_${prefix}_ARCH_${arch}_TRIPLE "${arch}-unknown-windows-${environment}") endif() # NOTE: set the path to / to avoid a spurious `--sysroot` from being passed # to the driver -- rely on the `INCLUDE` AND `LIB` environment variables # instead. set(SWIFT_SDK_${prefix}_ARCH_${arch}_PATH "/") endforeach() # Add this to the list of known SDKs. list(APPEND SWIFT_CONFIGURED_SDKS "${prefix}") _report_sdk("${prefix}") endmacro() # Configure a variant of a certain SDK # # In addition to the SDK and architecture, a variant determines build settings. # # FIXME: this is not wired up with anything yet. function(configure_target_variant prefix name sdk build_config lib_subdir) set(SWIFT_VARIANT_${prefix}_NAME ${name}) set(SWIFT_VARIANT_${prefix}_SDK_PATH ${SWIFT_SDK_${sdk}_PATH}) set(SWIFT_VARIANT_${prefix}_VERSION ${SWIFT_SDK_${sdk}_VERSION}) set(SWIFT_VARIANT_${prefix}_BUILD_NUMBER ${SWIFT_SDK_${sdk}_BUILD_NUMBER}) set(SWIFT_VARIANT_${prefix}_DEPLOYMENT_VERSION ${SWIFT_SDK_${sdk}_DEPLOYMENT_VERSION}) set(SWIFT_VARIANT_${prefix}_LIB_SUBDIR "${lib_subdir}/${SWIFT_SDK_${sdk}_LIB_SUBDIR}") set(SWIFT_VARIANT_${prefix}_VERSION_MIN_NAME ${SWIFT_SDK_${sdk}_VERSION_MIN_NAME}) set(SWIFT_VARIANT_${prefix}_TRIPLE_NAME ${SWIFT_SDK_${sdk}_TRIPLE_NAME}) set(SWIFT_VARIANT_${prefix}_ARCHITECTURES ${SWIFT_SDK_${sdk}_ARCHITECTURES}) endfunction()