.bzl ファイル

すべての .bzl ファイルで使用できるグローバル メソッド。

メンバー

analysis_test_transition

transition analysis_test_transition(*, settings)

分析テストルールの依存関係に適用される構成の移行を作成します。この移行は、analysis_test = True を含むルールの属性にのみ適用できます。このようなルールは機能が制限されているため(依存関係ツリーのサイズが制限されているなど)、この関数を使用して作成されたトランジションは、transition() を使用して作成されたトランジションと比較して、潜在的なスコープが制限されます。

この関数は、主に Analysis Test Framework のコア ライブラリを容易にするために設計されています。ベスト プラクティスについては、ドキュメント(または実装)をご覧ください。

パラメータ

パラメータ 説明
settings dict; 必須
この構成の移行で設定される構成設定に関する情報を含む辞書。キーはビルド設定ラベルで、値は移行後の新しい値です。その他の設定は変更されません。このアノテーションは、分析テストが合格するために設定する必要がある特定の構成設定を宣言するために使用します。

アスペクト

Aspect aspect(implementation, attr_aspects=[], toolchains_aspects=[], attrs={}, required_providers=[], required_aspect_providers=[], provides=[], requires=[], propagation_predicate=None, fragments=[], host_fragments=[], toolchains=[], doc=None, *, apply_to_generating_rules=False, exec_compatible_with=[], exec_groups=None, subrules=[])

新しいアスペクトを作成します。この関数の結果はグローバル値に保存する必要があります。詳しくは、アスペクトの概要をご覧ください。

パラメータ

パラメータ 説明
implementation function; 必須
このアスペクトを実装する Starlark 関数。パラメータは Target(アスペクトが適用されるターゲット)と ctx(ターゲットの作成元となるルール コンテキスト)の 2 つのみです。ターゲットの属性は ctx.rule フィールドで取得できます。この関数は、ターゲットへのアスペクトの各適用について、分析フェーズで評価されます。
attr_aspects 文字列シーケンス、または関数。デフォルトは []
です。 属性名のリスト、または [試験運用] 属性名のリストを返す関数を受け入れます。アスペクトは、これらの名前を持つターゲットの属性で指定された依存関係に沿って伝播します。一般的な値としては、depsexports などがあります。リストには、ターゲットのすべての依存関係に沿って伝播する単一の文字列 "*" を含めることもできます。
toolchains_aspects sequence、または function。デフォルトは []
です。ツールチェーン タイプのリスト、またはツールチェーン タイプのリストを返す関数(試験運用版)を受け入れます。アスペクトは、これらのツールチェーン タイプに一致するターゲット ツールチェーンに伝播されます。
attrs dict; デフォルトは {}
アスペクトのすべての属性を宣言するディクショナリ。属性名から attr.labelattr.string などの属性オブジェクトにマッピングします(attr モジュールを参照)。アスペクト属性は、ctx パラメータのフィールドとして実装関数で使用できます。

_ で始まる暗黙的な属性には、デフォルト値があり、型は label または label_list である必要があります。

明示的な属性は string 型で、values 制限を使用する必要があります。明示的な属性は、制限に従って同じ名前、型、有効な値の属性を持つルールでのみ使用されるようにアスペクトを制限します。

宣言された属性は None をデフォルト値に変換します。

required_providers sequence; デフォルトは []
この属性を使用すると、アスペクトは、ルールで必要なプロバイダがアドバタイズされているターゲットにのみ伝播を制限できます。値は、個々のプロバイダまたはプロバイダのリストのいずれかを含むリストである必要があります。両方を含むことはできません。たとえば、[[FooInfo], [BarInfo], [BazInfo, QuxInfo]] は有効な値ですが、[FooInfo, BarInfo, [BazInfo, QuxInfo]] は無効な値です。

ネストされていないプロバイダのリストは、プロバイダのリストを 1 つ含むリストに自動的に変換されます。つまり、[FooInfo, BarInfo] は自動的に [[FooInfo, BarInfo]] に変換されます。

あるルール(some_rule など)のターゲットをアスペクトに表示するには、some_rule が必須プロバイダ リストの少なくとも 1 つからすべてのプロバイダをアドバタイズする必要があります。たとえば、アスペクトの required_providers[[FooInfo], [BarInfo], [BazInfo, QuxInfo]] の場合、some_ruleFooInfo BarInfo または BazInfoQuxInfo の両方を提供する場合にのみ、このアスペクトは some_rule ターゲットを確認できます。

required_aspect_providers sequence; デフォルトは []
この属性により、このアスペクトは他のアスペクトを検査できます。値は、個々のプロバイダまたはプロバイダのリストのいずれかを含むリストである必要があります。両方を含むことはできません。たとえば、[[FooInfo], [BarInfo], [BazInfo, QuxInfo]] は有効な値ですが、[FooInfo, BarInfo, [BazInfo, QuxInfo]] は無効な値です。

ネストされていないプロバイダのリストは、プロバイダのリストを 1 つ含むリストに自動的に変換されます。つまり、[FooInfo, BarInfo] は自動的に [[FooInfo, BarInfo]] に変換されます。

別の側面(other_aspect など)をこの側面に表示するには、other_aspect は少なくとも 1 つのリストからすべてのプロバイダを提供する必要があります。[[FooInfo], [BarInfo], [BazInfo, QuxInfo]] の例では、このアスペクトは、other_aspectFooInfoまたは BarInfoまたは BazInfoQuxInfo の両方を提供する場合にのみ other_aspect を認識できます。

provides sequence; デフォルトは []
実装関数が返す必要があるプロバイダのリスト。

