2017-10-10 107 views
5

我可以通過運行emcc -O3 -s WASM=1 -s SIDE_MODULE=1 -o sum.wasm sum.c從以下C代碼生成相當小的(203字節)wasm文件。如何使用Rust生成最小化的wasm文件?

#include <emscripten/emscripten.h> 

int EMSCRIPTEN_KEEPALIVE sum(int a, int b) { 
    return a + b; 
} 

拆輸出:

(module 
(type $0 (func (param i32 i32) (result i32))) 
... trim 9 lines ... 
(export "_sum" (func $0)) 
(func $0 (type $0) (param $var$0 i32) (param $var$1 i32) (result i32) 
    (i32.add 
    (get_local $var$1) 
    (get_local $var$0) 
) 
) 
... trim 17 lines ... 
) 

但考慮到以下鏽代碼

pub fn main() {} 

#[no_mangle] 
pub extern fn sum(a: i32, b: i32) -> i32 { 
    a + b 
} 

我似乎無法產生類似的事情。

rustc -O --target=wasm32-unknown-emscripten sum.rs作品,但給我一個85k wasm文件和一個128k js文件。

我已經試過出口EMMAKEN_CFLAGS='-s WASM=1 -s SIDE_MODULE=1'但是,讓我像

輸入文件中的一些警告「/tmp/.../rust.metadata.bin」的存在,但並不適合一個LLVM位碼文件爲Emscripten。也許意外地將本機構建的目標文件與Emscripten混合?

然後無法鏈接。

我的鐵鏽版本是1.22.0-nightly (c6884b12d 2017-09-30),我的emcc版本是1.37.21

我在做什麼錯?

+0

哈,搜索的一個星期,我覺得沒有什麼:

這一目標可以作爲setup guide描述中使用。然後幾分鐘後發佈這個問題,我發現[這](https://gist.github.com/LukasKalbertodt/821ab8b85a25f4c54544cc43bed2c39f)可能會回答它。一旦我測試出來,會報告回來。 – zakm

+0

在[此文件](https://github.com/rust-lang/rust/blob/0defa208dcb5a0f3c1ca5bc4df7acf52759ece44/src/librustc_back/target/wasm32_unknown_emscripten.rs)幾乎所有關於Rust的emscripten目標都已定義。和[這裏](https://github.com/rust-lang/rust/blob/b2f67c8d5676d13d83523316ac95a7056dbd19c6/src/librustc_back/target/mod.rs),評論說可以通過編寫一個JSON文件來添加目標(不需要重新編譯) rustc!)。所以你可以嘗試添加一個自定義目標,它將'SIDE_MODULE'標誌傳遞給emcc。我會寫一個適當的答案,但我現在沒有時間。對不起:< –

回答

3

對於wasm32-unknown-emscripten目標,您使用的是基於Emscripten的編譯工具鏈。 Emscripten將相當多的運行時代碼添加到wasm模塊中,以及用於在運行時與其進行集成的其他JavaScript代碼。正如你所觀察到的,Emscripten可以編譯一個SIDE_MODULE選項,該選項可以刪除絕大多數這個運行時代碼。這會減少wasm二進制大小,但意味着您必須自己處理諸如綁定複雜類型的事情。

最近(2017年11月)新的wasm32-unknown-unknown target was added to Rust,它使用LLVM後端(而不是Emscripten及其fastcomp fork),從而實現最小的輸出。

rustup update 
rustup target add wasm32-unknown-unknown --toolchain nightly 
rustc +nightly --target wasm32-unknown-unknown -O hello.rs 
+0

我剛剛發現,有圍繞這個概念構建的工具包https://github.com/dcodeIO/webassembly – ColinE

+0

@Shepmaster公平點 - 我已經完全重寫了答案 – ColinE