Description
Hi team, playing around with Emscripten in earnest for the first time, not my usual area of work so apologies if this is clearly never going to work. What I'd like to do is compile a simple Swift program to JS:
println("Hello, world!")
So far what I've tried is:
xcrun swift hello_world.swift -emit-bc -o hello_world.bc
emcc hello_world.bc
but that fails because it can't find certain symbols (looks like the standard library isn't present):
Value: %1 = call { i8*, i64, i64 } @_TFSS37_convertFromBuiltinUTF16StringLiteralfMSSFTBp17numberOfCodeUnitsBw_SS(i8* bitcast ([14 x i16]* @0 to i8*), i64 13)
LLVM ERROR: Unrecognized struct value
Traceback (most recent call last):
File "/Users/glen/Downloads/emsdk_portable/emscripten/1.16.0/emcc", line 1540, in <module>
shared.Building.llvm_opt(final, link_opts)
File "/Users/glen/Downloads/emsdk_portable/emscripten/1.16.0/tools/shared.py", line 1267, in llvm_opt
assert os.path.exists(target), 'Failed to run llvm optimizations: ' + output
AssertionError: Failed to run llvm optimizations:
Drilling a bit further, and looking at how xcrun swift -v hello_world.swift
actually works, I'm able to use this linking command to compile the bitcode to an executable using normal ld
.
cp /Applications/Xcode6-Beta.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/macosx/libswift_stdlib_core.dylib .
/usr/bin/ld hello_world.bc \
-lSystem -arch x86_64 \
-L . -rpath . \
-o hello_world
./hello_world
=> Hello, world!
So, it seems like libswift_stdlib_core.dylib
is the only dependency for hello_world.bc
to be properly linked to an executable.
But I'm stuck - is there some equivalent between the -L
and -rpath
flags on ld
that I should be passing to emcc
? Or is a dylib like that not possible to be used in emscripten? The final command I tried was:
> emcc libswift_stdlib_core.dylib hello_world.bc ~/src/experiments/swift.js • 2.1.0p0
WARNING root: emcc: cannot find library "swift_stdlib_core"
Value: %1 = call { i8*, i64, i64 } @_TFSS37_convertFromBuiltinUTF16StringLiteralfMSSFTBp17numberOfCodeUnitsBw_SS(i8* bitcast ([14 x i16]* @0 to i8*), i64 13)
LLVM ERROR: Unrecognized struct value
Traceback (most recent call last):
File "/Users/glen/Downloads/emsdk_portable/emscripten/1.16.0/emcc", line 1540, in <module>
shared.Building.llvm_opt(final, link_opts)
File "/Users/glen/Downloads/emsdk_portable/emscripten/1.16.0/tools/shared.py", line 1267, in llvm_opt
assert os.path.exists(target), 'Failed to run llvm optimizations: ' + output
AssertionError: Failed to run llvm optimizations:
Hopefully something's possible from here - Swift is a neat high-level language with a nice type system and no garbage collector, which makes me think it's a good fit for compiling to JS.