はじめに
ブラウザで動く高速なプログラムである WebAssembly がついに Chrome で正式に対応しました。
これを機に Rust も書いてみようかな、と Rust で WebAssembly を書くために、まずはビルド環境を構築したかったのですが、あまりうまくいきませんでした。
Docker でビルドしたかった
最初に参考にした記事はこちらです。
Rustで書いたWebAssemblyでフィボナッチを計算したらJSより3倍速かった
http://qiita.com/akira_/items/55cf1f5911b14e265c6f
この記事では Docker を使って WebAssembly をビルドしていたのですが、Chrome が WebAssembly に正式対応したためビルドがうまくいかなくなってしまったそうです。そんなわけで私も以下のような Dockerfile を適当に書いてビルドしてみようとしました。
FROM ubuntu:16.04
RUN apt-get update && \
apt-get install -y curl \
build-essential \
git \
curl \
cmake \
python
RUN cd /tmp/ && \
curl https://sh.rustup.rs -sSf | sh -s -- --default-toolchain nightly -y && \
export PATH="$PATH:/root/.cargo/bin" && \
rustup install stable && \
rustup default stable && \
rustup target add wasm32-unknown-emscripten
RUN curl -sL https://s3.amazonaws.com/mozilla-games/emscripten/releases/emsdk-portable.tar.gz | tar xz
WORKDIR /emsdk-portable
RUN ./emsdk update-tags && \
./emsdk install sdk-incoming-64bit && \
./emsdk activate sdk-incoming-64bit && \
source ./emsdk_env.sh
が、どうも ./emsdk install sdk-incoming-64bit
がメモリ不足のためコケてしまいました。https://docs.docker.com/engine/admin/resource_constraints/#memory あたりを参考にすれば Docker コンテナに割り当てるメモリをいじれるのでなんとかなりそうでしたが、そもそも
Docker の依存イメージかなにかの関係で Docker 関連ファイルが 40GB 近くできてしまい、私の
Mac の SSD をかなり圧迫していました。そのため、Docker イメージをビルドするのは諦めました。
Vagrant でビルドした
Mac に直接 rust などをインストールするのもアリといえばアリなのですが、一応開発環境をわけておきたいので Vagrant を使うことにしました。
box の用意
普段はなんとなく使い慣れているので CentOS 6.x を使っているのですが、Cent OS 6.x では gcc や cmake のバージョンが古く、emsdk
のビルドがうまくいかず、消耗を強いられました。(加えて仮想マシンのストレージが足りなくなってしまい、ストレージを増やすための作業にも消耗しました。)
なので、新たに別の box を作ることにしました。
$ vagrant box add Ubuntu14.04 https://cloud-images.ubuntu.com/vagrant/trusty/current/trusty-server-cloudimg-amd64-vagrant-disk1.box
として新たに box を追加し、vagrant init
で設定ファイルを作りました。以下が Vagrantfile
の抜粋です。
# -*- mode: ruby -*-
# vi: set ft=ruby :
Vagrant.configure(2) do |config|
config.vm.box = "Ubuntu14.04"
config.vm.provider "virtualbox" do |vb|
vb.memory = "2048"
end
config.vm.provision "shell", path: "increase_swap.sh"
end
メモリを 2GB 割り当てていることに注意してください。実はメモリは 2GB でも足りず、4GB 割り当ててみても足りないと言われてしまいました。なので、 config.vm.provision "shell", path: "increase_swap.sh"
で Swap を 4GB ほど追加することにしました。 Swap の追加の方法については、以下の記事の手順にそのまま従えば OK です。
VagrantでUbuntuにSwapを4GBほど追加したい
http://qiita.com/suin/items/c30cb302043aa5cd041f
vagrant up
を実行した際に下図のようなメッセージがでなければ、vagrant ssh
をする前に vagrant provision
を実行しておきましょう。
ビルドツールのインストール
いろいろ
後で諸々をビルドするのに以下のパッケージが必要でした。
sudo apt-get install build-essential git
cmake
cmake
も emsdk
のビルドには必要なのですが、apt-get
でインストールできるものだとバージョンが古く使い物にならなかったので、泣く泣くソースからビルドすることにしました。以下の記事を参考に、3.8.0-rc4
をインストールしました。何も考えずに以下の記事のコマンドをコピペしてインストールできる cmake
はバージョンが古い!注意しよう!!!!
具体的には wget https://cmake.org/files/v3.8/cmake-3.8.0-rc4.tar.gz
とすれば OK です。
Ubuntu に cmake を install する。
http://qiita.com/YutakakINJO/items/69f01d2abfb958ada88b
Rust や emsdk などをインストール
あとはこれらの記事に従えばよいでしょう。
RustからWebAssemblyにコンパイルしてみる
http://suzumi.hatenablog.com/entry/2017/01/05/180405
Compiling Rust to WebAssembly Guide
https://hackernoon.com/compiling-rust-to-webassembly-guide-411066a69fde
作業環境
macOS Sierra v10.12.4
Vagrant 1.8.1
最後に
emsdk
のバイナリだれか配布して