Skip to content

Commit ae1c045

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 8f59806 commit ae1c045

File tree

15 files changed

+293
-27
lines changed

15 files changed

+293
-27
lines changed

CMakeLists.txt

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

482+
#
483+
# User-configurable Linux specific options.
484+
#
485+
486+
set(SWIFT_MUSL_PATH "/usr/local/musl" CACHE STRING
487+
"Path to the directory that contains the Musl headers and libraries. \
488+
This is only required if we have been asked to build the Musl SDK, and \
489+
defaults to the default install location for Musl.")
490+
491+
set(SWIFT_SDK_LINUX_STATIC_ARCHITECTURES "" CACHE STRING
492+
"The architectures to configure when using the static Linux SDK.")
493+
494+
set(SWIFT_SDK_LINUX_ARCHITECTURES "" CACHE STRING
495+
"The architectures to configure when using the Linux SDK.")
496+
482497
#
483498
# User-configurable Android specific options.
484499
#
@@ -1095,9 +1110,25 @@ if("${SWIFT_HOST_VARIANT_SDK}" STREQUAL "LINUX")
10951110
# Should we build the standard library for the host?
10961111
is_sdk_requested(LINUX swift_build_linux)
10971112
if(swift_build_linux)
1098-
configure_sdk_unix("Linux" "${SWIFT_HOST_VARIANT_ARCH}")
1099-
set(SWIFT_PRIMARY_VARIANT_SDK_default "${SWIFT_HOST_VARIANT_SDK}")
1100-
set(SWIFT_PRIMARY_VARIANT_ARCH_default "${SWIFT_HOST_VARIANT_ARCH}")
1113+
if("${SWIFT_SDK_LINUX_ARCHITECTURES}" STREQUAL "")
1114+
set(SWIFT_SDK_LINUX_ARCHITECTURES "${SWIFT_HOST_VARIANT_ARCH}")
1115+
endif()
1116+
1117+
configure_sdk_unix("Linux" "${SWIFT_SDK_LINUX_ARCHITECTURES}")
1118+
endif()
1119+
1120+
# Should we build it for LINUX_STATIC?
1121+
is_sdk_requested(LINUX_STATIC swift_build_linux_static)
1122+
if(swift_build_linux_static)
1123+
if("${SWIFT_MUSL_PATH}" STREQUAL "")
1124+
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.")
1125+
endif()
1126+
1127+
if("${SWIFT_SDK_LINUX_STATIC_ARCHITECTURES}" STREQUAL "")
1128+
set(SWIFT_SDK_LINUX_STATIC_ARCHITECTURES "aarch64;x86_64")
1129+
endif()
1130+
1131+
configure_sdk_unix("Linux_Static" "${SWIFT_SDK_LINUX_STATIC_ARCHITECTURES}")
11011132
endif()
11021133

11031134
is_sdk_requested(FREESTANDING swift_build_freestanding)
@@ -1106,6 +1137,10 @@ if("${SWIFT_HOST_VARIANT_SDK}" STREQUAL "LINUX")
11061137
# configure_sdk_unix("FREESTANDING" "${SWIFT_HOST_VARIANT_ARCH}")
11071138
endif()
11081139

1140+
# Default is Linux SDK for host
1141+
set(SWIFT_PRIMARY_VARIANT_SDK_default "${SWIFT_HOST_VARIANT_SDK}")
1142+
set(SWIFT_PRIMARY_VARIANT_ARCH_default "${SWIFT_HOST_VARIANT_ARCH}")
1143+
11091144
elseif("${SWIFT_HOST_VARIANT_SDK}" STREQUAL "FREEBSD")
11101145

11111146
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
@@ -119,6 +119,12 @@ function(_add_target_variant_c_compile_link_flags)
119119
list(APPEND result "--sysroot=${_sysroot}")
120120
endif()
121121

122+
if("${CFLAGS_SDK}" STREQUAL "LINUX_STATIC")
123+
list(APPEND result "-isystem" "${SWIFT_MUSL_PATH}/${CFLAGS_ARCH}/usr/include/c++/v1")
124+
list(APPEND result "-DSWIFT_LIBC_IS_MUSL")
125+
endif()
126+
127+
122128
if("${CFLAGS_SDK}" STREQUAL "ANDROID")
123129
# Make sure the Android NDK lld is used.
124130
swift_android_tools_path(${CFLAGS_ARCH} tools_path)
@@ -512,6 +518,8 @@ function(_add_target_variant_link_flags)
512518
if("${LFLAGS_ARCH}" MATCHES "armv5|armv6|armv7|i686")
513519
list(APPEND link_libraries "atomic")
514520
endif()
521+
elseif("${LFLAGS_SDK}" STREQUAL "LINUX_STATIC")
522+
list(APPEND link_libraries "pthread" "dl")
515523
elseif("${LFLAGS_SDK}" STREQUAL "FREEBSD")
516524
list(APPEND link_libraries "pthread")
517525
elseif("${LFLAGS_SDK}" STREQUAL "OPENBSD")
@@ -1352,10 +1360,14 @@ function(add_swift_target_library_single target name)
13521360
endif()
13531361

13541362
if(target_static)
1355-
_list_add_string_suffix(
1356-
"${SWIFTLIB_SINGLE_LINK_LIBRARIES}"
1357-
"-static"
1358-
target_static_depends)
1363+
set(target_static_depends)
1364+
foreach(dep ${SWIFTLIB_SINGLE_LINK_LIBRARIES})
1365+
if (NOT "${dep}" MATCHES "^(icucore|dispatch|BlocksRuntime)($|-.*)$")
1366+
list(APPEND target_static_depends "${dep}-static")
1367+
endif()
1368+
endforeach()
1369+
1370+
13591371
# FIXME: should this be target_link_libraries?
13601372
add_dependencies_multiple_targets(
13611373
TARGETS "${target_static}"
@@ -1500,6 +1512,7 @@ function(add_swift_target_library_single target name)
15001512
"SHELL:-Xclang --dependent-lib=msvcrt$<$<CONFIG:Debug>:d>")
15011513
endif()
15021514
endif()
1515+
15031516
target_compile_options(${target} PRIVATE
15041517
${c_compile_flags})
15051518
target_link_options(${target} PRIVATE
@@ -1869,6 +1882,7 @@ function(add_swift_target_library name)
18691882
SWIFT_MODULE_DEPENDS_HAIKU
18701883
SWIFT_MODULE_DEPENDS_IOS
18711884
SWIFT_MODULE_DEPENDS_LINUX
1885+
SWIFT_MODULE_DEPENDS_LINUX_STATIC
18721886
SWIFT_MODULE_DEPENDS_OSX
18731887
SWIFT_MODULE_DEPENDS_TVOS
18741888
SWIFT_MODULE_DEPENDS_WASI
@@ -1915,6 +1929,17 @@ function(add_swift_target_library name)
19151929
endif()
19161930
list_replace(SWIFTLIB_TARGET_SDKS ALL_APPLE_PLATFORMS "${SWIFT_DARWIN_PLATFORMS}")
19171931

1932+
# Support adding a "NOT" on the front to mean all SDKs except the following
1933+
list(GET SWIFTLIB_TARGET_SDKS 0 first_sdk)
1934+
if("${first_sdk}" STREQUAL "NOT")
1935+
list(REMOVE_AT SWIFTLIB_TARGET_SDKS 0)
1936+
list_subtract("${SWIFT_SDKS}" "${SWIFTLIB_TARGET_SDKS}"
1937+
"SWIFTLIB_TARGET_SDKS")
1938+
endif()
1939+
1940+
list_intersect(
1941+
"${SWIFTLIB_TARGET_SDKS}" "${SWIFT_SDKS}" SWIFTLIB_TARGET_SDKS)
1942+
19181943
# All Swift code depends on the standard library, except for the standard
19191944
# library itself.
19201945
if(SWIFTLIB_HAS_SWIFT_CONTENT AND NOT SWIFTLIB_IS_STDLIB_CORE)
@@ -2064,7 +2089,10 @@ function(add_swift_target_library name)
20642089
elseif(sdk STREQUAL "LINUX" OR sdk STREQUAL "ANDROID")
20652090
list(APPEND swiftlib_module_depends_flattened
20662091
${SWIFTLIB_SWIFT_MODULE_DEPENDS_LINUX})
2067-
elseif(sdk STREQUAL "CYGWIN")
2092+
elseif(${sdk} STREQUAL "LINUX_STATIC")
2093+
list(APPEND swiftlib_module_depends_flattened
2094+
${SWIFTLIB_SWIFT_MODULE_DEPENDS_LINUX_STATIC})
2095+
elseif(${sdk} STREQUAL "CYGWIN")
20682096
list(APPEND swiftlib_module_depends_flattened
20692097
${SWIFTLIB_SWIFT_MODULE_DEPENDS_CYGWIN})
20702098
elseif(sdk STREQUAL "HAIKU")
@@ -2319,12 +2347,21 @@ function(add_swift_target_library name)
23192347
set(back_deployment_library_option)
23202348
endif()
23212349

2350+
# If the SDK is static only, always build static instead of dynamic
2351+
if(SWIFT_SDK_${sdk}_STATIC_ONLY AND SWIFTLIB_SHARED)
2352+
set(shared)
2353+
set(static STATIC)
2354+
else()
2355+
set(shared ${SWIFTLIB_SHARED_keyword})
2356+
set(static ${SWIFTLIB_STATIC_keyword})
2357+
endif()
2358+
23222359
# Add this library variant.
23232360
add_swift_target_library_single(
23242361
${variant_name}
23252362
${name}
2326-
${SWIFTLIB_SHARED_keyword}
2327-
${SWIFTLIB_STATIC_keyword}
2363+
${shared}
2364+
${static}
23282365
${SWIFTLIB_NO_LINK_NAME_keyword}
23292366
${SWIFTLIB_OBJECT_LIBRARY_keyword}
23302367
${SWIFTLIB_INSTALL_WITH_SHARED_keyword}
@@ -2383,23 +2420,19 @@ function(add_swift_target_library name)
23832420

23842421
if(NOT SWIFTLIB_OBJECT_LIBRARY)
23852422
# Add dependencies on the (not-yet-created) custom lipo target.
2386-
foreach(DEP ${SWIFTLIB_LINK_LIBRARIES})
2387-
if (NOT "${DEP}" STREQUAL "icucore" AND
2388-
NOT "${DEP}" STREQUAL "dispatch" AND
2389-
NOT "${DEP}" STREQUAL "BlocksRuntime")
2423+
foreach(dep ${SWIFTLIB_LINK_LIBRARIES})
2424+
if (NOT "${dep}" MATCHES "^(icucore|dispatch|BlocksRuntime)($|-.*)$")
23902425
add_dependencies(${VARIANT_NAME}
2391-
"${DEP}-${SWIFT_SDK_${sdk}_LIB_SUBDIR}")
2426+
"${dep}-${SWIFT_SDK_${sdk}_LIB_SUBDIR}")
23922427
endif()
23932428
endforeach()
23942429

23952430
if (SWIFTLIB_IS_STDLIB AND SWIFTLIB_STATIC)
23962431
# Add dependencies on the (not-yet-created) custom lipo target.
2397-
foreach(DEP ${SWIFTLIB_LINK_LIBRARIES})
2398-
if (NOT "${DEP}" STREQUAL "icucore" AND
2399-
NOT "${DEP}" STREQUAL "dispatch" AND
2400-
NOT "${DEP}" STREQUAL "BlocksRuntime")
2432+
foreach(dep ${SWIFTLIB_LINK_LIBRARIES})
2433+
if (NOT "${dep}" MATCHES "^(icucore|dispatch|BlocksRuntime)($|-.*)$")
24012434
add_dependencies("${VARIANT_NAME}-static"
2402-
"${DEP}-${SWIFT_SDK_${sdk}_LIB_SUBDIR}-static")
2435+
"${dep}-${SWIFT_SDK_${sdk}_LIB_SUBDIR}-static")
24032436
endif()
24042437
endforeach()
24052438
endif()
@@ -2443,7 +2476,7 @@ function(add_swift_target_library name)
24432476

24442477
if(NOT SWIFTLIB_OBJECT_LIBRARY)
24452478
# Determine the name of the universal library.
2446-
if(SWIFTLIB_SHARED)
2479+
if(SWIFTLIB_SHARED AND NOT SWIFT_SDK_${sdk}_STATIC_ONLY)
24472480
if("${sdk}" STREQUAL "WINDOWS")
24482481
set(UNIVERSAL_LIBRARY_NAME
24492482
"${SWIFTLIB_DIR}/${library_subdir}/${name}.dll")
@@ -2455,12 +2488,18 @@ function(add_swift_target_library name)
24552488
"${SWIFTLIB_DIR}/${library_subdir}/${CMAKE_SHARED_LIBRARY_PREFIX}${name}${CMAKE_SHARED_LIBRARY_SUFFIX}")
24562489
endif()
24572490
else()
2491+
if(SWIFTLIB_INSTALL_WITH_SHARED)
2492+
set(lib_dir "${SWIFTLIB_DIR}")
2493+
else()
2494+
set(lib_dir "${SWIFTSTATICLIB_DIR}")
2495+
endif()
2496+
24582497
if("${sdk}" STREQUAL "WINDOWS")
24592498
set(UNIVERSAL_LIBRARY_NAME
2460-
"${SWIFTLIB_DIR}/${library_subdir}/${name}.lib")
2499+
"${lib_dir}/${library_subdir}/${name}.lib")
24612500
else()
24622501
set(UNIVERSAL_LIBRARY_NAME
2463-
"${SWIFTLIB_DIR}/${library_subdir}/${CMAKE_STATIC_LIBRARY_PREFIX}${name}${CMAKE_STATIC_LIBRARY_SUFFIX}")
2502+
"${lib_dir}/${library_subdir}/${CMAKE_STATIC_LIBRARY_PREFIX}${name}${CMAKE_STATIC_LIBRARY_SUFFIX}")
24642503
endif()
24652504
endif()
24662505