実装関数が、ここに記載されているプロバイダのいずれかの型を戻り値から省略すると、エラーになります。ただし、実装関数は、ここに記載されていない追加のプロバイダを返す場合があります。

リストの各要素は、provider() によって返される *Info オブジェクトです。ルールのターゲットが、必須プロバイダを宣言するターゲットの依存関係として使用される場合、ここでプロバイダを指定する必要はありません。実装関数がそれを返すだけで十分です。ただし、これは必須ではありませんが、指定することがベスト プラクティスとされています。ただし、アスペクトrequired_providers フィールドでは、プロバイダをここで指定する必要があります。

requires Aspectシーケンス。デフォルトは []
です。 このアスペクトの前に伝播する必要があるアスペクトのリスト。
propagation_predicate function、または None。デフォルトは None
です。 試験運用版: アスペクトをターゲットに伝播するかどうかを示すブール値を返す関数。
fragments 文字列シーケンス。デフォルトは []
です。 アスペクトがターゲット構成で必要とする構成フラグメントの名前のリスト。
host_fragments 文字列シーケンス。デフォルトは []
です。 アスペクトがホスト構成で必要とする構成フラグメントの名前のリスト。
toolchains sequence: デフォルトは []
です。設定されている場合、このアスペクトに必要なツールチェーンのセット。リストには、String、Label、StarlarkToolchainTypeApi オブジェクトを任意の組み合わせで含めることができます。ツールチェーンは現在のプラットフォームをチェックして検出され、ctx.toolchain 経由でアスペクト実装に提供されます。
doc string、または None。デフォルトは None
ドキュメント生成ツールで抽出できるアスペクトの説明。
apply_to_generating_rules bool; デフォルトは False
true の場合、アスペクトは出力ファイルに適用されるのではなく、出力ファイルの生成ルールに適用されます。

たとえば、アスペクトが属性 `deps` を介して推移的に伝播し、ターゲット `alpha` に適用されるとします。`alpha` に `deps = [':beta_output']` があり、`beta_output` はターゲット `beta` の宣言された出力であるとします。`beta` には、`deps` の 1 つとしてターゲット `charlie` があるとします。アスペクトの `apply_to_generating_rules=True` の場合、アスペクトは `alpha`、`beta`、`charlie` を介して伝播します。False の場合、アスペクトは `alpha` にのみ伝播します。

デフォルトは false です。

exec_compatible_with 文字列シーケンス。デフォルトは []
です。このアスペクトのすべてのインスタンスに適用される実行プラットフォームの制約のリスト。
exec_groups dict、または None。デフォルトは None
です。 実行グループ名(文字列)から exec_groups への辞書。設定されている場合、アスペクトは単一インスタンス内の複数の実行プラットフォームでアクションを実行できます。詳細については、実行グループのドキュメントをご覧ください。
subrules Subruleシーケンス。デフォルトは []
です。 試験運用版: このアスペクトで使用されるサブルールのリスト。

configuration_field

LateBoundDefault configuration_field(fragment, name)

label の属性の遅延バインドされたデフォルト値を参照します。値を決定する前に構成をビルドする必要がある場合、値は「遅延バインド」されます。これを値として使用する属性は、非公開にする必要があります。

使用例:

ルール属性の定義:

'_foo': attr.label(default=configuration_field(fragment='java', name='toolchain'))

ルール実装でのアクセス:

  def _rule_impl(ctx):
    foo_info = ctx.attr._foo
    ...

パラメータ

パラメータ 説明
fragment string; 必須
遅延バインド値を含む構成フラグメントの名前。
name string; 必須
構成フラグメントから取得する値の名前。

depset

depset depset(direct=None, order="default", *, transitive=None)

depset を作成します。direct パラメータは depset の直接要素のリストで、transitive パラメータは、その要素が作成された depset の間接要素になる depset のリストです。depsset がリストに変換されるときに要素が返される順序は、order パラメータで指定します。詳しくは、Depset の概要をご覧ください。

deps のすべての要素(直接および間接)は、式 type(x) で取得される同じ型でなければなりません。

ハッシュベースのセットは、反復処理中に重複を排除するために使用されるため、deps のすべての要素はハッシュ可能である必要があります。ただし、この不変条件は現在、すべてのコンストラクタで一貫してチェックされていません。--incompatible_always_check_depset_elements フラグを使用して一貫したチェックを有効にします。これは将来のリリースでのデフォルトの動作になります。問題 10313 をご覧ください。

また、現時点では要素は不変である必要がありますが、この制限は将来緩和される予定です。

作成された depset の順序は、その transitive depset の順序と互換性がある必要があります。"default" 順序は他のすべての順序と互換性がありますが、他のすべての順序はそれ自体とのみ互換性があります。

パラメータ

パラメータ 説明
direct sequence、または None。デフォルトは None
です。 deps の直接要素のリスト。
order string。デフォルトは "default"
です。新しい depset のトラバーサル戦略。設定可能な値については、こちらをご覧ください。
transitive depsetシーケンス、または None。デフォルトは None
要素が depset の間接要素になる depsets のリスト。

exec_group

exec_group exec_group(*, toolchains=[], exec_compatible_with=[])

ルール実装時に特定の実行プラットフォームのアクションを作成するために使用できる実行グループを作成します。

パラメータ

パラメータ 説明
toolchains sequence; デフォルトは []
この実行グループに必要なツールチェーンのセット。リストには、String、Label、StarlarkToolchainTypeApi オブジェクトを任意の組み合わせで含めることができます。
exec_compatible_with stringシーケンス。デフォルトは []
です。 実行プラットフォームの制約のリスト。

exec_transition

transition exec_transition(*, implementation, inputs, outputs)

