【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でした）
**・３～４時間**
（何度もインスタンスのグレードアップやディスク拡張を行ったため不正確ですがとにかく時間がかかります）

最終的に私が使用した構成は、
c5.4xlarge + 100GB Volume
です。

# 事前準備
おきまりとして。

・Yumのアップデート

```{shell}
sudo yum update
```

・TimezoneをTokyoへ

```{shell}
sudo timedatectl set-timezone Asia/Tokyo
```

・Swapボリュームを作成

```{shell}
# スワップファイルを作成し、有効化
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 |

次のコマンドで確認すると、

```{shell}
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実行時にエラーが発生します。

```{shell}
sudo yum install gcc
sudo yum install gcc-c++
```

さらに、次のコマンドが入っていることが想定されるとのこと

```{shell}
    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 |

次のコマンドで確認。

```{shell}
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
```

# 作業ディレクトリの作成と移動

次のコマンドで、作業ディレクトリを作成して移動します。

```{shell}
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のバイナリをダウンロードしてインストールする。

```{shell}

# ダウンロードに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も必要なので入れます。

```{shell}
sudo yum install svn
```

## Check out LLVM:

llvmのソースコードをダウンロードします。

```{shell}
svn co http://llvm.org/svn/llvm-project/llvm/trunk llvm
```

## Check out Clang:

Clangのソースコードをダウンロードします。

```{shell}
cd llvm/tools
svn co http://llvm.org/svn/llvm-project/cfe/trunk clang
cd ../..
```

## Check out extra Clang tools: (optional)

Clang toolsのソースコードをダウンロードします。

```{shell}
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のソースコードをダウンロードします。

```{shell}
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のコマンドが終了するまで数時間かかります。

```{shell}
mkdir build
cd build
cmake -G "Unix Makefiles" ../llvm
make
```

コンソールが帰ってきたらビルド終了です。

# 確認

build/binというディレクトリに実行ファイルが出力されます。
次のコマンドで確認してみます。

```{shell}
./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）の実行ファイルが生成されています。

# その他

最後に、ビルド時に消費したディスク容量を確認してみます。

```{shell}
du -m install-llvm
##########出力結果(の一部)##########
67377   install-llvm/build
1169    install-llvm/llvm
37      install-llvm/cmake
68582   install-llvm
##################################
```

ソース一式で1GBを超えているのも凄いですが。
buildディレクトリが67GBというのが驚きです。