次世代コンパイラ基盤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にするなどググる)か、UnxUtilsのusr\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.txt
のCMAKE_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
を直してまたmake
、make install
。
Edited by Narazaka 2012/05/31