🖥️

Apple Silicon での LLVMのフルビルド

2024/03/23に公開

手順

  1. llvm-project を clone

    git clone https://github.com/llvm/llvm-project.git
    
  2. 依存の追加

    brew install lua@5.3 swig ocaml ocaml-findlib python libxml2
    pip install pygments pyexpect pyyaml
    
  3. 他にも lldb を使用するための codesign を追加

    cd llvm-project
    ./lldb/scripts/macos-setup-codesign.sh
    
  4. 2 ステップに分けて以下のコマンドでコンパイル

    cmake -S llvm -B build -GNinja                                                                              \
        -DCMAKE_LIBTOOL=/opt/homebrew/opt/llvm/Toolchains/LLVM17.0.6.xctoolchain/usr/bin/llvm-libtool-darwin    \
        -DCLANG_ENABLE_BOOTSTRAP=On                                                                             \
        -DLLVM_ENABLE_PROJECTS="clang"                                                                          \
        -DLLVM_ENABLE_RUNTIMES="libcxx;libunwind;libcxxabi"                                                     \
        -DLLVM_POLLY_LINK_INTO_TOOLS=ON                                                                         \
        -DLLVM_BUILD_EXTERNAL_COMPILER_RT=ON                                                                    \
        -DLLVM_INCLUDE_DOCS=OFF                                                                                 \
        -DLLVM_INCLUDE_TESTS=OFF                                                                                \
        -DLLVM_ENABLE_LIBCXX=ON                                                                                 \
        -DLLVM_ENABLE_LTO=Thin                                                                                  \
        -DDEFAULT_SYSROOT=/Library/Developer/CommandLineTools/SDKs/MacOSX14.sdk/                                \
        -DFFI_INCLUDE_DIR=/Library/Developer/CommandLineTools/SDKs/MacOSX14.sdk/usr/include/ffi                 \
        -DFFI_LIBRARY_DIR=/Library/Developer/CommandLineTools/SDKs/MacOSX14.sdk/usr/lib                         \
        -DCMAKE_INSTALL_PREFIX=$HOME/.llvm                                                                      \
        -DCMAKE_BUILD_TYPE=Release                                                                              \
        -Wno-dev
    cmake --build build
    
    cmake -S llvm -B build -GNinja                                                                              \
        -DCMAKE_LIBTOOL=/opt/homebrew/opt/llvm/Toolchains/LLVM17.0.6.xctoolchain/usr/bin/llvm-libtool-darwin    \
        -DCLANG_ENABLE_BOOTSTRAP=On                                                                             \
        -DLLVM_ENABLE_PROJECTS="bolt;clang;clang-tools-extra;libclc;lld;lldb;mlir;openmp;polly"                 \
        -DLLVM_ENABLE_RUNTIMES="libcxx;libc;libunwind;libcxxabi;pstl;compiler-rt"                               \
        -DLLVM_POLLY_LINK_INTO_TOOLS=ON                                                                         \
        -DLLVM_BUILD_EXTERNAL_COMPILER_RT=ON                                                                    \
        -DLLVM_INCLUDE_DOCS=OFF                                                                                 \
        -DLLVM_INCLUDE_TESTS=OFF                                                                                \
        -DLLVM_ENABLE_LIBCXX=ON                                                                                 \
        -DLLVM_ENABLE_LTO=Thin                                                                                  \
        -DDEFAULT_SYSROOT=/Library/Developer/CommandLineTools/SDKs/MacOSX14.sdk/                                \
        -DFFI_INCLUDE_DIR=/Library/Developer/CommandLineTools/SDKs/MacOSX14.sdk/usr/include/ffi                 \
        -DFFI_LIBRARY_DIR=/Library/Developer/CommandLineTools/SDKs/MacOSX14.sdk/usr/lib                         \
        -DCMAKE_INSTALL_PREFIX=$HOME/.llvm                                                                      \
        -DCMAKE_BUILD_TYPE=Release                                                                              \
        -Wno-dev
    cmake --build buil
    
