Skip to content

Commit 7c9ecc5

Browse files
build: Build Swift SDK for WebAssembly
This change adds a new product, WasmSwiftSDK, to build the Swift SDK for WebAssembly. The product is built using the swift-sdk-generator package and takes just built WebAssembly stdlib, clang runtime libraries, and wasi-sysroot as input, and produces a Swift SDK artifactbundle under swift-sdk-generator/Bundles.
1 parent 590c7cd commit 7c9ecc5

File tree

4 files changed

+101
-1
lines changed

4 files changed

+101
-1
lines changed

utils/swift_build_support/swift_build_support/build_script_invocation.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -686,6 +686,8 @@ def compute_product_pipelines(self):
686686
is_enabled=self.args.build_wasmstdlib)
687687
builder.add_product(products.WasmThreadsStdlib,
688688
is_enabled=self.args.build_wasmstdlib)
689+
builder.add_product(products.WasmSwiftSDK,
690+
is_enabled=self.args.build_wasmstdlib)
689691

690692
# Keep SwiftDriver at last.
691693
# swift-driver's integration with the build scripts is not fully

utils/swift_build_support/swift_build_support/products/__init__.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@
3939
from .tsan_libdispatch import TSanLibDispatch
4040
from .wasisysroot import WASILibc, WasmLLVMRuntimeLibs, WasmThreadsLLVMRuntimeLibs
4141
from .wasmkit import WasmKit
42-
from .wasmstdlib import WasmStdlib, WasmThreadsStdlib
42+
from .wasmstdlib import WasmStdlib, WasmSwiftSDK, WasmThreadsStdlib
4343
from .xctest import XCTest
4444
from .zlib import Zlib
4545

@@ -79,4 +79,5 @@
7979
'WasmStdlib',
8080
'WasmThreadsLLVMRuntimeLibs',
8181
'WasmThreadsStdlib',
82+
'WasmSwiftSDK',
8283
]

utils/swift_build_support/swift_build_support/products/wasmstdlib.py

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,11 @@
1414

1515
from . import cmake_product
1616
from . import llvm
17+
from . import product
1718
from . import swift
1819
from . import wasisysroot
1920
from . import wasmkit
21+
from .. import shell
2022

2123

2224
class WasmStdlib(cmake_product.CMakeProduct):
@@ -42,6 +44,7 @@ def build(self, host_target):
4244
self._build(host_target, 'wasm32-wasi')
4345

