原色奈良阪

次世代コンパイラ基盤LLVMとC/C++コンパイラclangをWindowsで使いたくなったので。

Windows用バイナリが最近ようやく用意されるようになったそうなので、 LLVM公式ダウンロードページからLLVM3.1のExperimental Clang Binaries for Mingw32/x86をおとしてきたら、 これがまたclang++がExec format errorを吐いたりGCCのを間借りしているinclude pathがclangのソースに直書きで自分の環境に合わなかったりして、非常な残念感が漂っている代物だった。

しょうがないので自分でビルドすることにした。

方向性

僕はレジストリ汚さない主義者なので、所謂インストーラをあまりつかわない方向で行っています。ちょっと通常より作業が増えたりしてるかもしれませんが、誤差です。

また個人的メモレベルなのでうまくいかなくても泣かない。

下準備

clang/LLVMのビルドには以下のツールが必要です。

MinGW or Visual C++(Expressはダメ)
まあここを見る様な人ならもうセットアップ済みでしょうけど。今回はMinGWでゆきます。
make
GNU make。
cmake
Makefileをつくるツール。
Python
近年人気のLL。Portable Pythonを使います。

MinGW

これを手動インストールはさすがにしんどいのでインストーラ頼み。

MinGW | Minimalist GNU for Windowsの左サイドバーのちょっと下にある[Navigation > About > Downloads]からSourceforgeのダウンロードページにいくので、 (Looking for the latest version? とか書いてある)mingw-get-inst-*.exeをダウンロードしてインストールしてよしなにパス通してください。 僕はC直下に色々入るのがきらいなので、C:\usr\MinGWに入れました。

これからclang使うんだからこんなもんのパス通したくないわいという人は、cmakeとmakeの前にset PATH=%PATH%;C:\usr\MinGWしてください。

make

てきとうにMinGWの付属のを落としてくる(そしてmingw32-make.exeをmake.exeにするなどググる)か、UnxUtilsusr\local\wbin\make.exeなんかをC:\usr\bin\make.exeとかにおいてパスを通す。

パス通さないときは、cmakeとmakeの前にset PATH=%PATH%;C:\usr\binしてください。

cmake

cmakeのサイトの上に並んでるメニューっぽいところから[RESOURCES > Download]に行って、 'Latest Release'の'Binary distributions'の'Windows ZIP'、'cmake-*-win32-x86.zip'を落として解凍して出てきたbinとかdocとか入っているフォルダをC:\usr\cmakeにもってってC:\usr\cmake\binにパス通す。

まあこっちはあんまりパス通す必要性はないので、いちいちC:\usr\cmake\bin\cmake -G "MinGW Makefiles" ..とかやってもいい。

Python

Python本家ではmsiしか配ってなさげなので、Portable Pythonを使います。Portable PythonのサイトDownloadから、 Python 2.*系列を落としてください(2と3は互換性がないらしい)。Python 2.*のページの下の方[Country Mirror Type]と表があるところのUSA HTTPを選べばよいでしょう。

PortablePython_2.*.exeはインストーラですが無駄なとこ色々いじりません。'Destination Folder'をC:\usr\Portable_Pythonとかにして、type of installを(ライブラリとかはいらないので)Minimalにして、Install。

C:\usr\Portable_Pythonの中のpython.exeがあるところ(C:\usr\Portable_Python\App)にパス通す。

Python他で使わんいう人は、同じくcmakeとmakeの前にset PATH=%PATH%;C:\usr\Portable_Python\Appしてください。

注意

Strawberry Perlとかを入れててgccが複数ある場合はどれを使うことになるのか注意が必要です。LLVMは古いgccではコンパイルできない場合があるとも聞きます。

cmakeのときにどれを使うか出ますが、意図通りになってない場合はset PATH=C:\usr\MinGW\bin;C:\usr\cmake\bin;C:\usr\Portable_Python\App(%PATH%は入れない)などとしてパスを設定し直すことが必要です。

インストール

ダウンロード

LLVM公式の左側'Download!'の'Download now: LLVM 3.x'からリリースに飛んで、DownloadのSVNでない一番新しいやつ(執筆時点で3.1)を選んだダウンロードページから'LLVM source code'と'Clang source code'を落とします。

配置

