macOSでLLVM clang-19をソースコードからビルドする（2024年2月現在）

こんにちは｜こんばんは。カエルのアイコンで活動しております @kyamaz :frog: です。
## はじめに
macOSでは、`xcode-select --install`すれば Xcode とともにコンパイラである`clang`コマンドがインストールされます。Xcode はデフォルトではコマンドは`/Library/Developer/CommandLineTools/usr/bin`フォルダに置かれます。
また、別の手段としては、homebrewを使って`brew install llvm`でインストールして`/opt/homebrew/opt/llvm/bin`にPATHを通して使います。

本稿では、LLVMをソースコードからビルドして`/opt/local/bin`にインストールする手順を書きます。参考にしたQiitaの２つのエントリのリンクを次に挙げしておきます。環境が違っておりますが、本稿ではほぼ同様の手順を紹介します。

https://qiita.com/koyukitukimino/items/5de1080fddc5f43009b9

https://qiita.com/canary_llama/items/2b592b15c7b97229bb5f

### 本稿の環境
本稿のために使用した環境は以下となります。
- macOS: Sonoma 14.2.1 (chip: Apple M1)
- gcc/g++: Apple clang version 15.0.0 (clang-1500.1.0.2.5)
- Homebrew 4.2.9
- Ninja 1.11.1（homebrewにてインストール）
- CMake 3.28.2（homebrewにてインストール）

作業ディレクトリは作業ユーザーのホームディレクトリの下の`~/work`で作業します。各環境に合わせて読み替えてください。

# ビルドの手順
本家LLVMのサイトの[Getting Started with the LLVM System ページの Stand-alone Buildsの項](https://llvm.org/docs/GettingStarted.html#stand-alone-builds)に従って進めます。

## LLVMのソースコードを入手する
作業ディレクトリで`git clone`を実行してソースコードを入手します。

```shell-session:
$ cd ~/work
$ git clone https://github.com/llvm/llvm-project.git
$ cd llvm-project
```
## LLVMをビルドする
### ビルド設定を行う
cmakeでビルドのための設定を行います。
`-DLLVM_ENABLE_PROJECTS`にclangとlldを指定して同時にビルドできるようにしましょう。

```shell-session:
$ cmake -G Ninja -S llvm -B build \
-DLLVM_INSTALL_UTILS=ON -DCMAKE_INSTALL_PREFIX=/opt/local \
-DCMAKE_BUILD_TYPE=Release -DLLVM_ENABLE_PROJECTS='clang;lld'
```
<details><summary>cmakeのオプションの説明</summary>

> -S : ソースディレクトリのパス。
> -B : ビルド生成物の格納パス。指定したディレクトリは自動で生成されます。（本稿では`build`を指定。）
> -G : ビルド用のコード生成ツールを指定します。（本稿では`Ninja`を指定。）
> -D : キャッシュ・エントリーの情報(CMakeCache.txt)の定数定義を追加又は更新します。
> 　　-DCMAKE_INSTALL_PREFIX=directory : ツール及びライブラリのインストール先をフルパスで指定します。（本稿では`/opt/local`を指定。）
> 　　-DCMAKE_BUILD_TYPE=type : ビルドの種類を指定します。（本稿では`Release`を指定。）
</details>

<details><summary>【公開後の追記】</summary>

:::note info

* lldb,libcを追加する場合は、次のように`-DLLVM_ENABLE_RUNTIMES`や`-DLLDB_USE_SYSTEM_DEBUGSERVER`を指定する必要があります。
> cmake -G Ninja -S llvm -B build \\\
> -DLLVM_INSTALL_UTILS=ON -DCMAKE_INSTALL_PREFIX=/opt/local \\\
> -DLLVM_ENABLE_PROJECTS="clang;lld;lldb;libc" \\\
> -DCMAKE_BUILD_TYPE=Release \\\
> -DLLVM_ENABLE_RUNTIMES="libc;libunwind;libcxxabi;libcxx" \\\
> -DLLDB_USE_SYSTEM_DEBUGSERVER=ON

* openmpを指定してビルドしようとすると、macOSの著者環境では、[Cross-compiling libomp fails with missing symbol "___divdc3"](https://github.com/llvm/llvm-project/issues/54596)の問題が発生してビルドできませんでした。

:::
</details>


### ビルド＆インストールする
cmakeコマンドでビルドしたのち、ninjaコマンドでインストールします。それぞれビルド生成物の格納パス（本稿では"build"）を指定して実行します。

```shell-session:
$ cmake --build build -j$(nproc)
:
（ビルドには多少時間がかかります）
:
$ ninja -C build install
```
:::note warn
コンパイル中に警告がでることもありますが、ほとんど無視してもよい（ignoring）警告だと思います。ただし、ビルドに問題がないかは都度判断が必要です。
:::

### コマンドを実行する
正しくインストールされていればコマンドが正常に実行されます。本稿ではいくつかのコマンドのバージョン表示を確認します。

```shell-session:
$ /opt/local/bin/clang --version
clang version 19.0.0git (https://github.com/llvm/llvm-project.git XXX...)
Target: arm64-apple-darwin23.2.0
Thread model: posix
InstalledDir: /opt/local/bin
$ /opt/local/bin/ld64.lld --version
LLD 19.0.0
$ /opt/local/bin/llc --version
LLVM (http://llvm.org/):
  LLVM version 19.0.0git
  Optimized build.
  Default target: arm64-apple-darwin23.2.0
  Host CPU: apple-m1
:
:
```
## おわりに
本稿では、`/opt/local/bin`にソースコードから最新の LLVM clang-19 をインストールしました。「はじめに」に記載したとおり、macOSでは次のフォルダにもclangコマンドが存在します。
- /Library/Developer/CommandLineTools/usr/bin
- /opt/homebrew/opt/llvm/bin

インストールしたものと本稿でビルドしたものが混在することになりますが、PATHなどの環境変数を指定して、混乱しないように十分注意しましょう。
（●）（●） Happy Hacking!
/""　＿＿""＼