Skip to content

Commit ac6de62

Browse files
committed
Build the Dispatch overlay on Linux
This is an optional feature that is off by default, and is enabled by passing -- -build-swift-dispatch-overlay=1 to utils/build-script. The libdispatch build I was testing with was old and is missing some symbols, so perhaps some of the stuff can move out of #if protection later. There isn't much here yet, and no tests either.
1 parent 07e7be5 commit ac6de62

File tree

8 files changed

+104
-61
lines changed

8 files changed

+104
-61
lines changed

CMakeLists.txt

Lines changed: 25 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,13 @@ option(SWIFT_BUILD_STDLIB
3737
TRUE)
3838

3939
option(SWIFT_BUILD_SDK_OVERLAY
40-
"Build Swift SDK overlay"
40+
"Build Swift SDK overlay (Darwin only)"
4141
TRUE)
4242

43+
option(SWIFT_BUILD_DISPATCH_OVERLAY
44+
"Build Swift Grand Central Dispatch overlay (on Linux; on Darwin, controlled by SWIFT_BUILD_SDK_OVERLAY)"
45+
FALSE)
46+
4347
option(SWIFT_BUILD_STATIC_STDLIB
4448
"Build static variants of the Swift standard library and SDK overlay"
4549
FALSE)
@@ -573,11 +577,19 @@ message(STATUS " Build type: ${CMAKE_BUILD_TYPE}")
573577
message(STATUS " Assertions: ${LLVM_ENABLE_ASSERTIONS}")
574578
message(STATUS "")
575579

576-
message(STATUS "Building Swift standard library and SDK overlays for SDKs: ${SWIFT_SDKS}")
580+
message(STATUS "Building Swift standard library for SDKs: ${SWIFT_SDKS}")
577581
message(STATUS " Build type: ${SWIFT_STDLIB_BUILD_TYPE}")
578582
message(STATUS " Assertions: ${SWIFT_STDLIB_ASSERTIONS}")
579583
message(STATUS "")
580584

585+
message(STATUS "Building Swift overlays for SDKs: ${SWIFT_SDKS}")
586+
if("${SWIFT_HOST_VARIANT_SDK}" STREQUAL "LINUX")
587+
message(STATUS " libdispatch overlay: ${SWIFT_BUILD_DISPATCH_OVERLAY}")
588+
else()
589+
message(STATUS " SDK overlays: ${SWIFT_BUILD_SDK_OVERLAY}")
590+
endif()
591+
message(STATUS "")
592+
581593
message(STATUS "Building Swift runtime with:")
582594
message(STATUS " Dtrace: ${SWIFT_RUNTIME_ENABLE_DTRACE}")
583595
message(STATUS " Leak Detection Checker Entrypoints: ${SWIFT_RUNTIME_ENABLE_LEAK_CHECKER}")
@@ -598,16 +610,18 @@ endif()
598610
# Set up global CMake variables for API notes.
599611
#
600612

601-
set(SWIFT_API_NOTES_PATH "${SWIFT_SOURCE_DIR}/apinotes")
602-
if(NOT EXISTS "${SWIFT_API_NOTES_PATH}/Foundation.apinotes")
603-
message(FATAL_ERROR "API notes are not available in ${SWIFT_API_NOTES_PATH}")
604-
endif()
613+
if("${CMAKE_SYSTEM_NAME}" STREQUAL "Darwin")
614+
set(SWIFT_API_NOTES_PATH "${SWIFT_SOURCE_DIR}/apinotes")
615+
if(NOT EXISTS "${SWIFT_API_NOTES_PATH}/Foundation.apinotes")
616+
message(FATAL_ERROR "API notes are not available in ${SWIFT_API_NOTES_PATH}")
617+
endif()
605618

606-
file(GLOB SWIFT_API_NOTES_INPUT_FILES "${SWIFT_API_NOTES_PATH}/*.apinotes")
607-
foreach(file ${SWIFT_API_NOTES_INPUT_FILES})
608-
get_filename_component(name "${file}" NAME_WE)
609-
list(APPEND SWIFT_API_NOTES_INPUTS ${name})
610-
endforeach()
619+
file(GLOB SWIFT_API_NOTES_INPUT_FILES "${SWIFT_API_NOTES_PATH}/*.apinotes")
620+
foreach(file ${SWIFT_API_NOTES_INPUT_FILES})
621+
get_filename_component(name "${file}" NAME_WE)
622+
list(APPEND SWIFT_API_NOTES_INPUTS ${name})
623+
endforeach()
624+
endif()
611625

612626
# Add all of the subdirectories, where we actually do work.
613627
if(SWIFT_BUILD_TOOLS)

