CentOS6.7にClangをビルド&インストール

#お断り
とりあえずビルド報告的なものなのでところどころ間違っているところ、もしくはもう少し改良すべきところがあるかもしれません。ご了承ください。

#Porgのインストール・最新版のGCCのインストール
http://qiita.com/Tats_U_/items/5fed0f9dafb4ecb15c12

にまとめてあります。Porgはソースビルドする際にないとアンインストールができなくなります。Clangは付属のGCC4.4.7ではコンパイルできないので、最新版のGCCインストールは避けては通れません。また、RedHat Developer Toolsetを使えばいいじゃんという声があるかもしれませんが、その場合付属のlibstdc++よりも新しいものがついているか・常時リンクする設定にできるかを確認する必要があります。

#Python2.7をインストール
ClangはPython2.7がないとMakefileを作成する段階でコケますが、CentOS6に付属しているPythonは2.6と少々古いです。ですので以下の2つの方法のいずれかを使用してインストールします。

##最新版をソースビルドする
Pythonは`/usr/local`以下にインストールしてしまうと、付属のPython2.6に代わって`python`コマンドで実行されるようになりますが、そのPythonを利用する**iBusの動作などに悪影響が出ます。**そのため、別のディレクトリにインストールします。ここでは`/usr/local3`とします。変更する場合は読み替えてください。

```bash:Bash
wget https://www.python.org/ftp/python/2.7.10/Python-2.7.10.tar.xz
tar xf Python-2.7.10.tar.xz
rm Python-2.7.10.tar.xz
cd Python-2.7.10
./configure --host=x86_64-redhat-linux --build=x86_64-redhat-linux --target=x86_64-redhat-linux --prefix=/usr/local3 CFLAGS="-march=core2 -O3"
nice -n 0 make -j8
sudo nice -n -10 porg -lD "nice -n -10 make install"
```

このPython2.7にパスを通すときは**書く位置に十分注意してください。**Python2.7のパスを現在のパスの左側に書くと**付属のPython2.6より先に呼び出されて、iBusに悪影響が出ます。**そのため、Python2.7のパスは現在のパスの**右側に書くようにしてください。**例えば次のように書きます。

```bash:Bash
export PATH=$PATH:/usr/local3/bin
```

普段使用する場合は`python2.7`で呼び出すか、

```bash:Bash
env PATH="/usr/local3/bin:${PATH}" [PROGRAM] [ARGS] ...
```

のように`env`を使うかしてください。
なお、Python3はそのまま`/usr/local`以下にインストールしても既存のPythonとは干渉しません。

##Software Collectionsから有効化する
コメントで指摘があったので追記します。**この方法はrootが必要です。**
インストールはコメントのURLを参考に行ってください。
CMakeでのconfigure・ビルド・インストールをする前に

```Bash:bash
scl enable python27 bash
```

を実行します。コマンドを打つ際には先頭の

```bash
env PATH="/usr/local3/bin:${PATH}"
```

は不要になります。ただし、インストールが終了したら`exit`・`logout`・`Ctrl+D`などでSoftware Collectionsが有効化されたBashを閉じなければなりません。

#CMakeのインストール
##リポジトリからインストール
rootがある人は

```bash:Bash
sudo yum -y install cmake
```

でインストールできます。ただし、未検証です。(下の方法を使いました)この方法でインストールできるバージョンは古いので動くかどうかはわかりません(誰か人柱お願いします)。

##ソースビルド

こちらの方法を使いました。メリットはなんといっても最新版がインストールできることです。コマンドは次のようになります。CMakeの`configure`は使用できるオプションが少ないです。基本的に`--prefix`以外はつけません。

```bash:Bash
wget https://cmake.org/files/v3.4/cmake-3.4.0.tar.gz
tar xf cmake-3.4.0.tar.gz
rm cmake-3.4.0.tar.gz
cd cmake-3.4.0
./configure #build・target・host・CC・CXXなどのオプションは使えません; --prefixは使えますので/usr/local以外にインストールしたい人はご安心を
make -j8
sudo porg -lD "make install -j8"
```

#Clangのソースコードを取ってくる(3.7.0の時点)
http://clang.llvm.org/get_started.html の内容を元に一部改変します。

まず、次のコマンドでLLVMのソースコードを取得します。**trunkディレクトリはおそらく開発段階なのでチェックアウトしないようにしてください。**

```bash:Bash
svn co http://llvm.org/svn/llvm-project/llvm/tags/RELEASE_370/final llvm
```

次に、次のコマンドでClangのソースコードを取得します。

```bash:Bash
cd llvm/tools
svn co http://llvm.org/svn/llvm-project/cfe/tags/RELEASE_370/final clang
cd ../../
```

次にClang Toolsのソースコードを取得します。これはオプションなのでなくてもいいのかもしれません。

```bash:Bash
cd llvm/tools/clang/tools
svn co http://llvm.org/svn/llvm-project/clang-tools-extra/tags/RELEASE_370/final extra
cd ../../../..
```

最後に、Compiler-RTというもののソースコードを取得します。

