2014-06-10 12 views
6

Dato il più semplice dei file veloci:Come arrivare Ciao Word compilazione da Swift a JavaScript utilizzando Emscripten

println("lol") 

E 'banale per eseguire questo sulla riga di comando con xcrun swift -i lol.swift o compilare ad un eseguibile con xcrun swift lol.swift -o lol, ma come su una semplice dimostrazione di concetto per emscripten?

Non ho usato emscripten in precedenza, ma ho ottenuto un esempio di ciao mondo usando C++ funzionante da http://kripken.github.io/emscripten-site/docs/getting_started/Tutorial.html e volevo compilare anche il mio codice Swift.

ho cercato

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

Ma ottenere

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: 

Pensieri?

risposta

3

Il problema è che LLVM non riesce a trovare tipi/simboli, utilizzati in quella chiamata, durante il processo di collegamento. Questi simboli sono molto probabilmente specifici per la struttura rapida. Se esegui emcc con l'opzione -v, puoi ottenere ulteriori informazioni di debug. Potresti considerare di fornire anche --llvm-opts a suggerire dove trovare tali informazioni.

Ho eseguito xcrun swift -v test.swift per vedere quale comando viene effettivamente eseguito.

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 

Si potrebbe considerare esplorare come applicare queste opzioni di collegamento per emscripten per ottenere quello che vuoi. Non ci sarà alcuna documentazione su questo, perché non penso che abbiano intenzione di essere usati in questo modo.

2

Secondo this GitHub issue hai archiviato sul repo Emscripten, ciò che si sta cercando di fare non è possibile:

Purtroppo non è possibile collegare i file .dylib a Emscripten. Il motivo è che i .dylibs contengono già il codice macchina nativo per x86/x64, e Emscripten non può "tornare indietro" e ottenere di nuovo il modulo IR LLVM.

- juj (utente GitHub), sulla 2014-06-14