実行遷移の定義に使用される transition() の特殊なバージョン。ベスト プラクティスについては、ドキュメント(または実装)をご覧ください。Bazel ビルトインからのみ使用できます。

パラメータ

パラメータ 説明
implementation 呼び出し可能。必須
inputs 文字列シーケンス。必須
outputs 文字列シーケンス。必須

マクロ

macro macro(*, implementation, attrs={}, inherit_attrs=None, finalizer=False, doc=None)

BUILD ファイルまたはマクロ(レガシーまたはシンボリック)で呼び出して、ターゲット(複数可)を定義できるシンボリック マクロを定義します。

macro(...) によって返される値は、.bzl ファイルのグローバル変数に割り当てる必要があります。グローバル変数の名前は、マクロ シンボルの名前になります。

シンボリック マクロの使用方法に関する包括的なガイドについては、マクロをご覧ください。

パラメータ

パラメータ 説明
implementation function; required
このマクロを実装する Starlark 関数。マクロの属性の値は、キーワード引数として実装関数に渡されます。実装関数は、少なくとも 2 つの名前付きパラメータ namevisibility を持つ必要があります。また、マクロが属性を継承する場合(下記の inherit_attrs を参照)、**kwargs 残余キーワード パラメータを持つ必要があります。

慣例により、実装関数には、マクロが検査、変更、または「メイン」以外のターゲットに渡す必要がある属性の名前付きパラメータが必要です。一方、「メイン」ターゲットに渡される「一括」継承属性は、変更されずに **kwargs として渡されます。

実装関数は値を返してはなりません。代わりに、実装関数はルールまたはマクロのシンボルを呼び出してターゲットを宣言します。

シンボリック マクロ(マクロの実装関数が推移的に呼び出す Starlark 関数を含む)によって宣言されたターゲットまたは内部シンボリック マクロの名前は、name(「メイン」ターゲットと呼ばれる)と等しいか、name で始まり、区切り文字("_""-"".")と文字列接尾辞が続く必要があります。(この命名スキームに違反するターゲットを宣言することはできますが、ビルド、構成、依存関係の確立はできません)。

デフォルトでは、シンボリック マクロによって宣言されたターゲット(マクロの実装関数が推移的に呼び出す Starlark 関数を含む)は、マクロを定義する .bzl ファイルを含むパッケージでのみ表示されます。シンボリック マクロの呼び出し元を含む、外部に公開されるターゲットを宣言するには、実装関数で visibility を適切に設定する必要があります。通常は、呼び出されるルールまたはマクロのシンボルに visibility = visibility を渡すことで設定します。

次の API は、マクロ実装関数と、それが推移的に呼び出す Starlark 関数内では使用できません。

attrs dict; デフォルトは {}
このマクロがサポートする属性のディクショナリ。rule.attrs と同様です。キーは属性名で、値は attr.label_list(...) などの属性オブジェクト(attr モジュールを参照)または None です。None エントリは、マクロがその名前の属性を持たないことを意味します。これは、inherit_attrs を介して属性を継承する場合でも同様です(下記を参照)。

特殊な name 属性は事前に宣言されているため、辞書に含めることはできません。visibility 属性名は予約済みであり、ディクショナリに含めることはできません。

名前が _ で始まる属性は非公開です。ルールの呼び出しサイトで渡すことはできません。このような属性には、ラベルへの暗黙的な依存関係を作成するために、デフォルト値を割り当てることができます(attr.label(default="//pkg:foo") など)。

メモリ使用量を制限するため、宣言できる属性の数には上限があります。

inherit_attrs rulemacrostringNone。デフォルトは None
です。 マクロが属性を継承する組み込みの共通属性リスト(下記を参照)のルール記号、マクロ記号、または名前。

inherit_attrs が文字列 "common" に設定されている場合、マクロはすべての Starlark ルールで使用される共通ルール属性の定義を継承します。

rule() または macro() の戻り値が .bzl ファイルのグローバル変数に割り当てられていない場合、そのような値はルールまたはマクロのシンボルとして登録されていないため、inherit_attrs に使用できません。

継承メカニズムは次のように機能します。

  1. 特別な name 属性と visibility 属性は継承されません。
  2. 非表示属性(名前が "_" で始まる属性)は継承されません。
  3. 名前が attrs 辞書で定義済みの属性は継承されません(attrs のエントリが優先されます。エントリを None に設定して、その名前の属性がマクロで定義されないようにすることもできます)。
  4. 他のすべての属性はルールまたはマクロから継承され、attrs 辞書に効果的にマージされます。

必須でない属性が継承されると、元のルールまたはマクロで指定された内容に関係なく、属性のデフォルト値は None にオーバーライドされます。これにより、マクロが属性の値をラップされたルールまたはマクロのインスタンスに転送するとき(変更されていない **kwargs を渡すなど)、外部マクロの呼び出しで値が指定されなかった場合、内部ルールまたはマクロの呼び出しでも値が指定されなくなります(None を属性に渡すことは、属性を省略することと同じように扱われるため)。属性を省略すると、そのデフォルト値を渡す場合と意味が微妙に異なるため、これは重要です。特に、省略された属性は一部の bazel query 出力形式で表示されず、計算されたデフォルトは値が省略された場合にのみ実行されます。マクロで継承された属性を検査または変更する必要がある場合(たとえば、継承された tags 属性に値を追加する場合)、マクロの実装関数で None ケースを処理する必要があります。

たとえば、次のマクロは、cxxopts(属性リストから削除される)と copts(新しい定義が与えられる)を除く、native.cc_library のすべての属性を継承します。また、追加のタグを追加する前に、継承された tags 属性のデフォルトの None 値を確認します。

