Rust 编译到 Web 平台 - 哆啦比猫's Blog - I'm an ArchLinuxer

Rust 编译到 Web 平台

哆啦比猫 posted @ 2017年10月05日 17:59 in Rust with tags Rust WebAssembly Linux , 774 阅读

本文简单介绍如何把 Rust 程序编译到 WebAssembly,从而在浏览器里运行。网上虽然有一些类似的文章,但都是基于 macOS 命令行的。macOS 就是喜欢把简单的事情搞复杂(果然正统 UNIX 都是垃圾)。本文以 Arch Linux 为中心介绍如何配置环境。

# pacman -S rustup emscripten

老规矩,# 开头表示以 root 权限执行,$ 开头表示以普通用户权限执行。

这里从源里安装了 Rustup,这样做有一大好处,就是不用设置 PATH。To set PATH in .bashrc or .bash_profile or .zshrc or $XDG_CONFIG_HOME/fish/config.fish or even /etc/profile.d/*.sh: that is the question. 至于为什么可以不设置 PATH:

$ which rustc
/usr/bin/rustc

$ ll /usr/bin/rustc
Permissions Size User Group Date Modified    Name
lrwxrwxrwx    15 root root  2017-09-02 01:38 /usr/bin/rustc -> /usr/bin/rustup

Emscripten 自然也要设置一堆环境变量。emscripten 包已经自动设置了,就在 /etc/profile.d/emscripten.sh 里。重新登录使其生效。

接着就是配好 Rust 工具链然后编译了(所有国外的东西,一旦有下载都可能要梯子, 我就不强调了):

$ rustup update stable      # 笔者此时是 Rust 1.20
$ rustup target add wasm32-unknown-emscripten

$ cargo init --bin hello    # 创建空可执行项目,内置输出 hello world 的功能
$ cd hello
$ rustc --target=wasm32-unknown-emscripten src/main.rs -o main.html

调用 rustc 时会调用 Emscripten 里的 emcc,如果是第一次运行会下载一些东西(笔者此时是 emscripten port binaryen 37)。如果你下载的也是这个版本, 在 rustc 过程中会出错。循着错误找到对应文件,人肉打补丁:https://github.com/WebAssembly/binaryen/pull/1196

最后就是运行了。由于生成的 js 脚本是通过 AJAX (Fetch API) 载入 wasm 的,必须有服务器才能运行。好在 Emscripten 自带服务器:

$ emrun main.html

该命令启动服务器并打开默认浏览器。然后就可以看到屏幕中间出现黑底白字 “Hello, world!” 了。

展望


凡未特殊声明(转载/翻译),所有文章均为原创。
by Giumo Xavier Clanjor (哆啦比猫/兰威举), 2010, 2011, 2012, 2013, 2014, 2015-2016 and 2017.
知识共享许可协议本作品采用知识共享署名·非商业性使用·相同方式共享 3.0 中国大陆许可协议进行许可。
文中凡未特殊声明且未声明为引用的代码均以 MIT 协议授权。

blog comments powered by Disqus
© 2010, 2011, 2012, 2013, 2014, 2015-2016 and 2017 Giumo Xavier Clanjor (哆啦比猫/兰威举).
© 2013, 2014, 2015-2016 and 2017 The Dark Colorscheme Designed by Giumo Xavier Clanjor (哆啦比猫/兰威举).
知识共享署名·非商业性使用·相同方式共享 3.0 中国大陆许可协议
| © 2007 LinuxGem | Design by Matthew "Agent Spork" McGee