Skip to content

Commit a2dcc71

Browse files
authored
Merge pull request #84737 from etcwilde/ewilde/runtimes-linux-glibc-overlay
CMake: Glibc Overlay
2 parents 8c760c2 + 44830d7 commit a2dcc71

File tree

6 files changed

+141
-40
lines changed

6 files changed

+141
-40
lines changed

Runtimes/Core/cmake/modules/PlatformInfo.cmake

Lines changed: 38 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -43,47 +43,49 @@ if(NOT SwiftCore_ARCH_SUBDIR)
4343
message(CONFIGURE_LOG "Swift Arch: ${arch}")
4444
endif()
4545

46-
# Note: *moduleTriple* doesn't have an "x" on the end of "macos"; just to be
47-
# safe, we support both cases here.
48-
set(availability_platform_macos "macOS")
49-
set(availaiblity_platform_macosx "macOS")
50-
set(availability_platform_ios "iOS")
51-
set(availability_platform_watchos "watchOS")
52-
set(availability_platform_tvos "tvOS")
53-
set(availability_platform_xros "visionOS")
54-
set(availability_platform_bridgeos "bridgeOS")
46+
if(APPLE)
47+
# Note: *moduleTriple* doesn't have an "x" on the end of "macos"; just to be
48+
# safe, we support both cases here.
49+
set(availability_platform_macos "macOS")
50+
set(availaiblity_platform_macosx "macOS")
51+
set(availability_platform_ios "iOS")
52+
set(availability_platform_watchos "watchOS")
53+
set(availability_platform_tvos "tvOS")
54+
set(availability_platform_xros "visionOS")
55+
set(availability_platform_bridgeos "bridgeOS")
5556

56-
if(NOT SwiftCore_SWIFT_AVAILABILITY_PLATFORM)
57-
if(SwiftCore_MODULE_TRIPLE MATCHES ".*-([^-]+)-simulator$")
58-
set(platform "${CMAKE_MATCH_1}")
59-
elseif(SwiftCore_MODULE_TRIPLE MATCHES ".*-([^-]+)-msvc$")
60-
set(platform "${CMAKE_MATCH_1}")
61-
elseif(SwiftCore_MODULE_TRIPLE MATCHES ".*-([^-]+)$")
62-
set(platform "${CMAKE_MATCH_1}")
63-
else()
64-
message(WARNING "Unable to extract platform name from triple ${SwiftCore_MODULE_TRIPLE}")
65-
endif()
57+
if(NOT SwiftCore_SWIFT_AVAILABILITY_PLATFORM)
58+
if(SwiftCore_MODULE_TRIPLE MATCHES ".*-([^-]+)-simulator$")
59+
set(platform "${CMAKE_MATCH_1}")
60+
elseif(SwiftCore_MODULE_TRIPLE MATCHES ".*-([^-]+)-msvc$")
61+
set(platform "${CMAKE_MATCH_1}")
62+
elseif(SwiftCore_MODULE_TRIPLE MATCHES ".*-([^-]+)$")
63+
set(platform "${CMAKE_MATCH_1}")
64+
else()
65+
message(WARNING "Unable to extract platform name from triple ${SwiftCore_MODULE_TRIPLE}")
66+
endif()
6667

67-
if(availability_platform_${platform})
68-
set(SwiftCore_SWIFT_AVAILABILITY_PLATFORM "${availability_platform_${platform}}")
69-
else()
70-
set(SwiftCore_SWIFT_AVAILABILITY_PLATFORM "unknown")
71-
message(WARNING "Unknown platform ${platform} for availability")
68+
if(availability_platform_${platform})
69+
set(SwiftCore_SWIFT_AVAILABILITY_PLATFORM "${availability_platform_${platform}}")
70+
else()
71+
set(SwiftCore_SWIFT_AVAILABILITY_PLATFORM "unknown")
72+
message(WARNING "Unknown platform ${platform} for availability")
73+
endif()
7274
endif()
73-
endif()
7475

