#お断り
とりあえずビルド報告的なものなのでところどころ間違っているところ、もしくはもう少し改良すべきところがあるかもしれません。ご了承ください。
#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
とします。変更する場合は読み替えてください。
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のパスは現在のパスの右側に書くようにしてください。**例えば次のように書きます。
export PATH=$PATH:/usr/local3/bin
普段使用する場合はpython2.7
で呼び出すか、
env PATH="/usr/local3/bin:${PATH}" [PROGRAM] [ARGS] ...
のようにenv
を使うかしてください。
なお、Python3はそのまま/usr/local
以下にインストールしても既存のPythonとは干渉しません。
##Software Collectionsから有効化する
コメントで指摘があったので追記します。この方法はrootが必要です。
インストールはコメントのURLを参考に行ってください。
CMakeでのconfigure・ビルド・インストールをする前に
scl enable python27 bash
を実行します。コマンドを打つ際には先頭の
env PATH="/usr/local3/bin:${PATH}"
は不要になります。ただし、インストールが終了したらexit
・logout
・Ctrl+D
などでSoftware Collectionsが有効化されたBashを閉じなければなりません。
#CMakeのインストール
##リポジトリからインストール
rootがある人は
sudo yum -y install cmake
でインストールできます。ただし、未検証です。(下の方法を使いました)この方法でインストールできるバージョンは古いので動くかどうかはわかりません(誰か人柱お願いします)。
##ソースビルド
こちらの方法を使いました。メリットはなんといっても最新版がインストールできることです。コマンドは次のようになります。CMakeのconfigure
は使用できるオプションが少ないです。基本的に--prefix
以外はつけません。
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ディレクトリはおそらく開発段階なのでチェックアウトしないようにしてください。
svn co http://llvm.org/svn/llvm-project/llvm/tags/RELEASE_370/final llvm
次に、次のコマンドでClangのソースコードを取得します。
cd llvm/tools
svn co http://llvm.org/svn/llvm-project/cfe/tags/RELEASE_370/final clang
cd ../../
次にClang Toolsのソースコードを取得します。これはオプションなのでなくてもいいのかもしれません。
cd llvm/tools/clang/tools
svn co http://llvm.org/svn/llvm-project/clang-tools-extra/tags/RELEASE_370/final extra
cd ../../../..
最後に、Compiler-RTというもののソースコードを取得します。
cd llvm/projects
svn co http://llvm.org/svn/llvm-project/compiler-rt/tags/RELEASE_370/final compiler-rt
cd ../..
libc++もインストールしたい人は以下のコマンドでソースコードを取得してください。これはオプションですので、インストールするかは任意です。
cd llvm/projects
svn co http://llvm.org/svn/llvm-project/libcxx/tags/RELEASE_370/final libcxx
cd ../..
#いざビルド
Clangはソースファイルのあるディレクトリとは別のディレクトリでビルドしないといけません。まず、ビルド用のディレクトリを作成します。
mkdir llvm-3.7.0
cd llvm-3.7.0
いよいよビルドを行います。ClangはGCC4.4.7・Python2.6ではビルドできません。そのため、以下のenv
コマンドで最新のGCC・Python2.7を使うようにしてビルドを行いました。(nice
のところはいろいろといじってあります)
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値をいじらない場合のコマンドは次のような感じになります。
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の付け方がいつもと異なるので特に注意してください。(追記: 一部変更)
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のバグのようです。