このセクションでは、多くの関数やビルドルールに共通するさまざまな用語とコンセプトを定義します。
目次
- Bourne シェルのトークン化
- ラベルの拡張
- ほとんどのビルドルールで定義される一般的な属性
- すべてのビルドルールに共通する属性
- すべてのテストルールに共通する属性(*_test)
- すべてのバイナリルールに共通の属性(*_binary)
- 構成可能な属性
- 暗黙的な出力ターゲット
Bourne シェルのトークン化
一部のルールの文字列属性は、Bourne シェルのトークン化ルールに従って複数の単語に分割されます。引用符で囲まれていないスペースは個々の単語を区切り、一重引用符と二重引用符とバックスラッシュはトークン化を防ぐために使用されます。
このトークン化の対象となる属性は、このドキュメントの定義で明示的に示されています。
「Make」変数の展開と Bourne シェルのトークン化の対象となる属性は、通常、コンパイラやその他のツールに任意のオプションを渡すために使用されます。このような属性の例としては、cc_library.copts
と java_library.javacopts
があります。これらの置換を組み合わせることで、1 つの文字列変数を構成固有のオプション単語のリストに展開できます。
ラベルの拡張
ごく一部のルールの文字列属性は、ラベル展開の対象となります。これらの文字列に //mypkg:target
などの有効なラベルが部分文字列として含まれ、そのラベルが現在のルールの宣言された前提条件である場合、そのラベルは、ターゲット //mypkg:target
で表されるファイルのパス名に展開されます。
属性の例には、genrule.cmd
と cc_binary.linkopts
があります。詳細は、相対ラベルが展開されるかどうか、複数のファイルに展開されるラベルの処理方法など、ケースごとに大きく異なる場合があります。詳細については、ルール属性のドキュメントをご覧ください。
ほとんどのビルドルールで定義される一般的な属性
このセクションでは、多くのビルドルールで定義される属性について説明します(ただし、すべてではありません)。
属性 | 説明 |
---|---|
data |
ラベルのリスト。デフォルトは このルールが実行時に必要とするファイル。ファイルまたはルールのターゲットを一覧表示できます。通常、任意のターゲットを許可します。
新しいルールで、実行時に他の入力を使用する可能性のある入力を処理する場合は、 |
deps |
ラベルのリスト。デフォルトは
このターゲットの依存関係。通常は、ルールのターゲットのみを含めます。(一部のルールでは、ファイルを 通常、言語固有のルールでは、特定のプロバイダのターゲットのみが表示されます。
ターゲットが
ほとんどの場合、 |
licenses |
文字列のリスト。構成不可。デフォルトは この特定のターゲットに使用するライセンス タイプの文字列のリスト。これは、Bazel で使用されなくなった非推奨のライセンス API の一部です。使用しないでください。 |
srcs |
ラベルのリスト。デフォルトは
このルールによって処理または追加されたファイル。通常はファイルを直接一覧表示しますが、デフォルト出力を含めるようにルール ターゲット( 多くの場合、言語固有のルールにより、リストされたファイルには特定のファイル拡張子を付けることが義務付けられています。 |
すべてのビルドルールに共通する属性
このセクションでは、すべてのビルドルールに暗黙的に追加される属性について説明します。
属性 | 説明 |
---|---|
compatible_with |
デフォルトでサポートされている環境に加えて、このターゲットを構築できる環境のリスト。 これは Bazel の制約システムの一部であり、ユーザーは相互に依存できるターゲットとできないターゲットを宣言できます。たとえば、外部にデプロイ可能なバイナリは、企業秘密のコードを含むライブラリに依存しないようにしてください。詳細については、ConstraintSemantics をご覧ください。 |
deprecation |
文字列、設定不可、デフォルトは このターゲットに関連付けられた説明的な警告メッセージ。通常、これは、ターゲットが廃止された、別のルールに置き換えられた、パッケージ専用である、またはなんらかの理由で有害とみなされる可能性があることをユーザーに通知するために使用されます。メッセージが表示されないようにするために必要な変更を簡単に見つけられるように、参照情報(ウェブページ、バグ番号、移行 CL の例など)を含めることをおすすめします。ドロップイン リプレイスメントとして使用できる新しいターゲットがある場合は、古いターゲットのすべてのユーザーを移行することをおすすめします。
この属性はビルド方法には影響しませんが、ビルドツールの診断出力に影響する可能性があります。 パッケージ内の依存関係はこの警告から除外されるため、たとえば、非推奨のルールのテストをビルドしても警告は発生しません。 非推奨のターゲットが別の非推奨のターゲットに依存している場合、警告メッセージは出力されません。 ユーザーが使用しなくなったら、ターゲットを削除できます。 |
distribs |
文字列のリスト。構成不可。デフォルトは この特定のターゲットに使用される分散方法文字列のリスト。 これは、Bazel で使用されなくなった非推奨のライセンス API の一部です。これは使用しないでください。 |
exec_compatible_with |
このターゲットの実行プラットフォームに存在する必要がある |
exec_properties |
文字列の辞書。デフォルトは このターゲット用に選択したプラットフォームの プラットフォーム レベルのプロパティとターゲット レベルのプロパティの両方にキーが存在する場合、値はターゲットから取得されます。 |
features |
特徴文字列のリスト。デフォルトは 特徴とは、ターゲットで有効または無効にできる文字列タグです。特徴の意味はルール自体によって異なります。 この |
restricted_to |
デフォルトでサポートされている環境ではなく、このターゲットを構築できる環境のリスト。
これは Bazel の制約システムの一部です。詳しくは、 |
tags |
文字列のリスト。構成不可。デフォルトは
タグは任意のルールで使用できます。テストと
Bazel は、テストまたは
テストのタグは、通常、デバッグ プロセスとリリース プロセスにおけるテストの役割にアノテーションを付けるために使用されます。通常、タグは、ランタイム アノテーション機能がない C++ テストと Python テストに最も役立ちます。タグとサイズ要素を使用すると、コードベースのチェックイン ポリシーに基づいてテストスイートを柔軟に作成できます。
Bazel は、テストルールの
|
target_compatible_with |
ラベルのリスト。デフォルトは
このターゲットに互換性があるとみなされるには、ターゲット プラットフォームに存在する必要がある 互換性のないターゲットに推移的に依存するターゲット自体は、互換性がないとみなされます。ビルドとテストでもスキップされます。 空のリスト(デフォルト)は、ターゲットがすべてのプラットフォームと互換性があることを示します。
Workspace Rules 以外のすべてのルールがこの属性をサポートしています。一部のルールでは、この属性は効果がありません。たとえば、
互換性のないターゲットのスキップの詳細については、プラットフォーム ページをご覧ください。 |
testonly |
ブール値。構成不可。テスト ターゲットとテストスイート ターゲットを除き、デフォルトは
同様に、
テスト( この属性は、本番環境にリリースされるバイナリにターゲットを含めないことを意味します。 testonly は実行時ではなくビルド時に適用され、依存関係ツリーにウイルスのように伝播するため、慎重に適用する必要があります。たとえば、単体テストに役立つスタブとフェイクは、本番環境にリリースされるのと同じバイナリを含む統合テストにも役立つため、testonly とマークしないでください。逆に、通常の動作を無条件にオーバーライドするためなど、リンクしても危険なルールは、必ず testonly とマークする必要があります。 |
toolchains |
このターゲットがアクセスを許可されているMake 変数を持つターゲットのセット。これらのターゲットは、
これは、プラットフォーム依存の構成のルール実装で使用されるツールチェーン解決のコンセプトとは異なります。この属性を使用して、ターゲットが使用する特定の |
visibility |
ラベルのリスト。構成不可。指定されている場合はパッケージの
ターゲットの |
すべてのテストルールに共通する属性(*_test)
このセクションでは、すべてのテストルールに共通する属性について説明します。
属性 | 説明 | ||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
args |
文字列のリスト。$(location) と 「変数を作成」の置換、Bourne シェルのトークン化の対象。デフォルトは Bazel が
これらの引数は、 |
||||||||||||||||||||
env |
文字列のディクショナリ。値は $(location) と 「変数を作成」の置換の対象となります。デフォルトは
この属性は、 |
||||||||||||||||||||
env_inherit |
文字列のリスト。デフォルトは
この属性は、 |
||||||||||||||||||||
size |
文字列 テスト対象の「負荷」: 実行に必要な時間とリソースの量を指定します。 単体テストは「小規模」、インテグレーション テストは「中規模」、エンドツーエンド テストは「大規模」または「非常に大規模」と見なされます。Bazel はサイズを使用してデフォルトのタイムアウトを決定します。これは テストサイズは、次のデフォルトのタイムアウトと想定されるピーク時のローカル リソース使用量に対応しています。
テストのスポーン時に、環境変数 |
||||||||||||||||||||
timeout |
文字列 テストが完了するまでに予想される時間。
テストのサイズ属性はリソースの推定値を制御しますが、テストのタイムアウトは個別に設定できます。明示的に指定しない場合、タイムアウトはテストのサイズに基づきます。テストのタイムアウトは、
上記以外の時間では、テストのタイムアウトを 環境変数 |
||||||||||||||||||||
flaky |
ブール値。構成不可。デフォルトは テストを不安定なものとしてマークします。 設定されている場合、テストは最大 3 回実行され、毎回失敗した場合にのみ不合格としてマークされます。デフォルトでは、この属性は False に設定され、テストは 1 回だけ実行されます。なお、この属性の使用は、通常はおすすめしません。アサーションが維持されていれば、テストは確実に合格する必要があります。 |
||||||||||||||||||||
shard_count |
50 以下の正の整数。デフォルトは テストの実行に使用する並列シャードの数を指定します。 設定すると、この値は、テストを実行する並列シャードの数を決定するために使用されるヒューリスティックをオーバーライドします。一部のテストルールでは、シャーディングを有効にするためにこのパラメータが必要になる場合があります。 テスト シャーディングが有効になっている場合、テストのスポーン時に環境変数 シャーディングを行うには、テストランナーがテスト シャーディング プロトコルをサポートしている必要があります。そうしないと、すべてのシャードですべてのテストが実行される可能性が高くなりますが、これは望ましい動作ではありません。 シャーディングの詳細については、テスト エンサイクロペディアのテスト シャーディングをご覧ください。 |
||||||||||||||||||||
local |
ブール値。構成不可。デフォルトは テストをサンドボックス化せずにローカルで強制的に実行します。 この値を True に設定することは、タグ( |
すべてのバイナリルールに共通する属性(*_binary)
このセクションでは、すべてのバイナリルールに共通する属性について説明します。
属性 | 説明 |
---|---|
args |
文字列のリスト。$(location) と 「変数を作成」の置換、Bourne シェルのトークン化の対象。構成不可。デフォルトは
注: Bazel の外部でターゲットを実行する場合( |
env |
文字列の辞書。値は $(location) と 「変数を作成」の置換の対象となります。デフォルトは ターゲットが
この属性は、
注: Bazel の外部でターゲットを実行する場合( |
output_licenses |
文字列のリスト。デフォルトは このバイナリが生成する出力ファイルのライセンス。これは、Bazel で使用されなくなった非推奨のライセンス API の一部です。これは使用しないでください。 |
構成可能な属性
ほとんどの属性は「構成可能」です。つまり、ターゲットがさまざまな方法でビルドされると、値が変更される可能性があります。具体的には、構成可能な属性は、Bazel コマンドラインに渡されたフラグや、ターゲットをリクエストしているダウンストリーム デペンドンシティによって異なる場合があります。これは、たとえば、複数のプラットフォームまたはコンパイルモードのターゲットをカスタマイズするために使用できます。
次の例では、ターゲット アーキテクチャごとに異なるソースを宣言しています。bazel build :multiplatform_lib --cpu x86
を実行すると、x86_impl.cc
を使用してターゲットがビルドされますが、--cpu arm
に置き換えると、代わりに arm_impl.cc
が使用されます。
cc_library( name = "multiplatform_lib", srcs = select({ ":x86_mode": ["x86_impl.cc"], ":arm_mode": ["arm_impl.cc"] }) ) config_setting( name = "x86_mode", values = { "cpu": "x86" } ) config_setting( name = "arm_mode", values = { "cpu": "arm" } )
select()
関数は、ターゲットの構成が満たす config_setting
または constraint_value
の条件に基づいて、構成可能な属性のさまざまな代替値から選択します。
Bazel は、マクロの処理後に、ルールの処理の前に(技術的には、
読み込みフェーズと分析フェーズの間)構成可能な属性を評価します。select()
の評価前の処理では、select()
がどのブランチを選択するかがわかりません。たとえば、マクロは、選択されたブランチに基づいて動作を変更することはできません。また、bazel query
は、ターゲットの構成可能な依存関係について控えめに推測することしかできません。ルールとマクロで select()
を使用する方法については、よくある質問をご覧ください。
ドキュメントで nonconfigurable
とマークされている属性は、この機能を使用できません。通常、属性は構成できません。これは、Bazel が select()
の解決方法を決定する前に、内部でその値を知る必要があるためです。
詳細については、 構成可能なビルド属性をご覧ください。
暗黙的な出力ターゲット
C++ の暗黙的な出力は非推奨になりました。可能であれば、他の言語で使用しないでください。まだ非推奨化の予定はありませんが、最終的には非推奨となります。
BUILD ファイルでビルドルールを定義すると、パッケージに名前付きの新しいルール ターゲットを明示的に宣言します。多くのビルドルール関数は、1 つ以上の出力ファイル ターゲットを暗黙的に含みます。その内容と意味はルール固有です。たとえば、java_binary(name='foo', ...)
ルールを明示的に宣言すると、出力ファイル ターゲット foo_deploy.jar
を同じパッケージのメンバーとして暗黙的に宣言します。(このターゲットは、デプロイに適した自己完結型の Java アーカイブです)。
暗黙的な出力ターゲットは、グローバル ターゲット グラフの第一級メンバーです。他のターゲットと同様に、トップレベルのビルドコマンドで指定された場合、または他のビルドターゲットの前提条件として必要な場合に、オンデマンドでビルドされます。これらは、BUILD ファイルで依存関係として参照でき、bazel query
などの分析ツールの出力で確認できます。
ビルドルールの種類ごとに、その種類のルールの宣言に伴う暗黙的な出力の名前と内容を詳しく説明する特別なセクションがルールのドキュメントに含まれています。
ビルドシステムで使用される 2 つの名前空間には重要だが、やや微妙な違いがあります。ラベルはターゲット(ルールまたはファイル)を識別します。ファイル ターゲットは、ソースファイル(または入力)ファイル ターゲットと派生(または出力)ファイル ターゲットのいずれかに分けることができます。これらは、BUILD ファイルで指定したり、コマンドラインからビルドしたり、bazel query
を使用して調べたりできるものです。これはターゲット Namespace です。各ファイル ターゲットはディスク上の 1 つの実際のファイル(「ファイル システム Namespace」)に対応します。各ルール ターゲットは、ディスク上の 0 個、1 個以上の実際のファイルに対応できます。ディスク上に、対応するターゲットがないファイルが存在する場合があります。たとえば、C++ コンパイル中に生成された .o
オブジェクト ファイルは、BUILD ファイル内またはコマンドラインから参照できません。このように、ビルドツールは、その機能の実行方法に関する特定の実装の詳細を隠す場合があります。詳しくは、BUILD コンセプト リファレンスをご覧ください。