概要
emscriptenと関連ツールでHello worldするC++コードをWebAssembly向けにビルドする。
環境
- MacBook Pro OS X Yosemite
- Google Chrome Canary 51.0.2685.0 canary (64-bit)
準備
emsdk
emscripten、clang等々はこいつで一括して入れるのが楽。
Emscripten SDK (emsdk)から入手して、sdk-incoming-64bit
を入れる。
cd path/to/emsdk_portable
./emsdk update
./emsdk install sdk-incoming-64bit # 時間かかるよ
./emsdk activate sdk-incoming-64bit
binaryen
WebAssemblyに変換する各種ツール。emscriptenが内部でこれを使っている。
git clone https://github.com/WebAssembly/binaryen
cd binaryen
cmake . && make
~/.emscriptenにBINARYEN_ROOT='path/to/binaryen'
を追記。
sexpr-wasm
binaryenの各種ツールのなかの一つにwasm-as
という構文木(S式)をWebAssemblyのバイナリに変換するものがあるんだけど現状動かないのでそれの代替として使う。
git clone https://github.com/WebAssembly/sexpr-wasm-prototype
cd sexpr-wasm-prototype
git submodule update --init
make
ビルド
こんな感じのファイルを
#include <iostream>
int main() {
std::cout << "Hello World\n";
return 0;
}
ビルド。
emcc -O2 hello.cpp -o hello.html -s BINARYEN=1
# 現状emscriptenは構文木形式でしか吐き出してくれないのでここでバイナリに変換
path/to/sexpr-wasm-prototype/out/sexpr-wasm hello.wast -o hello.wasm
# hello.wasm.mappedGlobalsというのが必要なんだけどとりあえずコピーするだけ動く
cp hello.wast.mappedGlobals hello.wasm.mappedGlobals
python -m SimpleHTTPServer
とかしてみてください。
雑感
物がバイナリなので基本フェッチしないといけないのがめんどい。どうしても1ファイルにしたければ配列でいれる感じ。Wasm.instantiateModuleFromAsm
というのもあるのでそれを使うということ?(ちょっと試せてない)。
今回の方法でzlibも動いたので大体のものがいけそう。stableで動けば普通にプロダクトで使えると思う。