```bash:Bash
cd llvm/projects
svn co http://llvm.org/svn/llvm-project/compiler-rt/tags/RELEASE_370/final compiler-rt
cd ../..
```

libc++もインストールしたい人は以下のコマンドでソースコードを取得してください。**これはオプションですので、インストールするかは任意です。**

```bash:Bash
cd llvm/projects
svn co http://llvm.org/svn/llvm-project/libcxx/tags/RELEASE_370/final libcxx
cd ../..
```

#いざビルド
Clangはソースファイルのあるディレクトリとは別のディレクトリでビルドしないといけません。まず、ビルド用のディレクトリを作成します。

```bash:Bash
mkdir llvm-3.7.0
cd llvm-3.7.0
```

いよいよビルドを行います。ClangはGCC4.4.7・Python2.6ではビルドできません。そのため、以下の`env`コマンドで最新のGCC・Python2.7を使うようにしてビルドを行いました。(`nice`のところはいろいろといじってあります)

```bash:Bash(仮ビルドコマンド)
env CC=gcc5 CXX=g++5 CPP=cpp5 PATH="/usr/local3/bin:${PATH}" nice -n 0 cmake -G "Unix Makefiles" ../llvm
env CC=gcc5 CXX=g++5 CPP=cpp5 PATH="/usr/local3/bin:${PATH}" make -j8
sudo env CC=gcc5 CXX=g++5 CPP=cpp5 PATH="/usr/local3/bin:${PATH}" porg -lD "make install -j8"
```

ビルド後に気づいたのですが、http://llvm.org/docs/GettingStarted.html#requirements を見ると、色々とオプションを指定できるようです。以下にコマンド例を2つ示します。**(未検証)**まず、クアッドコアのCPUでnice値をいじらない場合のコマンドは次のような感じになります。

```bash:Bash
env PATH="/usr/local3/bin:${PATH}" cmake -G "Unix Makefiles" -DCMAKE_C_COMPILER=gcc5 -DCMAKE_CXX_COMPILER=g++5 -DCMAKE_BUILD_TYPE=Release ../llvm 
env PATH="/usr/local3/bin:${PATH}" make -j8
sudo env PATH="/usr/local3/bin:${PATH}" porg -lD "make install -j8"
```

仮想マシンだったりCPUのコア数が少なかったりする場合は`-j8`の値を減らしたり下のように`nice`コマンドを使ってください。
次に、rootを持っていないサーバにインストール(`~/local/`以下)する場合は以下のようになります。prefixの付け方がいつもと異なるので特に注意してください。(追記: 一部変更)

```bash:Bash
env PATH="${HOME}/local3/bin:${PATH}" nice -n 19 cmake -G "Unix Makefiles" -DCMAKE_C_COMPILER=gcc5 -DCMAKE_CXX_COMPILER=g++5 -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=$HOME/local -DGCC_INSTALL_PREFIX="${HOME}/local" ../llvm
env PATH="${HOME}/local3/bin:${PATH}" nice -n 19 make
sudo env PATH="${HOME}/local3/bin:${PATH}" nice -n 19 porg -lD "nice -n 19 make install"
```

CMakeでは次のようなオプションも使用できます。(主要なもの)

|やりたいこと|オプション|
|----------|-------|
|32ビットコードを生成したい|`-DLLVM_BUILD_32_BITS=ON`|
|32ビットコードを生成しない|`-DLLVM_BUILD_32_BITS=OFF`|
|x86(_64)以外のクロスコンパイル機能を削りたい|`-DLLVM_TARGETS_TO_BUILD="X86"`|
|同時に複数のソースファイルを並行でコンパイルしたい(例:8個)|`-DLLVM_PARALLEL_COMPILE_JOBS=8`|
|同時に複数のリンク作業を並行で行いたい(例:8個)|`-DLLVM_PARALLEL_LINK_JOBS=8`|


GCCよりビルド時間がかかることがあります。覚悟してください。また、これもGCC同様`make uninstall`が使えないのでPorgがないと後々詰みます。

これで付属のGCC4.4.7・GCC5.2・Clang3.7.0が仲良く共存できる環境が整いましたとさ。めでたしめでたし。

#要改善点
仮コマンドを使用してビルドした場合、バイナリサイズがGCCの4～10倍ほどにもなってしまったので、<del>対象アーキテクチャをx86(_64)に限定したり</del>(上表)、Object系の言語を除外したいですが、今のところどうすればいいのかわかっていません。

**追記: `~/local/`以下にGCC5.2をインストールしている環境で`~/local2/`以下にClangをインストールしようとしたのですが、Clang側にGCC5.2が検知されず、古いGCC4.4で使える関数しか使えないという事例が発生しました。**(`clang -v`で確認)
インストール後は`clang -v`でClangが新しいGCC5を認識しているかどうかを確認してください。

更に追記:`-DGCC_INSTALL_PREFIX="${HOME}/local"`オプションがあるという記述を見たので試したのですが<del>ダメでした(バグ？)現時点ではRootがない場合は諦めるしかないのでしょうか。</del>**Clang3.7.1で成功しました。どうやらClang3.7.0のバグのようです。**