stdlib/public/CMakeLists.txt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,14 @@ endif()
99
if(CMAKE_SYSTEM_NAME STREQUAL "Darwin")
1010
if(SWIFT_BUILD_SDK_OVERLAY)
1111
add_subdirectory(SDK)
12+
add_subdirectory(Dispatch)
1213
endif()
1314
endif()
1415

1516
if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
1617
add_subdirectory(Glibc)
18+
19+
if(SWIFT_BUILD_DISPATCH_OVERLAY)
20+
add_subdirectory(Dispatch)
21+
endif()
1722
endif()

stdlib/public/Dispatch/CMakeLists.txt

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
if("${SWIFT_HOST_VARIANT_SDK}" STREQUAL "LINUX")
2+
add_swift_library(swiftDispatch IS_SDK_OVERLAY
3+
Dispatch.cpp
4+
Dispatch.swift
5+
6+
LINK_FLAGS "-ldispatch")
7+
else()
8+
add_swift_library(swiftDispatch IS_SDK_OVERLAY
9+
Dispatch.cpp
10+
Dispatch.swift
11+
12+
SWIFT_MODULE_DEPENDS ObjectiveC)
13+
endif()

stdlib/public/SDK/Dispatch/Dispatch.mm renamed to stdlib/public/Dispatch/Dispatch.cpp

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,22 @@
1212

1313
#include <dispatch/dispatch.h>
1414

15+
#define SOURCE(t) \
16+
__attribute__((visibility("hidden"))) \
17+
extern "C" dispatch_source_type_t \
18+
_swift_dispatch_source_type_##t(void) { \
19+
return DISPATCH_SOURCE_TYPE_##t; \
20+
}
21+
22+
SOURCE(DATA_ADD)
23+
SOURCE(DATA_OR)
24+
SOURCE(READ)
25+
SOURCE(SIGNAL)
26+
SOURCE(TIMER)
27+
SOURCE(WRITE)
28+
29+
30+
#if defined(__APPLE__)
1531
__attribute__((visibility("hidden")))
1632
extern "C" dispatch_queue_attr_t
1733
_swift_dispatch_queue_concurrent(void) {
@@ -24,21 +40,9 @@
2440
return dispatch_data_empty;
2541
}
2642

27-
#define SOURCE(t) \
28-
__attribute__((visibility("hidden"))) \
29-
extern "C" dispatch_source_type_t \
30-
_swift_dispatch_source_type_##t(void) { \
31-
return DISPATCH_SOURCE_TYPE_##t; \
32-
}
33-
34-
SOURCE(DATA_ADD)
35-
SOURCE(DATA_OR)
3643
SOURCE(MACH_SEND)
3744
SOURCE(MACH_RECV)
3845
SOURCE(MEMORYPRESSURE)
3946
SOURCE(PROC)
40-
SOURCE(READ)
41-
SOURCE(SIGNAL)
42-
SOURCE(TIMER)
4347
SOURCE(VNODE)
44-
SOURCE(WRITE)
48+
#endif // defined(__APPLE__)

stdlib/public/SDK/Dispatch/Dispatch.swift renamed to stdlib/public/Dispatch/Dispatch.swift

Lines changed: 42 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ public typealias dispatch_block_t = @convention(block) () -> Void
2626
// FIXME: rdar://16851050 update API so these import better
2727
//===----------------------------------------------------------------------===//
2828

