Как получить компиляцию Hello Word из Swift в JavaScript с помощью Emscripten

Учитывая простейший из быстрых файлов:

println("lol")

Тривиально запустить это в командной строке с помощью xcrun swift -i lol.swift или скомпилировать в исполняемый файл с помощью xcrun swift lol.swift -o lol, но как насчет простого доказательства концепции для emscripten?

Раньше я не использовал emscripten, но получил пример приветствия, использующий C++, работающий с http://kripken.github.io/emscripten-site/docs/getting_started/Tutorial.html и также хотел скомпилировать свой код Swift.

Я попытался

xcrun swift lol.swift -emit-bc -o lol.bc
emcc lol.bc

Но получить

Value:   %1 = call { i8*, i64, i64 } @_TFSS37_convertFromBuiltinUTF16StringLiteralfMSSFTBp17numberOfCodeUnitsBw_SS(i8* bitcast ([4 x i16]* @0 to i8*), i64 3)
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:

Мысли?


person geelen    schedule 10.06.2014    source источник


Ответы (2)


Проблема в том, что LLVM не может найти типы/символы, используемые в этом вызове, в процессе связывания. Эти символы, скорее всего, специфичны для Swift Framework. Если вы запустите emcc с параметром -v, вы можете получить больше отладочной информации. Вы можете также рассмотреть возможность указания --llvm-opts, где можно найти эту информацию.

Я запустил xcrun swift -v test.swift, чтобы посмотреть, какая команда на самом деле выполняется.

Swift version 1.0 (swift-600.0.34.4.5)
Target: x86_64-apple-darwin13.2.0
/Applications/Xcode6-Beta.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift -frontend -c -primary-file test.swift -enable-objc-attr-requires-objc-module -target x86_64-apple-darwin13.2.0 -module-name test -color-diagnostics -o     /var/folders/69/l9w0zkqn38s1td4_gm5c__km0000gn/T/test-d800d3.o
/usr/bin/ld /var/folders/69/l9w0zkqn38s1td4_gm5c__km0000gn/T/test-d800d3.o -force_load /Applications/Xcode6-Beta.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/arc/libarclite_macosx.a -lSystem -arch x86_64 -L /Applications/Xcode6-Beta.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/macosx -rpath /Applications/Xcode6-Beta.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/macosx -macosx_version_min 10.9.0 -no_objc_category_merging -o test

Вы можете подумать о том, как применить эти параметры связывания к emscripten, чтобы получить то, что вы хотите. Документации по этому поводу не будет, потому что я не думаю, что они планировали использовать Swift таким образом.

person wbennett    schedule 10.06.2014

Согласно этой проблеме GitHub, которую вы отправили в репозиторий Emscripten, то, что вы пытаетесь сделать, невозможно:

К сожалению, невозможно связать файлы .dylib с Emscripten. Причина этого в том, что .dylibs уже содержит собственный машинный код для x86/x64, и Emscripten не может «вернуться назад» и снова передать его в форму LLVM IR.

-- juj (пользователь GitHub), в 14 июня 2014 г.

person erikprice    schedule 31.07.2014