「つくる」変数は、展開可能な文字列変数の特殊なクラスで、 "Subject to 'Make variable'置換」というテキストを使用します。
たとえば、ユーザーが作成したビルドアクションに特定のツールチェーン パスを挿入するために使用できます。
Bazel には、すべてのターゲットで使用できる事前定義変数と、依存関係ターゲットで定義され、依存するターゲットでのみ使用できるカスタム変数の両方が用意されています。
「Make」という言葉を使う理由は、記述されています。つまり、Terraform の構文と これらの変数はもともと、GNU Make。
使用
「Make 変数の置換の対象」としてマークされた属性は、次のように「Make」変数 FOO
を参照できます。
my_attr = "prefix $(FOO) suffix"
つまり、$(FOO)
に一致する部分文字列が展開されます。
FOO
の値に設定されます。その値が "bar"
の場合、最終的な文字列は次のようになります。
my_attr = "prefix bar suffix"
FOO
が使用元のターゲットに知られている変数に対応していない場合、Bazel はエラーで失敗します。
「つくる」名前が文字以外の記号である変数(例:
@
は、ドル記号のみを使用して参照することもできます。
あります。次に例を示します。
my_attr = "prefix $@ suffix"
$
を文字列リテラルとして記述する(つまり、変数が
拡張)、$$
と記述します。
事前定義された変数
事前定義の「Make」変数は、 "Make variable" の対象置換する」
特定のビルドオプションのセットのこれらの変数とその値のリストを表示するには、次のコマンドを実行します。
bazel info --show_make_env [build options]
大文字の出力行を確認します
ツールチェーン オプション変数
COMPILATION_MODE
:fastbuild
、dbg
、またはopt
。( 詳細)
パス変数
-
BINDIR
: ターゲット アーキテクチャ用に生成されたバイナリ ツリーのベース。クロスコンパイルをサポートするために、ホスト アーキテクチャでビルド中に実行されるプログラムに別のツリーが使用される場合があります。
genrule
内からツールを実行する場合は、 パスを取得するために推奨される方法は$(execpath toolname)
です。 ここで、toolname はgenrule
のtools
属性。 GENDIR
: ターゲット アーキテクチャ用に生成されたコードツリーのベース。
マシン アーキテクチャ変数
-
TARGET_CPU
: ターゲット アーキテクチャの CPU(例:k8
。
事前定義された genrule 変数
以下は genrule
の cmd
属性で特別に使用でき、通常、その属性を機能させるために重要です。
OUTS
:genrule
のouts
リスト。出力ファイルが 1 つしかない場合は、$@
を使用することもできます。-
SRCS
:genrule
のsrcs
リスト(またはそれ以上) 厳密に指定: バケット内のラベルに対応するファイルのパス名srcs
リスト)。 ソースファイルが 1 つしかない場合は、$<
を使用することもできます。 -
<
: 単一ファイルの場合はSRCS
。その他のトリガー ビルドエラーになります。 -
@
:OUTS
(単一ファイルの場合)。それ以外の場合は、ビルドエラーがトリガーされます。 -
RULEDIR
: ターゲットの出力ディレクトリ。つまり、genfiles
ツリーまたはbin
ツリーの下にターゲットを含むパッケージの名前に対応するディレクトリです。//my/pkg:my_genrule
の場合、//my/pkg:my_genrule
の出力がサブディレクトリにある場合でも、常にmy/pkg
で終わります。 -
@D
: 出力ディレクトリ。outs に 1 つのエントリがある場合、そのファイルを含むディレクトリに展開されます。エントリが複数ある場合、すべての出力ファイルが同じサブディレクトリにある場合でも、genfiles
ツリー内のパッケージのルート ディレクトリに展開されます。注: 次の理由により、
@D
ではなくRULEDIR
を使用してください。RULEDIR
はより単純なセマンティクスで、同じように動作します。 出力ファイルの数に関係なく 同じ結果になりますgenrule が一時中間ファイルを生成する必要がある場合(コンパイラなどの他のツールを使用した結果など)、それらを一時ファイルとして
@D
に書き込み(/tmp
にも書き込めます)、終了前に削除する必要があります。特に、入力を含むディレクトリへの書き込みは避けてください。読み取り専用ファイル システムに存在する場合があります。そうでなくても、ソースツリーが破棄されます。
事前定義されたソースパス変数と出力パス変数
事前定義変数 execpath
、execpaths
、rootpath
、rootpaths
、location
、locations
は、ラベル パラメータ($(execpath
//foo:bar)
など)を受け取り、そのラベルで表されるファイルパスを置き換えます。
ソースファイルの場合、これはワークスペースのルートからの相対パスです。ルールの出力であるファイルの場合、これはファイルの出力パスです。 (下記の出力ファイルの説明をご覧ください)。
-
execpath
: パスの下のパスを示します。 execroot Bazel はビルド アクションを実行します。上記の例では、Bazel はワークスペースのルートにある
bazel-myproject
シンボリック リンクによってリンクされたディレクトリですべてのビルドアクションを実行します。「 ソースファイルempty.source
がパスでリンクされます。bazel-myproject/testapp/empty.source
。そのため、実行パス(ルートの下のサブパス)はtestapp/empty.source
です。これは、ビルドアクションがファイルを検索するために使用できるパスです。出力ファイルも同様にステージングされますが、先頭にサブパスが付加されます。
bazel-out/cpu-compilation_mode/bin
(または ツール:bazel-out/cpu-opt-exec-hash/bin
)。上記の例では、//testapp:app
はツールで、次の場所に表示されます:show_app_output
のtools
属性。 そのため、出力ファイルapp
はbazel-myproject/bazel-out/cpu-opt-exec-hash/bin/testapp/app
。 したがって、exec パスはbazel-out/cpu-opt-exec-hash/bin/testapp/app
になります。この追加の接頭辞は、 たとえば、2 つの異なる CPU に対して同じターゲットを 結果が相互に上書きされないようにします。この変数に渡されるラベルは、1 つのファイルのみを表す必要があります。ソースファイルを表すラベルの場合、これは自動的に true になります。ラベルの場合 ルールによって生成される出力は 1 つだけです。これが false またはラベルの形式が正しくない場合、ビルドはエラーで失敗します。
-
rootpath
: ビルドされたバイナリが以下に使用できるパス 実行ファイルのサブディレクトリに対して相対的に、実行時に依存関係を検出する 対応するディレクトリに配置されます。 注: これは、--enable_runfiles
が有効な場合にのみ機能します。これは、Windows ではデフォルトで有効になっていません。代わりにrlocationpath
を使用する サポートしています。これは
execpath
に似ていますが、上記の構成接頭辞が削除されます。上の例では、これは両方のempty.source
とapp
は純粋なワークスペース相対値を使用しています パス:testapp/empty.source
とtestapp/app
。外部リポジトリ内のファイルの
rootpath
repo
は../repo/
で始まり、 リポジトリ相対パス。これは、
execpath
と同じ「1 つの出力のみ」の要件があります。 -
rlocationpath
: 依存関係を見つけるために、ビルドバイナリが runfiles ライブラリのRlocation
関数に渡すパス runfiles ディレクトリにあるか(使用可能な場合)、 実行ファイル マニフェスト。これは、構成接頭辞が含まれていないという点で
rootpath
に似ていますが、常にリポジトリの名前で始まるという点で異なります。上記の例では、empty.source
とapp
の結果は次のようになります。 パス:myproject/testapp/empty.source
とmyproject/testapp/app
。外部リポジトリ内のファイルの
rlocationpath
repo
はrepo/
で始まり、 リポジトリ相対パス。ランタイムで依存関係を見つけるには、このパスをバイナリに渡し、runfiles ライブラリを使用してファイル システム パスに解決することをおすすめします。
rootpath
と比較して、すべてのプラットフォームで動作し、runfiles ディレクトリが使用できない場合でも動作するという利点があります。これは、
execpath
と同じ「1 つの出力のみ」の要件があります。 -
location
: 展開される属性に応じて、execpath
またはrootpath
のいずれかの類義語。これは、 Starlark 以前の動作です。よくわからない場合は、おすすめしません。 調整できます。#2475 を参照 をご覧ください。
execpaths
、rootpaths
、rlocationpaths
、locations
は、それぞれ execpath
、rootpath
、rlocationpaths
、location
の複数形のバリエーションです。複数の出力を生成するラベルをサポートしています。この場合、各出力はスペースで区切って一覧表示されます。出力なしのルールと形式が正しくないラベルは、ビルドエラーを生成します。
参照されるすべてのラベルが使用ターゲットの srcs
に含まれている必要があります。
出力ファイル、または deps
です。それ以外の場合、ビルドは失敗します。C++ ターゲットは、data
のラベルを参照することもできます。
ラベルを正規形式(foo
、:foo
)にする必要はありません。
//somepkg:foo
で問題はありません。
カスタム変数
カスタムの「Make」変数は、 "Make variable" の対象"" という文字列を指定する必要があります。ただし、 その変数を定義している他のターゲットに依存します。
ベスト プラクティスとして、適切なものがない限り、すべての変数はカスタムにする それらをコア Bazel に組み込む理由です。これにより、Bazel は、ターゲットが気にしない変数を供給するために、費用のかかる依存関係を読み込む必要がなくなります。
C++ ツールチェーン変数
以下は C++ ツールチェーン ルールで定義され、toolchains =
["@bazel_tools//tools/cpp:current_cc_toolchain"]
を設定するすべてのルールで使用できます。java_binary
などの一部のルールでは、ルール定義に C++ ツールチェーンが暗黙的に含まれます。これらの変数は
自動的に適用されます。
組み込みの C++ ルールは、「コンパイラを実行する」よりもはるかに高度です。*SAN、ThinLTO、 バイナリを慎重に最適化し、バイナリをモジュール有り/無しで 組み込みルールを使用して、複数のプラットフォームで 正しい入力、出力、コマンドライン フラグが設定されていることを確認するための長さ。 内部で生成される複数のアクションの それぞれに対して行われます
これらの変数は、言語の専門家が使う代替メカニズムです。 まれに発生する場合があります。これらの機能を使用する場合は、まず Bazel デベロッパーにお問い合わせください。
ABI
: C++ ABI のバージョン。-
AR
: crosstool の「ar」コマンド。 -
C_COMPILER
: C/C++ コンパイラ ID(llvm
など)。 -
CC
: C コンパイラ コマンドと C++ コンパイラ コマンド。常に
CC_FLAGS
を使用することを強くおすすめします。CC
との組み合わせ。ご自身の責任で行っていただく必要があります。 CC_FLAGS
: C/C++ のフラグの最小セット genrules で使用できるようにします。特に、CC
が複数のアーキテクチャをサポートしている場合に、正しいアーキテクチャを選択するためのフラグが含まれています。-
NM
: 「nm」実行してみましょう -
OBJCOPY
: C/C++ と同じスイートの objcopy コマンド あります。 -
STRIP
: C/C++ コンパイラと同じスイートにある strip コマンド。
Java ツールチェーン変数
以下は、Java ツールチェーン ルールで定義されており、どのルールでも使用可能です。
toolchains =
["@bazel_tools//tools/jdk:current_java_runtime"]
(または
"@bazel_tools//tools/jdk:current_host_java_runtime"
を参照してください)。
JDK のツールのほとんどは直接使用しないでください。組み込みの Java ルールでは、インターフェース JAR、ヘッダー インターフェース JAR、高度に最適化された JAR パッケージングとマージの実装など、アップストリーム ツールで表現できるものよりもはるかに高度なアプローチで Java のコンパイルとパッケージングが行われます。
これらの変数は、まれなケースで言語の専門家が使用するフォールバック メカニズムです。使用したいとお考えの場合は、まず Bazel 開発者に連絡してください。
-
JAVA
: 「java」コマンド(Java 仮想マシン)。これを回避し、java_binary
ルールを使用する 推奨されます。相対パスを指定できます。変更が必要な場合java
を呼び出す前にディレクトリに保存したい場合は、 作業ディレクトリに保存されていることを確認してください。 JAVABASE
: ファイルを含むベース ディレクトリ Java ユーティリティ。相対パスを指定できます。「bin」サブディレクトリがあります。
Starlark で定義された変数
ルールとツールチェーンのライターは、
完全なカスタム変数を
TemplateVariableInfo
接続します。toolchains
属性を介してこれらの値に依存するルールは、値を読み取ることができます。
Starlark で定義された変数の例をご覧ください。