mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
As of CMake 3.25, there are now global variables `LINUX=1`, `ANDROID=1`,
etc. These conflict with expressions that used these names as unquoted
strings in positions where CMake accepts 'variable|string', for example:
- `if(sdk STREQUAL LINUX)` would fail, because `LINUX` is now defined and
expands to 1, where it would previously coerce to a string.
- `if(${sdk} STREQUAL "LINUX")` would fail if `sdk=LINUX`, because the
left-hand side expands twice.
In this patch, I looked for a number of patterns to fix up, sometimes a
little defensively:
- Quoted right-hand side of `STREQUAL` where I was confident it was
intended to be a string literal.
- Removed manual variable expansion on left-hand side of `STREQUAL`,
`MATCHES` and `IN_LIST` where I was confident it was unintended.
Fixes #65028.
246 lines
8.8 KiB
CMake
246 lines
8.8 KiB
CMake
set(swift_platform_sources
|
|
Platform.swift
|
|
TiocConstants.swift)
|
|
set(swift_platform_gyb_sources
|
|
tgmath.swift.gyb)
|
|
|
|
set(darwin_depends)
|
|
if(NOT BUILD_STANDALONE)
|
|
# This is overly conservative, but we have so few API notes files that
|
|
# haven't migrated to the Swift repo that it's probably fine in practice.
|
|
list(APPEND darwin_depends copy_apinotes)
|
|
endif()
|
|
|
|
set(swift_platform_compile_flags)
|
|
if(SWIFT_ENABLE_REFLECTION)
|
|
list(APPEND swift_platform_compile_flags "-DSWIFT_ENABLE_REFLECTION")
|
|
endif()
|
|
|
|
set(swiftDarwin_target_sdks ALL_APPLE_PLATFORMS)
|
|
if(SWIFT_FREESTANDING_FLAVOR STREQUAL "apple" AND NOT SWIFT_FREESTANDING_IS_DARWIN)
|
|
set(swiftDarwin_target_sdks ALL_APPLE_PLATFORMS FREESTANDING)
|
|
endif()
|
|
|
|
set(swiftDarwin_common_options
|
|
IS_SDK_OVERLAY
|
|
${swift_platform_sources}
|
|
POSIXError.swift
|
|
MachError.swift
|
|
|
|
"${SWIFT_SOURCE_DIR}/stdlib/linker-support/magic-symbols-for-install-name.c"
|
|
|
|
GYB_SOURCES
|
|
${swift_platform_gyb_sources}
|
|
Darwin.swift.gyb
|
|
|
|
SWIFT_COMPILE_FLAGS
|
|
${SWIFT_RUNTIME_SWIFT_COMPILE_FLAGS}
|
|
${SWIFT_STANDARD_LIBRARY_SWIFT_FLAGS}
|
|
-Xfrontend -disable-objc-attr-requires-foundation-module
|
|
${swift_platform_compile_flags}
|
|
LINK_FLAGS "${SWIFT_RUNTIME_SWIFT_LINK_FLAGS}"
|
|
DEPENDS ${darwin_depends})
|
|
|
|
|
|
if(BOOTSTRAPPING_MODE STREQUAL "BOOTSTRAPPING" AND
|
|
SWIFT_HOST_VARIANT_SDK IN_LIST SWIFT_DARWIN_PLATFORMS)
|
|
|
|
set(swiftDarwin_common_bootstrapping_options
|
|
${swiftDarwin_common_options}
|
|
SHARED
|
|
IS_STDLIB
|
|
SDK ${SWIFT_HOST_VARIANT_SDK}
|
|
ARCHITECTURE ${SWIFT_HOST_VARIANT_ARCH}
|
|
INSTALL_IN_COMPONENT "never_install")
|
|
|
|
set(b0_deps swiftCore-bootstrapping0)
|
|
set(b1_deps swiftCore-bootstrapping1)
|
|
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
|
|
set(b0_deps ${b0_deps} swiftSwiftOnoneSupport-bootstrapping0)
|
|
set(b1_deps ${b1_deps} swiftSwiftOnoneSupport-bootstrapping1)
|
|
endif()
|
|
|
|
add_swift_target_library_single(swiftDarwin-bootstrapping0 swiftDarwin
|
|
${swiftDarwin_common_bootstrapping_options}
|
|
FILE_DEPENDS ${b0_deps}
|
|
BOOTSTRAPPING 0)
|
|
|
|
add_swift_target_library_single(swiftDarwin-bootstrapping1 swiftDarwin
|
|
${swiftDarwin_common_bootstrapping_options}
|
|
FILE_DEPENDS ${b1_deps}
|
|
BOOTSTRAPPING 1)
|
|
endif()
|
|
|
|
add_swift_target_library(swiftDarwin ${SWIFT_STDLIB_LIBRARY_BUILD_TYPES}
|
|
${swiftDarwin_common_options}
|
|
TARGET_SDKS "${swiftDarwin_target_sdks}"
|
|
INSTALL_IN_COMPONENT sdk-overlay
|
|
MACCATALYST_BUILD_FLAVOR "zippered")
|
|
|
|
set(swiftGlibc_target_sdks ANDROID CYGWIN FREEBSD OPENBSD LINUX HAIKU)
|
|
if(SWIFT_FREESTANDING_FLAVOR STREQUAL "linux")
|
|
set(swiftGlibc_target_sdks ANDROID CYGWIN FREEBSD OPENBSD LINUX HAIKU FREESTANDING)
|
|
endif()
|
|
add_swift_target_library(swiftGlibc ${SWIFT_STDLIB_LIBRARY_BUILD_TYPES} IS_SDK_OVERLAY
|
|
${swift_platform_sources}
|
|
POSIXError.swift
|
|
|
|
GYB_SOURCES
|
|
${swift_platform_gyb_sources}
|
|
Glibc.swift.gyb
|
|
|
|
SWIFT_COMPILE_FLAGS
|
|
${SWIFT_RUNTIME_SWIFT_COMPILE_FLAGS}
|
|
${SWIFT_STANDARD_LIBRARY_SWIFT_FLAGS}
|
|
${swift_platform_compile_flags}
|
|
LINK_FLAGS "${SWIFT_RUNTIME_SWIFT_LINK_FLAGS}"
|
|
TARGET_SDKS "${swiftGlibc_target_sdks}"
|
|
INSTALL_IN_COMPONENT sdk-overlay
|
|
DEPENDS glibc_modulemap)
|
|
|
|
add_swift_target_library(swiftMusl ${SWIFT_STDLIB_LIBRARY_BUILD_TYPES} IS_SDK_OVERLAY
|
|
${swift_platform_sources}
|
|
POSIXError.swift
|
|
|
|
GYB_SOURCES
|
|
${swift_platform_gyb_sources}
|
|
Musl.swift.gyb
|
|
|
|
SWIFT_COMPILE_FLAGS
|
|
${SWIFT_RUNTIME_SWIFT_COMPILE_FLAGS}
|
|
${SWIFT_STANDARD_LIBRARY_SWIFT_FLAGS}
|
|
${swift_platform_compile_flags}
|
|
LINK_FLAGS "${SWIFT_RUNTIME_SWIFT_LINK_FLAGS}"
|
|
TARGET_SDKS MUSL
|
|
INSTALL_IN_COMPONENT sdk-overlay)
|
|
|
|
add_swift_target_library(swiftCRT ${SWIFT_STDLIB_LIBRARY_BUILD_TYPES} IS_SDK_OVERLAY
|
|
ucrt.swift
|
|
${swift_platform_sources}
|
|
POSIXError.swift
|
|
|
|
GYB_SOURCES
|
|
${swift_platform_gyb_sources}
|
|
|
|
SWIFT_COMPILE_FLAGS
|
|
${SWIFT_RUNTIME_SWIFT_COMPILE_FLAGS}
|
|
${SWIFT_STANDARD_LIBRARY_SWIFT_FLAGS}
|
|
-Xcc -D_USE_MATH_DEFINES
|
|
${swift_platform_compile_flags}
|
|
LINK_FLAGS "${SWIFT_RUNTIME_SWIFT_LINK_FLAGS}"
|
|
TARGET_SDKS WINDOWS
|
|
INSTALL_IN_COMPONENT sdk-overlay)
|
|
|
|
set(glibc_modulemap_target_list)
|
|
foreach(sdk ${SWIFT_SDKS})
|
|
if(NOT "${sdk}" STREQUAL "LINUX" AND
|
|
NOT "${sdk}" STREQUAL "FREEBSD" AND
|
|
NOT "${sdk}" STREQUAL "OPENBSD" AND
|
|
NOT "${sdk}" STREQUAL "ANDROID" AND
|
|
NOT "${sdk}" STREQUAL "CYGWIN" AND
|
|
NOT "${sdk}" STREQUAL "HAIKU")
|
|
continue()
|
|
endif()
|
|
|
|
foreach(arch ${SWIFT_SDK_${sdk}_ARCHITECTURES})
|
|
set(arch_subdir "${SWIFT_SDK_${sdk}_LIB_SUBDIR}/${arch}")
|
|
set(module_dir "${SWIFTLIB_DIR}/${arch_subdir}")
|
|
set(module_dir_static "${SWIFTSTATICLIB_DIR}/${arch_subdir}")
|
|
|
|
set(glibc_modulemap_source "glibc.modulemap.gyb")
|
|
set(glibc_modulemap_out "${module_dir}/glibc.modulemap")
|
|
set(glibc_modulemap_out_static "${module_dir_static}/glibc.modulemap")
|
|
|
|
# Configure the module map based on the target. Each platform needs to
|
|
# reference different headers, based on what's available in their glibc.
|
|
# This is the 'glibc.modulemap' in the 'resource-dir', so
|
|
# it's the one we'll look at during the build process.
|
|
handle_gyb_source_single(glibc_modulemap_target
|
|
SOURCE "${glibc_modulemap_source}"
|
|
OUTPUT "${glibc_modulemap_out}"
|
|
FLAGS
|
|
"-DCMAKE_SDK=${sdk}")
|
|
|
|
list(APPEND glibc_modulemap_target_list ${glibc_modulemap_target})
|
|
|
|
set(glibc_header_out "${module_dir}/SwiftGlibc.h")
|
|
set(glibc_header_out_static "${module_dir_static}/SwiftGlibc.h")
|
|
handle_gyb_source_single(glibc_header_target
|
|
SOURCE "SwiftGlibc.h.gyb"
|
|
OUTPUT "${glibc_header_out}"
|
|
FLAGS "-DCMAKE_SDK=${sdk}")
|
|
list(APPEND glibc_modulemap_target_list ${glibc_header_target})
|
|
|
|
if(SWIFT_BUILD_STATIC_STDLIB)
|
|
add_custom_command_target(
|
|
copy_glibc_modulemap_header_static
|
|
COMMAND
|
|
"${CMAKE_COMMAND}" "-E" "make_directory" ${module_dir_static}
|
|
COMMAND
|
|
"${CMAKE_COMMAND}" "-E" "copy"
|
|
${glibc_modulemap_out} ${glibc_modulemap_out_static}
|
|
COMMAND
|
|
"${CMAKE_COMMAND}" "-E" "copy"
|
|
${glibc_header_out} ${glibc_header_out_static}
|
|
OUTPUT ${glibc_modulemap_out_static} ${glibc_header_out_static}
|
|
DEPENDS
|
|
"${glibc_modulemap_target}"
|
|
"${glibc_header_target}"
|
|
COMMENT "Copying Glibc modulemap and header to static resources")
|
|
|
|
list(APPEND glibc_modulemap_target_list
|
|
${copy_glibc_modulemap_header_static})
|
|
endif()
|
|
|
|
# If this SDK is a target for a non-native host, except if it's for Android
|
|
# with its own native sysroot, create a native modulemap without a sysroot
|
|
# prefix. This is the one we'll install instead.
|
|
if(NOT "${SWIFT_SDK_${SWIFT_HOST_VARIANT_SDK}_ARCH_${arch}_PATH}" STREQUAL "/" AND
|
|
NOT (sdk STREQUAL "ANDROID" AND NOT "${SWIFT_ANDROID_NATIVE_SYSROOT}" STREQUAL ""))
|
|
set(glibc_sysroot_relative_modulemap_out "${module_dir}/sysroot-relative-modulemaps/glibc.modulemap")
|
|
|
|
handle_gyb_source_single(glibc_modulemap_native_target
|
|
SOURCE "${glibc_modulemap_source}"
|
|
OUTPUT "${glibc_sysroot_relative_modulemap_out}"
|
|
FLAGS "-DCMAKE_SDK=${sdk}")
|
|
|
|
list(APPEND glibc_modulemap_target_list ${glibc_modulemap_native_target})
|
|
set(glibc_modulemap_out ${glibc_sysroot_relative_modulemap_out})
|
|
endif()
|
|
|
|
# FIXME: When SDK is a cross-compile target (SDK != Host), the generated
|
|
# modulemap will be relative to the Host, with hardcoded paths.
|
|
# It is not relocatable to the target platform itself.
|
|
# This affects any cross-compiled targets that use glibc.modulemap.
|
|
|
|
swift_install_in_component(FILES "${glibc_modulemap_out}"
|
|
DESTINATION "lib/swift/${arch_subdir}"
|
|
COMPONENT sdk-overlay)
|
|
swift_install_in_component(FILES "${glibc_header_out}"
|
|
DESTINATION "lib/swift/${arch_subdir}"
|
|
COMPONENT sdk-overlay)
|
|
|
|
if(SWIFT_BUILD_STATIC_STDLIB)
|
|
swift_install_in_component(FILES "${glibc_modulemap_out}"
|
|
DESTINATION "lib/swift_static/${arch_subdir}"
|
|
COMPONENT sdk-overlay)
|
|
swift_install_in_component(FILES "${glibc_header_out}"
|
|
DESTINATION "lib/swift_static/${arch_subdir}"
|
|
COMPONENT sdk-overlay)
|
|
endif()
|
|
endforeach()
|
|
endforeach()
|
|
add_custom_target(glibc_modulemap DEPENDS ${glibc_modulemap_target_list})
|
|
set_property(TARGET glibc_modulemap PROPERTY FOLDER "Miscellaneous")
|
|
add_dependencies(sdk-overlay glibc_modulemap)
|
|
|
|
if(WINDOWS IN_LIST SWIFT_SDKS)
|
|
swift_install_in_component(FILES
|
|
ucrt.modulemap
|
|
vcruntime.apinotes
|
|
vcruntime.modulemap
|
|
winsdk.modulemap
|
|
DESTINATION "share"
|
|
COMPONENT sdk-overlay)
|
|
endif()
|