29+
#if _runtime(_ObjC)
2930
// dispatch/io.h
3031
public var DISPATCH_IO_STREAM: dispatch_io_type_t {
3132
return 0
@@ -40,6 +41,9 @@ public var DISPATCH_IO_STOP: dispatch_io_close_flags_t {
4041
public var DISPATCH_IO_STRICT_INTERVAL: dispatch_io_interval_flags_t {
4142
return 1
4243
}
44+
#endif // _runtime(_ObjC)
45+
46+
public typealias dispatch_queue_priority_t = Int
4347

4448
// dispatch/queue.h
4549
public var DISPATCH_QUEUE_SERIAL: dispatch_queue_attr_t! {
@@ -64,6 +68,7 @@ public var DISPATCH_QUEUE_PRIORITY_BACKGROUND: dispatch_queue_priority_t {
6468
return -32768
6569
}
6670

71+
#if _runtime(_ObjC)
6772
@warn_unused_result
6873
public func dispatch_get_global_queue(identifier: qos_class_t,
6974
_ flags: UInt) -> dispatch_queue_t {
@@ -107,6 +112,8 @@ public var DISPATCH_PROC_EXIT: dispatch_source_proc_flags_t {
107112
public var DISPATCH_PROC_FORK: dispatch_source_proc_flags_t { return 0x40000000 }
108113
public var DISPATCH_PROC_EXEC: dispatch_source_proc_flags_t { return 0x20000000 }
109114
public var DISPATCH_PROC_SIGNAL: dispatch_source_proc_flags_t { return 0x08000000 }
115+
116+
110117
public var DISPATCH_VNODE_DELETE: dispatch_source_vnode_flags_t { return 0x1 }
111118
public var DISPATCH_VNODE_WRITE: dispatch_source_vnode_flags_t { return 0x2 }
112119
public var DISPATCH_VNODE_EXTEND: dispatch_source_vnode_flags_t { return 0x4 }
@@ -115,37 +122,23 @@ public var DISPATCH_VNODE_LINK: dispatch_source_vnode_flags_t { return 0x10 }
115122
public var DISPATCH_VNODE_RENAME: dispatch_source_vnode_flags_t { return 0x20 }
116123
public var DISPATCH_VNODE_REVOKE: dispatch_source_vnode_flags_t { return 0x40 }
117124
public var DISPATCH_TIMER_STRICT: dispatch_source_timer_flags_t { return 1 }
125+
#endif // _runtime(_ObjC)
118126

119127
public var DISPATCH_SOURCE_TYPE_DATA_ADD: dispatch_source_type_t {
120128
return _swift_dispatch_source_type_data_add()
121129
}
122130
public var DISPATCH_SOURCE_TYPE_DATA_OR: dispatch_source_type_t {
123131
return _swift_dispatch_source_type_data_or()
124132
}
125-
public var DISPATCH_SOURCE_TYPE_MACH_SEND: dispatch_source_type_t {
126-
return _swift_dispatch_source_type_mach_send()
127-
}
128-
public var DISPATCH_SOURCE_TYPE_MACH_RECV: dispatch_source_type_t {
129-
return _swift_dispatch_source_type_mach_recv()
130-
}
131-
public var DISPATCH_SOURCE_TYPE_MEMORYPRESSURE: dispatch_source_type_t {
132-
return _swift_dispatch_source_type_memorypressure()
133-
}
134133
public var DISPATCH_SOURCE_TYPE_READ: dispatch_source_type_t {
135134
return _swift_dispatch_source_type_read()
136135
}
137-
public var DISPATCH_SOURCE_TYPE_PROC: dispatch_source_type_t {
138-
return _swift_dispatch_source_type_proc()
139-
}
140136
public var DISPATCH_SOURCE_TYPE_SIGNAL: dispatch_source_type_t {
141137
return _swift_dispatch_source_type_signal()
142138
}
143139
public var DISPATCH_SOURCE_TYPE_TIMER: dispatch_source_type_t {
144140
return _swift_dispatch_source_type_timer()
145141
}
146-
public var DISPATCH_SOURCE_TYPE_VNODE: dispatch_source_type_t {
147-
return _swift_dispatch_source_type_vnode()
148-
}
149142
public var DISPATCH_SOURCE_TYPE_WRITE: dispatch_source_type_t {
150143
return _swift_dispatch_source_type_write()
151144
}
@@ -158,6 +151,39 @@ internal func _swift_dispatch_source_type_data_add() -> dispatch_source_type_t
158151
@asmname("_swift_dispatch_source_type_DATA_OR")
159152
internal func _swift_dispatch_source_type_data_or() -> dispatch_source_type_t
160153

154+
@warn_unused_result
155+
@asmname("_swift_dispatch_source_type_READ")
156+
internal func _swift_dispatch_source_type_read() -> dispatch_source_type_t
157+
158+
@warn_unused_result
159+
@asmname("_swift_dispatch_source_type_SIGNAL")
160+
internal func _swift_dispatch_source_type_signal() -> dispatch_source_type_t
161+
162+
@warn_unused_result
163+
@asmname("_swift_dispatch_source_type_TIMER")
164+
internal func _swift_dispatch_source_type_timer() -> dispatch_source_type_t
165+
166+
@warn_unused_result
167+
@asmname("_swift_dispatch_source_type_WRITE")
168+
internal func _swift_dispatch_source_type_write() -> dispatch_source_type_t
169+
170+
#if _runtime(_ObjC)
171+
public var DISPATCH_SOURCE_TYPE_MACH_SEND: dispatch_source_type_t {
172+
return _swift_dispatch_source_type_mach_send()
173+
}
174+
public var DISPATCH_SOURCE_TYPE_MACH_RECV: dispatch_source_type_t {
175+
return _swift_dispatch_source_type_mach_recv()
176+
}
177+
public var DISPATCH_SOURCE_TYPE_MEMORYPRESSURE: dispatch_source_type_t {
178+
return _swift_dispatch_source_type_memorypressure()
179+
}
180+
public var DISPATCH_SOURCE_TYPE_PROC: dispatch_source_type_t {
181+
return _swift_dispatch_source_type_proc()
182+
}
183+
public var DISPATCH_SOURCE_TYPE_VNODE: dispatch_source_type_t {
184+
return _swift_dispatch_source_type_vnode()
185+
}
186+
161187
@warn_unused_result
162188
@asmname("_swift_dispatch_source_type_MACH_SEND")
163189
internal func _swift_dispatch_source_type_mach_send() -> dispatch_source_type_t
@@ -175,25 +201,10 @@ internal func _swift_dispatch_source_type_memorypressure()
175201
@asmname("_swift_dispatch_source_type_PROC")
176202
internal func _swift_dispatch_source_type_proc() -> dispatch_source_type_t
177203

178-
@warn_unused_result
179-
@asmname("_swift_dispatch_source_type_READ")
180-
internal func _swift_dispatch_source_type_read() -> dispatch_source_type_t
181-
182-
@warn_unused_result
183-
@asmname("_swift_dispatch_source_type_SIGNAL")
184-
internal func _swift_dispatch_source_type_signal() -> dispatch_source_type_t
185-
186-
@warn_unused_result
187-
@asmname("_swift_dispatch_source_type_TIMER")
188-
internal func _swift_dispatch_source_type_timer() -> dispatch_source_type_t
189-
190204
@warn_unused_result
191205
@asmname("_swift_dispatch_source_type_VNODE")
192206
internal func _swift_dispatch_source_type_vnode() -> dispatch_source_type_t
193-
194-
@warn_unused_result
195-
@asmname("_swift_dispatch_source_type_WRITE")
196-
internal func _swift_dispatch_source_type_write() -> dispatch_source_type_t
207+
#endif // _runtime(_ObjC)
197208

198209
// dispatch/time.h
199210
// DISPATCH_TIME_NOW: ok

stdlib/public/SDK/CMakeLists.txt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ add_subdirectory(CoreImage)
1414
add_subdirectory(CoreLocation)
1515
add_subdirectory(CoreMedia)
1616
add_subdirectory(Darwin)
17-
add_subdirectory(Dispatch)
1817
add_subdirectory(EventKit)
1918
add_subdirectory(Foundation)
2019
add_subdirectory(GameKit)

stdlib/public/SDK/Dispatch/CMakeLists.txt

Lines changed: 0 additions & 5 deletions
This file was deleted.

utils/build-script-impl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,7 @@ KNOWN_SETTINGS=(
133133
build-swift-tools "1" "set to 1 to build Swift host tools"
134134
build-swift-stdlib "1" "set to 1 to build the Swift standard library"
135135
build-swift-sdk-overlay "1" "set to 1 to build the Swift SDK overlay"
136+
build-swift-dispatch-overlay "0" "set to 1 to build the Swift libdispatch overlay on Linux"
136137
build-swift-static-stdlib "0" "set to 1 to build static versions of the Swift standard library and SDK overlay"
137138
build-swift-examples "1" "set to 1 to build examples"
138139
source-tree-includes-tests "1" "set to 0 to allow the build to proceed when 'test' directory is missing (required for B&I builds)"
@@ -1472,6 +1473,7 @@ for deployment_target in "${NATIVE_TOOLS_DEPLOYMENT_TARGETS[@]}" "${CROSS_TOOLS_
14721473
-DSWIFT_BUILD_TOOLS:BOOL=$(true_false "${BUILD_SWIFT_TOOLS}")
14731474
-DSWIFT_BUILD_STDLIB:BOOL=$(true_false "${BUILD_SWIFT_STDLIB}")
14741475
-DSWIFT_BUILD_SDK_OVERLAY:BOOL=$(true_false "${BUILD_SWIFT_SDK_OVERLAY}")
1476+
-DSWIFT_BUILD_DISPATCH_OVERLAY:BOOL=$(true_false "${BUILD_SWIFT_DISPATCH_OVERLAY}")
14751477
-DSWIFT_BUILD_STATIC_STDLIB:BOOL=$(true_false "${BUILD_SWIFT_STATIC_STDLIB}")
14761478
-DSWIFT_BUILD_EXAMPLES:BOOL=$(true_false "${BUILD_SWIFT_EXAMPLES}")
14771479
-DSWIFT_INCLUDE_TESTS:BOOL=$(true_false "${build_tests_this_time}")

0 commit comments

Comments
 (0)