Rust
Vagrant
WebAssembly

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

More than 1 year has passed since last update.


はじめに

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

スクリーンショット 2017-04-03 21.24.42.png

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


Docker でビルドしたかった

最初に参考にした記事はこちらです。


Rustで書いたWebAssemblyでフィボナッチを計算したらJSより3倍速かった

http://qiita.com/akira_/items/55cf1f5911b14e265c6f


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


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

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


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


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 を実行しておきましょう。

スクリーンショット 2017-04-04 00.33.16.png


ビルドツールのインストール


いろいろ

後で諸々をビルドするのに以下のパッケージが必要でした。


bash

sudo apt-get install build-essential git



cmake

cmakeemsdk のビルドには必要なのですが、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: