Skip to content

Commit ee69cbc

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 82bd345 commit ee69cbc

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
@@ -475,6 +475,21 @@ set(SWIFT_MIN_RUNTIME_VERSION "${DEFAULT_SWIFT_MIN_RUNTIME_VERSION}" CACHE STRIN
475475
the compiler itself. This is used on non-Darwin platforms to ensure \
476476
that it's possible to build the compiler using host tools.")
477477

478+
#
479+
# User-configurable Linux specific options.
480+
#
481+
482+
set(SWIFT_MUSL_PATH "/usr/local/musl" CACHE STRING
483+
"Path to the directory that contains the Musl headers and libraries. \
484+
This is only required if we have been asked to build the Musl SDK, and \
485+
defaults to the default install location for Musl.")
486+
487+
set(SWIFT_SDK_LINUX_STATIC_ARCHITECTURES "" CACHE STRING
488+
"The architectures to configure when using the static Linux SDK.")
489+
490+
set(SWIFT_SDK_LINUX_ARCHITECTURES "" CACHE STRING
491+
"The architectures to configure when using the Linux SDK.")
492+
478493
#
479494
# User-configurable Android specific options.
480495
#
@@ -1033,9 +1048,25 @@ if("${SWIFT_HOST_VARIANT_SDK}" STREQUAL "LINUX")
10331048
# Should we build the standard library for the host?
10341049
is_sdk_requested(LINUX swift_build_linux)
10351050
if(swift_build_linux)
1036-
configure_sdk_unix("Linux" "${SWIFT_HOST_VARIANT_ARCH}")
1037-
set(SWIFT_PRIMARY_VARIANT_SDK_default "${SWIFT_HOST_VARIANT_SDK}")
1038-
set(SWIFT_PRIMARY_VARIANT_ARCH_default "${SWIFT_HOST_VARIANT_ARCH}")
1051+
if("${SWIFT_SDK_LINUX_ARCHITECTURES}" STREQUAL "")
1052+
set(SWIFT_SDK_LINUX_ARCHITECTURES "${SWIFT_HOST_VARIANT_ARCH}")
1053+
endif()
1054+
1055+
configure_sdk_unix("Linux" "${SWIFT_SDK_LINUX_ARCHITECTURES}")
1056+
endif()
1057+
1058+
# Should we build it for LINUX_STATIC?
1059+
is_sdk_requested(LINUX_STATIC swift_build_linux_static)
1060+
if(swift_build_linux_static)
1061+
if("${SWIFT_MUSL_PATH}" STREQUAL "")
1062+
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.")
1063+
endif()
1064+
1065+
if("${SWIFT_SDK_LINUX_STATIC_ARCHITECTURES}" STREQUAL "")
1066+
set(SWIFT_SDK_LINUX_STATIC_ARCHITECTURES "aarch64;x86_64")
1067+
endif()
1068+
1069+
configure_sdk_unix("Linux_Static" "${SWIFT_SDK_LINUX_STATIC_ARCHITECTURES}")
10391070
endif()
10401071

10411072
is_sdk_requested(FREESTANDING swift_build_freestanding)
@@ -1044,6 +1075,10 @@ if("${SWIFT_HOST_VARIANT_SDK}" STREQUAL "LINUX")
10441075
# configure_sdk_unix("FREESTANDING" "${SWIFT_HOST_VARIANT_ARCH}")
10451076
endif()
10461077

1078+
# Default is Linux SDK for host
1079+
set(SWIFT_PRIMARY_VARIANT_SDK_default "${SWIFT_HOST_VARIANT_SDK}")
1080+
set(SWIFT_PRIMARY_VARIANT_ARCH_default "${SWIFT_HOST_VARIANT_ARCH}")
1081+
10471082
elseif("${SWIFT_HOST_VARIANT_SDK}" STREQUAL "FREEBSD")
10481083

10491084
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
set(_default_threading_package "none")
@@ -436,6 +444,9 @@ macro(configure_sdk_unix name architectures)
436444
endif()
437445
set(SWIFT_SDK_WASI_ARCH_wasm32_PATH "${SWIFT_WASI_SYSROOT_PATH}")
438446
set(SWIFT_SDK_WASI_ARCH_wasm32_TRIPLE "wasm32-unknown-wasi")
447+
elseif("${prefix}" STREQUAL "LINUX_STATIC")
448+
set(SWIFT_SDK_LINUX_STATIC_ARCH_${arch}_TRIPLE "${arch}-swift-linux-musl")
449+
set(SWIFT_SDK_LINUX_STATIC_ARCH_${arch}_PATH "${SWIFT_MUSL_PATH}/${arch}")
439450
else()
440451
message(FATAL_ERROR "unknown Unix OS: ${prefix}")
441452
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)
@@ -500,6 +506,8 @@ function(_add_target_variant_link_flags)
500506
if("${LFLAGS_ARCH}" MATCHES "armv5|armv6|armv7|i686")
501507
list(APPEND link_libraries "atomic")
502508
endif()
509+
elseif("${LFLAGS_SDK}" STREQUAL "LINUX_STATIC")
510+
list(APPEND link_libraries "pthread" "dl")
503511
elseif("${LFLAGS_SDK}" STREQUAL "FREEBSD")
504512
list(APPEND link_libraries "pthread")
505513
elseif("${LFLAGS_SDK}" STREQUAL "OPENBSD")
@@ -1325,10 +1333,14 @@ function(add_swift_target_library_single target name)
13251333
endif()
13261334

13271335
if(target_static)
1328-
_list_add_string_suffix(
1329-
"${SWIFTLIB_SINGLE_LINK_LIBRARIES}"
1330-
"-static"
1331-
target_static_depends)
1336+
set(target_static_depends)
1337+
foreach(dep ${SWIFTLIB_SINGLE_LINK_LIBRARIES})
1338+
if (NOT "${dep}" MATCHES "^(icucore|dispatch|BlocksRuntime)($|-.*)$")
1339+
list(APPEND target_static_depends "${dep}-static")
1340+
endif()
1341+
endforeach()
1342+
1343+
13321344
# FIXME: should this be target_link_libraries?
13331345
add_dependencies_multiple_targets(
13341346
TARGETS "${target_static}"
@@ -1471,6 +1483,7 @@ function(add_swift_target_library_single target name)
14711483
"SHELL:-Xclang --dependent-lib=msvcrt$<$<CONFIG:Debug>:d>")
14721484
endif()
14731485
endif()
1486+
14741487
target_compile_options(${target} PRIVATE
14751488
${c_compile_flags})
14761489
target_link_options(${target} PRIVATE
@@ -1829,6 +1842,7 @@ function(add_swift_target_library name)
18291842
SWIFT_MODULE_DEPENDS_HAIKU
18301843
SWIFT_MODULE_DEPENDS_IOS
18311844
SWIFT_MODULE_DEPENDS_LINUX
1845+
SWIFT_MODULE_DEPENDS_LINUX_STATIC
18321846
SWIFT_MODULE_DEPENDS_OSX
18331847
SWIFT_MODULE_DEPENDS_TVOS
18341848
SWIFT_MODULE_DEPENDS_WASI
@@ -1874,6 +1888,17 @@ function(add_swift_target_library name)
18741888
endif()
18751889
list_replace(SWIFTLIB_TARGET_SDKS ALL_APPLE_PLATFORMS "${SWIFT_DARWIN_PLATFORMS}")
18761890

1891+
# Support adding a "NOT" on the front to mean all SDKs except the following
1892+
list(GET SWIFTLIB_TARGET_SDKS 0 first_sdk)
1893+
if("${first_sdk}" STREQUAL "NOT")
1894+
list(REMOVE_AT SWIFTLIB_TARGET_SDKS 0)
1895+
list_subtract("${SWIFT_SDKS}" "${SWIFTLIB_TARGET_SDKS}"
1896+
"SWIFTLIB_TARGET_SDKS")
1897+
endif()
1898+
1899+
list_intersect(
1900+
"${SWIFTLIB_TARGET_SDKS}" "${SWIFT_SDKS}" SWIFTLIB_TARGET_SDKS)
1901+
18771902
# All Swift code depends on the standard library, except for the standard
18781903
# library itself.
18791904
if(SWIFTLIB_HAS_SWIFT_CONTENT AND NOT SWIFTLIB_IS_STDLIB_CORE)
@@ -2016,7 +2041,10 @@ function(add_swift_target_library name)
20162041
elseif(sdk STREQUAL "LINUX" OR sdk STREQUAL "ANDROID")
20172042
list(APPEND swiftlib_module_depends_flattened
20182043
${SWIFTLIB_SWIFT_MODULE_DEPENDS_LINUX})
2019-
elseif(sdk STREQUAL "CYGWIN")
2044+
elseif(${sdk} STREQUAL "LINUX_STATIC")
2045+
list(APPEND swiftlib_module_depends_flattened
2046+
${SWIFTLIB_SWIFT_MODULE_DEPENDS_LINUX_STATIC})
2047+
elseif(${sdk} STREQUAL "CYGWIN")
20202048
list(APPEND swiftlib_module_depends_flattened
20212049
${SWIFTLIB_SWIFT_MODULE_DEPENDS_CYGWIN})
20222050
elseif(sdk STREQUAL "HAIKU")
@@ -2268,12 +2296,21 @@ function(add_swift_target_library name)
22682296
set(back_deployment_library_option)
22692297
endif()
22702298

2299+
# If the SDK is static only, always build static instead of dynamic
2300+
if(SWIFT_SDK_${sdk}_STATIC_ONLY AND SWIFTLIB_SHARED)
2301+
set(shared)
2302+
set(static STATIC)
2303+
else()
2304+
set(shared ${SWIFTLIB_SHARED_keyword})
2305+
set(static ${SWIFTLIB_STATIC_keyword})
2306+
endif()
2307+
22712308
# Add this library variant.
22722309
add_swift_target_library_single(
22732310
${variant_name}
22742311
${name}
2275-
${SWIFTLIB_SHARED_keyword}
2276-
${SWIFTLIB_STATIC_keyword}
2312+
${shared}
2313+
${static}
22772314
${SWIFTLIB_NO_LINK_NAME_keyword}
22782315
${SWIFTLIB_OBJECT_LIBRARY_keyword}
22792316
${SWIFTLIB_INSTALL_WITH_SHARED_keyword}
@@ -2330,23 +2367,19 @@ function(add_swift_target_library name)
23302367

23312368
if(NOT SWIFTLIB_OBJECT_LIBRARY)
23322369
# Add dependencies on the (not-yet-created) custom lipo target.
2333-
foreach(DEP ${SWIFTLIB_LINK_LIBRARIES})
2334-
if (NOT "${DEP}" STREQUAL "icucore" AND
2335-
NOT "${DEP}" STREQUAL "dispatch" AND
2336-
NOT "${DEP}" STREQUAL "BlocksRuntime")
2370+
foreach(dep ${SWIFTLIB_LINK_LIBRARIES})
2371+
if (NOT "${dep}" MATCHES "^(icucore|dispatch|BlocksRuntime)($|-.*)$")
23372372
add_dependencies(${VARIANT_NAME}
2338-
"${DEP}-${SWIFT_SDK_${sdk}_LIB_SUBDIR}")
2373+
"${dep}-${SWIFT_SDK_${sdk}_LIB_SUBDIR}")
23392374
endif()
23402375
endforeach()
23412376

23422377
if (SWIFTLIB_IS_STDLIB AND SWIFTLIB_STATIC)
23432378
# 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")
2379+
foreach(dep ${SWIFTLIB_LINK_LIBRARIES})
2380+
if (NOT "${dep}" MATCHES "^(icucore|dispatch|BlocksRuntime)($|-.*)$")
23482381
add_dependencies("${VARIANT_NAME}-static"
2349-
"${DEP}-${SWIFT_SDK_${sdk}_LIB_SUBDIR}-static")
2382+
"${dep}-${SWIFT_SDK_${sdk}_LIB_SUBDIR}-static")
23502383
endif()
23512384
endforeach()
23522385
endif()
@@ -2390,7 +2423,7 @@ function(add_swift_target_library name)
23902423

23912424
if(NOT SWIFTLIB_OBJECT_LIBRARY)
23922425
# Determine the name of the universal library.
2393-
if(SWIFTLIB_SHARED)
2426+
if(SWIFTLIB_SHARED AND NOT SWIFT_SDK_${sdk}_STATIC_ONLY)
23942427
if("${sdk}" STREQUAL "WINDOWS")
23952428
set(UNIVERSAL_LIBRARY_NAME
23962429
"${SWIFTLIB_DIR}/${library_subdir}/${name}.dll")
@@ -2402,12 +2435,18 @@ function(add_swift_target_library name)
24022435
"${SWIFTLIB_DIR}/${library_subdir}/${CMAKE_SHARED_LIBRARY_PREFIX}${name}${CMAKE_SHARED_LIBRARY_SUFFIX}")
24032436
endif()
24042437
else()
2438+
if(SWIFTLIB_INSTALL_WITH_SHARED)
2439+
set(lib_dir "${SWIFTLIB_DIR}")
2440+
else()
2441+
set(lib_dir "${SWIFTSTATICLIB_DIR}")
2442+
endif()
2443+
24052444
if("${sdk}" STREQUAL "WINDOWS")
24062445
set(UNIVERSAL_LIBRARY_NAME
2407-
"${SWIFTLIB_DIR}/${library_subdir}/${name}.lib")
2446+
"${lib_dir}/${library_subdir}/${name}.lib")
24082447
else()
24092448
set(UNIVERSAL_LIBRARY_NAME
2410-
"${SWIFTLIB_DIR}/${library_subdir}/${CMAKE_STATIC_LIBRARY_PREFIX}${name}${CMAKE_STATIC_LIBRARY_SUFFIX}")
2449+
"${lib_dir}/${library_subdir}/${CMAKE_STATIC_LIBRARY_PREFIX}${name}${CMAKE_STATIC_LIBRARY_SUFFIX}")
24112450
endif()
24122451
endif()
24132452

