Skip to content

Commit 8ee2fe6

Browse files
committed
[Build] Add the new fully-static Linux SDK.
Declare a new `LINUX_STATIC` SDK and configure it. Add options to set the build architectures for the `LINUX` and `LINUX_STATIC` SDKs, similar to what we have for Darwin, because we'll be cross-compiling. Also add an option to point the build system at the sources for the musl C library, which we're using for `LINUX_STATIC`. rdar://123503470
1 parent b0e936e commit 8ee2fe6

File tree

15 files changed

+294
-27
lines changed

15 files changed

+294
-27
lines changed

CMakeLists.txt

Lines changed: 38 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -477,6 +477,21 @@ set(SWIFT_MIN_RUNTIME_VERSION "${DEFAULT_SWIFT_MIN_RUNTIME_VERSION}" CACHE STRIN
477477
the compiler itself. This is used on non-Darwin platforms to ensure \
478478
that it's possible to build the compiler using host tools.")
479479

480+
#
481+
# User-configurable Linux specific options.
482+
#
483+
484+
set(SWIFT_MUSL_PATH "/usr/local/musl" CACHE STRING
485+
"Path to the directory that contains the Musl headers and libraries. \
486+
This is only required if we have been asked to build the Musl SDK, and \
487+
defaults to the default install location for Musl.")
488+
489+
set(SWIFT_SDK_LINUX_STATIC_ARCHITECTURES "" CACHE STRING
490+
"The architectures to configure when using the static Linux SDK.")
491+
492+
set(SWIFT_SDK_LINUX_ARCHITECTURES "" CACHE STRING
493+
"The architectures to configure when using the Linux SDK.")
494+
480495
#
481496
# User-configurable Android specific options.
482497
#
@@ -1059,9 +1074,25 @@ if("${SWIFT_HOST_VARIANT_SDK}" STREQUAL "LINUX")
10591074
# Should we build the standard library for the host?
10601075
is_sdk_requested(LINUX swift_build_linux)
10611076
if(swift_build_linux)
1062-
configure_sdk_unix("Linux" "${SWIFT_HOST_VARIANT_ARCH}")
1063-
set(SWIFT_PRIMARY_VARIANT_SDK_default "${SWIFT_HOST_VARIANT_SDK}")
1064-
set(SWIFT_PRIMARY_VARIANT_ARCH_default "${SWIFT_HOST_VARIANT_ARCH}")
1077+
if("${SWIFT_SDK_LINUX_ARCHITECTURES}" STREQUAL "")
1078+
set(SWIFT_SDK_LINUX_ARCHITECTURES "${SWIFT_HOST_VARIANT_ARCH}")
1079+
endif()
1080+
1081+
configure_sdk_unix("Linux" "${SWIFT_SDK_LINUX_ARCHITECTURES}")
1082+
endif()
1083+
1084+
# Should we build it for LINUX_STATIC?
1085+
is_sdk_requested(LINUX_STATIC swift_build_linux_static)
1086+
if(swift_build_linux_static)
1087+
if("${SWIFT_MUSL_PATH}" STREQUAL "")
1088+
message(FATAL_ERROR "You must set SWIFT_MUSL_PATH to point to the Musl libraries and headers. Specifically, we expect to find Musl at <SWIFT_MUSL_PATH>/<arch> for each requested architecture.")
1089+
endif()
1090+
1091+
if("${SWIFT_SDK_LINUX_STATIC_ARCHITECTURES}" STREQUAL "")
1092+
set(SWIFT_SDK_LINUX_STATIC_ARCHITECTURES "aarch64;x86_64")
1093+
endif()
1094+
1095+
configure_sdk_unix("Linux_Static" "${SWIFT_SDK_LINUX_STATIC_ARCHITECTURES}")
10651096
endif()
10661097

10671098
is_sdk_requested(FREESTANDING swift_build_freestanding)
@@ -1070,6 +1101,10 @@ if("${SWIFT_HOST_VARIANT_SDK}" STREQUAL "LINUX")
10701101
# configure_sdk_unix("FREESTANDING" "${SWIFT_HOST_VARIANT_ARCH}")
10711102
endif()
10721103

1104+
# Default is Linux SDK for host
1105+
set(SWIFT_PRIMARY_VARIANT_SDK_default "${SWIFT_HOST_VARIANT_SDK}")
1106+
set(SWIFT_PRIMARY_VARIANT_ARCH_default "${SWIFT_HOST_VARIANT_ARCH}")
1107+
10731108
elseif("${SWIFT_HOST_VARIANT_SDK}" STREQUAL "FREEBSD")
10741109

10751110
set(SWIFT_HOST_VARIANT "freebsd" CACHE STRING

cmake/modules/SwiftConfigureSDK.cmake

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -321,12 +321,20 @@ macro(configure_sdk_unix name architectures)
321321

322322
# Static linking is suported on Linux and WASI
323323
if("${prefix}" STREQUAL "LINUX"
324+
OR "${prefix}" STREQUAL "LINUX_STATIC"
324325
OR "${prefix}" STREQUAL "WASI")
325326
set(SWIFT_SDK_${prefix}_STATIC_LINKING_SUPPORTED TRUE)
326327
else()
327328
set(SWIFT_SDK_${prefix}_STATIC_LINKING_SUPPORTED FALSE)
328329
endif()
329330

331+
# For LINUX_STATIC, build static only
332+
if("${prefix}" STREQUAL "LINUX_STATIC")
333+
set(SWIFT_SDK_${prefix}_STATIC_ONLY TRUE)
334+
else()
335+
set(SWIFT_SDK_${prefix}_STATIC_ONLY FALSE)
336+
endif()
337+
330338
# GCC on Linux is usually located under `/usr`.
331339
# However, Ubuntu 20.04 ships with another GCC installation under `/`, which
332340
# does not include libstdc++. Swift build scripts pass `--sysroot=/` to
@@ -343,7 +351,7 @@ macro(configure_sdk_unix name architectures)
343351
CACHE STRING "Extra flags for compiling the C++ overlay")
344352

345353
set(_default_threading_package "pthreads")
346-
if("${prefix}" STREQUAL "LINUX")
354+
if("${prefix}" STREQUAL "LINUX" OR "${prefix}" STREQUAL "LINUX_STATIC")
347355
set(_default_threading_package "linux")
348356
elseif("${prefix}" STREQUAL "WASI")
349357
if(SWIFT_ENABLE_WASI_THREADS)
@@ -444,6 +452,9 @@ macro(configure_sdk_unix name architectures)
444452
else()
445453
set(SWIFT_SDK_WASI_ARCH_wasm32_TRIPLE "wasm32-unknown-wasi")
446454
endif()
455+
elseif("${prefix}" STREQUAL "LINUX_STATIC")
456+
set(SWIFT_SDK_LINUX_STATIC_ARCH_${arch}_TRIPLE "${arch}-swift-linux-musl")
457+
set(SWIFT_SDK_LINUX_STATIC_ARCH_${arch}_PATH "${SWIFT_MUSL_PATH}/${arch}")
447458
else()
448459
message(FATAL_ERROR "unknown Unix OS: ${prefix}")
449460
endif()

stdlib/cmake/modules/AddSwiftStdlib.cmake

Lines changed: 73 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,12 @@ function(_add_target_variant_c_compile_link_flags)
115115
list(APPEND result "--sysroot=${_sysroot}")
116116
endif()
117117

118+
if("${CFLAGS_SDK}" STREQUAL "LINUX_STATIC")
119+
list(APPEND result "-isystem" "${SWIFT_MUSL_PATH}/${CFLAGS_ARCH}/usr/include/c++/v1")
120+
list(APPEND result "-DSWIFT_LIBC_IS_MUSL")
121+
endif()
122+
123+
118124
if("${CFLAGS_SDK}" STREQUAL "ANDROID")
119125
# Make sure the Android NDK lld is used.
120126
swift_android_tools_path(${CFLAGS_ARCH} tools_path)
@@ -504,6 +510,8 @@ function(_add_target_variant_link_flags)
504510
if("${LFLAGS_ARCH}" MATCHES "armv5|armv6|armv7|i686")
505511
list(APPEND link_libraries "atomic")
506512
endif()
513+
elseif("${LFLAGS_SDK}" STREQUAL "LINUX_STATIC")
514+
list(APPEND link_libraries "pthread" "dl")
507515
elseif("${LFLAGS_SDK}" STREQUAL "FREEBSD")
508516
list(APPEND link_libraries "pthread")
509517
elseif("${LFLAGS_SDK}" STREQUAL "OPENBSD")
@@ -1336,10 +1344,14 @@ function(add_swift_target_library_single target name)
13361344
endif()
13371345

13381346
if(target_static)
1339-
_list_add_string_suffix(
1340-
"${SWIFTLIB_SINGLE_LINK_LIBRARIES}"
1341-
"-static"
1342-
target_static_depends)
1347+
set(target_static_depends)
1348+
foreach(dep ${SWIFTLIB_SINGLE_LINK_LIBRARIES})
1349+
if (NOT "${dep}" MATCHES "^(icucore|dispatch|BlocksRuntime)($|-.*)$")
1350+
list(APPEND target_static_depends "${dep}-static")
1351+
endif()
1352+
endforeach()
1353+
1354+
13431355
# FIXME: should this be target_link_libraries?
13441356
add_dependencies_multiple_targets(
13451357
TARGETS "${target_static}"
@@ -1482,6 +1494,7 @@ function(add_swift_target_library_single target name)
14821494
"SHELL:-Xclang --dependent-lib=msvcrt$<$<CONFIG:Debug>:d>")
14831495
endif()
14841496
endif()
1497+
14851498
target_compile_options(${target} PRIVATE
14861499
${c_compile_flags})
14871500
target_link_options(${target} PRIVATE
@@ -1840,6 +1853,7 @@ function(add_swift_target_library name)
18401853
SWIFT_MODULE_DEPENDS_HAIKU
18411854
SWIFT_MODULE_DEPENDS_IOS
18421855
SWIFT_MODULE_DEPENDS_LINUX
1856+
SWIFT_MODULE_DEPENDS_LINUX_STATIC
18431857
SWIFT_MODULE_DEPENDS_OSX
18441858
SWIFT_MODULE_DEPENDS_TVOS
18451859
SWIFT_MODULE_DEPENDS_WASI
@@ -1885,6 +1899,17 @@ function(add_swift_target_library name)
18851899
endif()
18861900
list_replace(SWIFTLIB_TARGET_SDKS ALL_APPLE_PLATFORMS "${SWIFT_DARWIN_PLATFORMS}")
18871901

1902+
# Support adding a "NOT" on the front to mean all SDKs except the following
1903+
list(GET SWIFTLIB_TARGET_SDKS 0 first_sdk)
1904+
if("${first_sdk}" STREQUAL "NOT")
1905+
list(REMOVE_AT SWIFTLIB_TARGET_SDKS 0)
1906+
list_subtract("${SWIFT_SDKS}" "${SWIFTLIB_TARGET_SDKS}"
1907+
"SWIFTLIB_TARGET_SDKS")
1908+
endif()
1909+
1910+
list_intersect(
1911+
"${SWIFTLIB_TARGET_SDKS}" "${SWIFT_SDKS}" SWIFTLIB_TARGET_SDKS)
1912+
18881913
# All Swift code depends on the standard library, except for the standard
18891914
# library itself.
18901915
if(SWIFTLIB_HAS_SWIFT_CONTENT AND NOT SWIFTLIB_IS_STDLIB_CORE)
@@ -2027,7 +2052,10 @@ function(add_swift_target_library name)
20272052
elseif(sdk STREQUAL "LINUX" OR sdk STREQUAL "ANDROID")
20282053
list(APPEND swiftlib_module_depends_flattened
20292054
${SWIFTLIB_SWIFT_MODULE_DEPENDS_LINUX})
2030-
elseif(sdk STREQUAL "CYGWIN")
2055+
elseif(${sdk} STREQUAL "LINUX_STATIC")
2056+
list(APPEND swiftlib_module_depends_flattened
2057+
${SWIFTLIB_SWIFT_MODULE_DEPENDS_LINUX_STATIC})
2058+
elseif(${sdk} STREQUAL "CYGWIN")
20312059
list(APPEND swiftlib_module_depends_flattened
20322060
${SWIFTLIB_SWIFT_MODULE_DEPENDS_CYGWIN})
20332061
elseif(sdk STREQUAL "HAIKU")
@@ -2279,12 +2307,21 @@ function(add_swift_target_library name)
22792307
set(back_deployment_library_option)
22802308
endif()
22812309

2310+
# If the SDK is static only, always build static instead of dynamic
2311+
if(SWIFT_SDK_${sdk}_STATIC_ONLY AND SWIFTLIB_SHARED)
2312+
set(shared)
2313+
set(static STATIC)
2314+
else()
2315+
set(shared ${SWIFTLIB_SHARED_keyword})
2316+
set(static ${SWIFTLIB_STATIC_keyword})
2317+
endif()
2318+
22822319
# Add this library variant.
22832320
add_swift_target_library_single(
22842321
${variant_name}
22852322
${name}
2286-
${SWIFTLIB_SHARED_keyword}
2287-
${SWIFTLIB_STATIC_keyword}
2323+
${shared}
2324+
${static}
22882325
${SWIFTLIB_NO_LINK_NAME_keyword}
22892326
${SWIFTLIB_OBJECT_LIBRARY_keyword}
22902327
${SWIFTLIB_INSTALL_WITH_SHARED_keyword}
@@ -2341,23 +2378,19 @@ function(add_swift_target_library name)
23412378

23422379
if(NOT SWIFTLIB_OBJECT_LIBRARY)
23432380
# Add dependencies on the (not-yet-created) custom lipo target.
2344-
foreach(DEP ${SWIFTLIB_LINK_LIBRARIES})
2345-
if (NOT "${DEP}" STREQUAL "icucore" AND
2346-
NOT "${DEP}" STREQUAL "dispatch" AND
2347-
NOT "${DEP}" STREQUAL "BlocksRuntime")
2381+
foreach(dep ${SWIFTLIB_LINK_LIBRARIES})
2382+
if (NOT "${dep}" MATCHES "^(icucore|dispatch|BlocksRuntime)($|-.*)$")
23482383
add_dependencies(${VARIANT_NAME}
2349-
"${DEP}-${SWIFT_SDK_${sdk}_LIB_SUBDIR}")
2384+
"${dep}-${SWIFT_SDK_${sdk}_LIB_SUBDIR}")
23502385
endif()
23512386
endforeach()
23522387

23532388
if (SWIFTLIB_IS_STDLIB AND SWIFTLIB_STATIC)
23542389
# Add dependencies on the (not-yet-created) custom lipo target.
2355-
foreach(DEP ${SWIFTLIB_LINK_LIBRARIES})
2356-
if (NOT "${DEP}" STREQUAL "icucore" AND
2357-
NOT "${DEP}" STREQUAL "dispatch" AND
2358-
NOT "${DEP}" STREQUAL "BlocksRuntime")
2390+
foreach(dep ${SWIFTLIB_LINK_LIBRARIES})
2391+
if (NOT "${dep}" MATCHES "^(icucore|dispatch|BlocksRuntime)($|-.*)$")
23592392
add_dependencies("${VARIANT_NAME}-static"
2360-
"${DEP}-${SWIFT_SDK_${sdk}_LIB_SUBDIR}-static")
2393+
"${dep}-${SWIFT_SDK_${sdk}_LIB_SUBDIR}-static")
23612394
endif()
23622395
endforeach()
23632396
endif()
@@ -2401,7 +2434,7 @@ function(add_swift_target_library name)
24012434

24022435
if(NOT SWIFTLIB_OBJECT_LIBRARY)
24032436
# Determine the name of the universal library.
2404-
if(SWIFTLIB_SHARED)
2437+
if(SWIFTLIB_SHARED AND NOT SWIFT_SDK_${sdk}_STATIC_ONLY)
24052438
if("${sdk}" STREQUAL "WINDOWS")
24062439
set(UNIVERSAL_LIBRARY_NAME
24072440
"${SWIFTLIB_DIR}/${library_subdir}/${name}.dll")
@@ -2413,12 +2446,18 @@ function(add_swift_target_library name)
24132446
"${SWIFTLIB_DIR}/${library_subdir}/${CMAKE_SHARED_LIBRARY_PREFIX}${name}${CMAKE_SHARED_LIBRARY_SUFFIX}")
24142447
endif()
24152448
else()
2449+
if(SWIFTLIB_INSTALL_WITH_SHARED)
2450+
set(lib_dir "${SWIFTLIB_DIR}")
2451+
else()
2452+
set(lib_dir "${SWIFTSTATICLIB_DIR}")
2453+
endif()
2454+
24162455
if("${sdk}" STREQUAL "WINDOWS")
24172456
set(UNIVERSAL_LIBRARY_NAME
2418-
"${SWIFTLIB_DIR}/${library_subdir}/${name}.lib")
2457+
"${lib_dir}/${library_subdir}/${name}.lib")
24192458
else()
24202459
set(UNIVERSAL_LIBRARY_NAME
2421-
"${SWIFTLIB_DIR}/${library_subdir}/${CMAKE_STATIC_LIBRARY_PREFIX}${name}${CMAKE_STATIC_LIBRARY_SUFFIX}")
2460+
"${lib_dir}/${library_subdir}/${CMAKE_STATIC_LIBRARY_PREFIX}${name}${CMAKE_STATIC_LIBRARY_SUFFIX}")
24222461
endif()
24232462
endif()
24242463

