CentOS
AWS
clang
LLVM
clang++

【2018年11月版】コンパイラ基盤LLVM+Clangをゼロからビルドする(AWS + CentOS7)。


はじめに

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というのが驚きです。