'LLVM source code'たるllvm-3.x.src.tar.gzと'Clang source code'たるclang-3.x.src.tar.gzをそれぞれ展開し、clangのフォルダclang-3.x.srcの方をLLVMのフォルダ中llvm-3.x.src\tools\clangへ移動します。

ライブラリパスの修正

clangは現在gcc(MinGW)のライブラリを使っているそうで、MinGWを使わない場合もMinGWのファイルは残しておく必要があるようです。

またclangはincludeのパスを環境変数とかで無しに直書きで全部済ましてるそうなので、(無論コンパイルオプションでは指定できますがいちいち面倒なので)MinGWをC:\MinGW以外の所へ置こうとするとそのソースを修正する方が便利です。

llvm-3.1.src\tools\clang\lib\Frontend\InitHeaderSearch.cppをいじります。

AddPath()でパスを追加しているらしいので、それを追加してゆきます。

InitHeaderSearch::AddDefaultCIncludePaths()(Cのinclude path指定)の中

AddPath("/mingw/include", System, true, false, false);
AddPath("c:/mingw/include", System, true, false, false);

の下に

AddPath("/mingw/include", System, true, false, false);
AddPath("c:/mingw/include", System, true, false, false);
AddPath("c:/usr/mingw/include", System, true, false, false);

と追加します。

またInitHeaderSearch::AddDefaultCPlusPlusIncludePaths()(C++のinclude path指定)の中

AddMinGWCPlusPlusIncludePaths("c:/MinGW/lib/gcc", "mingw32", "4.6.2");
AddMinGWCPlusPlusIncludePaths("c:/MinGW/lib/gcc", "mingw32", "4.6.1");
AddMinGWCPlusPlusIncludePaths("c:/MinGW/lib/gcc", "mingw32", "4.5.2");
AddMinGWCPlusPlusIncludePaths("c:/MinGW/lib/gcc", "mingw32", "4.5.0");
AddMinGWCPlusPlusIncludePaths("c:/MinGW/lib/gcc", "mingw32", "4.4.0");
AddMinGWCPlusPlusIncludePaths("c:/MinGW/lib/gcc", "mingw32", "4.3.0");

の下に

AddMinGWCPlusPlusIncludePaths("c:/MinGW/lib/gcc", "mingw32", "4.6.2");
AddMinGWCPlusPlusIncludePaths("c:/MinGW/lib/gcc", "mingw32", "4.6.1");
AddMinGWCPlusPlusIncludePaths("c:/MinGW/lib/gcc", "mingw32", "4.5.2");
AddMinGWCPlusPlusIncludePaths("c:/MinGW/lib/gcc", "mingw32", "4.5.0");
AddMinGWCPlusPlusIncludePaths("c:/MinGW/lib/gcc", "mingw32", "4.4.0");
AddMinGWCPlusPlusIncludePaths("c:/MinGW/lib/gcc", "mingw32", "4.3.0");
AddMinGWCPlusPlusIncludePaths("c:/usr/MinGW/lib/gcc", "mingw32", "4.6.2");

とか追加します。

cmake

Makefileを作るためのmake、cmakeでどんな環境もどんと来い。

てきとうなフォルダ(llvm-3.1.src\build等)を作り、そこでcmake -G "MinGW Makefiles" -D CMAKE_INSTALL_PREFIX=C:\usr\LLVM ..を走らせ、Makefileを作る。

-GはMakefileのタイプ指定、-Dは変数設定でCMAKE_INSTALL_PREFIXはインストール場所、..CMakeLists.txtのある場所(llvm-3.x直下)。

インストール場所を後で変更するときはCMakeCache.txtCMAKE_INSTALL_PREFIX:PATH=C:/Program Files/LLVMを変えればよい。

make

GNU makeでmake

待つ。

終盤clang.exeのリンクの時1GB超えの酷いメモリの食い方するかもしれないので注意。もし止まってももっかいmakeするだけ。

make install

make install

C:\usr\LLVMに入ってゆく。

以上

C:\usr\LLVM\binにパスを通す。

ダメなとき

clang++ hoge.cpp -o hoge.exe -vとかでc,cppとも試してincludeうまくいってないとかの時はllvm-3.1.src\tools\clang\lib\Frontend\InitHeaderSearch.cppを直してまたmakemake install

Edited by Narazaka 2012/05/31