インストール - LLVM

提供:MochiuWiki : SUSE, EC, PCB
ナビゲーションに移動 検索に移動

概要

LLVMプロジェクトは、モジュール化され再利用可能なコンパイラとツールチェイン技術の集合体である。

イリノイ大学の研究プロジェクトとして始まり、任意のプログラミング言語の静的 / 動的コンパイルをサポートできる、SSAベースの近代的なコンパイル戦略を提供することを目的としていた。
その後、LLVMは多くのサブプロジェクトからなるアンブレラプロジェクトに成長して、その多くは、学術研究において広く利用されるだけでなく、様々な商用およびオープンソースプロジェクトによって稼働している。

LLVMの主なサブプロジェクトを、以下に示す。

  • LLVMコアライブラリ
    ソースコードやターゲットに依存しない最新のオプティマイザと、多くの一般的なCPUに対応したコード生成機能を提供する。
    これらのライブラリは、LLVM中間表現(LLVM IR)として知られる指定されたコード表現を中心に構築されている。
    LLVMコアライブラリは文書化されており、LLVMをオプティマイザやコード生成器として使用するための独自の言語の考案(または既存のコンパイラの移植)が容易である。

  • Clang
    LLVMネイティブのC / C++ / Objective-Cコンパイラにおいて、速いコンパイル、非常に有用なエラーと警告メッセージ、優れたソースレベルツールを構築するためのプラットフォームを提供することを目的としている。
    Clang Static Analyzerとclang-tidyは、コードのバグを自動的に見つけるツールであり、C / C++コードを解析するライブラリとしてClangフロントエンドを使用して構築できる。

  • libc++およびlibc++ ABIプロジェクト
    C++11およびC++14の完全サポートを含むC++標準ライブラリの標準準拠かつ高性能な実装を提供する。

  • compiler-rtプロジェクト
    __fixunsdfdi等の低レベルコードジェネレータサポートルーチンや、ターゲットがコアIR操作を実装するための短いネイティブ命令列を持っていない場合に発生するその他のコールの高度に調整された実装を提供する。
    また、AddressSanitizer、ThreadSanitizer、MemorySanitizer、DataFlowSanitizer等の動的テストツールのランタイムライブラリの実装を提供している。

  • MLIRサブプロジェクト
    再利用可能で拡張性のあるコンパイラ基盤を構築するための新しいアプローチである。
    MLIRは、ソフトウェアの断片化の対処、異種ハードウェアに対するコンパイルの改善、ドメイン固有のコンパイラを構築するコストを大幅に削減する等、既存のコンパイラの接続を支援することを目的としている。

  • OpenMPサブプロジェクト
    ClangのOpenMP実装で使用するためのOpenMPランタイムを提供する。

  • pollyプロジェクト
    多面体モデルを用いて、自動並列化やベクトル化だけでなく、キャッシュローカリティ最適化のスイートも実装している。

  • libclcプロジェクト
    OpenCL標準ライブラリの実装を目的としている。

  • kleeプロジェクト
    定理証明器を用いてプログラムの動的パスの評価を行い、バグの発見や関数の性質を証明する"記号的仮想機械"を実装している。
    kleeの大きな特徴は、バグを検出した際にテストケースを生成することができる点である。

  • LLDプロジェクト
    リンカのことであり、システムリンカのドロップイン置き換えで、高速に動作する。

  • BOLTプロジェクト
    ポストリンクオプティマイザである。
    サンプリングプロファイラで収集した実行プロファイルをもとに、ソフトウェアのコードレイアウトを最適化することにより、高速化を実現する。



LLVMのインストール

パッケージ管理システムからインストール

sudo zypper install llvm llvm-gold llvm-polly clang lldb lld


ソースコードからインストール

LLVMのインストールに必要なライブラリをインストールする。

sudo zypper install git ncurses-devel isl-devel xz-devel libedit-devel libxml2-devel libbsd-devel lua53 lua53-devel \
                    python3 python3-devel python3-pyaml python3-Pygments                                \  # Python 3.6を使用する場合
                    python311 python311-devel python311-PyYAML python311-Pygments                       \  # Python 3.11を使用する場合
                    doxygen                                                                                # ドキュメントをビルドする場合


LLVMのGithubから、LLVMのソースコードをダウンロードする。
ダウンロードするファイルは、llvm-project-<バージョン>.src.tar.xzである。

ダウンロードしたLLVMのソースコードを解凍する。

tar xf llvm-project-<バージョン>.src.tar.xz


LLVMのビルドディレクトリを作成する。

cd llvm-project
mkdir build && cd build


LLVMをビルドおよびインストールする。

