自動実行グループ(AEG)

自動実行グループでは、ツールチェーンのタイプごとに実行プラットフォームが選択されます。つまり、実行グループを定義しなくても、1 つのターゲットに複数の実行プラットフォームを設定できます。

要約

自動実行グループはツールチェーンと密接に関係しています。ツールチェーンを使用している場合は、影響を受けるアクション(実行可能ファイルまたはツールチェーンのツールを使用するアクション)に toolchain パラメータを追加して設定する必要があります。次に例を示します。

ctx.actions.run(
    ...,
    executable = ctx.toolchain['@bazel_tools//tools/jdk:toolchain_type'].tool,
    ...,
    toolchain = '@bazel_tools//tools/jdk:toolchain_type',
)

アクションがツールチェーンのツールや実行ファイルを使用しておらず、Blaze がそれを検出しない場合(エラーが発生した場合)、toolchain = None を設定できます。

1 つの実行プラットフォームで複数のツールチェーンを使用する必要がある場合(アクションが実行可能ファイルまたは複数のツールチェーンのツールを使用する場合)、exec_groups を手動で定義する必要があります(カスタム exec_group を使用する状況をご覧ください)。

History

AEG が行われる前は、実行プラットフォームはルールレベルで選択されていました。例:

my_rule = rule(
    _impl,
    toolchains = ['//tools:toolchain_type_1', '//tools:toolchain_type_2'],
)

ルール my_rule では、2 つのツールチェーン タイプを登録します。つまり、ツールチェーンの解決を使用して、両方のツールチェーン タイプをサポートする実行プラットフォームを見つけます。選択した実行プラットフォームは、exec_groups で別の指定がない限り、ルールに登録されたアクションごとに使用されていました。つまり、異なるツールチェーンのツールを使用した場合でも、ルール内のすべてのアクションは単一の実行プラットフォームを使用します(ターゲットごとに実行プラットフォームが選択されます)。その結果、すべてのツールチェーンをサポートする実行プラットフォームが存在しない場合にエラーが発生しました。

現在の状態

AEG では、ツールチェーン タイプごとに実行プラットフォームが選択されます。上記の例 my_rule の実装関数は次のようになります。

def _impl(ctx):
    ctx.actions.run(
      mnemonic = "First action",
      executable = ctx.toolchain['//tools:toolchain_type_1'].tool,
      toolchain = '//tools:toolchain_type_1',
    )

    ctx.actions.run(
      mnemonic = "Second action",
      executable = ctx.toolchain['//tools:toolchain_type_2'].tool,
      toolchain = '//tools:toolchain_type_2',
    )

このルールは 2 つのアクションを作成します。1 つは //tools:toolchain_type_1 から実行可能ファイルを使用する First action で、もう 1 つは //tools:toolchain_type_2 から実行可能ファイルを使用する Second action です。AEG が導入される以前は、これらのアクションは両方のツールチェーン タイプをサポートする単一の実行プラットフォームで実行されていました。AEG では、アクション内に toolchain パラメータを追加することで、各アクションがツールチェーンを提供する実行プラットフォームで実行されます。アクションは、さまざまな実行プラットフォームで実行できます。

同様に、ctx.actions.run_shell でも tools がツールチェーンからの場合に toolchain パラメータを追加する必要があります。

カスタム エグゼクティブ グループと自動エグゼクティブ グループの違い

その名前が示すように、AEG はルールに登録されたツールチェーン タイプごとに自動的に作成される実行可能ファイルです。「クラシック」の exec グループとは異なり、手動で指定する必要はありません。

カスタムの exec_group を使用すべき理由

カスタムの exec_groups は、複数のツールチェーンを単一の実行プラットフォームで実行する必要がある場合にのみ必要です。それ以外の場合は、カスタムの exec_groups を定義する必要はありません。例:

def _impl(ctx):
    ctx.actions.run(
      ...,
      executable = ctx.toolchain['//tools:toolchain_type_1'].tool,
      tools = [ctx.toolchain['//tools:toolchain_type_2'].tool],
      exec_group = 'two_toolchains',
    )
my_rule = rule(
    _impl,
    exec_groups = {
        "two_toolchains": exec_group(
            toolchains = ['//tools:toolchain_type_1', '//tools:toolchain_type_2'],
        ),
    }
)

AEG の移行

google3 の内部では、Blaze はすでに AEG を使用しています。Bazel については外部で、移行が進行中です。一部のルール(Java や C++ のルールなど)では、すでにこの機能が使用されています。

この移行をサポートしている Bazel バージョン

AEG は Bazel 7 以降で完全にサポートされています。

AEG を有効にする方法

--incompatible_auto_exec_groups を true に設定します。 フラグについて詳しくは、GitHub の問題をご覧ください。

特定のルール内で AEG を有効にするにはどうすればよいですか?

ルールに _use_auto_exec_groups 属性を設定します。

my_rule = rule(
    _impl,
    attrs = {
      "_use_auto_exec_groups": attr.bool(default = True),
    }
)

これにより、AEG は my_rule でのみ有効になり、そのアクションは実行プラットフォームを選択する際に新しいロジックの使用を開始します。互換性のないフラグは、この属性でオーバーライドされます。

エラー発生時に AEG を無効にする方法

--incompatible_auto_exec_groups を false に設定してプロジェクトで AEG を完全に無効にするか(フラグの GitHub の問題)、_use_auto_exec_groups 属性を False に設定して特定のルールを無効にします(属性の詳細)。

AEG への移行中のエラー メッセージ

ツールが暗黙的な依存関係からのものか、ツールチェーンからのものかを識別できませんでした。ツールチェーン パラメータを設定してください。ツールチェーンを使用していない場合は、「None」に設定します。

  • この場合、エラーが発生する前の呼び出しのスタックが得られ、どのアクションがツールチェーン パラメータを必要とするかが明確にわかります。アクションにどのツールチェーンが使用されているかを確認し、ツールチェーン パラメータで設定します。ツールまたは実行可能ファイルのアクション内でツールチェーンを使用しない場合は、None に設定します。

存在しないツールチェーン [ツールチェーン タイプ] に対してアクションが宣言されました。

  • これは、アクションにツールチェーン パラメータを設定したものの、ルールには登録していないことを意味します。ツールチェーンを登録するか、アクション内で None を設定します。

その他の資料

詳しくは、設計ドキュメント: ツールチェーンの自動実行グループをご覧ください。