def _my_cc_library_impl(name, visibility, tags, **kwargs):
    # Append a tag; tags attr was inherited from native.cc_library, and
    # therefore is None unless explicitly set by the caller of my_cc_library()
    my_tags = (tags or []) + ["my_custom_tag"]
    native.cc_library(
        name = name,
        visibility = visibility,
        tags = my_tags,
        **kwargs
    )

my_cc_library = macro(
    implementation = _my_cc_library_impl,
    inherit_attrs = native.cc_library,
    attrs = {
        "cxxopts": None,
        "copts": attr.string_list(default = ["-D_FOO"]),
    },
)

inherit_attrs が設定されている場合、マクロの実装関数には **kwargs 残余キーワード パラメータが必要です。

慣例により、マクロは、継承されたオーバーライドされていない属性を、マクロがラップしている「メイン」ルールまたはマクロ シンボルにそのまま渡す必要があります。通常、ほとんどの継承された属性は実装関数のパラメータ リストにパラメータを持たず、単に **kwargs を介して渡されます。マクロが「メイン」ターゲットと「メイン」以外のターゲットの両方に属性を渡す必要がある場合、実装関数に一部の継承属性(通常は tagstestonly)の明示的なパラメータがあると便利です。ただし、マクロがこれらの属性を検査または操作する必要がある場合は、必須ではない継承属性の None のデフォルト値を処理するように注意する必要があります。

finalizer bool; デフォルトは False
このマクロがルール ファイナライザーかどうか。ルール ファイナライザーは、BUILD ファイル内の位置に関係なく、パッケージの読み込みの最後に、すべての非ファイナライザー ターゲットが定義された後に評価されるマクロです。

通常のシンボリック マクロとは異なり、ルール ファイナライザーは native.existing_rule()native.existing_rules() を呼び出して、現在のパッケージで定義されているファイナライザー以外のルール ターゲットのセットをクエリできます。native.existing_rule()native.existing_rules() は、このルール ファイナライザーを含む、ルール ファイナライザーで定義されたターゲットにアクセスできません。

doc string、または None。デフォルトは None
です。 ドキュメント生成ツールで抽出できるマクロの説明。

materializer_rule

callable materializer_rule(*, implementation, attrs={}, doc=None, allow_real_deps=False)

新しいマテリアライザー ルールを作成します。このルールは、BUILD ファイルまたはマクロから呼び出して、マテリアライザー ターゲットを作成できます。

マテリアライザー ターゲットは、分析時に依存関係を動的に選択するために使用されます。マテリアライザー ターゲットに依存するターゲットには、マテリアライザー ターゲット自体ではなく、マテリアライズされた依存関係が表示されます。

パラメータ

パラメータ 説明
implementation function; 必須
このマテリアライザー ルールを実装する Starlark 関数。パラメータは ctx の 1 つのみでなければなりません。この関数は、ルールのインスタンスごとに分析フェーズで呼び出されます。マテリアライザー ルールは、別のターゲットの属性でこのルールのインスタンスの代わりにマテリアライズする依存関係を指定する MaterializedDepsInfo プロバイダを 1 つだけ返します。
attrs dict。デフォルトは {}
です。ルールのすべての属性を宣言するディクショナリ。属性名から属性オブジェクトへのマッピングを行います(attr モジュールを参照)。_ で始まる属性は非公開で、ラベルへの暗黙的な依存関係を追加するために使用できます。属性 name は暗黙的に追加されるため、指定しないでください。属性 visibilitydeprecationtagstestonlyfeatures は暗黙的に追加され、オーバーライドできません。ほとんどのルールに必要な属性はごくわずかです。メモリ使用量を制限するため、宣言できる属性の数には上限があります。

宣言された属性は None をデフォルト値に変換します。

doc 文字列、または None。デフォルトは None
です。 ドキュメント生成ツールで抽出できるルールの説明。
allow_real_deps bool; デフォルトは False
このマテリアライザー ルールのインスタンスに実際の依存関係(非休眠依存関係 / 非 for_dependency_resolution)を持たせるかどうか。許可リストの対象となります。

module_extension

unknown module_extension(implementation, *, tag_classes={}, doc=None, environ=[], os_dependent=False, arch_dependent=False)

新しいモジュール拡張機能を作成します。グローバル値に保存して、use_extension を使用して MODULE.bazel ファイルでエクスポートして使用できるようにします。

パラメータ

パラメータ 説明
implementation callable; required
このモジュール拡張機能を実装する関数。module_ctx という 1 つのパラメータを受け取る必要があります。この関数は、ビルドの開始時に 1 回呼び出され、利用可能なリポジトリのセットを決定します。
tag_classes dict; デフォルトは {}
拡張機能で使用されるすべてのタグクラスを宣言するディクショナリ。タグクラスの名前から tag_class オブジェクトにマッピングします。
doc 文字列、または None。デフォルトは None
ドキュメント生成ツールで抽出できるモジュール拡張の説明。
environ 文字列シーケンス。デフォルトは []
です。 非推奨。このパラメータのサポートは終了しました。代わりに module_ctx.getenv に移行してください。
このモジュール拡張機能が依存する環境変数のリストを提供します。そのリスト内の環境変数が変更されると、拡張機能が再評価されます。
--experimental_strict_repo_env もご覧ください。
os_dependent bool; デフォルトは False
この拡張機能が OS に依存するかどうかを示します。
arch_dependent bool; デフォルトは False
この拡張機能がアーキテクチャに依存するかどうかを示します。

provider

unknown provider(doc=None, *, fields=None, init=None)