cmake -G "Unix Makefiles" \
-DCMAKE_C_COMPILER=<GCC 8以降のgccコンパイラのパス> -DCMAKE_CXX_COMPILER=<GCC 8以降のg++コンパイラのパス> \
-DLLVM_TARGETS_TO_BUILD="X86;ARM;AArch64;AVR;MSP430" \  # x86, x86-64, ARM, AArch64, MSP430, AVR向けのLLVMをビルドする場合(指定しない場合は全てのアーキテクチャ)
-DCMAKE_BUILD_TYPE=Release                      \
-DCMAKE_INSTALL_PREFIX=<LLVMのインストールディレクトリ> \
-DLLVM_ENABLE_RTTI=ON                           \
-DLLVM_ENABLE_PROJECTS="clang;clang-tools-extra;flang;libclc;lld;lldb;mlir;openmp;polly" \
-DLLVM_ENABLE_RUNTIMES="compiler-rt;libc;libcxx;libcxxabi;libunwind;openmp" \
../llvm

make -j $(nproc)
make install

# または

cmake -G Ninja \
-DCMAKE_C_COMPILER=<GCC 8以降のgccコンパイラのパス> -DCMAKE_CXX_COMPILER=<GCC 8以降のg++コンパイラのパス> \
-DLLVM_TARGETS_TO_BUILD="X86;AArch64" \  # x86, x86-64, AArch64向けのLLVMをビルドする場合(デフォルトは全てのアーキテクチャ)
-DCMAKE_BUILD_TYPE=Release                      \
-DCMAKE_INSTALL_PREFIX=<LLVMのインストールディレクトリ> \
-DLLVM_ENABLE_RTTI=ON                           \
-DLLVM_ENABLE_PROJECTS="clang;clang-tools-extra;flang;libclc;lld;lldb;mlir;polly" \
-DLLVM_ENABLE_RUNTIMES="compiler-rt;libc;libcxx;libcxxabi;libunwind;openmp" \
../llvm

ninja -j $(nproc)
ninja install


ビルド向けオプションは、以下の通りである。

  • LLVM_TARGETS_TO_BUILD
    セミコロンで区切られたリストで、どのターゲットをビルドしてLLVMにリンクするかを制御する。
    デフォルト値はLLVM_ALL_TARGETSとして定義され、ツリー外のターゲットを含むように設定できる。
    デフォルト値は、ARMAArch64AMDGPUAVRBPFHexagonLanaiMipsMSP430NVPTXPowerPCRISCVSparcSystemZWebAssemblyX86XCoreである。

    このオプションの値をhostと指定すると、ホストアーキテクチャのみがコンパイルされる。
    例えば、x86ホストPCでX86を指定するのと同じである。

  • PYTHON_EXECUTABLE
    Pythonへのパスを渡すことで、CMakeに特定のPythonのバージョンを使用する。
    デフォルトでは環境変数PATHにあるPythonが使用される。

  • LLVM_TARGETS_TO_BUILD
    ビルドするターゲットを選択する。
    これは、LLVMにどのターゲットをリンクするかを制御するセミコロンで区切られたリストである。
    デフォルトは、LLVM_ALL_TARGETSとして定義されている。
    デフォルトでは、以下のターゲットが含まれる。
    AArch64, AMDGPU, ARM, AVR, BPF, Hexagon, Lanai, Mips, MSP430, NVPTX, PowerPC, RISCV, Sparc, SystemZ, WebAssembly, X86, XCore

  • LLVM_ENABLE_DOXYGEN
    ソースコードからdoxygenベースのドキュメントをビルドする。
    これは多くの出力を生成するため、デフォルトでは無効になっている。

  • LLVM_ENABLE_PROJECTS
    他のLLVMサブプロジェクトの内、どのプロジェクトを追加でビルドするかをセミコロンで区切ったリストで指定する。
    デフォルトでは空のリストである。
    ビルドできるプロジェクトは、以下の通りである。
    clang、clang-tools-extra、compiler-rt、cross-project-tests、flang、libc、libclc、libcxx、libcxxabi、libunwind、lld、lldb、mlir、openmp、polly、pstl

  • LLVM_ENABLE_SPHINX
    Sphinxベースのドキュメントをビルドする。
    これは多くの出力を生成するため、デフォルトでは無効になっている。
    Sphinx 1.5以降を推奨する。

  • LLVM_BUILD_LLVM_DYLIB
    libLLVM.soを生成する。
    このライブラリには、LLVMコンポーネントのデフォルトセットが含まれており、LLVM_DYLIB_COMPONENTSでオーバーライドすることができる。
    デフォルトでは、ほとんどのLLVMが含まれており、tools/llvm-shlib/CMakelists.txtで定義されている。
    このオプションはWindowsでは使用できない。

  • LLVM_OPTIMIZED_TABLEGEN
    リリーステーブル生成器を構築する。


