Skip to content

Commit b573555

Browse files
committed
[Threading] Fix threading package defaults.
These are better done via the SwiftConfigureSDK mechanism rather than how I was doing them previously. Additionally, I've changed the way that the swift-threading-package option works. In addition to specifying just a single package name, you can specify it as a CMake list (i.e. separate by semicolons) of colon-separated `sdk:package` pairs, e.g. `osx:darwin;linux:pthreads`. You can also override it for all SDKs and then specify for a given SDK; specifications for a particular SDK take precedence over the global override. For instance `pthreads;osx:darwin` says to use `pthreads` except on the OS X SDK where we should use `darwin`.
1 parent 3cf948b commit b573555

11 files changed

+103
-80
lines changed

CMakeLists.txt

+30-11
Original file line numberDiff line numberDiff line change
@@ -192,16 +192,6 @@ option(SWIFT_STDLIB_ENABLE_UNICODE_DATA
192192
NOTE: Disabling this will cause many String methods to crash."
193193
TRUE)
194194

195-
include(Threading)
196-
197-
threading_package_default("${SWIFT_HOST_VARIANT_SDK}"
198-
SWIFT_THREADING_PACKAGE_default)
199-
200-
set(SWIFT_THREADING_PACKAGE "${SWIFT_THREADING_PACKAGE_default}"
201-
CACHE STRING
202-
"The threading package to use. Must be one of 'none', 'pthreads',
203-
'darwin', 'linux', 'win32', 'c11'.")
204-
205195
option(SWIFT_BUILD_DYNAMIC_SDK_OVERLAY
206196
"Build dynamic variants of the Swift SDK overlay"
207197
TRUE)
@@ -589,6 +579,12 @@ cmake_dependent_option(SWIFT_ENABLE_SOURCEKIT_TESTS
589579
"Enable running SourceKit tests" TRUE
590580
"SWIFT_BUILD_SOURCEKIT" FALSE)
591581

582+
option(SWIFT_THREADING_PACKAGE
583+
"Override the threading package used for the build. This can either be a
584+
single package name, or a semicolon separated sequence of sdk:package pairs.
585+
Valid package names are 'pthreads', 'darwin', 'linux', 'win32', 'c11', 'none'
586+
or the empty string for the SDK default.")
587+
592588
#
593589
# End of user-configurable options.
594590
#
@@ -820,6 +816,30 @@ if("${CMAKE_C_COMPILER_ID}" STREQUAL "MSVC" OR "${CMAKE_CXX_SIMULATE_ID}" STREQU
820816
set(SWIFT_COMPILER_IS_MSVC_LIKE TRUE)
821817
endif()
822818

819+
#
820+
# Display a message if the threading package has been overridden
821+
#
822+
823+
if(SWIFT_THREADING_PACKAGE)
824+
message(STATUS "")
825+
message(STATUS "Threading package override enabled")
826+
foreach(elt ${SWIFT_THREADING_PACKAGE})
827+
string(REPLACE ":" ";" elt_list "${elt}")
828+
list(LENGTH elt_list elt_list_len)
829+
if(elt_list_len EQUAL 1)
830+
set(elt_sdk "Global")
831+
list(GET elt_list 0 elt_package)
832+
else()
833+
list(GET elt_list 0 elt_sdk)
834+
list(GET elt_list 1 elt_package)
835+
string(TOUPPER "${elt_sdk}" elt_sdk)
836+
endif()
837+
string(TOLOWER "${elt_package}" elt_package)
838+
message(STATUS " ${elt_sdk}: ${elt_package}")
839+
endforeach()
840+
message(STATUS "")
841+
endif()
842+
823843
#
824844
# Configure SDKs.
825845
#
@@ -1054,7 +1074,6 @@ if(SWIFT_BUILD_STDLIB OR SWIFT_BUILD_SDK_OVERLAY)
10541074
message(STATUS " Leak Detection Checker Entrypoints: ${SWIFT_RUNTIME_ENABLE_LEAK_CHECKER}")
10551075
message(STATUS "")
10561076

1057-
message(STATUS "Threading Package: ${SWIFT_THREADING_PACKAGE}")
10581077
message(STATUS "Differentiable Programming Support: ${SWIFT_ENABLE_EXPERIMENTAL_DIFFERENTIABLE_PROGRAMMING}")
10591078
message(STATUS "Concurrency Support: ${SWIFT_ENABLE_EXPERIMENTAL_CONCURRENCY}")
10601079
message(STATUS "Distributed Support: ${SWIFT_ENABLE_EXPERIMENTAL_DISTRIBUTED}")

cmake/modules/AddSwift.cmake

+1-2
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ include(SwiftXcodeSupport)
44
include(SwiftWindowsSupport)
55
include(SwiftAndroidSupport)
66
include(SwiftCXXUtils)
7-
include(Threading)
87

98
function(_swift_gyb_target_sources target scope)
109
file(GLOB GYB_UNICODE_DATA ${SWIFT_SOURCE_DIR}/utils/UnicodeData/*)
@@ -309,7 +308,7 @@ function(_add_host_variant_c_compile_flags target)
309308
$<$<COMPILE_LANGUAGE:C,CXX,OBJC,OBJCXX>:SWIFT_ENABLE_RUNTIME_FUNCTION_COUNTERS>)
310309
endif()
311310

312-
threading_package_name("${SWIFT_HOST_VARIANT_SDK}" _threading_package)
311+
string(TOUPPER "${SWIFT_SDK_${SWIFT_HOST_VARIANT_SDK}_THREADING_PACKAGE}" _threading_package)
313312
target_compile_definitions(${target} PRIVATE
314313
"SWIFT_THREADING_${_threading_package}")
315314

cmake/modules/AddSwiftUnittests.cmake

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11

22
include(AddSwift)
3-
include(Threading)
43

54
add_custom_target(SwiftUnitTests)
65

@@ -54,7 +53,8 @@ function(add_swift_unittest test_dirname)
5453
target_compile_definitions("${test_dirname}" PRIVATE
5554
SWIFT_STDLIB_SINGLE_THREADED_CONCURRENCY)
5655
endif()
57-
threading_package_name("${SWIFT_HOST_VARIANT_SDK}" _threading_package)
56+
57+
string(TOUPPER "${SWIFT_SDK_${SWIFT_HOST_VARIANT_SDK}_THREADING_PACKAGE}" _threading_package)
5858
target_compile_definitions("${test_dirname}" PRIVATE
5959
"SWIFT_THREADING_${_threading_package}")
6060

cmake/modules/SwiftConfigureSDK.cmake

+41
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ function(_report_sdk prefix)
1313
message(STATUS "${SWIFT_SDK_${prefix}_NAME} SDK:")
1414
message(STATUS " Object File Format: ${SWIFT_SDK_${prefix}_OBJECT_FORMAT}")
1515
message(STATUS " Swift Standard Library Path: ${SWIFT_SDK_${prefix}_LIB_SUBDIR}")
16+
message(STATUS " Threading Package: ${SWIFT_SDK_${prefix}_THREADING_PACKAGE}")
1617

1718
if("${prefix}" STREQUAL "WINDOWS")
1819
message(STATUS " UCRT Version: ${UCRTVersion}")
@@ -101,6 +102,34 @@ function(remove_sdk_unsupported_archs name os sdk_path architectures_var)
101102
set("${architectures_var}" ${architectures} PARENT_SCOPE)
102103
endfunction()
103104

105+
# Work out which threading package to use by consulting SWIFT_THREADING_PACKAGE
106+
function(find_threading_package sdk default package_var)
107+
set(global_override)
108+
foreach(elt ${SWIFT_THREADING_PACKAGE})
109+
string(REPLACE ":" ";" elt_list "${elt}")
110+
list(LENGTH elt_list elt_list_len)
111+
if(elt_list_len EQUAL 1)
112+
list(GET elt_list 0 global_override)
113+
string(TOLOWER "${global_override}" global_override)
114+
else()
115+
list(GET elt_list 0 elt_sdk)
116+
list(GET elt_list 1 elt_package)
117+
string(TOUPPER "${elt_sdk}" elt_sdk)
118+
string(TOLOWER "${elt_package}" elt_package)
119+
120+
if("${elt_sdk}" STREQUAL "${sdk}")
121+
set("${package_var}" "${elt_package}" PARENT_SCOPE)
122+
return()
123+
endif()
124+
endif()
125+
endforeach()
126+
if(global_override)
127+
set("${package_var}" "${global_override}" PARENT_SCOPE)
128+
else()
129+
set("${package_var}" "${default}" PARENT_SCOPE)
130+
endif()
131+
endfunction()
132+
104133
# Configure an SDK
105134
#
106135
# Usage:
@@ -179,6 +208,7 @@ macro(configure_sdk_darwin
179208
set(SWIFT_SDK_${prefix}_STATIC_LIBRARY_SUFFIX ".a")
180209
set(SWIFT_SDK_${prefix}_IMPORT_LIBRARY_PREFIX "")
181210
set(SWIFT_SDK_${prefix}_IMPORT_LIBRARY_SUFFIX "")
211+
find_threading_package(${prefix} "darwin" SWIFT_SDK_${prefix}_THREADING_PACKAGE)
182212

183213
set(SWIFT_SDK_${prefix}_ARCHITECTURES ${architectures})
184214
if(SWIFT_DARWIN_SUPPORTED_ARCHS)
@@ -297,6 +327,15 @@ macro(configure_sdk_unix name architectures)
297327
-Xcc --gcc-toolchain=/usr
298328
CACHE STRING "Extra flags for compiling the C++ overlay")
299329

330+
set(_default_threading_package "pthreads")
331+
if("${prefix}" STREQUAL "LINUX")
332+
set(_default_threading_package "linux")
333+
elseif("${prefix}" STREQUAL "WASI")
334+
set(_default_threading_package "none")
335+
endif()
336+
find_threading_package(${prefix} ${_default_threading_package}
337+
SWIFT_SDK_${prefix}_THREADING_PACKAGE)
338+
300339
foreach(arch ${architectures})
301340
if("${prefix}" STREQUAL "ANDROID")
302341
swift_android_sysroot(android_sysroot)
@@ -423,6 +462,7 @@ macro(configure_sdk_windows name environment architectures)
423462
set(SWIFT_SDK_${prefix}_STATIC_LIBRARY_SUFFIX ".lib")
424463
set(SWIFT_SDK_${prefix}_IMPORT_LIBRARY_PREFIX "")
425464
set(SWIFT_SDK_${prefix}_IMPORT_LIBRARY_SUFFIX ".lib")
465+
find_threading_package(${prefix} "win32" SWIFT_SDK_${prefix}_THREADING_PACKAGE)
426466

427467
foreach(arch ${architectures})
428468
if(arch STREQUAL armv7)
@@ -489,5 +529,6 @@ function(configure_target_variant prefix name sdk build_config lib_subdir)
489529
set(SWIFT_VARIANT_${prefix}_STATIC_LIBRARY_SUFFIX ${SWIFT_SDK_${sdk}_STATIC_LIBRARY_SUFFIX})
490530
set(SWIFT_VARIANT_${prefix}_IMPORT_LIBRARY_PREFIX ${SWIFT_SDK_${sdk}_IMPORT_LIBRARY_PREFIX})
491531
set(SWIFT_VARIANT_${prefix}_IMPORT_LIBRARY_SUFFIX ${SWIFT_SDK_${sdk}_IMPORT_LIBRARY_SUFFIX})
532+
find_threading_package(${prefix} ${SWIFT_SDK_${sdk}_THREADING_PACKAGE} SWIFT_VARIANT_${prefix}_THREADING_PACKAGE)
492533
endfunction()
493534

cmake/modules/Threading.cmake

-29
This file was deleted.

stdlib/cmake/modules/AddSwiftStdlib.cmake

+1-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11

22
include(AddSwift)
33
include(SwiftSource)
4-
include(Threading)
54

65
function(add_dependencies_multiple_targets)
76
cmake_parse_arguments(
@@ -355,7 +354,7 @@ function(_add_target_variant_c_compile_flags)
355354
list(APPEND result "-DSWIFT_STDLIB_SINGLE_THREADED_CONCURRENCY")
356355
endif()
357356

358-
threading_package_name("${CFLAGS_SDK}" _threading_package)
357+
string(TOUPPER "${SWIFT_SDK_${CFLAGS_SDK}_THREADING_PACKAGE}" _threading_package)
359358
list(APPEND result "-DSWIFT_THREADING_${_threading_package}")
360359

361360
if(SWIFT_STDLIB_OS_VERSIONING)

stdlib/cmake/modules/StdlibOptions.cmake

-11
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
include_guard(GLOBAL)
22

33
include(${CMAKE_CURRENT_LIST_DIR}/../../../cmake/modules/SwiftUtils.cmake)
4-
include(${CMAKE_CURRENT_LIST_DIR}/../../../cmake/modules/Threading.cmake)
54

65
precondition(SWIFT_HOST_VARIANT_SDK)
76
precondition(SWIFT_DARWIN_PLATFORMS)
@@ -191,16 +190,6 @@ else()
191190
set(SWIFT_CONCURRENCY_GLOBAL_EXECUTOR_default "dispatch")
192191
endif()
193192

194-
include(Threading)
195-
196-
threading_package_default("${SWIFT_HOST_VARIANT_SDK}"
197-
SWIFT_THREADING_PACKAGE_default)
198-
199-
set(SWIFT_THREADING_PACKAGE "${SWIFT_THREADING_PACKAGE_default}"
200-
CACHE STRING
201-
"The threading package to use. Must be one of 'none', 'pthreads',
202-
'darwin', 'linux', 'win32', 'c11'.")
203-
204193
set(SWIFT_CONCURRENCY_GLOBAL_EXECUTOR
205194
"${SWIFT_CONCURRENCY_GLOBAL_EXECUTOR_default}" CACHE STRING
206195
"Build the concurrency library to use the given global executor (options: dispatch, singlethreaded, hooked)")

stdlib/cmake/modules/SwiftSource.cmake

+2-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
include(macCatalystUtils)
22
include(SwiftUtils)
3-
include(Threading)
43

54
function(_compute_lto_swift_flag option out_var)
65
string(TOLOWER "${option}" lowercase_option)
@@ -327,7 +326,7 @@ function(_add_target_variant_swift_compile_flags
327326
list(APPEND result "-D" "SWIFT_STDLIB_SINGLE_THREADED_CONCURRENCY")
328327
endif()
329328

330-
threading_package_name("${sdk}" _threading_package)
329+
string(TOUPPER "${SWIFT_SDK_${sdk}_THREADING_PACKAGE}" _threading_package)
331330
list(APPEND result "-D" "SWIFT_THREADING_${_threading_package}")
332331

333332
set("${result_var_name}" "${result}" PARENT_SCOPE)
@@ -483,7 +482,7 @@ function(_compile_swift_files
483482
list(APPEND swift_flags "-Xfrontend" "-library-level" "-Xfrontend" "api")
484483
endif()
485484

486-
if(SWIFT_THREADING_PACKAGE STREQUAL "none")
485+
if("${SWIFT_SDK_${SWIFTFILE_SDK}_THREADING_PACKAGE}" STREQUAL "none")
487486
list(APPEND swift_flags "-Xfrontend" "-assume-single-threaded")
488487
endif()
489488

test/CMakeLists.txt

+1-9
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules")
22

33
include(SwiftTestUtils)
4-
include(Threading)
54

65
function(swift_configure_lit_site_cfg source_path destination_path installed_name)
76
if (CMAKE_CFG_INTDIR STREQUAL ".")
@@ -395,14 +394,7 @@ foreach(SDK ${SWIFT_SDKS})
395394
list(APPEND LIT_ARGS "--param" "string_processing")
396395
endif()
397396

398-
if("${SWIFT_SDK_${SDK}_THREADING_PACKAGE}")
399-
list(APPEND LIT_ARGS "--param" "threading=${SWIFT_SDK_${SDK}_THREADING_PACKAGE}")
400-
else()
401-
threading_package_default("${SDK}" SWIFT_THREADING_PACKAGE)
402-
list(APPEND LIT_ARGS "--param"
403-
"threading=${SWIFT_THREADING_PACKAGE}")
404-
endif()
405-
397+
list(APPEND LIT_ARGS "--param" "threading=${SWIFT_SDK_${SDK}_THREADING_PACKAGE}")
406398
foreach(test_subset ${TEST_SUBSETS})
407399
set(directories)
408400
set(dependencies ${test_dependencies})

test/lit.site.cfg.in

-5
Original file line numberDiff line numberDiff line change
@@ -99,11 +99,6 @@ if "@SWIFT_OPTIMIZED@" == "TRUE":
9999
if "@SWIFT_STDLIB_SINGLE_THREADED_CONCURRENCY@" == "TRUE":
100100
config.available_features.add("single_threaded_concurrency")
101101

102-
if "@SWIFT_THREADING_PACKAGE@" != "none":
103-
# This is not called "threading" because we might want that later
104-
config.available_features.add("thread_safe_runtime")
105-
config.available_features.add("threading_@SWIFT_THREADING_PACKAGE@")
106-
107102
if "@SWIFT_ENABLE_REFLECTION@" == "TRUE":
108103
config.available_features.add("reflection")
109104

utils/build-script-impl

+25-6
Original file line numberDiff line numberDiff line change
@@ -206,7 +206,7 @@ KNOWN_SETTINGS=(
206206
swift-stdlib-has-dladdr "1" "whether to build stdlib assuming the runtime environment provides dladdr API"
207207
swift-stdlib-supports-backtrace-reporting "" "whether to build stdlib assuming the runtime environment provides the backtrace(3) API, if not set defaults to true on all platforms except for Cygwin, Haiku and wasm"
208208
swift-runtime-static-image-inspection "0" "whether to build stdlib assuming the runtime environment only supports a single runtime image with Swift code"
209-
swift-threading-package "" "which threading package to use for Swift; valid values are empty string (default based on platform), 'pthreads', 'darwin', 'linux', 'win32', 'c11', 'none'"
209+
swift-threading-package "" "override the threading package for the host build; this is either a single package or a semicolon-separated list of sdk:package pairs. Valid packages are empty string (no override), 'pthreads', 'darwin', 'linux', 'win32', 'c11', 'none'"
210210
swift-stdlib-single-threaded-concurrency "0" "build Swift concurrency in single-threaded mode"
211211
swift-stdlib-concurrency-tracing "" "whether to enable tracing signposts for concurrency; default is 1 on Darwin platforms, 0 otherwise"
212212
swift-stdlib-os-versioning "1" "whether to build stdlib with availability based on OS versions (Darwin only)"
@@ -2227,15 +2227,34 @@ for host in "${ALL_HOSTS[@]}"; do
22272227
)
22282228
fi
22292229

2230-
if [[ "${SWIFT_THREADING_PACKAGE}" ]] ; then
2231-
case "${SWIFT_THREADING_PACKAGE}" in
2230+
# SWIFT_THREADING_PACKAGE can be:
2231+
#
2232+
# - Empty
2233+
# - A single package name
2234+
# - A semicolon separated sequence of sdk:package pairs
2235+
#
2236+
OFS=$IFS
2237+
IFS=';'
2238+
for elt in $SWIFT_THREADING_PACKAGE; do
2239+
if [[ $elt == *:* ]]; then
2240+
sdk=${elt/:*/}
2241+
package=${elt/*:/}
2242+
else
2243+
sdk='<any>'
2244+
package=$elt
2245+
fi
2246+
2247+
case $package in
22322248
"" | pthreads | darwin | linux | win32 | c11 | none) ;;
22332249
*)
2234-
echo "build-script: unknown threading package ${SWIFT_THREADING_PACKAGE}; must be one of 'pthreads', 'darwin', 'linux', 'win32', 'c11', 'none', or empty for platform default" >&2
2235-
exit 1
2236-
;;
2250+
echo "build-script: unknown threading package $package for sdk $sdk; must be one of 'pthreads', 'darwin', 'linux', 'win32', 'c11', 'none', or empty for sdk default"
2251+
exit 1
2252+
;;
22372253
esac
2254+
done
2255+
IFS=$OFS
22382256

2257+
if [[ "$SWIFT_THREADING_PACKAGE" ]] ; then
22392258
cmake_options=(
22402259
"${cmake_options[@]}"
22412260
-DSWIFT_THREADING_PACKAGE:STRING="${SWIFT_THREADING_PACKAGE}"

0 commit comments

Comments
 (0)