2016年02月18日

LLVM/Clang 3.7.1をMSYS2でビルド

MSYS2 を試してみた所、LLVM/Clang が比較的簡単にビルドできましたので紹介します。以前紹介した、VisualStudio でビルドする場合と比較すると、
  1. LLVM/Clang のビルドに必要な、GCC、CMake、Python、GNU Make などの各種 GNU ツールが、Linux の APT や Yum のようなパッケージマネージャ(MSYS2 は Arch Linux の pacman を採用)でインストールできるので、環境構築や管理が楽。
  2. VisualStudio は比較的大きく、有償(無料の Express エディションもありますが、常用には登録が必要)のソフトウェアなので、比較的コンパクトで自由なソフトウェアである MSYS2 の方が色々楽。
  3. 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) が立ち上がるので、ベースシステムのアップデートを行います。
$ 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 等の開発ツールが存在し、ややこしいのですが、以下のような違いがあります。
  1. MSYS2 Shell: MSYS2 自体を開発(ビルド)する際に使用するツールです。今回はインストールしません。この環境の GCC でビルドしたバイナリは(Cygwin のように)msys-2.0.dll に依存するものとなります。(そのぶん、fork() などの、よりリッチな UNIX エミュレーション関数が使用可能となります。)
  2. Win32 Shell: MinGW-w64 の 32bit ツール環境です。msys-2.0.dll に依存しない 32bit バイナリを生成可能です。今回はこれを使用します。
  3. Win64 Shell: MinGW-w64 の 64bit ツール環境です。今回はインストールしません。
(3) 32bit のツール(i686-w64-mingw32-XXX)のインストール

今回は 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 install
i7-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)のが怪しい感じです。

トラックバックURL

コメントする

名前
URL
 
  絵文字
 
 
記事検索
最新コメント
アクセスカウンター
  • 今日:
  • 昨日:
  • 累計:

QRコード
QRコード