Edited at

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

More than 3 years have passed since last update.


お断り

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


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

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

export PATH=$PATH:/usr/local3/bin


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


Bash

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


のようにenvを使うかしてください。

なお、Python3はそのまま/usr/local以下にインストールしても既存のPythonとは干渉しません。


Software Collectionsから有効化する

コメントで指摘があったので追記します。この方法はrootが必要です。

インストールはコメントのURLを参考に行ってください。

CMakeでのconfigure・ビルド・インストールをする前に


bash

scl enable python27 bash


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

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

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


CMakeのインストール


リポジトリからインストール

rootがある人は


Bash

sudo yum -y install cmake


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


ソースビルド

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


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

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


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


Bash

cd llvm/tools

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

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


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

cd llvm/projects

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

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


Bash

cd llvm/projects

svn co http://llvm.org/svn/llvm-project/libcxx/tags/RELEASE_370/final libcxx
cd ../..


いざビルド

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


Bash

mkdir llvm-3.7.0

cd llvm-3.7.0

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


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

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

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倍ほどにもなってしまったので、対象アーキテクチャをx86(_64)に限定したり(上表)、Object系の言語を除外したいですが、今のところどうすればいいのかわかっていません。

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

インストール後はclang -vでClangが新しいGCC5を認識しているかどうかを確認してください。

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