Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
6
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

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

お断り

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

Porgのインストール・最新版のGCCのインストール

にまとめてあります。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のバグのようです。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
6
Help us understand the problem. What are the problem?