LLVMのインストール完了後、~/.profileファイル等に環境変数を設定する。

export PATH="/<LLVMのインストールディレクトリ>/bin:$PATH"
export LLVM_INSTALL_DIR="<LLVMのインストールディレクトリ>"

export LDFLAGS="-L/<LLVMのインストールディレクトリ>/lib"       # 不要の可能性あり
export CPPFLAGS="-I/<LLVMのインストールディレクトリ>/include"  # 不要の可能性あり



LLVMのクロスコンパイル

LLVMの実行ファイルやライブラリにおいて、ビルドされるプラットフォームとは異なるプラットフォームでホストするためにインストールすることができる。
クロスコンパイル向けのビルドファイルを生成するために、-DCMAKE_TOOLCHAIN_FILEオプションを、LLVMのインストール時に使用するコンパイラフラグや変数を定義することができる。

AArch64

以下の例では、AArch64をターゲットとしたLLVMをクロスビルドおよびインストールしている。

mkdir build && cd build

cmake -G Ninja                                         \
-DCMAKE_BUILD_TYPE=Release                             \
-DCMAKE_INSTALL_PREFIX=<LLVMクロスツールチェーンのインストールディレクトリ>  \
-DCMAKE_C_COMPILER=/<クロスコンパイラのパス  例: aarch64-unknown-linux-gnu-gcc>   \  # CMakeツールチェーンファイルを使用しない場合
-DCMAKE_CXX_COMPILER=/<クロスコンパイラのパス  例: aarch64-unknown-linux-gnu-g++> \  # CMakeツールチェーンファイルを使用しない場合
-DCMAKE_CXX_FLAGS='-march=armv8-a -mtune=cortex-a53'                        \  # CMakeツールチェーンファイルを使用しない場合 (左の例は、PinePhoneの場合)
-DCMAKE_TOOLCHAIN_FILE=<CMakeツールチェーンファイルのパス>           \  # CMakeツールチェーンファイルを使用する場合
-DLLVM_NATIVE_TOOL_DIR=/<ホスト向けLLVMのインストールディレクトリ>/bin  \
-DLLVM_BUILD_RUNTIME=Off               \
-DLLVM_INCLUDE_TESTS=Off               \
-DLLVM_INCLUDE_EXAMPLES=Off            \
-DLLVM_ENABLE_BACKTRACES=Off           \
-DCMAKE_CROSSCOMPILING=1               \
-DLLVM_TARGET_ARCH="AArch64"           \
-DLLVM_TARGETS_TO_BUILD="AArch64"      \
-DLLVM_DEFAULT_TARGET_TRIPLE=aarch64-unknown-linux-gnu         \
-DCMAKE_CXX_FLAGS='-march=armv8-a -mtune=cortex-a53'           \
-DLLVM_TABLEGEN=/<ホスト向けLLVMのインストールディレクトリ>/bin/llvm-tblgen     \
-DCLANG_TABLEGEN=/<ホスト向けLLVMのインストールディレクトリ>/bin/clang-tblgen   \
-DCMAKE_LIBRARY_ARCHITECTURE=/<ターゲットのシステムルートのパス>/lib          \
-DLLVM_ENABLE_PROJECTS="clang;clang-tools-extra;compiler-rt;lld;lldb" \
-DLLVM_INSTALL_TOOLCHAIN_ONLY=On \
-DLLDB_ENABLE_PYTHON=0           \
-DLLDB_ENABLE_LIBEDIT=0          \
-DLLDB_ENABLE_CURSES=0           \
-DLLVM_BUILD_LLVM_DYLIB=On       \
-DLLVM_LINK_LLVM_DYLIB=On        \
-DDEFAULT_SYSROOT=<ターゲットのシステムルートディレクトリ> \
../llvm


iOS

以下の例では、iOSをターゲットとしたLLVMをクロスビルドおよびインストールしている。

mkdir build && cd build

cmake -G Ninja "Unix Makefiles"                                                           \
               -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=<LLVMのインストールディレクトリ> \
               -DCMAKE_OSX_ARCHITECTURES="armv7;armv7s;arm64"                             \
               -DCMAKE_TOOLCHAIN_FILE=<PATH_TO_LLVM>/cmake/platforms/iOS.cmake            \
               -DLLVM_BUILD_RUNTIME=Off -DLLVM_INCLUDE_TESTS=Off                          \
               -DLLVM_INCLUDE_EXAMPLES=Off -DLLVM_ENABLE_BACKTRACES=Off                   \
               ../llvm

ninja -j $(nproc)
ninja install