LLVMをソースからビルドする

LLVMをLinux(RHEL9)上でソースからビルドする方法についての説明となります。

## LLVMとは
>LLVM（エルエルヴィーエム、 またはエルエルブイエム）とは、コンパイル時、リンク時、実行時などあらゆる時点でプログラムを最適化するよう設計された、任意のプログラミング言語に対応可能なコンパイラ基盤である。
>
> [LLVM ‐ Wikipediaより](https://ja.wikipedia.org/wiki/LLVM)

## 環境について
本稿を記載の為に使用した環境は以下となります。
・OS:RHEL9.0(Hyper-V上の仮想マシン)
・gcc (GCC) 11.2.1 20220127 (Red Hat 11.2.1-9)
・cmake version 3.20.2
・ninja 1.11.0
ユーザはuserという名称を使用、作業ディレクトリは/home/user/workとしています。これについては各環境に合わせて読み替えてください。

## ビルドの方法

#### 1. ソースを取得する。
llvm-projectのGitリポジトリのクローンを行う。

```terminal:
[user@localhost work]$ git clone https://github.com/llvm/llvm-project.git
Cloning into 'llvm-project'...
remote: Enumerating objects: 4966226, done.
remote: Counting objects: 100% (2723/2723), done.
remote: Compressing objects: 100% (458/458), done.
remote: Total 4966226 (delta 2447), reused 2337 (delta 2262), pack-reused 4963503
Receiving objects: 100% (4966226/4966226), 1.91 GiB | 14.28 MiB/s, done.
Resolving deltas: 100% (4066854/4066854), done.
Updating files: 100% (118535/118535), done.
[user@localhost work]$
```

#### 2. コンフィグを行う
CMakeにより、メークの準備を行う。

```terminal:
[user@localhost work]$ cd llvm-project
[user@localhost llvm-project]$ cmake -S llvm -B build -G 'Ninja' -DLLVM_ENABLE_PROJECTS='clang' -DCMAKE_BUILD_TYPE='Release' -DCMAKE_INSTALL_PREFIX='/usr/local' -DLLVM_ENABLE_ASSERTIONS='On'
-- The C compiler identification is GNU 11.2.1
-- The CXX compiler identification is GNU 11.2.1
-- The ASM compiler identification is GNU
-- Found assembler: /usr/bin/cc
　：
　：
-- Performing Test HAVE_STEADY_CLOCK -- success
-- Configuring done
-- Generating done
-- Build files have been written to: /home/user/work/llvm-project/build
[user@localhost llvm-project]$
```

cmake の引数は以下の通り。
```terminal:
-S : ソースディレクトリのパス。ここでは ./llvm を指定する。
―B : ビルド生成物の格納パス。ここでは ./build を指定する。指定したディレクトリは自動で生成される。
―G : ビルド用のコードの生成ツールを指定する。本稿ではNinjaを使用する。
　　　他には、Unix Makefile、Visual Studio、Xcode等が指定可能。
-D : キャッシュ・エントリーの情報(CMakeCache.txt)の定数定義を追加又は更新する。
     LLVMのビルド固有の指定内容は以下のとおり。
   -DLLVM_ENABLE_PROJECTS='...' : 追加でビルドしたいプロジェクトをセミコロン区切りで指定する。
　　　　　　　　　　 　　　　　　　　clang, clang-tools-extra, cross-project-tests, flang, 
　　　　　　　　　　 　　　　　　　　libc, libclc, lld, lldb, mlir, openmp, polly及びpstl
　　　　　　　　　　 　　　　　　　　が指定可能
 　-DLLVM_ENABLE_RUNTIMES='...' : 追加でビルドしたいライブラリをセミコロン区切りで指定する。
                                  libcxx, libcxxabi, libunwind, compiler-rt, libc及びopenmp
　　　　　　　　　　 　　　　　　　　が指定可能
   -DCMAKE_INSTALL_PREFIX=directory : ツール及びライブラリのインストール先をフルパスで指定する。
　　　　　　　　　　　　　　　　　　　　　デフォルトは/usr/local。
                                      LLVMが提供するライブラリ
　　　　　　　　　　　　　　　　　　　　 （libc++やlibc++abiなど）をシステムが使用する場合、
　　　　　　　　　　　　　　　　　　　　 システムのライブラリを上書きするパスを指定しないこと。
   -DCMAKE_BUILD_TYPE=type : ビルドの種類を指定する。Debug、Release、RelWithDebInfo又は
                             MinSizeRelが指定可能。デフォルトはDebug。
   -DLLVM_ENABLE_ASSERTIONS=On/Off : ONの場合、アサーション・チェックを有効としてビルドする。
```
そのほか、cmakeに対する詳細な情報は以下を参照。

https://llvm.org/docs/CMake.html

#### 3. ビルドを実行する。
CMakeにより、ビルドを実行する。

```terminal:
[user@localhost llvm-project]$ cmake --build build
[4564/4564] Linking CXX executable bin/obj2yaml
[user@localhost llvm-project]$
```

:::note warn
筆者環境ではコンパイル中に警告が多数出力されました。
しかし、今回はソース自体を操作しているわけではない為、無視します。
(プログラム実行には問題が起きない理解とします。)
:::

#### 4. プログラムをインストールする
CMakeにより、生成したモジュールをインストールする。

```terminal:
[user@localhost llvm-project]$ sudo cmake --install build
[sudo] user のパスワード:
-- Install configuration: "Release"
　：
　：
-- Up-to-date: /usr/local/lib/cmake/llvm/./VersionFromVCS.cmake
-- Up-to-date: /usr/local/lib/cmake/llvm/./llvm-driver-template.cpp.in
[user@localhost llvm-project]$
```

#### ５. インストール結果の確認
コマンドを実行してみる。
正しくインストールされていればコマンドが正常に実行され、バージョンが表示される。

```terminal:
[user@localhost llvm-project]$ clang --version
clang version 16.0.0 (https://github.com/llvm/llvm-project.git 2b731b30a7e7948ba37649ab1af4be542578104a)
Target: x86_64-unknown-linux-gnu
Thread model: posix
InstalledDir: /usr/local/bin
[user@localhost llvm-project]$
```