LLVMプロジェクトの作成

概要

LLVMビルドシステムは、LLVMヘッダーファイル、ライブラリ、ツールを使用するサードパーティプロジェクトのビルドを容易にするように設計されています。これらの機能を使用するには、プロジェクトのMakefileで次の操作を行う必要があります。

  • make変数を設定します。LLVMビルドシステムを使用するには、Makefileで設定する必要があるいくつかの変数があります。

    • PROJECT_NAME - プロジェクトの名称。

    • LLVM_SRC_ROOT - LLVMソースツリーのルート。

    • LLVM_OBJ_ROOT - LLVMオブジェクトツリーのルート。

    • PROJ_SRC_ROOT - プロジェクトのソースツリーのルート。

    • PROJ_OBJ_ROOT - プロジェクトのオブジェクトツリーのルート。

    • PROJ_INSTALL_ROOT - ルートインストールディレクトリ。

    • LEVEL - カレントディレクトリからプロジェクトのルート($PROJ_OBJ_ROOT)への相対パス。

  • $(LLVM_OBJ_ROOT)からMakefile.configを含めます。

  • $(LLVM_SRC_ROOT)からMakefile.rulesを含めます。

これらの変数を設定するには2つの方法があります。

  • これらの値をハードコードする独自のMakefileを作成できます。

  • 事前に作成されたLLVMサンプルプロジェクトを使用できます。このサンプルプロジェクトには、Makefile、LLVMの場所を設定するために使用できるコンフィグスクリプト、および単一のソースディレクトリから複数のオブジェクトディレクトリをサポートする機能が含まれています。

独自のビルドシステムを作成する場合は、他のプロジェクトとLLVMのMakefileを研究することで、独自のMakefileの書き方に関する十分な情報が得られるでしょう。

ソースツリーのレイアウト

LLVMビルドシステムを使用するには、ビルドシステムの機能を活用できるようにソースコードを整理する必要があります。主に、ソースツリーのレイアウトをLLVMソースツリーのレイアウトに似せる必要があります。

最上位ディレクトリの配下には、次のディレクトリが必要です。

lib

このサブディレクトリには、すべてのライブラリソースコードを含める必要があります。ビルドする各ライブラリについて、そのライブラリのソースコードを含むディレクトリが**lib**内に1つずつ存在します。

ライブラリは、オブジェクトファイル、アーカイブ、または動的ライブラリにすることができます。**lib**ディレクトリは、後でリンクできるディレクトリにすべてのライブラリを配置するため、ライブラリにとって便利な場所です。

include

このサブディレクトリには、プロジェクト全体で共通的に使用されるヘッダーファイルを含める必要があります。「共通」とは、プロジェクトの複数のライブラリまたは実行ファイルで使用されることを意味します。

ヘッダーファイルを**include**に配置することで、LLVMビルドシステムによって自動的に検出されます。たとえば、**include/jazz/note.h**というファイルがある場合、ソースファイルでは**#include “jazz/note.h”**だけでインクルードできます。

tools

このサブディレクトリには、実行ファイルのソースコードをすべて含める必要があります。ビルドする各プログラムについて、そのプログラムのソースコードを含むディレクトリが**tools**内に1つずつ存在します。

test

このサブディレクトリには、コードが正しく動作することを検証するテストを含める必要があります。自動テストは特に役立ちます。

現在、LLVMビルドシステムはテストの基本的なサポートを提供しています。LLVMシステムは以下のものを提供しています。

  • LLVMにはllvm/testに回帰テストが含まれています。これらのテストは、Litテストツールによって実行されます。このテスト手順では、テストケース内のRUN行を使用して、テストの実行方法を決定します。詳細は、LLVMテストインフラストラクチャガイドを参照してください。

  • LLVMには、Clangフロントエンドでコンパイルできることがわかっているベンチマークとプログラムを提供する、llvm-testというオプションのパッケージが含まれています。これらのプログラムを使用してコードをテストし、統計情報を収集し、現在のLLVMパフォーマンス統計と比較できます。

    現在、テストをllvm/testテストハーネスに直接フックする方法はありません。自分でそのディレクトリ内のソースを使用する方法を見つける必要があります。

通常、**lib**ディレクトリを最初にビルドしてから、**tools**ディレクトリをビルドします。

LLVMスタイルのMakefileの記述

LLVMビルドシステムは、ライブラリと実行ファイルをビルドするための便利な方法を提供します。プロジェクトのMakefileの大部分は、いくつかの変数を定義するだけで済みます。以下は、設定できる変数とその機能のリストです。

必須変数

LEVEL

この変数は、このMakefileからプロジェクトのソースコードの最上位ディレクトリへの相対パスです。たとえば、ソースコードが/tmp/srcにある場合、/tmp/src/jump/highMakefileではLEVEL"../.."に設定します。

