search
LoginSignup
8

More than 5 years have passed since last update.

posted at

updated at

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

はじめに

ブラウザで動く高速なプログラムである 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:

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
8