Rust で WebAssembly を書くための環境構築で消耗した話

# はじめに
ブラウザで動く高速なプログラムである WebAssembly がついに Chrome で正式に対応しました。

<img width="805" alt="スクリーンショット 2017-04-03 21.24.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/106258/ff6a2f6e-8e9a-36b9-799b-a4290de01f30.png">

これを機に Rust も書いてみようかな、と Rust で WebAssembly を書くために、まずはビルド環境を構築したかったのですが、あまりうまくいきませんでした。

# Docker でビルドしたかった
最初に参考にした記事はこちらです。

> Rustで書いたWebAssemblyでフィボナッチを計算したらJSより3倍速かった
http://qiita.com/akira_/items/55cf1f5911b14e265c6f

この記事では Docker を使って　WebAssembly をビルドしていたのですが、Chrome が WebAssembly に正式対応したためビルドがうまくいかなくなってしまったそうです。そんなわけで私も以下のような Dockerfile を適当に書いてビルドしてみようとしました。

```text:Dokerfile
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 を作ることにしました。

```bash:bash
$ vagrant box add Ubuntu14.04 https://cloud-images.ubuntu.com/vagrant/trusty/current/trusty-server-cloudimg-amd64-vagrant-disk1.box
```

として新たに box を追加し、`vagrant init` で設定ファイルを作りました。以下が `Vagrantfile` の抜粋です。

```ruby: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 割り当ててみても足りないと言われてしまいました:rage::rage:。なので、 `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` を実行しておきましょう。

<img width="682" alt="スクリーンショット 2017-04-04 00.33.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/106258/3d73199b-218e-d2ea-094c-907bdfe36d7b.png">

 

## ビルドツールのインストール
### いろいろ
後で諸々をビルドするのに以下のパッケージが必要でした。

```bash:bash
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` のバイナリだれか配布して :pray: :pray: :pray: