2017-10-10 73 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