@@ -2450,7 +2489,8 @@ function(add_swift_target_library name)
24502489

24512490
precondition(resource_dir_sdk_subdir)
24522491

2453-
if(SWIFTLIB_SHARED OR SWIFTLIB_INSTALL_WITH_SHARED)
2492+
if((SWIFTLIB_SHARED AND NOT SWIFT_SDK_${sdk}_STATIC_ONLY)
2493+
OR SWIFTLIB_INSTALL_WITH_SHARED)
24542494
set(resource_dir "swift")
24552495
set(file_permissions
24562496
OWNER_READ OWNER_WRITE OWNER_EXECUTE
@@ -2826,6 +2866,7 @@ function(add_swift_target_executable name)
28262866
SWIFT_MODULE_DEPENDS_HAIKU
28272867
SWIFT_MODULE_DEPENDS_IOS
28282868
SWIFT_MODULE_DEPENDS_LINUX
2869+
SWIFT_MODULE_DEPENDS_LINUX_STATIC
28292870
SWIFT_MODULE_DEPENDS_OSX
28302871
SWIFT_MODULE_DEPENDS_TVOS
28312872
SWIFT_MODULE_DEPENDS_WASI
@@ -2882,6 +2923,14 @@ function(add_swift_target_executable name)
28822923
endif()
28832924
list_replace(SWIFTEXE_TARGET_TARGET_SDKS ALL_APPLE_PLATFORMS "${SWIFT_DARWIN_PLATFORMS}")
28842925

2926+
# Support adding a "NOT" on the front to mean all SDKs except the following
2927+
list(GET SWIFTEXE_TARGET_TARGET_SDKS 0 first_sdk)
2928+
if("${first_sdk}" STREQUAL "NOT")
2929+
list(REMOVE_AT SWIFTEXE_TARGET_TARGET_SDKS 0)
2930+
list_subtract("${SWIFT_SDKS}" "${SWIFTEXE_TARGET_TARGET_SDKS}"
2931+
"SWIFTEXE_TARGET_TARGET_SDKS")
2932+
endif()
2933+
28852934
list_intersect(
28862935
"${SWIFTEXE_TARGET_TARGET_SDKS}" "${SWIFT_SDKS}" SWIFTEXE_TARGET_TARGET_SDKS)
28872936

@@ -2923,6 +2972,9 @@ function(add_swift_target_executable name)
29232972
elseif(sdk STREQUAL "LINUX" OR sdk STREQUAL "ANDROID")
29242973
list(APPEND swiftexe_module_depends_flattened
29252974
${SWIFTEXE_TARGET_SWIFT_MODULE_DEPENDS_LINUX})
2975+
elseif(sdk STREQUAL "LINUX_STATIC")
2976+
list(APPEND swiftexe_module_depends_flattened
2977+
${SWIFTEXE_TARGET_SWIFT_MODULE_DEPENDS_LINUX_STATIC})
29262978
elseif(sdk STREQUAL "CYGWIN")
29272979
list(APPEND swiftexe_module_depends_flattened
29282980
${SWIFTEXE_TARGET_SWIFT_MODULE_DEPENDS_CYGWIN})
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
-static
2+
-lswiftCore
3+
-lswift_RegexParser
4+
-Xlinker
5+
-undefined=pthread_self
6+
-Xlinker
7+
-undefined=pthread_once
8+
-Xlinker
9+
-undefined=pthread_key_create
10+
-ldispatch
11+
-lBlocksRuntime
12+
-lpthread
13+
-ldl
14+
-lc++
15+
-lm
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
-ldl
2+
-lpthread
3+
-lswiftCore
4+
-ldispatch -lBlocksRuntime
5+
-lc++
6+
-lm
7+
-Xlinker -export-dynamic
8+
-Xlinker --exclude-libs
9+
-Xlinker ALL

test/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,7 @@ function(get_test_dependencies SDK result_var_name)
107107
("${SDK}" STREQUAL "WATCHOS_SIMULATOR") OR
108108
("${SDK}" STREQUAL "FREESTANDING") OR
109109
("${SDK}" STREQUAL "LINUX") OR
110+
("${SDK}" STREQUAL "LINUX_STATIC") OR
110111
("${SDK}" STREQUAL "CYGWIN") OR
111112
("${SDK}" STREQUAL "FREEBSD") OR
112113
("${SDK}" STREQUAL "OPENBSD") OR

utils/build-script

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -297,6 +297,12 @@ def default_stdlib_deployment_targets(args):
297297
if args.build_watchos and args.build_watchos_device:
298298
targets.extend(StdlibDeploymentTarget.AppleWatch.targets)
299299
return targets
300+
elif host_target.platform.name == 'linux':
301+
targets = [host_target]
302+
if args.build_linux_static:
303+
targets.append(getattr(StdlibDeploymentTarget.Musl,
304+
host_target.arch))
305+
return targets
300306
else:
301307
# All other machines only configure their host stdlib by default.
302308
return [host_target]

0 commit comments

Comments
 (0)