プロバイダ シンボルを定義します。この関数の結果の値は、ルールまたはアスペクトの実装で使用できるように、グローバル値に保存する必要があります。プロバイダは、結果の値を関数として呼び出すことでインスタンス化できます。また、ターゲットからそのプロバイダのインスタンスを取得するためのインデックス キーとして直接使用することもできます。例:
MyInfo = provider()
...
def _my_library_impl(ctx):
    ...
    my_info = MyInfo(x = 2, y = 3)
    # my_info.x == 2
    # my_info.y == 3
    ...

プロバイダの使用方法については、ルール(プロバイダ)をご覧ください。

init が指定されていない場合は、Provider 呼び出し可能な値を返します。

init が指定されている場合は、Provider 呼び出し可能値と raw constructor 呼び出し可能値の 2 つの要素のタプルを返します。詳細については、 ルール(カスタム プロバイダのカスタム初期化)と、下記の init パラメータの説明をご覧ください。

パラメータ

パラメータ 説明
doc 文字列、または None。デフォルトは None
です。 ドキュメント生成ツールで抽出できるプロバイダの説明。
fields stringsequence、または dict、または None。デフォルトは None
です。指定すると、許可されるフィールドのセットが制限されます。
指定できる値は次のとおりです。
  • フィールドのリスト:
    provider(fields = ['a', 'b'])

  • 辞書フィールド名 -> ドキュメント:
    provider(
           fields = { 'a' : 'Documentation for a', 'b' : 'Documentation for b' })
すべてのフィールドは省略可能です。
init 呼び出し可能。または None。デフォルトは None
です。インスタンス化中にプロバイダのフィールド値を前処理して検証するための省略可能なコールバック。init が指定されている場合、provider() は 2 つの要素(通常のプロバイダ シンボルと未加工のコンストラクタ)のタプルを返します。

正確な説明は次のとおりです。直感的な説明とユースケースについては、ルール(プロバイダのカスタム初期化)をご覧ください。

provider() を呼び出して作成されたプロバイダ シンボルを P とします。概念的には、P のインスタンスは、次の処理を行うデフォルトのコンストラクタ関数 c(*args, **kwargs) を呼び出すことで生成されます。

  • args が空でない場合は、エラーが発生します。
  • provider() の呼び出し時に fields パラメータが指定され、kwargsfields にリストされていないキーが含まれている場合は、エラーが発生します。
  • それ以外の場合、c は、kwargs の各 k: v エントリに対して、値が vk という名前のフィールドを持つ新しいインスタンスを返します。
init コールバックが指定されていない場合、シンボル P 自体の呼び出しは、デフォルトのコンストラクタ関数 c の呼び出しとして機能します。つまり、P(*args, **kwargs)c(*args, **kwargs) を返します。次に例を示します。
MyInfo = provider()
m = MyInfo(foo = 1)
を使用すると、mm.foo == 1 を持つ MyInfo インスタンスになります。

ただし、init が指定されている場合、呼び出し P(*args, **kwargs) は代わりに次の手順を実行します。

  1. コールバックは init(*args, **kwargs) として呼び出されます。つまり、P に渡されたものとまったく同じ位置引数とキーワード引数が渡されます。
  2. init の戻り値は、キーがフィールド名文字列である辞書 d であることが想定されています。そうでない場合は、エラーが発生します。
  3. P の新しいインスタンスは、c(**d) のように、d のエントリをキーワード引数としてデフォルトのコンストラクタを呼び出すかのように生成されます。

注: 上記の手順は、*args または **kwargsinit のシグネチャと一致しない場合、init の本文の評価が失敗した場合(fail() の呼び出しによる意図的な失敗など)、または init の戻り値が想定されるスキーマのディクショナリでない場合にエラーが発生することを意味します。

このように、init コールバックは、位置引数と、前処理と検証のための任意のロジックを許可することで、通常のプロバイダの構築を一般化します。許可された fields のリストを回避することはできません

init が指定されている場合、provider() の戻り値はタプル (P, r) になります。ここで、r未加工のコンストラクタです。実際、r の動作は、前述のデフォルトのコンストラクタ関数 c の動作とまったく同じです。通常、r はアンダースコアで始まる名前の変数にバインドされ、現在の .bzl ファイルのみが直接アクセスできるようになります。

MyInfo, _new_myinfo = provider(init = ...)

repository_rule

callable repository_rule(implementation, *, attrs=None, local=False, environ=[], configure=False, remotable=False, doc=None)

新しいリポジトリルールを作成します。グローバル値に保存して、module_extension() 実装関数から読み込んで呼び出せるようにするか、use_repo_rule() で使用できるようにします。

パラメータ

パラメータ 説明
implementation callable; required
このルールを実装する関数。単一のパラメータ repository_ctx が必要です。この関数は、ルールのインスタンスごとに読み込みフェーズで呼び出されます。
attrs dict、または None。デフォルトは None
です。リポジトリルールのすべての属性を宣言するディクショナリ。属性名から属性オブジェクトへのマッピングを行います(attr モジュールを参照)。_ で始まる属性は非公開であり、ラベルへの暗黙的な依存関係をファイルに追加するために使用できます(リポジトリ ルールは生成されたアーティファクトに依存できません)。属性 name は暗黙的に追加されるため、指定しないでください。

宣言された属性は None をデフォルト値に変換します。

local bool; デフォルトは False
このルールがローカル システムからすべてを取得し、取得ごとに再評価されることを示します。
environ 文字列シーケンス。デフォルトは []
です。 非推奨。このパラメータのサポートは終了しました。代わりに repository_ctx.getenv に移行してください。
このリポジトリ ルールが依存する環境変数のリストを提供します。このリスト内の環境変数が変更されると、リポジトリが再取得されます。
--experimental_strict_repo_env もご覧ください。
configure bool; デフォルトは False
リポジトリが構成目的でシステムを検査することを示す
remotable bool; デフォルトは False
試験運用中。このパラメータは試験運用版であり、いつでも変更される可能性があります。これに依存しないでください。--experimental_repo_remote_exec
リモート実行と互換性ありに設定することで、試験運用として有効にできます。
doc 文字列、または None。デフォルトは None
です。 ドキュメント生成ツールで抽出できるリポジトリ ルールの説明。

