mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
Runtimes: add Overlay project
Add the next stage of the runtimes build - the overlays. This homes the platform specific overlays for the libraries and is required to make further progress towards a static SDK for Windows.
This commit is contained in:
52
Runtimes/Overlay/CMakeLists.txt
Normal file
52
Runtimes/Overlay/CMakeLists.txt
Normal file
@@ -0,0 +1,52 @@
|
||||
|
||||
cmake_minimum_required(VERSION 3.26...3.29)
|
||||
|
||||
set(CMAKE_C_VISIBILITY_PRESET "hidden")
|
||||
set(CMAKE_CXX_VISIBILITY_PRESET "hidden")
|
||||
set(CMAKE_VISIBILITY_INLINES_HIDDEN YES)
|
||||
|
||||
list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake/modules")
|
||||
|
||||
# NOTE: always use the 3-component style as the expansion as
|
||||
# `${PROJECT_VERSION}` will not extend this to the complete form and this can
|
||||
# change the behaviour for comparison with non-SemVer compliant parsing. If
|
||||
# possible, use the 4-version component as that is used to differentiate the
|
||||
# builds of the runtime for Windows.
|
||||
if($ENV{BUILD_NUMBER})
|
||||
# NOTE: SxS modules have a limit on each component being [0-65535].
|
||||
# https://learn.microsoft.com/en-us/windows/win32/sbscs/assembly-versions
|
||||
math(EXPR BUILD_NUMBER "$ENV{BUILD_NUMBER} % 65535")
|
||||
set(BUILD_NUMBER ".${BUILD_NUMBER}")
|
||||
endif()
|
||||
project(SwiftOverlay
|
||||
LANGUAGES C CXX Swift
|
||||
VERSION 6.1.0${BUILD_NUMBER})
|
||||
|
||||
# FIXME: We should not need to refer back into the compiler sources. This is
|
||||
# needed by gyb and AvailabilityMacros
|
||||
set(SwiftOverlay_SWIFTC_SOURCE_DIR
|
||||
"${PROJECT_SOURCE_DIR}/../../"
|
||||
CACHE FILEPATH "Path to the root source directory of the Swift compiler")
|
||||
|
||||
include(GNUInstallDirs)
|
||||
|
||||
include(gyb)
|
||||
include(AvailabilityMacros)
|
||||
include(DefaultSettings)
|
||||
include(EmitSwiftInterface)
|
||||
include(PlatformInfo)
|
||||
include(ResourceEmbedding)
|
||||
|
||||
defaulted_option(SwiftOverlay_ENABLE_REFLECTION "Enable runtime support for mirrors and reflection support")
|
||||
|
||||
option(SwiftOverlay_INSTALL_NESTED_SUBDIR "Install libraries under a platform and architecture subdirectory" ON)
|
||||
set(SwiftOverlay_INSTALL_LIBDIR "${CMAKE_INSTALL_LIBDIR}/swift$<$<NOT:$<BOOL:${BUILD_SHARED_LIBS}>>:_static>$<$<BOOL:${SwiftOverlay_INSTALL_NESTED_SUBDIR}>:/${SwiftOverlay_PLATFORM_SUBDIR}/${SwiftOverlay_ARCH_SUBDIR}>")
|
||||
set(SwiftOverlay_INSTALL_SWIFTMODULEDIR "${CMAKE_INSTALL_LIBDIR}/swift$<$<NOT:$<BOOL:${BUILD_SHARED_LIBS}>>:_static>$<$<BOOL:${SwiftOverlay_INSTALL_NESTED_SUBDIR}>:/${SwiftOverlay_PLATFORM_SUBDIR}>")
|
||||
|
||||
add_compile_options(
|
||||
"$<$<COMPILE_LANGUAGE:Swift>:SHELL:-Xfrontend -disable-implicit-concurrency-module-import>"
|
||||
"$<$<COMPILE_LANGUAGE:Swift>:SHELL:-Xfrontend -disable-implicit-string-processing-module-import>")
|
||||
|
||||
if(WIN32)
|
||||
add_subdirectory(Windows)
|
||||
endif()
|
||||
4
Runtimes/Overlay/Windows/CMakeLists.txt
Normal file
4
Runtimes/Overlay/Windows/CMakeLists.txt
Normal file
@@ -0,0 +1,4 @@
|
||||
|
||||
add_subdirectory(clang)
|
||||
add_subdirectory(CRT)
|
||||
add_subdirectory(WinSDK)
|
||||
24
Runtimes/Overlay/Windows/CRT/CMakeLists.txt
Normal file
24
Runtimes/Overlay/Windows/CRT/CMakeLists.txt
Normal file
@@ -0,0 +1,24 @@
|
||||
|
||||
gyb_expand(tgmath.swift.gyb tgmath.swift)
|
||||
|
||||
add_library(swiftCRT
|
||||
tgmath.swift
|
||||
ucrt.swift
|
||||
Platform.swift
|
||||
POSIXError.swift
|
||||
TiocConstants.swift)
|
||||
set_target_properties(swiftCRT PROPERTIES
|
||||
Swift_MODULE_NAME CRT)
|
||||
target_compile_definitions(swiftCRT PRIVATE
|
||||
$<$<BOOL:${SwiftOverlay_ENABLE_REFLECTION}>:SWIFT_ENABLE_REFLECTION>)
|
||||
target_compile_options(swiftCRT PRIVATE
|
||||
"SHELL:-Xcc -D_USE_MATH_DEFINES")
|
||||
|
||||
install(TARGETS swiftCRT
|
||||
ARCHIVE DESTINATION "${SwiftOverlay_INSTALL_LIBDIR}"
|
||||
LIBRARY DESTINATION "${SwiftOverlay_INSTALL_LIBDIR}"
|
||||
RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}")
|
||||
emit_swift_interface(swiftCRT)
|
||||
install_swift_interface(swiftCRT)
|
||||
|
||||
embed_manifest(swiftCRT)
|
||||
16
Runtimes/Overlay/Windows/WinSDK/CMakeLists.txt
Normal file
16
Runtimes/Overlay/Windows/WinSDK/CMakeLists.txt
Normal file
@@ -0,0 +1,16 @@
|
||||
|
||||
add_library(swiftWinSDK
|
||||
WinSDK.swift)
|
||||
set_target_properties(swiftWinSDK PROPERTIES
|
||||
Swift_MODULE_NAME WinSDK)
|
||||
target_compile_definitions(swiftCRT PRIVATE
|
||||
$<$<BOOL:${SwiftOverlay_ENABLE_REFLECTION}>:SWIFT_ENABLE_REFLECTION>)
|
||||
|
||||
install(TARGETS swiftWinSDK
|
||||
ARCHIVE DESTINATION "${SwiftOverlay_INSTALL_LIBDIR}"
|
||||
LIBRARY DESTINATION "${SwiftOverlay_INSTALL_LIBDIR}"
|
||||
RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}")
|
||||
emit_swift_interface(swiftWinSDK)
|
||||
install_swift_interface(swiftWinSDK)
|
||||
|
||||
embed_manifest(swiftWinSDK)
|
||||
7
Runtimes/Overlay/Windows/clang/CMakeLists.txt
Normal file
7
Runtimes/Overlay/Windows/clang/CMakeLists.txt
Normal file
@@ -0,0 +1,7 @@
|
||||
|
||||
install(FILES
|
||||
ucrt.modulemap
|
||||
vcruntime.apinotes
|
||||
vcruntime.modulemap
|
||||
winsdk.modulemap
|
||||
DESTINATION ${CMAKE_INSTALL_DATAROOTDIR})
|
||||
5
Runtimes/Overlay/cmake/modules/AvailabilityMacros.cmake
Normal file
5
Runtimes/Overlay/cmake/modules/AvailabilityMacros.cmake
Normal file
@@ -0,0 +1,5 @@
|
||||
file(STRINGS "${SwiftOverlay_SWIFTC_SOURCE_DIR}/utils/availability-macros.def" availability_defs)
|
||||
list(FILTER availability_defs EXCLUDE REGEX "^\\s*(#.*)?$")
|
||||
foreach(def ${availability_defs})
|
||||
add_compile_options("$<$<COMPILE_LANGUAGE:Swift>:SHELL:-Xfrontend -define-availability -Xfrontend \"${def}\">")
|
||||
endforeach()
|
||||
37
Runtimes/Overlay/cmake/modules/DefaultSettings.cmake
Normal file
37
Runtimes/Overlay/cmake/modules/DefaultSettings.cmake
Normal file
@@ -0,0 +1,37 @@
|
||||
# This file is designed to setup reasonable defaults for the various settings so
|
||||
# that configuring a build for a given platform is likely to build
|
||||
# out-of-the-box without customization. This does not mean that it is the only
|
||||
# way that will work, or that it represents a shipping configuration.
|
||||
# User-specified configurations should be done through cache files or by setting
|
||||
# the variable with `-DSwiftOverlay_*` on the commandline.
|
||||
|
||||
# Provide a boolean option that a user can optionally enable.
|
||||
# Variables are defaulted based on the value of `<variable>_default`.
|
||||
# If no such default variable exists, the option is defaults to `OFF`.
|
||||
macro(defaulted_option variable helptext)
|
||||
if(NOT DEFINED ${variable}_default)
|
||||
set(${variable}_default OFF)
|
||||
endif()
|
||||
option(${variable} ${helptext} ${${variable}_default})
|
||||
endmacro()
|
||||
|
||||
# Create a defaulted cache entry
|
||||
# Entries are defaulted on the value of `<variable>_default`.
|
||||
# If no such default variable exists, the variable is not created.
|
||||
macro(defaulted_set variable type helptext)
|
||||
if(DEFINED ${variable}_default)
|
||||
set(${variable} ${${variable}_default} CACHE ${type} ${helptext})
|
||||
endif()
|
||||
endmacro()
|
||||
|
||||
if(APPLE)
|
||||
set(SwiftOverlay_ENABLE_REFLECTION_default ON)
|
||||
elseif(CMAKE_SYSTEM_NAME STREQUAL "WASM")
|
||||
set(SwiftOverlay_ENABLE_REFLECTION_default OFF)
|
||||
elseif(LINUX OR ANDROID OR BSD)
|
||||
set(SwiftOverlay_ENABLE_REFLECTION_default OFF)
|
||||
elseif(WIN32)
|
||||
set(SwiftOverlay_ENABLE_REFLECTION_default OFF)
|
||||
endif()
|
||||
|
||||
include("${SwiftOverlay_VENDOR_MODULE_DIR}/DefaultSettings.cmake" OPTIONAL)
|
||||
68
Runtimes/Overlay/cmake/modules/EmitSwiftInterface.cmake
Normal file
68
Runtimes/Overlay/cmake/modules/EmitSwiftInterface.cmake
Normal file
@@ -0,0 +1,68 @@
|
||||
# Generate and install swift interface files
|
||||
|
||||
# TODO: CMake should learn how to model library evolution and generate this
|
||||
# stuff automatically.
|
||||
|
||||
|
||||
# Generate a swift interface file for the target if library evolution is enabled
|
||||
function(emit_swift_interface target)
|
||||
# Generate the target-variant binary swift module when performing zippered
|
||||
# build
|
||||
if(SwiftOverlay_VARIANT_MODULE_TRIPLE)
|
||||
set(variant_module_tmp_dir "${CMAKE_CURRENT_BINARY_DIR}/${target}-${SwiftOverlay_VARIANT_MODULE_TRIPLE}")
|
||||
file(MAKE_DIRECTORY "${variant_module_tmp_dir}")
|
||||
target_compile_options(${target} PRIVATE
|
||||
"$<$<COMPILE_LANGUAGE:Swift>:SHELL:-emit-variant-module-path ${variant_module_tmp_dir}/${target}.swiftmodule>")
|
||||
endif()
|
||||
|
||||
# Generate textual swift interfaces is library-evolution is enabled
|
||||
if(SwiftOverlay_ENABLE_LIBRARY_EVOLUTION)
|
||||
target_compile_options(${target} PRIVATE
|
||||
$<$<COMPILE_LANGUAGE:Swift>:-emit-module-interface-path$<SEMICOLON>${CMAKE_CURRENT_BINARY_DIR}/$<TARGET_PROPERTY:${target},Swift_MODULE_NAME>.swiftinterface>
|
||||
$<$<COMPILE_LANGUAGE:Swift>:-emit-private-module-interface-path$<SEMICOLON>${CMAKE_CURRENT_BINARY_DIR}/$<TARGET_PROPERTY:${target},Swift_MODULE_NAME>.private.swiftinterface>
|
||||
$<$<COMPILE_LANGUAGE:Swift>:-library-level$<SEMICOLON>api>
|
||||
$<$<COMPILE_LANGUAGE:Swift>:-Xfrontend$<SEMICOLON>-require-explicit-availability=ignore>)
|
||||
|
||||
# Emit catalyst swiftmodules and interfaces
|
||||
if(SwiftOverlay_VARIANT_MODULE_TRIPLE)
|
||||
target_compile_options(${target} PRIVATE
|
||||
"$<$<COMPILE_LANGUAGE:Swift>:SHELL:-emit-variant-module-interface-path ${variant_module_tmp_dir}/${target}.swiftinterface>"
|
||||
"$<$<COMPILE_LANGUAGE:Swift>:SHELL:-emit-variant-private-module-interface-path ${variant_module_tmp_dir}/${target}.private.swiftinterface>")
|
||||
endif()
|
||||
endif()
|
||||
endfunction()
|
||||
|
||||
# Install the generated swift interface file for the target if library evolution
|
||||
# is enabled.
|
||||
function(install_swift_interface target)
|
||||
# Install binary swift modules
|
||||
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/$<TARGET_PROPERTY:${target},Swift_MODULE_NAME>.swiftmodule"
|
||||
RENAME "${SwiftOverlay_MODULE_TRIPLE}.swiftmodule"
|
||||
DESTINATION "${SwiftOverlay_INSTALL_SWIFTMODULEDIR}/$<TARGET_PROPERTY:${target},Swift_MODULE_NAME>.swiftmodule")
|
||||
if(SwiftOverlay_VARIANT_MODULE_TRIPLE)
|
||||
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/${target}-${SwiftOverlay_VARIANT_MODULE_TRIPLE}/${target}.swiftmodule"
|
||||
RENAME "${SwiftOverlay_VARIANT_MODULE_TRIPLE}.swiftmodule"
|
||||
DESTINATION "${SwiftOverlay_INSTALL_SWIFTMODULEDIR}/$<TARGET_PROPERTY:${target},Swift_MODULE_NAME>.swiftmodule")
|
||||
endif()
|
||||
|
||||
# Install Swift interfaces if library-evolution is enabled
|
||||
if(SwiftOverlay_ENABLE_LIBRARY_EVOLUTION)
|
||||
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/$<TARGET_PROPERTY:${target},Swift_MODULE_NAME>.swiftinterface"
|
||||
RENAME "${SwiftOverlay_MODULE_TRIPLE}.swiftinterface"
|
||||
DESTINATION "${SwiftOverlay_INSTALL_SWIFTMODULEDIR}/$<TARGET_PROPERTY:${target},Swift_MODULE_NAME>.swiftmodule")
|
||||
|
||||
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/$<TARGET_PROPERTY:${target},Swift_MODULE_NAME>.private.swiftinterface"
|
||||
RENAME "${SwiftOverlay_MODULE_TRIPLE}.private.swiftinterface"
|
||||
DESTINATION "${SwiftOverlay_INSTALL_SWIFTMODULEDIR}/$<TARGET_PROPERTY:${target},Swift_MODULE_NAME>.swiftmodule")
|
||||
|
||||
# Install catalyst interface files
|
||||
if(SwiftOverlay_VARIANT_MODULE_TRIPLE)
|
||||
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/${target}-${SwiftOverlay_VARIANT_MODULE_TRIPLE}/${target}.swiftinterface"
|
||||
RENAME "${SwiftOverlay_VARIANT_MODULE_TRIPLE}.swiftinterface"
|
||||
DESTINATION "${SwiftOverlay_INSTALL_SWIFTMODULEDIR}/$<TARGET_PROPERTY:${target},Swift_MODULE_NAME>.swiftmodule")
|
||||
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/${target}-${SwiftOverlay_VARIANT_MODULE_TRIPLE}/${target}.private.swiftinterface"
|
||||
RENAME "${SwiftOverlay_VARIANT_MODULE_TRIPLE}.private.swiftinterface"
|
||||
DESTINATION "${SwiftOverlay_INSTALL_SWIFTMODULEDIR}/$<TARGET_PROPERTY:${target},Swift_MODULE_NAME>.swiftmodule")
|
||||
endif()
|
||||
endif()
|
||||
endfunction()
|
||||
32
Runtimes/Overlay/cmake/modules/PlatformInfo.cmake
Normal file
32
Runtimes/Overlay/cmake/modules/PlatformInfo.cmake
Normal file
@@ -0,0 +1,32 @@
|
||||
# TODO: This logic should migrate to CMake once CMake supports installing swiftmodules
|
||||
set(module_triple_command "${CMAKE_Swift_COMPILER}" -print-target-info)
|
||||
if(CMAKE_Swift_COMPILER_TARGET)
|
||||
list(APPEND module_triple_command -target ${CMAKE_Swift_COMPILER_TARGET})
|
||||
endif()
|
||||
execute_process(COMMAND ${module_triple_command} OUTPUT_VARIABLE target_info_json)
|
||||
message(CONFIGURE_LOG "Swift target info: ${module_triple_command}\n"
|
||||
"${target_info_json}")
|
||||
|
||||
if(NOT SwiftOverlay_MODULE_TRIPLE)
|
||||
string(JSON module_triple GET "${target_info_json}" "target" "moduleTriple")
|
||||
set(SwiftOverlay_MODULE_TRIPLE "${module_triple}" CACHE STRING "Triple used for installed swift{doc,module,interface} files")
|
||||
mark_as_advanced(SwiftOverlay_MODULE_TRIPLE)
|
||||
|
||||
message(CONFIGURE_LOG "Swift module triple: ${module_triple}")
|
||||
endif()
|
||||
|
||||
if(NOT SwiftOverlay_PLATFORM_SUBDIR)
|
||||
string(JSON platform GET "${target_info_json}" "target" "platform")
|
||||
set(SwiftOverlay_PLATFORM_SUBDIR "${platform}" CACHE STRING "Platform name used for installed swift{doc,module,interface} files")
|
||||
mark_as_advanced(SwiftOverlay_PLATFORM_SUBDIR)
|
||||
|
||||
message(CONFIGURE_LOG "Swift platform: ${platform}")
|
||||
endif()
|
||||
|
||||
if(NOT SwiftOverlay_ARCH_SUBDIR)
|
||||
string(JSON arch GET "${target_info_json}" "target" "arch")
|
||||
set(SwiftOverlay_ARCH_SUBDIR "${arch}" CACHE STRING "Architecture used for setting the architecture subdirectory")
|
||||
mark_as_advanced(SwiftOverlay_ARCH_SUBDIR)
|
||||
|
||||
message(CONFIGURE_LOG "Swift Arch: ${arch}")
|
||||
endif()
|
||||
70
Runtimes/Overlay/cmake/modules/ResourceEmbedding.cmake
Normal file
70
Runtimes/Overlay/cmake/modules/ResourceEmbedding.cmake
Normal file
@@ -0,0 +1,70 @@
|
||||
function(generate_plist project_name project_version target)
|
||||
set(PLIST_INFO_PLIST "Info.plist")
|
||||
set(PLIST_INFO_NAME "${project_name}")
|
||||
|
||||
# Underscores aren't permitted in the bundle identifier.
|
||||
string(REPLACE "_" "" PLIST_INFO_UTI "com.apple.dt.runtime.${PLIST_INFO_NAME}")
|
||||
set(PLIST_INFO_VERSION "${project_version}")
|
||||
set(PLIST_INFO_BUILD_VERSION "${project_version}")
|
||||
|
||||
set(PLIST_INFO_PLIST_OUT "${PLIST_INFO_PLIST}")
|
||||
set(PLIST_INFO_PLIST_IN "${PROJECT_SOURCE_DIR}/${PLIST_INFO_PLIST}.in")
|
||||
|
||||
if(APPLE)
|
||||
target_link_options(${target} PRIVATE
|
||||
"SHELL:-Xlinker -sectcreate -Xlinker __TEXT -Xlinker __info_plist -Xlinker ${CMAKE_CURRENT_BINARY_DIR}/${PLIST_INFO_PLIST_OUT}")
|
||||
endif()
|
||||
|
||||
configure_file(
|
||||
"${PLIST_INFO_PLIST_IN}"
|
||||
"${PLIST_INFO_PLIST_OUT}"
|
||||
@ONLY
|
||||
NEWLINE_STYLE UNIX)
|
||||
|
||||
set_property(TARGET ${target} APPEND PROPERTY LINK_DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/${PLIST_INFO_PLIST_OUT}")
|
||||
|
||||
# If Application Extensions are enabled, pass the linker flag marking
|
||||
# the dylib as safe.
|
||||
if (CXX_SUPPORTS_FAPPLICATION_EXTENSION AND (NOT DISABLE_APPLICATION_EXTENSION))
|
||||
list(APPEND link_flags "-Wl,-application_extension")
|
||||
endif()
|
||||
endfunction()
|
||||
|
||||
# FIXME: it appears that `CMAKE_MT` evaluates to an empty string which prevents
|
||||
# the use of the variable. This aliases `MT` to `CMAKE_MT` and tries to fallback
|
||||
# to known spellings for the tool.
|
||||
if(WIN32 AND BUILD_SHARED_LIBS)
|
||||
find_program(MT HINTS ${CMAKE_MT} NAMES mt llvm-mt REQUIRED)
|
||||
endif()
|
||||
|
||||
function(embed_manifest target)
|
||||
get_target_property(_EM_TARGET_TYPE ${target} TYPE)
|
||||
if(NOT "${_EM_TARGET_TYPE}" MATCHES "SHARED_LIBRARY|EXECUTABLE")
|
||||
return()
|
||||
endif()
|
||||
|
||||
get_target_property(_EM_BINARY_DIR ${target} BINARY_DIR)
|
||||
get_target_property(_EM_NAME ${target} NAME)
|
||||
|
||||
# Evaluate variables
|
||||
file(CONFIGURE
|
||||
OUTPUT ${_EM_BINARY_DIR}/${_EM_NAME}-${PROJECT_VERSION}.1.manifest.in
|
||||
CONTENT [[<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||
<assembly manifestversion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
|
||||
<assemblyIdentity
|
||||
name="$<TARGET_NAME:@target@>"
|
||||
processorArchitecture="@CMAKE_SYSTEM_PROCESSOR@"
|
||||
type="win32"
|
||||
version="@PROJECT_VERSION@" />
|
||||
<file name="$<TARGET_FILE_NAME:@target@>" />
|
||||
</assembly>]])
|
||||
# Evaluate generator expression
|
||||
file(GENERATE
|
||||
OUTPUT ${_EM_BINARY_DIR}/${_EM_NAME}-${PROJECT_VERSION}.1.manifest
|
||||
INPUT ${_EM_BINARY_DIR}/${_EM_NAME}-${PROJECT_VERSION}.1.manifest.in)
|
||||
|
||||
if(WIN32)
|
||||
add_custom_command(TARGET ${target} POST_BUILD
|
||||
COMMAND "${MT}" -nologo -manifest "${_EM_BINARY_DIR}/${_EM_NAME}-${PROJECT_VERSION}.1.manifest" "-outputresource:$<TARGET_FILE:${target}>;#1")
|
||||
endif()
|
||||
endfunction()
|
||||
47
Runtimes/Overlay/cmake/modules/gyb.cmake
Normal file
47
Runtimes/Overlay/cmake/modules/gyb.cmake
Normal file
@@ -0,0 +1,47 @@
|
||||
find_package(Python3 REQUIRED)
|
||||
|
||||
# Create a target to expand a gyb source
|
||||
# target_name: Name of the target
|
||||
# FLAGS list of flags passed to gyb
|
||||
# DEPENDS list of dependencies
|
||||
# COMMENT Custom comment
|
||||
function(gyb_expand source output)
|
||||
set(flags)
|
||||
set(arguments)
|
||||
set(multival_arguments FLAGS DEPENDS)
|
||||
cmake_parse_arguments(GYB "${flags}" "${arguments}" "${multival_arguments}" ${ARGN})
|
||||
|
||||
get_filename_component(full_output_path ${output} ABSOLUTE BASE_DIR "${CMAKE_CURRENT_BINARY_DIR}")
|
||||
get_filename_component(dir "${full_output_path}" DIRECTORY)
|
||||
get_filename_component(fname "${full_output_path}" NAME)
|
||||
|
||||
file(READ "${source}" gyb_src)
|
||||
string(REGEX MATCHALL "\\\$\{[\r\n\t ]*gyb.expand\\\([\r\n\t ]*[\'\"]([^\'\"]*)[\'\"]" gyb_expand_matches "${gyb_src}")
|
||||
foreach(match ${gyb_expand_matches})
|
||||
string(REGEX MATCH "[\'\"]\([^\'\"]*\)[\'\"]" gyb_dep "${match}")
|
||||
list(APPEND gyb_expand_deps "${CMAKE_MATCH_1}")
|
||||
endforeach()
|
||||
list(REMOVE_DUPLICATES gyb_expand_deps)
|
||||
|
||||
set(utils_dir "${SwiftOverlay_SWIFTC_SOURCE_DIR}/utils/")
|
||||
set(gyb_tool "${utils_dir}/gyb")
|
||||
|
||||
# All the tidbits to track for changes
|
||||
list(APPEND GYB_DEPENDS
|
||||
"${source}"
|
||||
"${utils_dir}/GYBUnicodeDataUtils.py"
|
||||
"${utils_dir}/SwiftIntTypes.py"
|
||||
"${utils_dir}/SwiftFloatingPointTypes.py"
|
||||
"${utils_dir}/UnicodeData/GraphemeBreakProperty.txt"
|
||||
"${utils_dir}/UnicodeData/GraphemeBreakTest.txt"
|
||||
"${utils_dir}/gyb_stdlib_support.py")
|
||||
add_custom_command(
|
||||
OUTPUT "${full_output_path}"
|
||||
COMMAND "${CMAKE_COMMAND}" -E make_directory "${dir}"
|
||||
COMMAND "${CMAKE_COMMAND}" -E env "$<TARGET_FILE:Python3::Interpreter>" "${gyb_tool}" ${GYB_FLAGS} -o "${full_output_path}.tmp" "${source}"
|
||||
COMMAND "${CMAKE_COMMAND}" -E copy_if_different "${full_output_path}.tmp" "${full_output_path}"
|
||||
COMMAND "${CMAKE_COMMAND}" -E remove "${full_output_path}.tmp"
|
||||
DEPENDS ${gyb_tool} ${gyb_tool}.py ${GYB_DEPENDS} ${gyb_expand_deps}
|
||||
COMMENT "Generating GYB source ${fname} from ${source}"
|
||||
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}")
|
||||
endfunction()
|
||||
@@ -71,6 +71,51 @@ if(_output)
|
||||
"Copy ${StdlibSources}/Info.plist.in] -> Core/Info.plist.in Failed: ${_output}")
|
||||
endif()
|
||||
|
||||
# Copy Windows clang overlays
|
||||
message(STATUS "modulemap[${StdlibSources}/Windows/ucrt.modulemap] -> Overlay/Windows/clang")
|
||||
file(COPY_FILE
|
||||
"${StdlibSources}/public/Platform/ucrt.modulemap" # From
|
||||
"${CMAKE_CURRENT_LIST_DIR}/Overlay/Windows/clang/ucrt.modulemap" # To
|
||||
RESULT _output
|
||||
ONLY_IF_DIFFERENT)
|
||||
if(_output)
|
||||
message(SEND_ERROR
|
||||
"Copy ${StdlibSources}/public/Platform/ucrt.modulemap -> Overlay/Windows/clang/ucrt.modulemap Failed: ${_output}")
|
||||
endif()
|
||||
|
||||
message(STATUS "modulemap[${StdlibSources}/Windows/winsdk.modulemap] -> Overlay/Windows/clang")
|
||||
file(COPY_FILE
|
||||
"${StdlibSources}/public/Platform/winsdk.modulemap" # From
|
||||
"${CMAKE_CURRENT_LIST_DIR}/Overlay/Windows/clang/winsdk.modulemap" # To
|
||||
RESULT _output
|
||||
ONLY_IF_DIFFERENT)
|
||||
if(_output)
|
||||
message(SEND_ERROR
|
||||
"Copy ${StdlibSources}/public/Platform/winsdk.modulemap -> Overlay/Windows/clang/winsdk.modulemap Failed: ${_output}")
|
||||
endif()
|
||||
|
||||
message(STATUS "modulemap[${StdlibSources}/Windows/vcruntime.modulemap] -> Overlay/Windows/clang")
|
||||
file(COPY_FILE
|
||||
"${StdlibSources}/public/Platform/vcruntime.modulemap" # From
|
||||
"${CMAKE_CURRENT_LIST_DIR}/Overlay/Windows/clang/vcruntime.modulemap" # To
|
||||
RESULT _output
|
||||
ONLY_IF_DIFFERENT)
|
||||
if(_output)
|
||||
message(SEND_ERROR
|
||||
"Copy ${StdlibSources}/public/Platform/vcruntime.modulemap -> Overlay/Windows/clang/vcruntime.modulemap Failed: ${_output}")
|
||||
endif()
|
||||
|
||||
message(STATUS "APINotes[${StdlibSources}/Windows/vcruntime.apinotes] -> Overlay/Windows/clang")
|
||||
file(COPY_FILE
|
||||
"${StdlibSources}/public/Platform/vcruntime.apinotes" # From
|
||||
"${CMAKE_CURRENT_LIST_DIR}/Overlay/Windows/clang/vcruntime.apinotes" # To
|
||||
RESULT _output
|
||||
ONLY_IF_DIFFERENT)
|
||||
if(_output)
|
||||
message(SEND_ERROR
|
||||
"Copy ${StdlibSources}/public/Platform/vcruntime.apinotes -> Overlay/Windows/clang/vcruntime.modulemap Failed: ${_output}")
|
||||
endif()
|
||||
|
||||
set(CoreLibs
|
||||
LLVMSupport
|
||||
SwiftShims
|
||||
@@ -90,5 +135,29 @@ foreach(library ${CoreLibs})
|
||||
copy_library_sources(${library} "public" "Core")
|
||||
endforeach()
|
||||
|
||||
message(STATUS "CRT[${StdlibSources}/public/Platform] -> ${CMAKE_CURRENT_LIST_DIR}/Overlay/Windows/CRT")
|
||||
foreach(file ucrt.swift Platform.swift POSIXError.swift TiocConstants.swift tgmath.swift.gyb)
|
||||
file(COPY_FILE
|
||||
"${StdlibSources}/public/Platform/${file}"
|
||||
"${CMAKE_CURRENT_LIST_DIR}/Overlay/Windows/CRT/${file}"
|
||||
RESULT _output
|
||||
ONLY_IF_DIFFERENT)
|
||||
if(_output)
|
||||
message(SEND_ERROR
|
||||
"Copy Platform/${file} -> ${CMAKE_CURRENT_LIST_DIR}/Overlay/Windows/CRT/${file} Failed: ${_output}")
|
||||
endif()
|
||||
endforeach()
|
||||
|
||||
message(STATUS "WinSDK[${StdlibSources}/public/Windows] -> ${CMAKE_CURRENT_LIST_DIR}/Overlay/Windows/WinSDK")
|
||||
file(COPY_FILE
|
||||
"${StdlibSources}/public/Windows/WinSDK.swift"
|
||||
"${CMAKE_CURRENT_LIST_DIR}/Overlay/Windows/WinSDK/WinSDK.swift"
|
||||
RESULT _output
|
||||
ONLY_IF_DIFFERENT)
|
||||
if(_output)
|
||||
message(SEND_ERROR
|
||||
"Copy Windows/WinSDK.swift -> ${CMAKE_CURRENT_LIST_DIR}/Overlay/Windows/WinSDK/WinSDK.swift Failed: ${_output}")
|
||||
endif()
|
||||
|
||||
# TODO: Add source directories for the platform overlays, supplemental
|
||||
# libraries, and test support libraries.
|
||||
|
||||
Reference in New Issue
Block a user