UbuntuでC/C++のコンパイラである、Clangをビルドしてインストールする方法についてまとめました。
概要
C言語やC++の有名なコンパイラには、GCCがありますが、最近はClangというフロントエンドコンパイラが注目を浴びています。
これは、コンパイラという名前ではなくフロントエンドコンパイラという名前からもわかるように、Clangはあくまでも、コンパイラの機能のうちフロントエンドの部分を担当しており、バックエンドの部分はLLVMというバックエンドコンパイラが担当しています。
今回は、このClangとLLVMをソースコードからビルドしてインストールします。
ビルド方法
それぞれ、複数の場所から複数のソースコードを取得します。
ソースコードの取得には、Subversionを使うので、下記のコマンドを入力して、Subversionをインストールしておいてください。
$ sudo apt-get install subversion
その他にも、ビルドにはいくつかのパッケージが必要となります。
下記のコマンドを入力して、パッケージをインストールします。
$ sudo apt-get install make cmake gcc python libtool zlib1g zlib1g-dev
では、ソースコードを取得します。
最初に、LLVMのソースコードを取得します。
$ cd
$ svn co http://llvm.org/svn/llvm-project/llvm/trunk llvm
今回は、llvmというディレクトの中に、今後取得するファイルを入れていきます。
次に、Clangのソースコードを取得します。
$ cd llvm/tools
$ svn co http://llvm.org/svn/llvm-project/cfe/trunk clang
$ cd ../..
extra Clang ToolsというClangの便利な機能を追加するソースコードを取得します。
これを追加するかは任意なので、いらないという場合はこの作業をやらないでください。
$ cd llvm/tools/clang/tools
$ svn co http://llvm.org/svn/llvm-project/clang-tools-extra/trunk extra
$ cd ../../../..
最後に、ランタイムライブラリのソースコードを取得します。
$ cd llvm/projects
$ svn co http://llvm.org/svn/llvm-project/compiler-rt/trunk compiler-rt
$ cd ../..
これで、すべてのソースコードを取得できたので、ビルドをします。
今回、ビルドは、buildというllvmディレクトリの外にあるディレクトリで行います。
ビルドには、最初にcmakeを使ってmakefileを作成してからmakeコマンドを実行します。
$ mkdir build
$ cd build
$ cmake -G "Unix Makefiles" ../llvm/ -DCMAKE_INSTALL_PREFIX=/xxxxx -DCMAKE_BUILD_TYPE=Release
cmakeの実行時に、いくつかのオプションをつけています。
-G “Unix Makefiles"は、UnixまたはLinuxの環境であることを示しています。
../llvmは、取得したソースコードの場所の指定です。
-DCMAKE_INSTALL_PREFIXは、インストール場所の指定です。ここの指定をしない場合は、/usr/localになります。
-DCMAKE_BUILD_TYPEは、ビルド時のタイプの指定です。指定をしないとDebugになります。今回はReleaseにしました。
これで、ビルドの準備ができました。
ビルドは、makeコマンドを使います。
$ make -j2
オプションの-jは、並行ビルドの設定です。これをうまく設定しておくとビルドが早く終わります。
数字は、いくつ並行してビルドするのかを指定します。環境にもよりますが, よくCPUのコア数+1を指定するのが、ビルドが高速に終わり、良いと言われているようです。
私の場合は、CPUのコア数が1つだったので、2にしました。
ビルドが終了したら、インストールをします。
$ make install
環境によっては、コマンドにsudoをつける必要があると思います。
これで、インストールは終了です。
後は、環境設定が終われば、C言語のソースコードをコンパイルする場合はclang、C++のソースコードをコンパイルする場合はclang++で、できるようになります。
さいごに
ビルドに結構の時間がかかったので、時間があるときにやったほうがいいです。