ルール

callable rule(implementation, *, test=unbound, attrs={}, outputs=None, executable=unbound, output_to_genfiles=False, fragments=[], host_fragments=[], _skylark_testable=False, toolchains=[], doc=None, provides=[], dependency_resolution_rule=False, exec_compatible_with=[], analysis_test=False, build_setting=None, cfg=None, exec_groups=None, initializer=None, parent=None, extendable=None, subrules=[])

BUILD ファイルまたはマクロから呼び出してターゲットを作成できる新しいルールを作成します。

ルールは .bzl ファイルのグローバル変数に割り当てる必要があります。グローバル変数の名前がルールの名前になります。

テストルールには _test で終わる名前が必要ですが、他のすべてのルールにはこの接尾辞は使用できません。(この制限はルールにのみ適用され、ターゲットには適用されません)。

パラメータ

パラメータ 説明
implementation function; 必須
このルールを実装する Starlark 関数。パラメータは 1 つ(ctx)のみである必要があります。この関数は、ルールのインスタンスごとに分析フェーズで呼び出されます。ユーザーが提供した属性にアクセスできます。宣言されたすべての出力を生成するアクションを作成する必要があります。
test bool; デフォルトは unbound
このルールがテストルールであるかどうか、つまり bazel test コマンドの対象となる可能性があるかどうか。すべてのテストルールは自動的に実行可能と見なされます。テストルールに executable = True を明示的に設定する必要はありません(また、設定することは推奨されません)。デフォルト値は False です。詳しくは、 ルールページをご覧ください。
attrs dict。デフォルトは {}
です。ルールのすべての属性を宣言するディクショナリ。属性名から属性オブジェクトへのマッピングを行います(attr モジュールを参照)。_ で始まる属性は非公開で、ラベルへの暗黙的な依存関係を追加するために使用できます。属性 name は暗黙的に追加されるため、指定しないでください。属性 visibilitydeprecationtagstestonlyfeatures は暗黙的に追加され、オーバーライドできません。ほとんどのルールに必要な属性はごくわずかです。メモリ使用量を制限するため、宣言できる属性の数には上限があります。

宣言された属性は None をデフォルト値に変換します。

outputs dictNonefunction のいずれか。デフォルトは None
です。 非推奨。このパラメータは非推奨となり、まもなく削除されます。これに依存しないでください。--incompatible_no_rule_outputs_param無効になっています。このフラグを使用して、コードが削除予定の API と互換性があることを確認します。
このパラメータは非推奨になりました。代わりに OutputGroupInfo または attr.output を使用するようにルールを移行します。

事前宣言された出力を定義するためのスキーマ。output 属性や output_list 属性とは異なり、ユーザーはこれらのファイルのラベルを指定しません。事前宣言された出力の詳細については、ルールページをご覧ください。

この引数の値は、ディクショナリまたはディクショナリを生成するコールバック関数のいずれかです。コールバックは、計算された依存関係属性と同様に機能します。関数のパラメータ名がルールの属性と照合されます。たとえば、定義 def _my_func(srcs, deps): ... を使用して outputs = _my_func を渡すと、関数は属性 srcsdeps にアクセスできます。辞書が直接指定されているか、関数経由で指定されているかにかかわらず、次のように解釈されます。

ディクショナリの各エントリは、キーが識別子で、値が出力のラベルを決定する文字列テンプレートである、事前宣言された出力を作成します。ルールの実装関数では、識別子は、ctx.outputs で出力の File にアクセスするために使用されるフィールド名になります。出力のラベルはルールと同じパッケージを持ち、パッケージの後の部分は、"%{ATTR}" 形式の各プレースホルダを属性 ATTR の値から形成された文字列に置き換えることで生成されます。

  • 文字列型の属性はそのまま置き換えられます。
  • ラベル型の属性は、パッケージの後にファイル拡張子を除いたラベルの一部になります。たとえば、ラベル "//pkg:a/b.c""a/b" になります。
  • 出力型の属性は、パッケージの後にラベルの一部になります。これには、ファイル拡張子(上記の例では "a/b.c")が含まれます。
  • プレースホルダで使用されるリスト型の属性(attr.label_list など)はすべて、1 つの要素を持つ必要があります。コンバージョンは、リスト以外のバージョン(attr.label)と同じです。
  • 他の属性タイプはプレースホルダに表示されないことがあります。
  • 特別な属性以外のプレースホルダ %{dirname}%{basename} は、ルールのラベルのパッケージ以外の部分に展開されます。たとえば、"//pkg:a/b.c" では、dirname は a、basename は b.c です。

実際には、最も一般的な置換プレースホルダは "%{name}" です。たとえば、「foo」という名前のターゲットの場合、出力ディクショナリ {"bin": "%{name}.exe"} は、実装関数で ctx.outputs.bin としてアクセスできる foo.exe という名前の出力を事前に宣言します。