4446
def _build(self, host_target, target_triple):
47+
self.cmake_options.define('CMAKE_INSTALL_PREFIX:PATH', 'usr')
4548
self.cmake_options.define('CMAKE_BUILD_TYPE:STRING', self._build_variant)
4649
self.cmake_options.define(
4750
'SWIFT_STDLIB_BUILD_TYPE:STRING', self._build_variant)
@@ -206,3 +209,94 @@ def add_extra_cmake_options(self):
206209
'-Xcc;-mthread-model;-Xcc;posix;'
207210
'-Xcc;-pthread;-Xcc;-ftls-model=local-exec')
208211
self.cmake_options.define('SWIFT_ENABLE_WASI_THREADS:BOOL', 'TRUE')
212+
213+
214+
class WasmSwiftSDK(product.Product):
215+
@classmethod
216+
def product_source_name(cls):
217+
return "swift-sdk-generator"
218+
219+
@classmethod
220+
def is_build_script_impl_product(cls):
221+
return False
222+
223+
@classmethod
224+
def is_before_build_script_impl_product(cls):
225+
return False
226+
227+
def should_build(self, host_target):
228+
return self.args.build_wasmstdlib
229+
230+
def should_test(self, host_target):
231+
return False
232+
233+
def _target_package_path(self, target_triple):
234+
return os.path.join(self.build_dir, 'Toolchains', target_triple)
235+
236+
def _build_target_package(self, target_triple,
237+
stdlib_build_path, llvm_runtime_libs_build_path):
238+
239+
dest_dir = self._target_package_path(target_triple)
240+
shell.rmtree(dest_dir)
241+
shell.makedirs(dest_dir)
242+
243+
# Build toolchain package for standalone stdlib
244+
with shell.pushd(stdlib_build_path):
245+
shell.call([self.toolchain.cmake, '--install', '.'],
246+
env={'DESTDIR': dest_dir})
247+
248+
# Copy LLVM runtime libraries
249+
with shell.pushd(llvm_runtime_libs_build_path):
250+
clang_dest_dir = os.path.join(dest_dir, 'usr/lib/swift_static/clang')
251+
shell.call([self.toolchain.cmake, '--install', '.',
252+
'--component', 'clang_rt.builtins-wasm32'],
253+
env={'DESTDIR': clang_dest_dir})
254+
return dest_dir
255+
256+
def build(self, host_target):
257+
build_root = os.path.dirname(self.build_dir)
258+
llvm_runtime_libs_build_path = os.path.join(
259+
build_root, '%s-%s' % ('wasmllvmruntimelibs', host_target))
260+
261+
target_packages = []
262+
for target_triple, build_basename in [
263+
('wasm32-unknown-wasi', 'wasmstdlib'),
264+
# TODO: Enable threads stdlib once sdk-generator supports multi-target SDK
265+
# ('wasm32-unknown-wasip1-threads', 'wasmthreadsstdlib'),
266+
]:
267+
stdlib_build_path = os.path.join(
268+
build_root, '%s-%s' % (build_basename, host_target))
269+
package_path = self._build_target_package(
270+
target_triple, stdlib_build_path, llvm_runtime_libs_build_path)
271+
target_packages.append((target_triple, package_path))
272+
273+
swiftc_path = os.path.abspath(self.toolchain.swiftc)
274+
toolchain_path = os.path.dirname(os.path.dirname(swiftc_path))
275+
swift_run = os.path.join(toolchain_path, 'bin', 'swift-run')
276+
277+
swift_version = os.environ.get('TOOLCHAIN_VERSION',
278+
'swift-DEVELOPMENT-SNAPSHOT').lstrip('swift-')
279+
run_args = [
280+
swift_run,
281+
'--package-path', self.source_dir,
282+
'--build-path', self.build_dir,
283+
'swift-sdk-generator',
284+
'make-wasm-sdk',
285+
'--wasi-sysroot', wasisysroot.WASILibc.sysroot_install_path(build_root),
286+
'--swift-version', swift_version,
287+
]
288+
for target_triple, package_path in target_packages:
289+
run_args.extend(['--target', target_triple])
290+
run_args.extend(['--target-swift-package-path', package_path])
291+
292+
shell.call(run_args)
293+
294+
def test(self, host_target):
295+
pass
296+
297+
def should_install(self, host_target):
298+
return False
299+
300+
@classmethod
301+
def get_dependencies(cls):
302+
return [WasmStdlib, WasmThreadsStdlib]

utils/update_checkout/update-checkout-config.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,8 @@
8383
"remote": { "id": "apple/swift-nio-ssl" } },
8484
"swift-experimental-string-processing": {
8585
"remote": { "id": "apple/swift-experimental-string-processing" } },
86+
"swift-sdk-generator": {
87+
"remote": { "id": "apple/swift-sdk-generator" } },
8688
"swift-llvm-bindings": {
8789
"remote": { "id": "apple/swift-llvm-bindings" } },
8890
"llvm-project": {
@@ -149,6 +151,7 @@
149151
"swift-markdown": "main",
150152
"swift-nio": "2.31.2",
151153
"swift-experimental-string-processing": "swift/main",
154+
"swift-sdk-generator": "main",
152155
"wasi-libc": "wasi-sdk-20",
153156
"wasmkit": "0.0.3",
154157
"curl": "curl-8_5_0",

0 commit comments

Comments
 (0)