@@ -2439,7 +2478,8 @@ function(add_swift_target_library name)
24392478

24402479
precondition(resource_dir_sdk_subdir)
24412480

2442-
if(SWIFTLIB_SHARED OR SWIFTLIB_INSTALL_WITH_SHARED)
2481+
if((SWIFTLIB_SHARED AND NOT SWIFT_SDK_${sdk}_STATIC_ONLY)
2482+
OR SWIFTLIB_INSTALL_WITH_SHARED)
24432483
set(resource_dir "swift")
24442484
set(file_permissions
24452485
OWNER_READ OWNER_WRITE OWNER_EXECUTE
@@ -2815,6 +2855,7 @@ function(add_swift_target_executable name)
28152855
SWIFT_MODULE_DEPENDS_HAIKU
28162856
SWIFT_MODULE_DEPENDS_IOS
28172857
SWIFT_MODULE_DEPENDS_LINUX
2858+
SWIFT_MODULE_DEPENDS_LINUX_STATIC
28182859
SWIFT_MODULE_DEPENDS_OSX
28192860
SWIFT_MODULE_DEPENDS_TVOS
28202861
SWIFT_MODULE_DEPENDS_WASI
@@ -2871,6 +2912,14 @@ function(add_swift_target_executable name)
28712912
endif()
28722913
list_replace(SWIFTEXE_TARGET_TARGET_SDKS ALL_APPLE_PLATFORMS "${SWIFT_DARWIN_PLATFORMS}")
28732914

2915+
# Support adding a "NOT" on the front to mean all SDKs except the following
2916+
list(GET SWIFTEXE_TARGET_TARGET_SDKS 0 first_sdk)
2917+
if("${first_sdk}" STREQUAL "NOT")
2918+
list(REMOVE_AT SWIFTEXE_TARGET_TARGET_SDKS 0)
2919+
list_subtract("${SWIFT_SDKS}" "${SWIFTEXE_TARGET_TARGET_SDKS}"
2920+
"SWIFTEXE_TARGET_TARGET_SDKS")
2921+
endif()
2922+
28742923
list_intersect(
28752924
"${SWIFTEXE_TARGET_TARGET_SDKS}" "${SWIFT_SDKS}" SWIFTEXE_TARGET_TARGET_SDKS)
28762925

@@ -2912,6 +2961,9 @@ function(add_swift_target_executable name)
29122961
elseif(sdk STREQUAL "LINUX" OR sdk STREQUAL "ANDROID")
29132962
list(APPEND swiftexe_module_depends_flattened
29142963
${SWIFTEXE_TARGET_SWIFT_MODULE_DEPENDS_LINUX})
2964+
elseif(sdk STREQUAL "LINUX_STATIC")
2965+
list(APPEND swiftexe_module_depends_flattened
2966+
${SWIFTEXE_TARGET_SWIFT_MODULE_DEPENDS_LINUX_STATIC})
29152967
elseif(sdk STREQUAL "CYGWIN")
29162968
list(APPEND swiftexe_module_depends_flattened
29172969
${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
@@ -106,6 +106,7 @@ function(get_test_dependencies SDK result_var_name)
106106
("${SDK}" STREQUAL "WATCHOS_SIMULATOR") OR
107107
("${SDK}" STREQUAL "FREESTANDING") OR
108108
("${SDK}" STREQUAL "LINUX") OR
109+
("${SDK}" STREQUAL "LINUX_STATIC") OR
109110
("${SDK}" STREQUAL "CYGWIN") OR
110111
("${SDK}" STREQUAL "FREEBSD") OR
111112
("${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_musl:
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)