75-
set(SwiftCore_VARIANT_AVAILABILITY_PLATFORM "none")
76-
if(SwiftCore_VARIANT_MODULE_TRIPLE)
77-
if(SwiftCore_VARIANT_MODULE_TRIPLE MATCHES ".*-([^-]+)$")
78-
set(platform "${CMAKE_MATCH_1}")
79-
else()
80-
message(FATAL_ERROR "Unable to extract platform name from triple ${SwiftCore_VARIANT_MODULE_TRIPLE}")
81-
endif()
76+
set(SwiftCore_VARIANT_AVAILABILITY_PLATFORM "none")
77+
if(SwiftCore_VARIANT_MODULE_TRIPLE)
78+
if(SwiftCore_VARIANT_MODULE_TRIPLE MATCHES ".*-([^-]+)$")
79+
set(platform "${CMAKE_MATCH_1}")
80+
else()
81+
message(FATAL_ERROR "Unable to extract platform name from triple ${SwiftCore_VARIANT_MODULE_TRIPLE}")
82+
endif()
8283

83-
if(availability_platform_${platform})
84-
set(SwiftCore_VARIANT_AVAILABILITY_PLATFORM "${availability_platform_${platform}}")
85-
else()
86-
message(WARNING "Unknown platform ${platform} for variant availability")
84+
if(availability_platform_${platform})
85+
set(SwiftCore_VARIANT_AVAILABILITY_PLATFORM "${availability_platform_${platform}}")
86+
else()
87+
message(WARNING "Unknown platform ${platform} for variant availability")
88+
endif()
8789
endif()
8890
endif()
8991

Runtimes/Overlay/CMakeLists.txt

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,6 @@ add_compile_definitions(
6464
$<$<BOOL:${SwiftOverlay_ENABLE_BACKDEPLOYMENT_SUPPORT}>:SWIFT_STDLIB_SUPPORT_BACK_DEPLOYMENT>)
6565

