はじめに
AWS上に新規に構築したCentOS上で、LLVMとClangをビルドした際にやったことの全てです。
作業日時点(2018年11月10日)の最新版のソースで作業しています。
環境構築
ビルド環境はAWS+CentOS7です。
CentOS7はマーケットプレイスにある公式のものを使用しました。
https://aws.amazon.com/marketplace/pp/B00O7WM7QW
AWS Marketplace: CentOS 7 (x86_64) - with Updates HVM
Version:1805_01
当初はt2.medium (CPU:2core, Memory:4GB)に30GBのディスクを付けて作業を開始したのですが、この構成ではビルド不可能でした。
必要なのは、
・できるだけ高速なCPU
(makeがシングルスレッドで処理するのでコア数は無視できそうです。make -jxは試していません。)
・32GB程度のメモリー
(一時的にスワップしますが16GBでもぎりぎりビルド可能と思います)
・80GB以上のディスク空き容量
(ビルド完了時の出力フォルダの容量は70GBでした)
・3~4時間
(何度もインスタンスのグレードアップやディスク拡張を行ったため不正確ですがとにかく時間がかかります)
最終的に私が使用した構成は、
c5.4xlarge + 100GB Volume
です。
事前準備
おきまりとして。
・Yumのアップデート
sudo yum update
・TimezoneをTokyoへ
sudo timedatectl set-timezone Asia/Tokyo
・Swapボリュームを作成
# スワップファイルを作成し、有効化
sudo dd if=/dev/zero of=/swapfile bs=1M count=1024
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
sudo echo "/swapfile swap swap defaults 0 0" >> /etc/fstab
# スワップファイルがオンになっていることを確認
free
# 数字が出ていればOK
必要ソフトウェアをインストール
LLVMの公式サイトによると、次のソフトウェアが必要とのこと。
Package | Version | Notes |
---|---|---|
GNU Make | 3.79, 3.79.1 | Makefile/build processor |
GCC | >=4.8.0 | C/C++ compiler1 |
python | >=2.7 | Automated test suite2 |
zlib | >=1.2.3.4 | Compression library3 |
次のコマンドで確認すると、
yum list installed | grep -e ^make -e gcc -e ^python.x86 -e zlib
libgcc.x86_64 4.8.5-28.el7_5.1 installed
make.x86_64 1:3.82-23.el7 installed
python.x86_64 2.7.5-69.el7_5 @updates
zlib.x86_64 1.2.7-17.el7 installed
gccが無いのでインストールする。
gcc-c++は要件にはないですが、入れておかないとcmake実行時にエラーが発生します。
sudo yum install gcc
sudo yum install gcc-c++
さらに、次のコマンドが入っていることが想定されるとのこと
ar - archive library builder
bzip2 - bzip2 command for distribution generation
bunzip2 - bunzip2 command for distribution checking
chmod - change permissions on a file
cat - output concatenation utility
cp - copy files
date - print the current date/time
echo - print to standard output
egrep - extended regular expression search utility
find - find files/dirs in a file system
grep - regular expression search utility
gzip - gzip command for distribution generation
gunzip - gunzip command for distribution checking
install - install directories/files
mkdir - create a directory
mv - move (rename) files
ranlib - symbol table builder for archive libraries
rm - remove (delete) files and directories
sed - stream editor for transforming output
sh - Bourne shell for make build scripts
tar - tape archive for distribution generation
test - test things in file system
unzip ? unzip command for distribution checking
zip - zip command for distribution generation
これ、、、普通入っているのでは?
その他、次のツール+バージョンではエラーが出るとのことなので注意が必要です。
Package | ダメな!Version | Note |
---|---|---|
GNU ld | 2.16.X | 2.17以上ならOK |
GNU binutils | 2.17 | 2.17.50.0.4以上ならOK |
GNU Binutils | 2.19.1 Gold | 最新VerならOK |
次のコマンドで確認。
ld --version
> GNU ld version 2.27-28.base.el7_5.1
yum list installed | grep binutils
> binutils.x86_64 2.27-28.base.el7_5.1 @updates
作業ディレクトリの作成と移動
次のコマンドで、作業ディレクトリを作成して移動します。
mkdir install-llvm
cd install-llvm
cmakeのインストール
ビルドで使用するcmakeはyumでインストールされるバージョン(2.8.12.2)では使えない(3.4.3以上が必要)ので、公式からダウンロードしてインストールします。
はじめに、cmakeのページでダウンロードするファイルのURLをコピーしておく。
https://cmake.org/download/
上記リンクに移動し、
Binary distributions: -> Linux x86_64 のリストにある
cmake-3.13.....x86_64.shのURLをコピー
今回は次のURLを使用
https://cmake.org/files/v3.13/cmake-3.13.0-rc3-Linux-x86_64.sh
次のコマンドを順に実行し、上でコピーしたURLからcmakeのバイナリをダウンロードしてインストールする。
# ダウンロードにwgetを使うのでインストールする
sudo yum install wget
# cmake用作業ディレクトリを作成して移動
mkdir cmake
cd cmake
# 先ほどコピーしたファイルをダウンロードする
wget https://cmake.org/files/v3.13/cmake-3.13.0-rc3-Linux-x86_64.sh
# インストール(ただの自己解凍だけれど)を実行
sh ./cmake-3.13.0-rc3-Linux-x86_64.sh
# 利用規約が表示されるのでyで答える。
Do you accept the license? [yN]:
y
# 解凍先を聞かれるのでYで答える
Saying no will install in: "/home/centos/install-llvm/cmake" [Yn]:
Y
# 独自パッケージ置き場(/opt)へコピーする(自分ルールがある方はご自由に)
sudo mv cmake-3.13.0-rc3-Linux-x86_64 /opt/cmake
# 今回は簡易環境なので/opt/cmake/binをパスへ追加
# (真面目な方はシンボリックリンク使うなりご自由に)
echo 'export PATH=$PATH:/opt/cmake/bin' >> ~/.bashrc
source ~/.bashrc
# 確認
cmake]$ cmake --version
cmake version 3.13.0-rc3
LLVM + Clangのビルド
やっとメインの作業です。
以下、公式のインストールページを参照して作業を進めます。
しかし、公式の「Getting Start with the LLVM」を開くと、
https://llvm.org/docs/GettingStarted.html
The LLVM Getting Started documentation may be out of date. So, the Clang Getting Started page might also be a good place to start.
Google翻訳によると
LLVM Getting Startedのドキュメントは古くなっている可能性があります。 だから、Clang Getting Startedのページも始めるのが良いかもしれない。
え!
どうせClangも入れますし、ClangのガイドでLLVMもインストールしているので、素直にClangのドキュメントに従って作業することにします。
http://clang.llvm.org/get_started.html
ドキュメントにありますが、ここで紹介する手順でインストールされるClangはデバッグモードとのことです。気になる方はビルドオプションなど調べてみたほうが良いかもしれません。
Get the required tools.
「必要なソフトウェアをインストール」で済ませていますが、ソース取得にsvnも必要なので入れます。
sudo yum install svn
Check out LLVM:
llvmのソースコードをダウンロードします。
svn co http://llvm.org/svn/llvm-project/llvm/trunk llvm
Check out Clang:
Clangのソースコードをダウンロードします。
cd llvm/tools
svn co http://llvm.org/svn/llvm-project/cfe/trunk clang
cd ../..
Check out extra Clang tools: (optional)
Clang toolsのソースコードをダウンロードします。
cd llvm/tools/clang/tools
svn co http://llvm.org/svn/llvm-project/clang-tools-extra/trunk extra
cd ../../../..
Check out Compiler-RT (optional):
Compiler-RTのソースコードをダウンロードします。
cd llvm/projects
svn co http://llvm.org/svn/llvm-project/compiler-rt/trunk compiler-rt
cd ../..
Check out libcxx:
only required to build and run Compiler-RT tests on OS X, optional otherwise
OS XでCompiler-RTテストをビルドして実行するためにのみ必要です。それ以外の場合はオプションです
とのことなので無視します。
Build LLVM and Clang:
いよいよビルドです。
makeのコマンドが終了するまで数時間かかります。
mkdir build
cd build
cmake -G "Unix Makefiles" ../llvm
make
コンソールが帰ってきたらビルド終了です。
確認
build/binというディレクトリに実行ファイルが出力されます。
次のコマンドで確認してみます。
./bin/clang --version
##########出力結果##########
clang version 8.0.0 (trunk 346584)
Target: x86_64-unknown-linux-gnu
Thread model: posix
InstalledDir: /home/centos/install-llvm/build/bin/.
###########################
ソースのバージョン(8.0.0)の実行ファイルが生成されています。
その他
最後に、ビルド時に消費したディスク容量を確認してみます。
du -m install-llvm
##########出力結果(の一部)##########
67377 install-llvm/build
1169 install-llvm/llvm
37 install-llvm/cmake
68582 install-llvm
##################################
ソース一式で1GBを超えているのも凄いですが。
buildディレクトリが67GBというのが驚きです。