一般的な定義

このセクションでは、多くの関数やビルドルールに共通する用語とコンセプトを定義します。

目次

Bourne シェルのトークン化

一部のルールでは、一部の文字列属性は Bourne シェルのトークン化ルールに従って複数の単語に分割されます。引用符で囲まれていないスペースは単語を区切り、一重引用符と二重引用符、バックスラッシュはトークン化を防ぐために使用されます。

このトークン化の対象となる属性は、このドキュメントの定義で明示されています。

「Make」変数展開と Bourne シェルのトークン化の対象となる属性は、通常、任意のオプションをコンパイラやその他のツールに渡すために使用されます。このような属性の例としては、cc_library.coptsjava_library.javacopts などがあります。これらの置換を組み合わせることで、1 つの文字列変数を構成固有のオプション単語リストに展開できます。

ラベルの拡張

ごく一部のルールでも、ラベル拡張の対象となる文字列属性があります。それらの文字列に、部分文字列として有効なラベル(//mypkg:target など)が含まれ、そのラベルが現在のルールの宣言された前提条件である場合、ターゲット //mypkg:target で表されるファイルのパス名に展開されます。

属性の例としては、genrule.cmdcc_binary.linkopts などがあります。相対ラベルが展開されているかどうか、複数のファイルに展開されるラベルの処理方法など、各ケースで詳細が大きく異なる場合があります。詳細についてはルール属性のドキュメントをご覧ください。

ほとんどのビルドルールで定義されている一般的な属性

このセクションでは、すべてのビルドルールで定義されているわけではない、多くのビルドルールで定義されている属性について説明します。

属性 説明
data

List of labels ; optional

実行時にこのルールで必要となるファイル。ファイルまたはルールのターゲットを一覧表示できます。通常、任意のターゲットを許可します。

data 属性内のターゲットのデフォルトの出力と実行ファイルは、このターゲットによって出力される、またはこのターゲットに対してランタイム依存関係がある実行可能ファイルの *.runfiles 領域に配置される必要があります。これには、このターゲットの srcs の実行時に使用されるデータファイルやバイナリが含まれる可能性があります。データファイルの依存関係と使用方法について詳しくは、データの依存関係のセクションをご覧ください。

新しいルールで実行時に他の入力を使用する可能性のある入力を処理する場合は、data 属性を定義する必要があります。また、ルールの実装関数は、data 属性の出力とランファイルからターゲットの実行ファイルにデータを取り込む必要があります。また、ソースコードまたはランタイムの依存関係を提供する依存関係属性からの実行ファイルにも入力する必要があります。

deps

List of labels ; optional

このターゲットの依存関係。通常は、ルール ターゲットのみをリストする必要があります。(ルールによっては、ファイルを deps に直接リストすることが許可されているものもありますが、可能であれば回避する必要があります)。

通常、言語固有のルールにより、リストされるターゲットは特定のプロバイダを持つターゲットに限定されます。

deps を使用してターゲットが別のターゲットに依存する場合の正確なセマンティクスは、ルールの種類に固有です。詳細についてはルール固有のドキュメントをご覧ください。ソースコードを処理するルールの場合、deps は通常、srcs 内のコードで使用されるコード依存関係を指定します。

多くの場合、deps 依存関係は、あるモジュールが同じプログラミング言語で記述され、個別にコンパイルされた別のモジュールで定義されたシンボルを使用できるようにするために使用されます。言語間依存関係も多くのケースで許可されます。たとえば、java_library ターゲットは、cc_library ターゲットの C++ コードに依存する可能性があります(後者を deps 属性に含めます)。詳細については、依存関係の定義をご覧ください。

licenses

List of strings; optional; nonconfigurable

このターゲットで使用されるライセンス タイプの文字列のリスト。 これは、Bazel で使用されなくなった非推奨のライセンス API の一部です。これは使用しないでください。

srcs

List of labels ; optional

このルールで処理または追加されたファイル。通常はファイルを直接リストしますが、デフォルトの出力を含めるためにルール ターゲット(filegroupgenrule など)をリストすることもできます。

言語固有のルールでは、多くの場合、リストするファイルに特定のファイル拡張子が必要です。

すべてのビルドルールに共通の属性

このセクションでは、すべてのビルドルールに暗黙的に追加される属性について説明します。

属性 説明
compatible_with

List of labels ; optional; nonconfigurable

デフォルトでサポートされている環境に加えて、このターゲットをビルドすることができる環境のリスト。

これは Bazel の制約システムの一部です。これにより、ユーザーは相互に依存できるターゲットと依存関係できないターゲットを宣言できます。たとえば、外部にデプロイ可能なバイナリは、会社機密コードを含むライブラリに依存しないようにする必要があります。詳細については、 ConstraintSemantics をご覧ください。

deprecation

String; optional; nonconfigurable

このターゲットに関連付けられた説明を示す警告メッセージ。 これは通常、ターゲットが古くなった、別のルールによって置き換えられた、パッケージに非公開になっている、なんらかの理由で有害であると考えられることをユーザーに通知する場合に使用します。このメッセージが表示されないようにするためにどのような変更が必要かを簡単に把握できるように、ウェブページ、バグ番号、移行 CL の例など、いくつかのリファレンスを含めることをおすすめします。ドロップの代替として使用できる新しいターゲットがある場合は、古いターゲットのすべてのユーザーを移行することをおすすめします。

この属性はビルド方法には影響しませんが、ビルドツールの診断出力には影響する可能性があります。deprecation 属性を含むルールが別のパッケージ内のターゲットによって依存されている場合、ビルドツールは警告を発行します。

パッケージ内依存関係はこの警告から除外されます。たとえば、非推奨のルールのテストをビルドしても警告は発生しません。

非推奨のターゲットが別のターゲットに依存している場合、警告メッセージは発行されません。

ユーザーが使用を停止した場合、ターゲットは削除できます。

distribs

List of strings; optional; nonconfigurable

この特定のターゲットに使用される配布方法の文字列のリスト。 これは、Bazel で使用されなくなった非推奨のライセンス API の一部です。これは使用しないでください。

exec_compatible_with

List of labels ; optional; nonconfigurable

このターゲットの実行プラットフォームに存在する必要がある constraint_values のリスト。これは、ルールタイプですでに設定されている制約に加えて適用されます。制約は、使用可能な実行プラットフォームのリストを制限するために使用されます。詳しくは、ツールチェーンの解決の説明をご覧ください。

exec_properties

Dictionary of strings; optional

このターゲットに対して選択されたプラットフォームの exec_properties に追加される文字列のディクショナリ。プラットフォーム ルールの exec_properties をご覧ください。

プラットフォームとターゲット レベルのプロパティの両方にキーが存在する場合、値はターゲットから取得されます。

features

List of feature strings; optional

機能は、ターゲットで有効または無効にできる文字列タグです。対象物の意味はルール自体によって異なります。

この features 属性は、 パッケージ レベルの features 属性と組み合わせられます。たとえば、機能 ["a", "b"] がパッケージ レベルで有効になっており、ターゲットの features 属性に ["-a", "c"] が含まれている場合、ルールで有効になる機能は "b" と "c" になります。 例をご覧ください

restricted_to

List of labels ; optional; nonconfigurable

デフォルトでサポートされている環境の代わりに、このターゲットをビルドすることができる環境のリスト。

これは Bazel の制約システムの一部です。詳しくは、compatible_with をご覧ください。

tags

List of strings; optional; nonconfigurable

タグはどのルールでも使用できます。テストルールと test_suite ルールのタグはテストの分類に役立ちます。テスト以外のターゲットのタグは、genruleStarlark アクションのサンドボックス化された実行を制御するため、および人間や外部ツールによる解析に使用されます。

テストまたは genrule ターゲットの tags 属性で次のキーワードを検出した場合、または Starlark アクションの execution_requirements のキーを検出した場合、Bazel はサンドボックス コードの動作を変更します。

  • no-sandbox キーワードを使用すると、アクションまたはテストはサンドボックス化されません。この場合でも、キャッシュに保存したりリモートで実行したりできます。no-cache または no-remote を使用して、いずれか一方または両方を防ぐことができます。
  • no-cache キーワードにより、アクションまたはテストが(リモートまたはローカルに)キャッシュされない。
  • no-remote-cache キーワードを指定すると、アクションまたはテストがリモートにキャッシュされることはありません(ただし、ローカルにキャッシュ保存され、リモートで実行されることもできます)。注: このタグでは、ディスク キャッシュはローカル キャッシュとみなされ、http キャッシュと gRPC キャッシュはリモートとみなされます。ローカル コンポーネントとリモート コンポーネントを組み合わせたキャッシュを指定すると、リモート キャッシュとして扱われ、完全に無効になります。ただし、--incompatible_remote_results_ignore_disk が設定されている場合はローカル コンポーネントが使用されます。
  • no-remote-exec キーワードを使用すると、アクションまたはテストはリモートで実行されることはありません(ただし、リモートでキャッシュされる場合があります)。
  • no-remote キーワードを指定すると、アクションやテストがリモートで実行されることや、リモートからキャッシュに保存されることが防止されます。これは、no-remote-cacheno-remote-exec の両方を使用するのと同じです。
  • no-remote-cache-upload キーワードは、スポーンのリモート キャッシュの一部のアップロードを無効にします。リモート実行が無効になることはありません。
  • local キーワードを指定すると、アクションまたはテストがリモート キャッシュ、リモート実行、サンドボックス内で実行されなくなります。genrules とテストの場合、ルールを local = True 属性でマークしても同じ効果があります。
  • requires-network キーワードを使用すると、サンドボックス内から外部ネットワークにアクセスできます。このタグは、サンドボックス化が有効になっている場合にのみ効果があります。
  • block-network キーワードは、サンドボックス内からの外部ネットワークへのアクセスをブロックします。この場合、localhost との通信のみが許可されます。このタグは、サンドボックス化が有効になっている場合にのみ効果があります。
  • requires-fakeroot は、テストまたはアクションを uid および gid 0(root ユーザー)として実行します。これは Linux でのみサポートされています。このタグは、--sandbox_fake_username コマンドライン オプションよりも優先されます。

通常、テストのタグは、デバッグとリリースのプロセスにおけるテストの役割にアノテーションを付けるために使用されます。通常、タグは C++ と Python のテストで特に役立ちます。これらのテストにはランタイム アノテーション機能がありません。タグとサイズ要素を使用すると、コードベースのチェックイン ポリシーに基づいてテストスイートを柔軟に作成できます。

テストルールの tags 属性に次のキーワードが見つかった場合、Bazel はテスト実行動作を変更します。

  • exclusive は、他のテストが同時に実行されないように、テストを「排他」モードで実行します。このようなテストは、すべてのビルド アクティビティと非排他的テストが完了した後に順次実行されます。Bazel はリモートマシンで実行する内容を制御できないため、このようなテストではリモート実行が無効になります。
  • exclusive-if-local は、ローカルで実行される場合はテストを強制的に「排他」モードで実行しますが、リモートで実行される場合は並行して実行します。
  • manual キーワードは、ターゲット パターンのワイルドカード(...:*:all など)と test_suite ルールの拡張からターゲットを除外します。これらのルールは、buildtestcoverage コマンドのビルド/実行対象となるトップレベル ターゲット セットの計算時にテストを明示的にリストしません。query コマンドなど、他のコンテキストでのターゲットのワイルドカードやテストスイートの展開には影響しません。manual は、継続的なビルド/テストシステムによりターゲットが自動的にビルド/実行されないことを意味しません。たとえば、特定の Bazel フラグを必要とするため、bazel test ... からターゲットを除外することが望ましい場合がありますが、適切に構成された presubmit または継続的なテスト実行には含まれます。
  • external キーワードは、--cache_test_results の値に関係なく、テストを強制的に無条件に実行します。
テスト ターゲットに付加されるタグの規則について詳しくは、テスト百科事典のタグの規則をご覧ください。
target_compatible_with

List of labels ; optional

このターゲットが互換性であると見なされるために、ターゲット プラットフォームに存在する必要がある constraint_value のリスト。これは、ルールタイプですでに設定されている制約に加えて適用されます。ターゲット プラットフォームがリストにある制約をすべて満たしていない場合、ターゲットは互換性がないとみなされます。incompatibleターゲット パターンが展開されると、ビルドとテストで互換性のないターゲットはスキップされます(//...:all など)。コマンドラインで明示的に指定すると、互換性のないターゲットにより、Bazel がエラーを出力し、ビルドまたはテストが失敗します。

互換性のないターゲットに推移的に依存しているターゲットは、それ自体が互換性がないと見なされます。ビルドとテストではスキップされます。

空のリスト(デフォルト)は、ターゲットがすべてのプラットフォームと互換性があることを示します。

この属性は、Workspace ルール以外のすべてのルールでサポートされています。 一部のルールでは、この属性は効果がありません。たとえば、cc_toolchaintarget_compatible_with を指定しても役に立ちません。

互換性のないターゲットのスキップの詳細については、プラットフォーム ページをご覧ください。

testonly

Boolean; optional; default False except for test and test suite targets; nonconfigurable

True の場合、テスト専用ターゲット(テストなど)のみがこのターゲットに依存できます。

同様に、testonly でないルールは、testonly であるルールに依存できません。

テスト(*_test ルール)とテストスイート(test_suite ルール)はデフォルトで testonly です。

この属性は、本番環境にリリースされるバイナリにターゲットが含まれないことを意味します。

testonly は実行時ではなくビルド時に適用され、依存関係ツリーを介して広範に伝播されるため、適用は慎重に行う必要があります。たとえば、単体テストに役立つスタブとフェイクは、本番環境にリリースされるのと同じバイナリを含む統合テストでも役立つ可能性があるため、テスト専用としてマークしないでください。逆に、通常の動作を無条件にオーバーライドするなど、リンクしても危険なルールは、テスト専用としてマークする必要があります。

toolchains

List of labels ; optional; nonconfigurable

このターゲットがアクセスできる Make 変数を含むターゲットのセット。これらのターゲットは、TemplateVariableInfo を提供するルールのインスタンスか、Bazel に組み込まれたツールチェーン タイプ用の特別なターゲットです。これには以下が含まれます。

  • @bazel_tools//tools/cpp:current_cc_toolchain
  • @bazel_tools//tools/jdk:current_java_runtime

これは、プラットフォームに依存する構成のルール実装で使用されるツールチェーンの解決のコンセプトとは異なります。この属性を使用して、ターゲットが使用する cc_toolchain または java_toolchain を特定することはできません。

visibility

List of labels ; optional; default default_visibility from package if specified, or //visibility:private otherwise; nonconfigurable

ターゲットの visibility 属性は、そのターゲットを他のパッケージで使用できるかどうかを制御します。可視性については、ドキュメントをご覧ください。

すべてのテストルールに共通の属性(*_test)

このセクションでは、すべてのテストルールに共通する属性について説明します。

属性 説明
args

List of strings; optional; subject to $(location) and "Make variable" substitution, and Bourne shell tokenization

bazel test で実行されたときに Bazel がターゲットに渡すコマンドライン引数。

これらの引数は、bazel test コマンドラインで指定された --test_arg 値の前に渡されます。

env

Dictionary of strings; optional; values are subject to $(location) and "Make variable" substitution

bazel test によってテストが実行されるときに設定する追加の環境変数を指定します。

この属性は、cc_testpy_testsh_test などのネイティブ ルールにのみ適用されます。Starlark で定義されたテストルールには適用されません。独自の Starlark ルールでは、「env」属性を追加し、それを使用して TestEnvironment プロバイダに値を設定できます。

env_inherit

List of strings; optional

bazel test がテストを実行する際に外部環境から継承する追加の環境変数を指定します。

この属性は、cc_testpy_testsh_test などのネイティブ ルールにのみ適用されます。Starlark で定義されたテストルールには適用されません。

size

String "enormous", "large" "medium" or "small", default is "medium"; optional; nonconfigurable

テスト ターゲットの「重さ」(実行に必要な時間やリソース)を指定します。

単体テストは「小規模」、統合テストは「中」、エンドツーエンド テストは「大規模」または「巨大」と見なされます。Bazel では、このサイズを使用してデフォルトのタイムアウトを決定します。このタイムアウトは、timeout 属性でオーバーライドできます。タイムアウトは、個々のテストではなく、BUILD ターゲット内のすべてのテストに対して行われます。テストをローカルで実行する場合、スケジューリングの目的で size も使用されます。Bazel は、--local_{ram,cpu}_resources を尊重し、負荷の高いテストを大量に同時に実行してローカルマシンに過負荷をかけないようにします。

テストサイズは、次のデフォルトのタイムアウトに対応し、ローカル リソースのピーク使用量として想定されます。

サイズ RAM(MB) CPU(CPU コア数) デフォルトのタイムアウト
小さく初めて 20 1 短め(1 分)
medium 100 1 中(5 分)
300 1 長い(15 分)
巨大 800 1 eternal(60 分)

環境変数 TEST_SIZE は、テストの生成時にこの属性の値に設定されます。

timeout

String "short", "moderate", "long", "eternal" (with the default derived from the test's size attribute); nonconfigurable

戻る前に予想されるテストの実行時間。

テストのサイズ属性はリソースの見積もりを制御しますが、テストのタイムアウトは個別に設定できます。明示的に指定しない場合、タイムアウトはテストのサイズに基づきます。テストのタイムアウトは、--test_timeout フラグでオーバーライドできます。たとえば、低速であることがわかっている特定の条件下で実行する場合などです。テストのタイムアウト値は、次の期間に対応しています。

タイムアウト値 期間
short 1 分
やや不足 5 分
long 15 分
永遠 60 分

上記以外の場合、テストのタイムアウトは --test_timeout bazel フラグを使用してオーバーライドできます。たとえば、低速であることがわかっている条件下で手動で実行する場合などです。--test_timeout の値は秒単位です。たとえば、--test_timeout=120 はテストのタイムアウトを 2 分に設定します。

環境変数 TEST_TIMEOUT には、テストの生成時にテストのタイムアウト(秒単位)を設定します。

flaky

Boolean; optional; default False; nonconfigurable

テストを不安定としてマーク。

設定されている場合は、テストを最大 3 回実行し、毎回失敗した場合にのみ不合格としてマークします。デフォルトでは、この属性は False に設定されており、テストは 1 回だけ実行されます。なお、この属性は使用しないのが一般的です。アサーションが維持されると、テストは確実に合格するはずです。

shard_count

Non-negative integer less than or equal to 50; optional

テストの実行に使用する並列シャード数を指定します。

この値は、テストを実行する並列シャードの数を決定するために使用されるヒューリスティックをオーバーライドします。一部のテストルールでは、そもそもシャーディングを有効にするためにこのパラメータが必要になることがあります。--test_sharding_strategy もご覧ください。

テストのシャーディングが有効になっている場合、テストの生成時に環境変数 TEST_TOTAL_SHARDS がこの値に設定されます。

シャーディングを行うには、テストランナーがテスト シャーディング プロトコルをサポートする必要があります。そうでない場合は、各シャードですべてのテストを実行する可能性が高いと考えられます。

シャーディングの詳細については、テスト百科事典のテストのシャーディングをご覧ください。

local

Boolean; default False; nonconfigurable

サンドボックス化せずに、テストを強制的にローカルに実行します。

このフィールドを True に設定すると、「local」をタグ(tags=["local"])として指定したのと同じことになります。

すべてのバイナリルールに共通の属性(*_binary)

このセクションでは、すべてのバイナリルールに共通する属性について説明します。

属性 説明
args

List of strings; optional; subject to $(location) and "Make variable" substitution, and Bourne shell tokenization; nonconfigurable

run コマンドによる実行またはテストの実行時に Bazel がターゲットに渡すコマンドライン引数。これらの引数は、bazel run または bazel test コマンドラインで指定された引数の前に渡されます。

注: Bazel の外部でターゲットを実行する場合(bazel-bin/ でバイナリを手動で実行する場合など)は、引数は渡されません。

env

Dictionary of strings; optional; values are subject to $(location) and "Make variable" substitution

ターゲットが bazel run によって実行されたときに設定する追加の環境変数を指定します。

この属性は、cc_binarypy_binarysh_binary などのネイティブ ルールにのみ適用されます。Starlark 定義の実行可能ルールには適用されません。

注: Bazel の外部でターゲットを実行する場合(bazel-bin/ でバイナリを手動で実行する場合など)、環境変数は設定されません。

output_licenses

List of strings; optional

このバイナリが生成する出力ファイルのライセンス。 これは、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 を使用して調べることもできます。これがターゲット名前空間です。各ファイル ターゲットは、ディスク上の 1 つの実際のファイル(「ファイル システムの名前空間」)に対応します。各ルール ターゲットは、ディスク上の実際のファイル(0 個または複数)に対応する場合があります。対応するターゲットのないファイルがディスク上に存在している可能性があります。たとえば、C++ のコンパイル中に生成された .o オブジェクト ファイルは、BUILD ファイル内またはコマンドラインから参照できません。 これにより、ビルドツールがそのジョブの実行方法に関する特定の実装の詳細を隠す場合があります。詳細については、BUILD のコンセプトのリファレンスをご覧ください。