homebrew/llvm.rb と [llvm のリポジトリ](https://github.com/llvm/llvm-project/blob/llvmorg-18.1.0/libcxx/cmake/caches/Apple.cmake) を参考にした project の設定
cmake -S llvm -B build -GNinja                                                                              \
    -DCMAKE_BUILD_TYPE=Release                                                                              \
    -DCMAKE_INSTALL_PREFIX=$HOME/.llvm                                                                      \
    -DDEFAULT_SYSROOT=/Library/Developer/CommandLineTools/SDKs/MacOSX14.sdk/                                \
    -DFFI_INCLUDE_DIR=/Library/Developer/CommandLineTools/SDKs/MacOSX14.sdk/usr/include/ffi                 \
    -DFFI_LIBRARY_DIR=/Library/Developer/CommandLineTools/SDKs/MacOSX14.sdk/usr/lib                         \
    -DLLVM_BUILD_EXTERNAL_COMPILER_RT=ON                                                                    \
    -DLLVM_ENABLE_PROJECTS="clang;clang-tools-extra;lld;lldb;mlir;polly"                                    \
    -DLLVM_ENABLE_RUNTIMES="libcxx;libunwind;libcxxabi;openmp;pstl;compiler-rt"                             \
    -DLLVM_ENABLE_LIBCXX=ON                                                                                 \
    -DLLVM_ENABLE_LTO=Thin                                                                                  \
    -DLLVM_INCLUDE_DOCS=OFF                                                                                 \
    -DLLVM_INCLUDE_TESTS=OFF                                                                                \
    -DLLVM_POLLY_LINK_INTO_TOOLS=ON                                                                         \
    -DLLVM_TARGETS_TO_BUILD="AArch64"                                                                       \
    -DLLVM_ENABLE_Z3_SOLVER=ON                                                                              \
    -DLIBCXX_INSTALL_MODULES=ON                                                                             \
    -DCMAKE_POSITION_INDEPENDENT_CODE=OFF                                                                   \
    -DLIBCXX_USE_COMPILER_RT=ON                                                                             \
    -DLIBCXX_ABI_VERSION=1                                                                                  \
    -DLIBCXX_ENABLE_STATIC=ON                                                                               \
    -DLIBCXX_ENABLE_SHARED=ON                                                                               \
    -DLIBCXX_CXX_ABI="libcxxabi"                                                                            \
    -DLIBCXX_ENABLE_VENDOR_AVAILABILITY_ANNOTATIONS=ON                                                      \
    -DLIBCXX_PSTL_CPU_BACKEND="libdispatch"                                                                 \
    -DLIBCXX_HERMETIC_STATIC_LIBRARY=ON                                                                     \
    -DLIBCXXABI_HERMETIC_STATIC_LIBRARY=ON                                                                  \
    -DLIBCXXABI_ENABLE_ASSERTIONS=OFF                                                                       \
    -DLIBCXXABI_ENABLE_FORGIVING_DYNAMIC_CAST=ON                                                            \
    -DLIBCXXABI_USE_LLVM_UNWINDER=OFF                                                                       \
    -Wno-dev
cmake --build build

llvm-project の cache.cmake を使用する

llvm-project にはさまざまなcmake の変数を設定してくれている .cmake ファイルがある。
Apple については以下の四つ

./clang/cmake/caches/Apple-stage1.cmake
./libcxx/cmake/caches/Apple.cmake
./compiler-rt/cmake/caches/Apple.cmake
./lldb/cmake/caches/Apple-lldb-macOS.cmake

これらを用いることでより簡潔にビルドをできる
BOOTSTRAP でビルドをするためには、2回目以降のビルドのための CMAKE 変数を設定してあげる必要があり、これは CLANG_BOOTSTRAP_PASSTHROUGH; 区切りで列挙する必要がある。

cmake -S llvm -B build -GNinja \
    -C ./clang/cmake/caches/Apple-stage1.cmake \
    -C ./libcxx/cmake/caches/Apple.cmake \
    -C ./compiler-rt/cmake/caches/Apple.cmake  \
    -C ./lldb/cmake/caches/Apple-lldb-macOS.cmake \
    -DDEFAULT_SYSROOT=/Library/Developer/CommandLineTools/SDKs/MacOSX14.sdk \
    -DFFI_INCLUDE_DIR=/Library/Developer/CommandLineTools/SDKs/MacOSX14.sdk/usr/include/ffi \
    -DFFI_LIBRARY_DIR=/Library/Developer/CommandLineTools/SDKs/MacOSX14.sdk/usr/lib \
    -DLIBCXX_INSTALL_MODULES=ON \
    -DLLVM_ENABLE_PROJECTS="bolt;clang;clang-tools-extra;libclc;lld;lldb;mlir;openmp;polly" \
    -DLLVM_ENABLE_RUNTIMES="libcxx;libc;libunwind;libcxxabi;pstl;compiler-rt" \
    -DLLVM_ENABLE_Z3_SOLVER=ON \
    -DLLVM_POLLY_LINK_INTO_TOOLS=ON \
    -DCLANG_BOOTSTRAP_PASSTHROUGH="CMAKE_INSTALL_PREFIX;DEFAULT_SYSROOT;FFI_INCLUDE_DIR;FFI_LIBRARY_DIR;LIBCXX_INSTALL_MODULES;LLVM_ENABLE_Z3_SOLVER;LLVM_POLLY_LINK_INTO_TOOLS"
cmake --build build --target stage2

補足

各種プロジェクトの説明は以下の通りである(ChatGPT4 より作成)

プロジェクト名 説明
bolt バイナリ最適化ツール。実行ファイルのパフォーマンスを改善するためにプロファイルガイド付き最適化を行う。
clang C/C++/Objective-Cのコンパイラフロントエンド。GCCと互換性があり、高速なコンパイル速度と優れたエラーメッセージが特徴。
clang-tools-extra Clangに追加のツールやライブラリを提供。コードの静的解析やフォーマットなどの機能を拡張する。
libclc OpenCL C言語の標準ライブラリの実装。OpenCLカーネルを書くための数学関数やユーティリティ関数を提供。
lld LLVMプロジェクトのリンカー。高速なリンク速度と低メモリ消費が特徴。ELF、COFF、Mach-Oなどのフォーマットをサポート。
lldb LLVMベースのデバッガ。C、C++、Objective-Cのデバッグに対応。コマンドラインとグラフィカルインターフェースの両方を提供。
mlir 多言語間最適化と再利用を目的とした中間表現。異なるドメイン固有言語や計算モデルの最適化を統合する。
openmp OpenMP APIのサポートを提供。並列プログラミングのためのディレクティブ、ライブラリ、環境変数を含む。
polly ポリヘドラル最適化フレームワーク。ループネストや制御フローの自動並列化と最適化を行う。
libcxx C++標準ライブラリの実装。モダンC++の機能やパフォーマンスの向上を目指す。
libc 標準Cライブラリの実装。標準関数やマクロ、型定義を提供し、プログラムのポータビリティを向上させる。
libunwind スタック展開ライブラリ。関数呼び出しの履歴を取得し、例外処理やデバッグに使用される。
libcxxabi C++ ABIライブラリ。C++の例外処理やランタイム型情報などの低レベル機能を提供。
pstl 並列STL (Standard Template Library) の実装。アルゴリズムの並列実行をサポートし、パフォーマンスを向上させる。
compiler-rt コンパイラランタイムライブラリ。ビルトイン関数の実装やサニタイザー、プロファイリングツールなどを提供。
GitHubで編集を提案

Discussion