サブディレクトリのビルドのための変数

DIRS

これは、ビルドする必要があるサブディレクトリのスペース区切りリストです。指定された順序で、一度に1つずつビルドされます。

PARALLEL_DIRS

これは、並列にビルドできるディレクトリのリストです。これらは、DIRS内のディレクトリのビルド後にビルドされます。

OPTIONAL_DIRS

これは、存在する場合はビルドできますが、存在しない場合でもエラーにならないディレクトリのリストです。リストされている順序で連続してビルドされます。

ライブラリのビルドのための変数

LIBRARYNAME

この変数には、ビルドするライブラリのベース名が含まれます。たとえば、libsample.aという名前のライブラリをビルドするには、LIBRARYNAMEsampleに設定する必要があります。

BUILD_ARCHIVE

デフォルトでは、ライブラリはプログラムに直接リンクされる.oファイルです。アーカイブ(静的ライブラリとも呼ばれます)をビルドするには、BUILD_ARCHIVE変数を設定します。

SHARED_LIBRARY

MakefileでSHARED_LIBRARYが定義されている場合、共有(または動的)ライブラリがビルドされます。

プログラムのビルドのための変数

TOOLNAME

この変数には、ビルドするプログラムの名前が含まれます。たとえば、sampleという名前の実行ファイルをビルドするには、TOOLNAMEsampleに設定する必要があります。

USEDLIBS

この変数には、プログラムにリンクする必要があるライブラリのスペース区切りリストが含まれます。これらのライブラリは、**lib**ディレクトリから取得したライブラリである必要があります。ライブラリは、libプレフィックスなしで指定する必要があります。たとえば、libsample.aをリンクするには、USEDLIBSsample.aに設定します。

これは、静的にリンクされたライブラリの場合にのみ機能することに注意してください。

LLVMLIBS

この変数には、プログラムにリンクする必要があるライブラリのスペース区切りリストが含まれます。これらのライブラリはLLVMライブラリである必要があります。ライブラリは、libプレフィックスなしで指定する必要があります。たとえば、IR変換を実行するドライバとリンクするには、LLVMLIBSをこの最小限のライブラリセットLLVMSupport.a LLVMCore.a LLVMBitReader.a LLVMAsmParser.a LLVMAnalysis.a LLVMTransformUtils.a LLVMScalarOpts.a LLVMTarget.aに設定できます。

これは、静的にリンクされたライブラリの場合にのみ機能することに注意してください。LLVMは多数の静的ライブラリに分割されており、必要なライブラリのリストは上記のリストよりもはるかに長くなる可能性があります。ライブラリの完全なリストを表示するには、llvm-config --libs allを使用します。LINK_COMPONENTSを以下のように使用すると、LLVMLIBSを設定する必要がなくなります。

LINK_COMPONENTS

この変数は、LLVMのMakefilesがプログラムのリンクラインを生成するためにllvm-configツールに渡す、スペースで区切られたコンポーネントのリストを保持します。例えば、すべてのLLVMライブラリとリンクするにはLINK_COMPONENTS = allを使用します。

LIBS

動的ライブラリをリンクするには、-l<library base name>LIBS変数に追加します。LLVMビルドシステムは、静的ライブラリの場合と同じ場所で動的ライブラリを探します。

例えば、libsample.soをリンクするには、Makefileに次の行を追加します。

LIBS += -lsample

LIBSは、Makefile.commonのインクルードの後でMakefileに記述する必要があります。

その他の変数

CFLAGS & CPPFLAGS

この変数は、それぞれCコンパイラとC++コンパイラにオプションを追加するために使用できます。通常は、コンパイラに追加のヘッダーファイル検索ディレクトリを指定するオプションを追加するために使用されます。

CFLAGSCPPFLAGSは、上書きするのではなく、追加することを強くお勧めします。LLVMのMakefilesには、上書きしたくない便利なオプションが既に含まれている場合があります。

オブジェクトコードの配置場所

ビルドされたライブラリと実行ファイルの最終的な配置場所は、DebugRelease、またはProfileのいずれのビルドを行うかによって異なります。

ライブラリ

すべてのライブラリ(静的と動的)はPROJ_OBJ_ROOT/<type>/libに格納されます。ここで、typeは、デバッグ、最適化、プロファイル済みビルドに対してそれぞれDebugReleaseProfileです。

実行ファイル

すべての実行ファイルはPROJ_OBJ_ROOT/<type>/binに格納されます。ここで、typeは、デバッグ、最適化、プロファイル済みビルドに対してそれぞれDebugReleaseProfileです。

ヘルプ

LLVMプロジェクトの作成に関するご質問やご不明な点がございましたら、LLVMチームが喜んでお手伝いいたします。Discourseフォーラムにご質問を投稿いただけます。