windowsでemscriptenを動かす

インストール

こちらのURLからインストーラをDL、最初 Emscripten SDK Web Installer で試してみたがうまくインストール出来なかったので、Emscripten SDK Offline Installer を利用

これでインストールすると、clangやpythonなど必要なものは一式揃えてくれるらしい

執筆時点でこのページからDL出来る最新バージョンは1.35.0だった

Download and install — Emscripten 1.38.6 documentation

DLが完了したらインストーラの指示に従ってインストールを待つ

バージョンアップデート

DLした時点では1.35.0だが、最新バージョンは1.37.9(2017/04/10時点)なのでアップデートをする

デフォルトでは /c/Program Files/Emscripten にインストールされているはずなので移動しておく

cd '/c/Program Files/Emscripten'

現在のバージョンを確認する

以下のコマンドで現在インストールされている物の一覧がでるので、この時点で最新のものがインストールされている場合はアップデート不要

$ ./emsdk list

出力例(一部(既に1.37.9にアップデート済み))

(*)は現在アクティブなパッケージ

The following precompiled tool packages are available for download:
           clang-nightly-e1.37.9-2017_04_03_22_10-64bit
           clang-nightly-e1.37.9-2017_04_03_23_59-64bit
           clang-e1.30.0-64bit
           clang-e1.34.1-64bit
           clang-e1.35.0-64bit          INSTALLED
           clang-e1.37.1-64bit
           clang-e1.37.8-64bit
    (*)    clang-e1.37.9-64bit          INSTALLED
           node-4.1.1-32bit
    (*)    node-4.1.1-64bit             INSTALLED
           python-2.7.5.3-32bit
    (*)    python-2.7.5.3-64bit         INSTALLED
           java-7.45-32bit
    (*)    java-7.45-64bit              INSTALLED

emsdk経由で最新のパッケージをDL

以下のコマンドで最新のパッケージをDLする

$ ./emsdk update

出力例

Downloading: c:/Program Files/Emscripten/zips/emsdk_windows_update.zip from https://s3.amazonaws.com/mozilla-games/emscripten/packages/emsdk_windows_update.zip
Unpacking 'c:/Program Files/Emscripten/zips/emsdk_windows_update.zip' to 'c:/Program Files/Emscripten'
Fetching all tags from Emscripten Github repository...
Done. 96 tagged releases available, latest is 1.37.9.

インストール

以下のコマンドで最新のパッケージをインストール

$ ./emsdk install latest

最新バージョンをactivate

環境変数にもろもろ登録するのを一発でやってくれる

実行中のシェルに登録するパターンとOSの環境変数に設定するパターンがあるらしいが、今回はOSの環境変数に設定する(JAVA_HOME等も設定されるため実行する際は注意して)

不安な場合は自分で環境変数に設定しよう

以下のコマンドで必要な環境変数を設定してくれる

$ ./emsdk activate latest --global

しかし実行したところ以下のエラー

Failed to read environment variable PATH:
No module named win32api
Traceback (most recent call last):
  File "./emsdk", line 2149, in <module>
    sys.exit(main())
  File "./emsdk", line 2092, in main
    tools_to_activate = set_active_tools(tools_to_activate, permanently_activate=permanently_activate)
  File "./emsdk", line 1675, in set_active_tools
    env_string = construct_env(tools_to_activate, False)
  File "./emsdk", line 1755, in construct_env
    newpath, added_path = adjusted_path(tools_to_activate)
  File "./emsdk", line 1725, in adjusted_path
    existing_path = win_get_environment_variable('PATH', system=True)
  File "./emsdk", line 183, in win_get_environment_variable
    win32api.RegCloseKey(folder)
UnboundLocalError: local variable 'win32api' referenced before assignment

pywin32というモジュールが入っていないので、環境変数を書き換えれない様子。

↓からDLしてpython2.7の物をインストール

https://sourceforge.net/projects/pywin32/

こちらも、インストーラの指示に従えばOK

インストール完了後に再度↓を実行すればうまくいくはず、実行した時点で確認もなく書き換わるので注意

$ ./emsdk activate latest --global

ここまでできたら一度PCを再起動しておく

動作確認

ためしに適当なC++ソースを動かしてみる

↓を main.cpp なんかに保存しておく

#include <iostream>
#include <string>

using namespace std;

int main()
{
    string str = "はじめまして";
    cout << str << endl;
    return 0;
}

以下のコマンドでコンパイル

一度目はlibcのキャッシュが無いのでコンパイルに時間がかかる

$ emcc -o main.html main.cpp

コンパイルが通れば同じディレクトリに main.html が作られているので開いてみる

f:id:kaneta1011:20170410235416p:plain

動いた