WebAssembly用にClangをビルド
Windows で Clang のビルドをしたときのまとめです。最近では Clang+LLVM から直接 WebAssembly を出力できるようなったそうで、試してみたかったのですが、Windows 用のビルド方法の記事がほとんどなかったため、やったことをまとめました。といっても、CMake するだけです。
C/C++ を WebAssembly にコンパイルする方法として Emscripten が一般的ですが、ちょっとしたコードでも膨大なサイズのサポートライブラリがついてきてしまい、ちょっと不便なことが多いです。一方、最近では Clang+LLVM から直接 WebAssembly を出力できるようになったようで、これを使えば出力するコードを最小限に抑えられそうです。(標準ライブラリすらないのは難点ですが、それはそれで。)
環境は、Windows を想定しています。また、紹介する方法には以下のツールが必要です。
- Git
- CMake
- Visual Studio 2017 (2017 必須です )
この記事執筆時の各バージョンは以下のとおりです。
Clang | 9.0.0 |
LLVM | 7.0.1 |
コードをダウンロード
まずは、Git から必要なソースコードをダウンロードしてきます。
参考にしたサイトでは、libcxx を入れているのですが、もしかするといらないかもしれません。
さて、ダウンロードが終わったら以下のようなディレクトリ構造に配置します。このように配置しないと追加のツールがビルドされないため、注意が必要です。
llvm tools clang lld projects compiler-rt libcxx
CMake で VS のソリューションを出力
llvm フォルダの下に、build 等適当な名前のフォルダを作成し、そこに移動します。そして、CMake で Visual Studio 用のソリューションを出力します。ポイントは、LLVM_EXPERIMENTAL_TARGETS_TO_BUILD で WebAssembly 指定するところでしょうか?
出力がうまく行けば、build フォルダ下に LLVM.sln が出力されているはずです。なお、CMake ですので 2017 より前の VS でも行けそうですが、LLVM のソースコードが最新の? C++ で書かれているため、Visual Studio 2017 でないとコンパイルできませんでした。
Visual Studio でビルド
先程出力された LLVM.sln を VS2017 で開き、ビルド構成を Release に設定してビルドすれば完了です。これですんなり行きそうだったのですが、私の環境ですと、「clangBasic」というプロジェクトのビルドに失敗してしまいました。原因は、ヒープを使い切ってしまったというものでした。原因がよくわからなかったのですが、ひとまず最適化オプションを「/O2」から「/Ox」へ変更することでビルドは通りました。
ビルドがうまく行けば、
フォイルだにツール群が出力されているはずです。clang や wasm-ld あたりが出力されていれば問題ないはずです。ついでに WASM 周りのツールもビルド
これまでビルドしたツールで、WASM は出力できるのですが、これからいろいろと調べていく上で必要になりそうですので、WASM の変換周りのツール (WABT) も用意しておきます。
こちらも、CMake が用意されているので、Visual Stuido でコンパイルします。
あとは、出力されたソリューションをコンパイルすれば完了です。
まとめ
Windows 向けの WebAssembly 用のツール群のビルド方法を紹介しました。最近は、CMake が用意されているので、Windows でも簡単で助かります。
次は、C 言語のコードをコンパイルして、どのようなコードが出力されるのかを見ていこうと思います。また、Clang で直接作ると、malloc すらないため、このへんをどのように用意していこうかを、コードを見ながら考えていきたいと思います。