Clang を MinGW 64 bit 版 でコンパイル

2015年2月15日

はじめに

Clang を MinGW 64 bit 版 でコンパイルするメモ。環境は Windows 7 Home Premium 64 bit。

前準備

ここでコンパイルする LLVM/Clang 3.5.1 はそこそこ新しい GCC を要求するので、必要であればアップデートする (バージョンが足りているかどうかはコンパイルしてみればわかる)。ここでは GCC 4.9.2 を使用した。

また、LLVM/Clang のコンパイルには CMake が必要である。ここ からダウンロード、インストールし、パスを通しておく。

パッケージの入手

LLVM Download Page から、LLVM、Clang のソースコードをダウンロードする。

  • llvm-3.5.1.src.tar.xz
  • cfe-3.5.1.src.tar.xz

コンパイル

パッケージを展開する。.xz は 7-Zip で展開できる。

clang-3.5.1.src を llvm-3.5.1.src/tools/clang として移動する。

cmake を実行 (インストール先を "$HOME/opt/llvm-3.5.1" としている)。

$ cd llvm-3.5.1.src
$ mkdir build
$ cmake -G "MinGW Makefiles" -D CMAKE_INSTALL_PREFIX=$HOME/opt/llvm-3.5.1 ..

1 回目すぐ止まるが、2 回実行すると進む。

make を実行。

$ make

エラーで止まった。

[ 69%] Createing export file for LTO
コマンドの構文が誤っています。
tools\lto\CMakeFiles\LTO_exports.dir\build.make:50: recipe for target 'tools/lto/LTO.def' failed
mingw32-make[2]: *** [tools/lto/LTO.def] Error 1
CMakeFiles\Makefile2:9231: recipe for target 'tools/lto/CMakeFiles/LTO_exports.dir/all' failed
mingw32-make[1]: *** [tools/lto/CMakeFiles/LTO_exports.dir/all] Error 2
makefile:136: recipe for target 'all' failed
mingw32-make: *** [all] Error 2

気にしないでもう一度 make を実行すると、突破した。

またエラー。

C:\Users\...\ccl8qQCi.s: Fatal error: can't write CMakeFiles\clangDynamicASTMatchers.dir\Registry.cpp.obj: File to big

よくわからないが、"tools/clang/lib/ASTMatchers/Dynamic/CMakeFiles/clangDynamicASTMatchers.dir/flags.make" の CXX に "-Og" を追加して make したら突破できた。

またエラー。

[ 98%] Creating export file for libclang
コマンドの構文が誤っています。
tools\clang\tools\libclang\CMakeFiles\libclang_exports.dir\build.make:50: recipe for target 'tools/clang/tools/libclang/libclang.def' failed
...

1 つめのエラーと同じなので、気にせず再度 make を実行。

かなりメモリを食うみたい。コンパイルに数時間かかった。

コンパイルが済んだら、インストール。

$ make install

パスを通す。

~/.bashrc

export PATH=$HOME/opt/llvm-3.5.1/bin:$PATH

clang はインクルードファイルをフルではもっていないようで、gcc のものを使う必要がある。まず、gcc のインクルードパスを調べる。適当なコード test.c を用意する。

$ gcc -v test.c

...

#include <...> search starts here:
 c:/Program Files/mingw-w64/x86_64-4.9.2-posix-seh-rt_v3-rev1/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/4.9.2/include
 c:/Program Files/mingw-w64/x86_64-4.9.2-posix-seh-rt_v3-rev1/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/4.9.2/include-fixed
 c:/Program Files/mingw-w64/x86_64-4.9.2-posix-seh-rt_v3-rev1/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/4.9.2/../../../../x86_64-w64-mingw32/include
End of search list.

同様に g++ のも調べる。

$ g++ -v test.c

#include <...> search starts here:
 c:/Program Files/mingw-w64/x86_64-4.9.2-posix-seh-rt_v3-rev1/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/4.9.2/include
 c:/Program Files/mingw-w64/x86_64-4.9.2-posix-seh-rt_v3-rev1/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/4.9.2/include-fixed
 c:/Program Files/mingw-w64/x86_64-4.9.2-posix-seh-rt_v3-rev1/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/4.9.2/../../../../x86_64-w64-mingw32/include
 c:/Program Files/mingw-w64/x86_64-4.9.2-posix-seh-rt_v3-rev1/mingw64/lib/gcc/../../x86_64-w64-mingw32/include/c++
 c:/Program Files/mingw-w64/x86_64-4.9.2-posix-seh-rt_v3-rev1/mingw64/lib/gcc/../../x86_64-w64-mingw32/include/c++/x86_64-w64-mingw32
 c:/Program Files/mingw-w64/x86_64-4.9.2-posix-seh-rt_v3-rev1/mingw64/lib/gcc/../../x86_64-w64-mingw32/include/c++/backward
End of search list.

これらを CPATH に設定する。

~/.bashrc

CPATH="/c/Program Files/mingw-w64/x86_64-4.9.2-posix-seh-rt_v3-rev1/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/4.9.2/include"
CPATH="/c/Program Files/mingw-w64/x86_64-4.9.2-posix-seh-rt_v3-rev1/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/4.9.2/include-fixed":$CPATH
CPATH="/c/Program Files/mingw-w64/x86_64-4.9.2-posix-seh-rt_v3-rev1/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/4.9.2/../../../../x86_64-w64-mingw32/include":$CPATH

CPATH="/c/Program Files/mingw-w64/x86_64-4.9.2-posix-seh-rt_v3-rev1/mingw64/lib/gcc/../../x86_64-w64-mingw32/include/c++":$CPATH
CPATH="/c/Program Files/mingw-w64/x86_64-4.9.2-posix-seh-rt_v3-rev1/mingw64/lib/gcc/../../x86_64-w64-mingw32/include/c++/x86_64-w64-mingw32":$CPATH
CPATH="/c/Program Files/mingw-w64/x86_64-4.9.2-posix-seh-rt_v3-rev1/mingw64/lib/gcc/../../x86_64-w64-mingw32/include/c++/backward":$CPATH

export CPATH

これで clang、clang++ が使えるようになる。clang の gcc のコードに対する警告がうるさいので、警告を抑制しておいたほうがよいかもしれない。

~/.bashrc

alias clang='clang -Wno-ignored-attributes'

参考