WebAssembly用にClangをビルド

Windows で Clang のビルドをしたときのまとめです。最近では Clang+LLVM から直接 WebAssembly を出力できるようなったそうで、試してみたかったのですが、Windows 用のビルド方法の記事がほとんどなかったため、やったことをまとめました。といっても、CMake するだけです。


C/C++ を WebAssembly にコンパイルする方法として Emscripten が一般的ですが、ちょっとしたコードでも膨大なサイズのサポートライブラリがついてきてしまい、ちょっと不便なことが多いです。一方、最近では Clang+LLVM から直接 WebAssembly を出力できるようになったようで、これを使えば出力するコードを最小限に抑えられそうです。(標準ライブラリすらないのは難点ですが、それはそれで。)

環境は、Windows を想定しています。また、紹介する方法には以下のツールが必要です。

  • Git
  • CMake
  • Visual Studio 2017 (2017 必須です )

この記事執筆時の各バージョンは以下のとおりです。

表1: ビルド対象のバージョン
Clang9.0.0
LLVM7.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」へ変更することでビルドは通りました。

ビルドがうまく行けば、 [build] - [Release] - [bin] フォイルだにツール群が出力されているはずです。clang や wasm-ld あたりが出力されていれば問題ないはずです。

ついでに WASM 周りのツールもビルド

これまでビルドしたツールで、WASM は出力できるのですが、これからいろいろと調べていく上で必要になりそうですので、WASM の変換周りのツール (WABT) も用意しておきます。

こちらも、CMake が用意されているので、Visual Stuido でコンパイルします。

あとは、出力されたソリューションをコンパイルすれば完了です。

まとめ

Windows 向けの WebAssembly 用のツール群のビルド方法を紹介しました。最近は、CMake が用意されているので、Windows でも簡単で助かります。

次は、C 言語のコードをコンパイルして、どのようなコードが出力されるのかを見ていこうと思います。また、Clang で直接作ると、malloc すらないため、このへんをどのように用意していこうかを、コードを見ながら考えていきたいと思います。