14
14
15
15
from . import cmake_product
16
16
from . import llvm
17
+ from . import product
17
18
from . import swift
18
19
from . import wasisysroot
19
20
from . import wasmkit
21
+ from .. import shell
20
22
21
23
22
24
class WasmStdlib (cmake_product .CMakeProduct ):
@@ -42,6 +44,7 @@ def build(self, host_target):
42
44
self ._build (host_target , 'wasm32-wasi' )
43
45
44
46
def _build (self , host_target , target_triple ):
47
+ self .cmake_options .define ('CMAKE_INSTALL_PREFIX:PATH' , 'usr' )
45
48
self .cmake_options .define ('CMAKE_BUILD_TYPE:STRING' , self ._build_variant )
46
49
self .cmake_options .define (
47
50
'SWIFT_STDLIB_BUILD_TYPE:STRING' , self ._build_variant )
@@ -206,3 +209,94 @@ def add_extra_cmake_options(self):
206
209
'-Xcc;-mthread-model;-Xcc;posix;'
207
210
'-Xcc;-pthread;-Xcc;-ftls-model=local-exec' )
208
211
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 ]
0 commit comments