2016年02月18日
LLVM/Clang 3.7.1をMSYS2でビルド
MSYS2 を試してみた所、LLVM/Clang が比較的簡単にビルドできましたので紹介します。以前紹介した、VisualStudio でビルドする場合と比較すると、
- LLVM/Clang のビルドに必要な、GCC、CMake、Python、GNU Make などの各種 GNU ツールが、Linux の APT や Yum のようなパッケージマネージャ(MSYS2 は Arch Linux の pacman を採用)でインストールできるので、環境構築や管理が楽。
- VisualStudio は比較的大きく、有償(無料の Express エディションもありますが、常用には登録が必要)のソフトウェアなので、比較的コンパクトで自由なソフトウェアである MSYS2 の方が色々楽。
- GNU 環境のコマンドライン操作に慣れている人には、MSYS2 の方が楽。
(1) MSYS2 のインストール
従来の MSYS は、MinGW とセットでインストールして使うようなイメージでしたが、MSYS2 はむしろモダンな Linux や Cygwin に近い環境となっています。最初に MSYS2 をインストールし、pacman パッケージマネージャを使用して、MinGW-w64(64bit 対応など、様々な所がモダンになった MinGW の後継のようなプロジェクト)等のツールをインストールするという流れになります。
公式サイト:MSYS2 A Cygwin-derived software distro for Windows using Arch Linux's Pacman
今回は VMWare 上のまっさらな 64bit Windows 7 イメージを使用し、msys2-x86_64-20160205.exe インストーラを使用してインストールしました。インストール場所は C:\msys64(デフォルト)で、他の設定項目も全てデフォルトでインストールしました。
インストール完了後、スタートメニューから MSYS2 64bit > MSYS2 Shell を起動します。MSYS2 Shell(mintty.exe) が立ち上がるので、ベースシステムのアップデートを行います。
(2) 32/64bit 共通ツールのインストール
基本的な開発ツールをインストールします。
MSYS2 には、MSYS2 Shell(共通ツール)/MinGW-w64 Win32 Shell(32bit ツール)/MinGW-w64 Win64 Shell(64bit ツール)という 3 種類のツールがあり、ややこしいのですが、ここまでにインストールしたツールは、全ての環境で使用可能です。(他の 2 つの環境の違いは、/mingw32/bin と /mingw64/bin の、どっちに PATH が通っているかだけのようです。)
ちなみに、3 つの環境、それぞれに GCC や cmake 等の開発ツールが存在し、ややこしいのですが、以下のような違いがあります。
今回は 32bit のツールを使用します。64bit のツールを使用したい場合は、この (3) の説明の i686 を、全て x86_64 に置き換えてインストールし、(4) 以降は Win64 Shell 環境で作業をしてください。
MinGW-w64 32bit をインストールします。
以後の作業は、/mingw32/bin に PATH が通った、MinGW-w64 Win32 Shell 環境で行います。 (最初から全部 Win32 Shell で行っても問題無いと思いますが、32/64bit になるべく依存しない説明にするため、明確に切り分けました。)
(4) LLVM/Clang のソースコードを準備
MSYS2 の tar で clang のソース(cfe)を展開すると、エラーが出ましたが、どうも Linux 関係のシンボリックリンクが上手く展開できないようです。7-Zip などの外部ツールでもエラーが出るので、これはまあ問題無いと判断しました。
ビルドは build で行い、install にインストールします。また、今回は X86 バックエンド(32bit/64bit)のみをビルドします。
(6) せっかくなので C++14 を試してみる。
Clang は独立したツールチェーンでは無く、また生粋のクロスコンパイラなので、target オプションで間借りするツールチェーンをちゃんと指定する必要があります。(これを忘れて、しばらく悩みました。)
Clang をインストールした場所に PATH を通します。
C++14 を指定しないとエラー、指定するとと無事に動作することが確認できました。
従来の MSYS は、MinGW とセットでインストールして使うようなイメージでしたが、MSYS2 はむしろモダンな Linux や Cygwin に近い環境となっています。最初に MSYS2 をインストールし、pacman パッケージマネージャを使用して、MinGW-w64(64bit 対応など、様々な所がモダンになった MinGW の後継のようなプロジェクト)等のツールをインストールするという流れになります。
公式サイト:MSYS2 A Cygwin-derived software distro for Windows using Arch Linux's Pacman
今回は VMWare 上のまっさらな 64bit Windows 7 イメージを使用し、msys2-x86_64-20160205.exe インストーラを使用してインストールしました。インストール場所は C:\msys64(デフォルト)で、他の設定項目も全てデフォルトでインストールしました。
インストール完了後、スタートメニューから MSYS2 64bit > MSYS2 Shell を起動します。MSYS2 Shell(mintty.exe) が立ち上がるので、ベースシステムのアップデートを行います。
$ update-core今回はインストーラが最新だったためか、アップデートは無かったのですが、一応、MSYS2 Shell を一度終了して(右上の × ボタンをクリック)、また起動しました。続いて、インストール済みのパッケージのアップデートを行います。
$ pacman -Suこちらも同様にアップデートはありませんでしたが、一応また再起動します。
(2) 32/64bit 共通ツールのインストール
基本的な開発ツールをインストールします。
$ pacman -S base-develインストールされるパッケージの確認や、インストールの確認がされますが、そのまま Enter、Enter で進めてください。これらは 32/64bit 共通ツールなので、/usr/bin あたりにインストールされるようです。
MSYS2 には、MSYS2 Shell(共通ツール)/MinGW-w64 Win32 Shell(32bit ツール)/MinGW-w64 Win64 Shell(64bit ツール)という 3 種類のツールがあり、ややこしいのですが、ここまでにインストールしたツールは、全ての環境で使用可能です。(他の 2 つの環境の違いは、/mingw32/bin と /mingw64/bin の、どっちに PATH が通っているかだけのようです。)
ちなみに、3 つの環境、それぞれに GCC や cmake 等の開発ツールが存在し、ややこしいのですが、以下のような違いがあります。
- MSYS2 Shell: MSYS2 自体を開発(ビルド)する際に使用するツールです。今回はインストールしません。この環境の GCC でビルドしたバイナリは(Cygwin のように)msys-2.0.dll に依存するものとなります。(そのぶん、fork() などの、よりリッチな UNIX エミュレーション関数が使用可能となります。)
- Win32 Shell: MinGW-w64 の 32bit ツール環境です。msys-2.0.dll に依存しない 32bit バイナリを生成可能です。今回はこれを使用します。
- Win64 Shell: MinGW-w64 の 64bit ツール環境です。今回はインストールしません。
今回は 32bit のツールを使用します。64bit のツールを使用したい場合は、この (3) の説明の i686 を、全て x86_64 に置き換えてインストールし、(4) 以降は Win64 Shell 環境で作業をしてください。
MinGW-w64 32bit をインストールします。
$ pacman -S mingw-w64-i686-toolchainこれらは /mingw32 以下にインストールされるので、32bit 環境でしか使えません。ここで python もインストールされます。続いて cmake をインストールします。
$ pacman -S mingw-w64-i686-cmakeこれで環境構築は終わります。MSYS2 Shell を終了します。
以後の作業は、/mingw32/bin に PATH が通った、MinGW-w64 Win32 Shell 環境で行います。 (最初から全部 Win32 Shell で行っても問題無いと思いますが、32/64bit になるべく依存しない説明にするため、明確に切り分けました。)
(4) LLVM/Clang のソースコードを準備
MSYS2 の tar で clang のソース(cfe)を展開すると、エラーが出ましたが、どうも Linux 関係のシンボリックリンクが上手く展開できないようです。7-Zip などの外部ツールでもエラーが出るので、これはまあ問題無いと判断しました。
$ mkdir -p work/llvm $ cd work/llvm $ wget http://llvm.org/releases/3.7.1/llvm-3.7.1.src.tar.xz $ wget http://llvm.org/releases/3.7.1/cfe-3.7.1.src.tar.xz $ wget http://llvm.org/releases/3.7.1/compiler-rt-3.7.1.src.tar.xz $ tar xvf llvm-3.7.1.src.tar.xz $ tar xvf cfe-3.7.1.src.tar.xz $ mv cfe-3.7.1.src llvm-3.7.1.src/tools/clang $ tar xvf compiler-rt-3.7.1.src.tar.xz $ mv compiler-rt-3.7.1.src llvm-3.7.1.src/projects/compiler-rt(5) LLVM/Clang のビルドとインストール
ビルドは build で行い、install にインストールします。また、今回は X86 バックエンド(32bit/64bit)のみをビルドします。
$ mkdir build install $ cd build $ cmake -G "MSYS Makefiles" ../llvm-3.7.1.src/ -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=../install -DLLVM_TARGETS_TO_BUILD=X86 $ make -j4 $ make installi7-2600@3.4GHz で 4 コア/メモリ 4GB 割り振った VMWare 上という環境でしたが、ビルドは 30 分程度で終わりました。ちゃんと make の j オプションも効いているようです。(j オプションを付けないと、素直に 4 倍ぐらいかかりました。)
(6) せっかくなので C++14 を試してみる。
Clang は独立したツールチェーンでは無く、また生粋のクロスコンパイラなので、target オプションで間借りするツールチェーンをちゃんと指定する必要があります。(これを忘れて、しばらく悩みました。)
Clang をインストールした場所に PATH を通します。
$ export PATH=/absolute/path/to/install/bin:$PATH $ llc.exe --version LLVM (http://llvm.org/): LLVM version 3.7.1 Optimized build. Built Feb 17 2016 (16:58:23). Default target: x86_64-pc-windows-gnu Host CPU: sandybridge Registered Targets: x86 - 32-bit X86: Pentium-Pro and above x86-64 - 64-bit X86: EM64T and AMD64とりあえず、桁区切りリテラルを使って見ます。(2 進数リテラルはエラーになりませんでした…。)
C++14 を指定しないとエラー、指定するとと無事に動作することが確認できました。
$ cat test.cpp #include <iostream> int main() { int n = 1'000'000; std::cout << n << std::endl; return 0; } $ clang++.exe -target i686-w64-mingw32 -Wall test.cpp test.cpp:4:14: error: expected ';' at end of declaration int n = 1'000'000; ^ ; 1 error generated. $ clang++.exe -target i686-w64-mingw32 -Wall -std=c++14 test.cpp $ ./a.exe 1000000追記: この MSYS2 環境でビルドした clang/clang++ には問題があるようです。手元でいろいろ試してみた所、コンパイルすると clang が異常終了する C ファイルが存在するようです。(同じコードベースを Visual C++ でビルドしたバイナリでは問題ありません。)どうも GCC のバージョンが新しすぎる(5.3.0)のが怪しい感じです。