executable bool; デフォルトは unbound
このルールが実行可能と見なされるかどうか、つまり、bazel run コマンドの対象になる可能性があるかどうか。デフォルトは False です。詳しくは、 ルールページをご覧ください。
output_to_genfiles bool; デフォルトは False
true の場合、ファイルは bin ディレクトリではなく genfiles ディレクトリに生成されます。既存のルールとの互換性(C++ のヘッダー ファイルを生成する場合など)のために必要な場合を除き、このフラグを設定しないでください。
fragments stringsequence。デフォルトは []
です。 ルールがターゲット構成で必要とする構成フラグメントの名前のリスト。
host_fragments 文字列シーケンス。デフォルトは []
です。 ホスト構成でルールが必要とする構成フラグメントの名前のリスト。
_skylark_testable bool; デフォルトは False
(試験運用版)

true の場合、このルールは Actions プロバイダを介して、このルールに依存するルールによる検査のためにアクションを公開します。プロバイダは、ctx.created_actions() を呼び出すことで、ルール自体でも使用できます。

これは、Starlark ルールの分析時の動作をテストする場合にのみ使用する必要があります。このフラグは今後削除される可能性があります。
toolchains sequence: デフォルトは []
です。設定されている場合、このルールに必要なツールチェーンのセット。リストには、String、Label、StarlarkToolchainTypeApi オブジェクトを任意の組み合わせで含めることができます。ツールチェーンは現在のプラットフォームをチェックすることで検出され、ctx.toolchain を介してルール実装に提供されます。
doc 文字列、または None。デフォルトは None
です。 ドキュメント生成ツールで抽出できるルールの説明。
provides sequence; デフォルトは []
実装関数が返す必要があるプロバイダのリスト。

実装関数が、ここに記載されているプロバイダのいずれかの型を戻り値から省略すると、エラーになります。ただし、実装関数は、ここに記載されていない追加のプロバイダを返す場合があります。

リストの各要素は、provider() によって返される *Info オブジェクトです。ルールのターゲットが、必須プロバイダを宣言するターゲットの依存関係として使用される場合、ここでプロバイダを指定する必要はありません。実装関数がそれを返すだけで十分です。ただし、これは必須ではありませんが、指定することがベスト プラクティスとされています。ただし、アスペクトrequired_providers フィールドでは、プロバイダをここで指定する必要があります。

dependency_resolution_rule bool; デフォルトは False
設定されている場合、ルールは、マテリアライザーで利用可能としてマークされた属性を介した依存関係にすることもできます。このフラグが設定されたルールのすべての属性は、マテリアライザーでも使用可能としてマークする必要があります。これは、このようにマークされたルールが、このようにマークされていないルールに依存できないようにするためです。
exec_compatible_with 文字列シーケンス。デフォルトは []
です。 このルールタイプのすべてのターゲットに適用される実行プラットフォームの制約のリスト。
analysis_test bool; デフォルトは False
true の場合、このルールは分析テストとして扱われます。

注: 分析テストルールは、主にコア Starlark ライブラリで提供されるインフラストラクチャを使用して定義されます。ガイダンスについては、テストをご覧ください。

ルールが分析テストルールとして定義されている場合、その属性で analysis_test_transition を使用して定義された構成遷移を使用できるようになりますが、いくつかの制限が適用されます。

  • このルールのターゲットは、推移的依存関係の数に制限があります。
  • ルールはテストルールとみなされます(test=True が設定されている場合と同様)。これは test の値に優先します
  • ルール実装関数はアクションを登録しない場合があります。代わりに、AnalysisTestResultInfo を提供して合格/不合格の結果を登録する必要があります。
build_setting BuildSetting、または None。デフォルトは None
です。 設定されている場合、このルールがどのような build setting であるかを記述します。config モジュールを参照してください。この値を設定すると、このルールに「build_setting_default」という必須属性が自動的に追加されます。この属性の型は、ここで渡された値に対応します。
cfg デフォルトは None
です。 設定されている場合、ルールが分析前に独自の構成に適用する構成の移行を指します。
exec_groups dict、または None。デフォルトは None
です。 実行グループ名(文字列)から exec_groups への辞書。設定されている場合、ルールは単一のターゲット内の複数の実行プラットフォームでアクションを実行できます。詳細については、実行グループのドキュメントをご覧ください。
initializer デフォルトは None
です。 試験運用版: ルールの属性を初期化する Stalark 関数。

この関数は、ルールのインスタンスごとに読み込み時に呼び出されます。name と、ルールで定義された公開属性の値(汎用属性(tags など)ではない)を使用して呼び出されます。

属性名から目的の値へのディクショナリを返す必要があります。返されない属性は影響を受けません。値として None を返すと、属性定義で指定されたデフォルト値が使用されます。

初期化子は、属性定義で指定されたデフォルト値の前に評価されます。したがって、初期化子のシグネチャのパラメータにデフォルト値が含まれている場合、属性定義のデフォルトが上書きされます(None を返す場合を除く)。

同様に、イニシャライザのシグネチャのパラメータにデフォルトがない場合、そのパラメータは必須になります。このような場合は、属性定義のデフォルト設定や必須設定を省略することをおすすめします。

処理されない属性には **kwargs を使用することをおすすめします。

拡張ルールの場合は、すべての子から祖先に向かって初期化子が呼び出されます。各イニシャライザには、認識している公開属性のみが渡されます。

parent デフォルトは None
です。 試験運用版: 拡張される Stalark ルール。設定すると、公開属性とアドバタイズされたプロバイダが統合されます。このルールは、親の executabletest に一致します。fragmentstoolchainsexec_compatible_withexec_groups の値が統合されます。以前のパラメータや非推奨のパラメータは設定できない場合があります。このルールの受信構成の後に、親の受信構成の遷移 cfg が適用されます。
extendable boolラベル文字列None。デフォルトは None
です。 試験運用版: このルールを拡張できるルールを定義する許可リストのラベル。また、常に拡張を許可または禁止するために、True / False に設定することもできます。Bazel はデフォルトで拡張機能を常に許可します。
subrules Subrulesequence。デフォルトは []
です。 試験運用版: このルールで使用されるサブルールのリスト。