6666
add_compile_options(
67-
$<$<COMPILE_LANGUAGE:Swift>:-explicit-module-build>
6867
$<$<COMPILE_LANGUAGE:Swift>:-nostdlibimport>
6968
$<$<COMPILE_LANGUAGE:Swift>:-strict-memory-safety>
7069
"$<$<COMPILE_LANGUAGE:Swift>:SHELL:-Xfrontend -enable-lexical-lifetimes=false>"
@@ -90,12 +89,20 @@ add_link_options($<$<PLATFORM_ID:Android,Linux>:LINKER:-z,defs>)
9089

9190
include(ExperimentalFeatures)
9291

92+
if(NOT LINUX)
93+
# explicit module builds crash the Swift compiler when building the Glibc
94+
# platform overlay https://github.com/swiftlang/swift/issues/84740
95+
add_compile_options($<$<COMPILE_LANGUAGE:Swift>:-explicit-module-build>)
96+
endif()
97+
9398
add_subdirectory(clang)
9499
if(ANDROID)
95100
add_subdirectory(Android)
96-
endif()
97-
if(WIN32)
101+
elseif(WIN32)
98102
add_subdirectory(Windows)
103+
elseif(LINUX)
104+
defaulted_set(SwiftOverlay_LINUX_LIBC STRING "Select Linux libc flavor. Options are: glibc")
105+
add_subdirectory("Linux/${SwiftOverlay_LINUX_LIBC}")
99106
endif()
100107

101108
if(SwiftOverlay_ENABLE_CXX_INTEROP)
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
add_subdirectory(clang)
2+
3+
gyb_expand(Glibc.swift.gyb Glibc.swift)
4+
gyb_expand(tgmath.swift.gyb tgmath.swift)
5+
6+
add_library(swiftGlibc
7+
Glibc.swift
8+
POSIXError.swift
9+
Platform.swift
10+
TiocConstants.swift
11+
tgmath.swift)
12+
13+
target_link_libraries(swiftGlibc
14+
PRIVATE
15+
swiftCore
16+
SwiftGlibcClangOverlay)
17+
18+
set_target_properties(swiftGlibc PROPERTIES
19+
Swift_MODULE_NAME Glibc)
20+
21+
target_compile_options(swiftGlibc PRIVATE
22+
"SHELL:-Xcc -fno-omit-frame-pointer"
23+
"SHELL:-Xfrontend -empty-abi-descriptor"
24+
"SHELL:-Xfrontend -prespecialize-generic-metadata"
25+
"SHELL:-Xfrontend -require-explicit-availability=ignore"
26+
"SHELL:-library-level api")
27+
28+
install(TARGETS swiftGlibc
29+
EXPORT SwiftOverlayTargets
30+
ARCHIVE DESTINATION "${SwiftOverlay_INSTALL_LIBDIR}"
31+
LIBRARY DESTINATION "${SwiftOverlay_INSTALL_LIBDIR}"
32+
RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}")
33+
emit_swift_interface(swiftGlibc)
34+
install_swift_interface(swiftGlibc)
35+
embed_manifest(swiftGlibc)
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
gyb_expand(glibc.modulemap.gyb glibc.modulemap
2+
FLAGS -DCMAKE_SDK="LINUX")
3+
gyb_expand(SwiftGlibc.h.gyb SwiftGlibc.h)
4+
5+
file(CONFIGURE
6+
OUTPUT glibc-overlay.yml
7+
CONTENT [==[
8+
---
9+
version: 0
10+
case-sensitive: false
11+
use-external-names: false
12+
roots:
13+
- name: "/usr/include"
14+
type: directory
15+
contents:
16+
- name: module.modulemap
17+
type: file
18+
external-contents: "@CMAKE_CURRENT_BINARY_DIR@/glibc.modulemap"
19+
- name: SwiftGlibc.h
20+
type: file
21+
external-contents: "@CMAKE_CURRENT_BINARY_DIR@/SwiftGlibc.h"
22+
]==]
23+
ESCAPE_QUOTES @ONLY NEWLINE_STYLE LF)
24+
25+
add_library(SwiftGlibcClangOverlay INTERFACE
26+
SwiftGlibc.h
27+
glibc.modulemap)
28+
target_compile_options(SwiftGlibcClangOverlay INTERFACE
29+
"$<BUILD_INTERFACE:$<$<COMPILE_LANGUAGE:Swift>:SHELL:-vfsoverlay ${CMAKE_CURRENT_BINARY_DIR}/glibc-overlay.yml>>")
30+
31+
install(
32+
FILES
33+
"${CMAKE_CURRENT_BINARY_DIR}/glibc.modulemap"
34+
"${CMAKE_CURRENT_BINARY_DIR}/SwiftGlibc.h"
35+
DESTINATION
36+
"${CMAKE_INSTALL_LIBDIR}/swift/${SwiftOverlay_PLATFORM_SUBDIR}/${SwiftOverlay_ARCH_SUBDIR}")

Runtimes/Overlay/cmake/modules/DefaultSettings.cmake

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,14 @@ if(APPLE)
3030
elseif(CMAKE_SYSTEM_NAME STREQUAL "WASM")
3131
set(SwiftOverlay_ENABLE_REFLECTION_default OFF)
3232
set(SwiftOverlay_ENABLE_CXX_INTEROP_default OFF)
33-
elseif(LINUX OR ANDROID OR BSD)
33+
elseif(ANDROID OR BSD)
3434
set(SwiftOverlay_ENABLE_REFLECTION_default OFF)
3535
set(SwiftOverlay_ENABLE_CXX_INTEROP_default OFF)
36+
elseif(LINUX)
37+
# TODO: Enable once we have them building
38+
set(SwiftOverlay_ENABLE_REFLECTION_default OFF)
39+
set(SwiftOverlay_ENABLE_CXX_INTEROP_default OFF)
40+
set(SwiftOverlay_LINUX_LIBC_default "glibc")
3641
elseif(WIN32)
3742
set(SwiftOverlay_ENABLE_REFLECTION_default ON)
3843
set(SwiftOverlay_ENABLE_CXX_INTEROP_default OFF)

Runtimes/Resync.cmake

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,22 @@ copy_files(public/Platform Overlay/Android/Math
155155
FILES
156156
Math.swift)
157157

158+
# Linux Glibc Overlay
159+
message(STATUS "Glibc modulemaps[${StdlibSources}/Platform] -> ${CMAKE_CURRENT_LIST_DIR}/Overlay/Linux/glibc/clang")
160+
copy_files(public/Platform Overlay/Linux/glibc/clang
161+
FILES
162+
glibc.modulemap.gyb
163+
SwiftGlibc.h.gyb)
164+
165+
message(STATUS "Glibc [${StdlibSources}/Platform] -> ${CMAKE_CURRENT_LIST_DIR}/Overlay/Linux/glibc")
166+
copy_files(public/Platform Overlay/Linux/glibc
167+
FILES
168+
Glibc.swift.gyb
169+
POSIXError.swift
170+
Platform.swift
171+
TiocConstants.swift
172+
tgmath.swift.gyb)
173+
158174
# Windows Overlay
159175
message(STATUS "WinSDK[${StdlibSources}/public/Windows] -> ${CMAKE_CURRENT_LIST_DIR}/Overlay/Windows/WinSDK")
160176
copy_files(public/Windows Overlay/Windows/WinSDK FILES WinSDK.swift)

0 commit comments

Comments
 (0)