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/high
のMakefile
ではLEVEL
を"../.."
に設定します。
サブディレクトリのビルドのための変数¶
DIRS
これは、ビルドする必要があるサブディレクトリのスペース区切りリストです。指定された順序で、一度に1つずつビルドされます。
PARALLEL_DIRS
これは、並列にビルドできるディレクトリのリストです。これらは、DIRS内のディレクトリのビルド後にビルドされます。
OPTIONAL_DIRS
これは、存在する場合はビルドできますが、存在しない場合でもエラーにならないディレクトリのリストです。リストされている順序で連続してビルドされます。
ライブラリのビルドのための変数¶
LIBRARYNAME
この変数には、ビルドするライブラリのベース名が含まれます。たとえば、
libsample.a
という名前のライブラリをビルドするには、LIBRARYNAME
をsample
に設定する必要があります。
BUILD_ARCHIVE
デフォルトでは、ライブラリはプログラムに直接リンクされる
.o
ファイルです。アーカイブ(静的ライブラリとも呼ばれます)をビルドするには、BUILD_ARCHIVE
変数を設定します。
SHARED_LIBRARY
Makefileで
SHARED_LIBRARY
が定義されている場合、共有(または動的)ライブラリがビルドされます。
プログラムのビルドのための変数¶
TOOLNAME
この変数には、ビルドするプログラムの名前が含まれます。たとえば、
sample
という名前の実行ファイルをビルドするには、TOOLNAME
をsample
に設定する必要があります。
USEDLIBS
この変数には、プログラムにリンクする必要があるライブラリのスペース区切りリストが含まれます。これらのライブラリは、**lib**ディレクトリから取得したライブラリである必要があります。ライブラリは、
lib
プレフィックスなしで指定する必要があります。たとえば、libsample.a
をリンクするには、USEDLIBS
をsample.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++コンパイラにオプションを追加するために使用できます。通常は、コンパイラに追加のヘッダーファイル検索ディレクトリを指定するオプションを追加するために使用されます。
CFLAGS
とCPPFLAGS
は、上書きするのではなく、追加することを強くお勧めします。LLVMのMakefiles
には、上書きしたくない便利なオプションが既に含まれている場合があります。
オブジェクトコードの配置場所¶
ビルドされたライブラリと実行ファイルの最終的な配置場所は、Debug
、Release
、またはProfile
のいずれのビルドを行うかによって異なります。
ライブラリ
すべてのライブラリ(静的と動的)は
PROJ_OBJ_ROOT/<type>/lib
に格納されます。ここで、typeは、デバッグ、最適化、プロファイル済みビルドに対してそれぞれDebug
、Release
、Profile
です。
実行ファイル
すべての実行ファイルは
PROJ_OBJ_ROOT/<type>/bin
に格納されます。ここで、typeは、デバッグ、最適化、プロファイル済みビルドに対してそれぞれDebug
、Release
、Profile
です。
ヘルプ¶
LLVMプロジェクトの作成に関するご質問やご不明な点がございましたら、LLVMチームが喜んでお手伝いいたします。Discourseフォーラムにご質問を投稿いただけます。