@@ -2492,7 +2531,8 @@ function(add_swift_target_library name)
24922531

24932532
precondition(resource_dir_sdk_subdir)
24942533

2495-
if(SWIFTLIB_SHARED OR SWIFTLIB_INSTALL_WITH_SHARED)
2534+
if((SWIFTLIB_SHARED AND NOT SWIFT_SDK_${sdk}_STATIC_ONLY)
2535+
OR SWIFTLIB_INSTALL_WITH_SHARED)
24962536
set(resource_dir "swift")
24972537
set(file_permissions
24982538
OWNER_READ OWNER_WRITE OWNER_EXECUTE
@@ -2868,6 +2908,7 @@ function(add_swift_target_executable name)
28682908
SWIFT_MODULE_DEPENDS_HAIKU
28692909
SWIFT_MODULE_DEPENDS_IOS
28702910
SWIFT_MODULE_DEPENDS_LINUX
2911+
SWIFT_MODULE_DEPENDS_LINUX_STATIC
28712912
SWIFT_MODULE_DEPENDS_OSX
28722913
SWIFT_MODULE_DEPENDS_TVOS
28732914
SWIFT_MODULE_DEPENDS_WASI
@@ -2924,6 +2965,14 @@ function(add_swift_target_executable name)
29242965
endif()
29252966
list_replace(SWIFTEXE_TARGET_TARGET_SDKS ALL_APPLE_PLATFORMS "${SWIFT_DARWIN_PLATFORMS}")
29262967

2968+
# Support adding a "NOT" on the front to mean all SDKs except the following
2969+
list(GET SWIFTEXE_TARGET_TARGET_SDKS 0 first_sdk)
2970+
if("${first_sdk}" STREQUAL "NOT")
2971+
list(REMOVE_AT SWIFTEXE_TARGET_TARGET_SDKS 0)
2972+
list_subtract("${SWIFT_SDKS}" "${SWIFTEXE_TARGET_TARGET_SDKS}"
2973+
"SWIFTEXE_TARGET_TARGET_SDKS")
2974+
endif()
2975+
29272976
list_intersect(
29282977
"${SWIFTEXE_TARGET_TARGET_SDKS}" "${SWIFT_SDKS}" SWIFTEXE_TARGET_TARGET_SDKS)
29292978

@@ -2965,6 +3014,9 @@ function(add_swift_target_executable name)
29653014
elseif(sdk STREQUAL "LINUX" OR sdk STREQUAL "ANDROID")
29663015
list(APPEND swiftexe_module_depends_flattened
29673016
${SWIFTEXE_TARGET_SWIFT_MODULE_DEPENDS_LINUX})
3017+
elseif(sdk STREQUAL "LINUX_STATIC")
3018+
list(APPEND swiftexe_module_depends_flattened
3019+
${SWIFTEXE_TARGET_SWIFT_MODULE_DEPENDS_LINUX_STATIC})
29683020
elseif(sdk STREQUAL "CYGWIN")
29693021
list(APPEND swiftexe_module_depends_flattened
29703022
${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
@@ -109,6 +109,7 @@ function(get_test_dependencies SDK result_var_name)
109109
("${SDK}" STREQUAL "XROS_SIMULATOR") OR
110110
("${SDK}" STREQUAL "FREESTANDING") OR
111111
("${SDK}" STREQUAL "LINUX") OR
112+
("${SDK}" STREQUAL "LINUX_STATIC") OR
112113
("${SDK}" STREQUAL "CYGWIN") OR
113114
("${SDK}" STREQUAL "FREEBSD") OR
114115
("${SDK}" STREQUAL "OPENBSD") OR

utils/build-script

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -304,6 +304,12 @@ def default_stdlib_deployment_targets(args):
304304
args.build_xros and args.build_xros_device:
305305
targets.extend(StdlibDeploymentTarget.XROS.targets)
306306
return targets
307+
elif host_target.platform.name == 'linux':
308+
targets = [host_target]
309+
if args.build_linux_static:
310+
targets.append(getattr(StdlibDeploymentTarget.Musl,
311+
host_target.arch))
312+
return targets
307313
else:
308314
# All other machines only configure their host stdlib by default.
309315
return [host_target]

0 commit comments

Comments
 (0)