選択

unknown select(x, no_match_error='')

select() は、ルール属性を構成可能にするヘルパー関数です。詳しくは、ビルド百科事典をご覧ください。

パラメータ

パラメータ 説明
x dict; 必須
構成条件を値にマッピングする辞書。各キーは、config_setting または constraint_value インスタンスを識別する ラベルまたはラベル文字列です。文字列の代わりにラベルを使用するタイミングについては、マクロに関するドキュメントをご覧ください。--incompatible_resolve_select_keys_eagerly が有効になっている場合、キーは select の呼び出しを含むファイルのパッケージを基準とした Label オブジェクトに解決されます。
no_match_error string; デフォルトは ''
条件が一致しない場合に報告するカスタム エラー(省略可)。

subrule

Subrule subrule(*, implementation, attrs={}, toolchains=[], fragments=[], subrules=[])

サブルールの新しいインスタンスを構築します。この関数の結果は、使用する前にグローバル変数に保存する必要があります。

パラメータ

パラメータ 説明
implementation function; 必須
このサブルールを実装する Starlark 関数
attrs dict; デフォルトは {}
サブルールのすべての(プライベート)属性を宣言する辞書。

サブルールには、ラベル型(ラベルまたはラベルリスト)の非公開属性のみを含めることができます。これらのラベルに対応する解決済みの値は、名前付き引数として Bazel によってサブルールの実装関数に自動的に渡されます(したがって、実装関数は属性名と一致する名前付きパラメータを受け入れる必要があります)。これらの値の型は次のようになります。

  • executable=True を含むラベル属性の FilesToRunProvider
  • allow_single_file=True を含むラベル属性の File
  • その他のラベル属性の場合は Target
  • すべての label-list 属性の [Target]
toolchains sequence; デフォルトは []
設定されている場合、このサブルールが必要とするツールチェーンのセット。リストには、String、Label、StarlarkToolchainTypeApi オブジェクトを任意の組み合わせで含めることができます。ツールチェーンは現在のプラットフォームをチェックして検出され、ctx.toolchains を介してサブルール実装に提供されます。このパラメータが設定されている場合、使用するルールで AEG を有効にする必要があります。まだ AEG に移行していない場合は、https://bazel.build/extending/auto-exec-groups#migration-aegs をご覧ください。
fragments stringsequence。デフォルトは []
サブルールがターゲット構成で必要とする構成フラグメントの名前のリスト。
subrules Subrulesequence。デフォルトは []
です。 このサブルールに必要な他のサブルールのリスト。

tag_class

tag_class tag_class(attrs={}, *, doc=None)

新しい tag_class オブジェクトを作成します。このオブジェクトは、モジュール拡張機能で使用可能なデータ オブジェクトであるタグのクラスの属性スキーマを定義します。

パラメータ

パラメータ 説明
attrs dict。デフォルトは {}
です。このタグクラスのすべての属性を宣言するディクショナリ。属性名から属性オブジェクトへのマッピングを行います( attr モジュールを参照)。

rule()aspect()repository_rule() とは異なり、宣言された属性は None をデフォルト値に変換しません。デフォルトを使用するには、呼び出し元が属性を完全に省略する必要があります。

doc string、または None。デフォルトは None
ドキュメント生成ツールで抽出できるタグクラスの説明。

visibility

None visibility(value)

現在初期化中の .bzl モジュールの読み込みの可視性を設定します。

モジュールの読み込み可視性は、他の BUILD ファイルと .bzl ファイルがモジュールを読み込めるかどうかを制御します。(これは、基盤となる .bzl ソースファイルのターゲットの可視性とは異なります。ターゲットの可視性は、ファイルが他のターゲットの依存関係として表示されるかどうかを制御します)。読み込みの可視性はパッケージ レベルで機能します。モジュールを読み込むには、読み込みを行うファイルが、モジュールへの可視性が付与されたパッケージに存在する必要があります。モジュールは、公開設定に関係なく、常に独自のパッケージ内で読み込むことができます。

visibility() は .bzl ファイルごとに 1 回のみ、最上位レベルでのみ呼び出すことができます。関数内では呼び出すことはできません。推奨されるスタイルは、この呼び出しを load() ステートメントと引数の決定に必要な簡単なロジックの直下に配置することです。

フラグ --check_bzl_visibility が false に設定されている場合、読み込みの可視性違反は警告を生成しますが、ビルドは失敗しません。

パラメータ

パラメータ 説明
value 必須
パッケージ仕様文字列のリスト、または単一のパッケージ仕様文字列。

パッケージの仕様は package_group と同じ形式ですが、負のパッケージの仕様は許可されません。つまり、仕様は次の形式になります。

  • "//foo": パッケージ //foo
  • "//foo/...": パッケージ //foo とそのすべてのサブパッケージ。
  • "public" または "private": それぞれすべてのパッケージまたはパッケージなし

「@」構文は使用できません。すべての仕様は、現在のモジュールのリポジトリを基準として解釈されます。

value が文字列のリストの場合、このモジュールに可視性が付与されるパッケージのセットは、各仕様で表されるパッケージのユニオンです。(空のリストは private と同じ効果があります)。value が単一の文字列の場合、シングルトン リスト [value] として扱われます。

--incompatible_package_group_has_public_syntax フラグと --incompatible_fix_package_group_reporoot_syntax フラグは、この引数には影響しません。"public""private" の値は常に使用可能で、"//..." は常に「現在のリポジトリ内のすべてのパッケージ」として解釈されます。