🖥️
Apple Silicon での LLVMのフルビルド
手順
-
llvm-project
を clonegit clone https://github.com/llvm/llvm-project.git
-
依存の追加
brew install lua@5.3 swig ocaml ocaml-findlib python libxml2 pip install pygments pyexpect pyyaml
-
他にも
lldb
を使用するための codesign を追加cd llvm-project ./lldb/scripts/macos-setup-codesign.sh
-
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 | コンパイラランタイムライブラリ。ビルトイン関数の実装やサニタイザー、プロファイリングツールなどを提供。 |
Discussion