Skip to content

Commit af049c8

Browse files
[WASM] Implement build-script for WebAssembly/WASI
1 parent 0be8357 commit af049c8

File tree

10 files changed

+72
-7
lines changed

10 files changed

+72
-7
lines changed

CMakeLists.txt

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -265,11 +265,11 @@ set(SWIFT_ANDROID_DEPLOY_DEVICE_PATH "" CACHE STRING
265265
"Path on an Android device where build products will be pushed. These are used when running the test suite against the device")
266266

267267
#
268-
# User-configurable ICU specific options for Android, FreeBSD, Linux and Haiku.
268+
# User-configurable ICU specific options for Android, FreeBSD, Linux, Haiku, and WebAssembly/WASI.
269269
#
270270

271-
foreach(sdk ANDROID;FREEBSD;LINUX;WINDOWS;HAIKU)
272-
foreach(arch aarch64;armv6;armv7;i686;powerpc64;powerpc64le;s390x;x86_64)
271+
foreach(sdk ANDROID;FREEBSD;LINUX;WINDOWS;HAIKU;WASI)
272+
foreach(arch aarch64;armv6;armv7;i686;powerpc64;powerpc64le;s390x;wasm32;x86_64)
273273
set(SWIFT_${sdk}_${arch}_ICU_UC "" CACHE STRING
274274
"Path to a directory containing the icuuc library for ${sdk}")
275275
set(SWIFT_${sdk}_${arch}_ICU_UC_INCLUDE "" CACHE STRING
@@ -599,6 +599,8 @@ else()
599599
set(SWIFT_HOST_VARIANT_ARCH_default "powerpc64le")
600600
elseif("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "s390x")
601601
set(SWIFT_HOST_VARIANT_ARCH_default "s390x")
602+
elseif("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "wasm32")
603+
set(SWIFT_HOST_VARIANT_ARCH_default "wasm32")
602604
# FIXME: Only matches v6l/v7l - by far the most common variants
603605
elseif("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "armv6l")
604606
set(SWIFT_HOST_VARIANT_ARCH_default "armv6")
@@ -783,6 +785,14 @@ if(swift_build_windows AND NOT "${CMAKE_SYSTEM_NAME}" STREQUAL "Windows")
783785
configure_sdk_windows("Windows" "msvc" "${SWIFT_SDK_WINDOWS_ARCHITECTURES}")
784786
endif()
785787

788+
is_sdk_requested(WASI swift_build_wasi)
789+
if(swift_build_wasi AND NOT "${SWIFT_HOST_VARIANT_SDK}" STREQUAL "WASI")
790+
if("${SWIFT_SDK_WASI_ARCHITECTURES}" STREQUAL "")
791+
set(SWIFT_SDK_WASI_ARCHITECTURES wasm32)
792+
endif()
793+
configure_sdk_unix("WASI" "${SWIFT_SDK_WASI_ARCHITECTURES}")
794+
endif()
795+
786796
if("${SWIFT_SDKS}" STREQUAL "")
787797
set(SWIFT_SDKS "${SWIFT_CONFIGURED_SDKS}")
788798
endif()

cmake/modules/SwiftConfigureSDK.cmake

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -214,6 +214,8 @@ macro(configure_sdk_unix name architectures)
214214
set(SWIFT_SDK_${prefix}_ARCHITECTURES "${architectures}")
215215
if("${prefix}" STREQUAL "CYGWIN")
216216
set(SWIFT_SDK_${prefix}_OBJECT_FORMAT "COFF")
217+
elseif("${prefix}" STREQUAL "WASI")
218+
set(SWIFT_SDK_${prefix}_OBJECT_FORMAT "WASM")
217219
else()
218220
set(SWIFT_SDK_${prefix}_OBJECT_FORMAT "ELF")
219221
endif()
@@ -330,6 +332,14 @@ macro(configure_sdk_unix name architectures)
330332
message(FATAL_ERROR "unsupported arch for Haiku: ${arch}")
331333
endif()
332334
set(SWIFT_SDK_HAIKU_ARCH_x86_64_TRIPLE "x86_64-unknown-haiku")
335+
elseif("${prefix}" STREQUAL "WASI")
336+
if(NOT arch STREQUAL wasm32)
337+
message(FATAL_ERROR "unsupported arch for WASI: ${arch}")
338+
endif()
339+
set(SWIFT_SDK_WASI_ARCH_wasm32_PATH "${SWIFT_WASI_SYSROOT}")
340+
set(SWIFT_SDK_WASI_ARCH_wasm32_TRIPLE "wasm32-unknown-wasi")
341+
set(SWIFT_SDK_WASI_ARCH_wasm32_LIBC_INCLUDE_DIRECTORY "${SWIFT_WASI_SYSROOT}/include")
342+
set(SWIFT_SDK_WASI_ARCH_wasm32_LIBC_ARCHITECTURE_INCLUDE_DIRECTORY "${SWIFT_WASI_SYSROOT}/include")
333343
else()
334344
message(FATAL_ERROR "unknown Unix OS: ${prefix}")
335345
endif()

cmake/modules/SwiftSetIfArchBitness.cmake

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@ function(set_if_arch_bitness var_name)
1212
"${SIA_ARCH}" STREQUAL "armv6" OR
1313
"${SIA_ARCH}" STREQUAL "armv7" OR
1414
"${SIA_ARCH}" STREQUAL "armv7k" OR
15-
"${SIA_ARCH}" STREQUAL "armv7s")
15+
"${SIA_ARCH}" STREQUAL "armv7s" OR
16+
"${SIA_ARCH}" STREQUAL "wasm32")
1617
set("${var_name}" "${SIA_CASE_32_BIT}" PARENT_SCOPE)
1718
elseif("${SIA_ARCH}" STREQUAL "x86_64" OR
1819
"${SIA_ARCH}" STREQUAL "arm64" OR

stdlib/private/SwiftPrivateThreadExtras/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ add_swift_target_library(swiftSwiftPrivateThreadExtras ${SWIFT_STDLIB_LIBRARY_BU
1414
SWIFT_MODULE_DEPENDS_FREEBSD Glibc
1515
SWIFT_MODULE_DEPENDS_CYGWIN Glibc
1616
SWIFT_MODULE_DEPENDS_HAIKU Glibc
17+
SWIFT_MODULE_DEPENDS_WASI Glibc
1718
SWIFT_MODULE_DEPENDS_WINDOWS MSVCRT WinSDK
1819
SWIFT_COMPILE_FLAGS ${SWIFT_STANDARD_LIBRARY_SWIFT_FLAGS}
1920
TARGET_SDKS ALL_APPLE_PLATFORMS CYGWIN FREEBSD HAIKU LINUX WINDOWS ANDROID

test/CMakeLists.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,8 @@ function(get_test_dependencies SDK result_var_name)
9494
("${SDK}" STREQUAL "FREEBSD") OR
9595
("${SDK}" STREQUAL "ANDROID") OR
9696
("${SDK}" STREQUAL "WINDOWS") OR
97-
("${SDK}" STREQUAL "HAIKU"))
97+
("${SDK}" STREQUAL "HAIKU") OR
98+
("${SDK}" STREQUAL "WASI"))
9899
# No extra dependencies.
99100
else()
100101
message(FATAL_ERROR "Unknown SDK: ${SDK}")

utils/build-script

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -317,6 +317,14 @@ def apply_default_arguments(toolchain, args):
317317
args.stdlib_deployment_targets.append(
318318
StdlibDeploymentTarget.Android.aarch64.name)
319319

320+
if args.wasi:
321+
args.build_swift_static_stdlib = True
322+
args.build_dynamic_stdlib = False
323+
args.build_swift_static_sdk_overlay = True
324+
args.build_swift_dynamic_sdk_overlay = False
325+
args.stdlib_deployment_targets.append(
326+
StdlibDeploymentTarget.WASI.wasm32.name)
327+
320328
# Infer platform flags from manually-specified configure targets.
321329
# This doesn't apply to Darwin platforms, as they are
322330
# already configured. No building without the platform flag, though.
@@ -588,6 +596,8 @@ class BuildScriptInvocation(object):
588596
impl_args += ["--skip-build-watchos-simulator"]
589597
if not args.build_android:
590598
impl_args += ["--skip-build-android"]
599+
if not args.build_wasi:
600+
impl_args += ["--skip-build-wasi"]
591601
if not args.build_clang_tools_extra:
592602
impl_args += ["--skip-build-clang-tools-extra"]
593603

@@ -629,6 +639,8 @@ class BuildScriptInvocation(object):
629639
impl_args += ["--skip-test-android"]
630640
if not args.test_android_host:
631641
impl_args += ["--skip-test-android-host"]
642+
if not args.test_wasi:
643+
impl_args += ["--skip-test-wasi"]
632644
if args.build_runtime_with_host_compiler:
633645
impl_args += ["--build-runtime-with-host-compiler"]
634646
if args.validation_test:

utils/build-script-impl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,7 @@ KNOWN_SETTINGS=(
153153
skip-test-osx "" "set to skip testing Swift stdlibs for OS X"
154154
skip-test-tvos-host "" "set to skip testing the host parts of the tvOS toolchain"
155155
skip-test-tvos-simulator "" "set to skip testing Swift stdlibs for tvOS simulators (i.e. test devices only)"
156+
skip-test-wasi "" "set to skip testing Swift stdlibs for WebAssembly/WASI"
156157
skip-test-watchos-host "" "set to skip testing the host parts of the watchOS toolchain"
157158
skip-test-watchos-simulator "" "set to skip testing Swift stdlibs for Apple watchOS simulators (i.e. test devices only)"
158159
skip-test-benchmarks "" "set to skip running Swift Benchmark Suite"

utils/build_swift/build_swift/driver_arguments.py

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,9 @@ def _apply_default_arguments(args):
147147
if not args.android or not args.build_android:
148148
args.build_android = False
149149

150+
if not args.wasi or not args.build_wasi:
151+
args.build_wasi = False
152+
150153
# --test-paths implies --test and/or --validation-test
151154
# depending on what directories/files have been specified.
152155
if args.test_paths:
@@ -183,6 +186,7 @@ def _apply_default_arguments(args):
183186
args.test_tvos = False
184187
args.test_watchos = False
185188
args.test_android = False
189+
args.test_wasi = False
186190
args.test_swiftpm = False
187191
args.test_swiftsyntax = False
188192
args.test_indexstoredb = False
@@ -233,6 +237,12 @@ def _apply_default_arguments(args):
233237
if not args.test_android:
234238
args.test_android_host = False
235239

240+
if not args.build_wasi:
241+
args.test_wasi = False
242+
243+
if not args.test_wasi:
244+
args.test_wasi = False
245+
236246
if not args.host_test:
237247
args.test_ios_host = False
238248
args.test_tvos_host = False
@@ -326,6 +336,9 @@ def create_argument_parser():
326336
option('--android', toggle_true,
327337
help='also build for Android')
328338

339+
option('--wasi', toggle_true,
340+
help='also build for WebAssembly/WASI')
341+
329342
option('--swift-analyze-code-coverage', store,
330343
choices=['false', 'not-merged', 'merged'],
331344
# so CMake can see the inert mode as a false value
@@ -932,6 +945,9 @@ def create_argument_parser():
932945
option('--skip-build-android', toggle_false('build_android'),
933946
help='skip building Swift stdlibs for Android')
934947

948+
option('--skip-build-wasi', toggle_false('build_wasi'),
949+
help='skip building Swift stdlibs for WebAssembly/WASI')
950+
935951
option('--skip-build-benchmarks', toggle_false('build_benchmarks'),
936952
help='skip building Swift Benchmark Suite')
937953

@@ -988,6 +1004,10 @@ def create_argument_parser():
9881004
help='skip testing Android device targets on the host machine (the '
9891005
'phone itself)')
9901006

1007+
option('--skip-test-wasi',
1008+
toggle_false('test_wasi'),
1009+
help='skip testing all WebAssembly/WASI targets.')
1010+
9911011
option('--skip-test-swiftpm', toggle_false('test_swiftpm'),
9921012
help='skip testing swiftpm')
9931013
option('--skip-test-swiftsyntax', toggle_false('test_swiftsyntax'),
@@ -1011,7 +1031,7 @@ def create_argument_parser():
10111031
in_group('Build settings specific for LLVM')
10121032

10131033
option('--llvm-targets-to-build', store,
1014-
default='X86;ARM;AArch64;PowerPC;SystemZ;Mips',
1034+
default='X86;ARM;AArch64;PowerPC;SystemZ;Mips;WebAssembly',
10151035
help='LLVM target generators to build')
10161036

10171037
# -------------------------------------------------------------------------

utils/swift_build_support/swift_build_support/host_specific_configuration.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -243,6 +243,8 @@ def __platforms_to_skip_test(self, args):
243243
StdlibDeploymentTarget.AppleWatchSimulator)
244244
if not args.test_android:
245245
platforms_to_skip_test.add(StdlibDeploymentTarget.Android)
246+
if not args.test_wasi:
247+
platforms_to_skip_test.add(StdlibDeploymentTarget.WASI)
246248

247249
return platforms_to_skip_test
248250

utils/swift_build_support/swift_build_support/targets.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,8 @@ class StdlibDeploymentTarget(object):
158158

159159
Haiku = Platform("haiku", archs=["x86_64"])
160160

161+
WASI = Platform("wasi", archs=["wasm32"])
162+
161163
# The list of known platforms.
162164
known_platforms = [
163165
OSX,
@@ -169,7 +171,8 @@ class StdlibDeploymentTarget(object):
169171
Cygwin,
170172
Android,
171173
Windows,
172-
Haiku]
174+
Haiku,
175+
WASI]
173176

174177
# Cache of targets by name.
175178
_targets_by_name = dict((target.name, target)
@@ -233,6 +236,10 @@ def host_target():
233236
if machine == 'x86_64':
234237
return StdlibDeploymentTarget.Haiku.x86_64
235238

239+
elif system == 'WASI':
240+
if machine == 'wasm32':
241+
return StdlibDeploymentTarget.WASI.wasm32
242+
236243
raise NotImplementedError('System "%s" with architecture "%s" is not '
237244
'supported' % (system, machine))
238245

0 commit comments

Comments
 (0)