自動実行グループ(AEG)

問題を報告 ソースを表示 ナイトリー · 8.0 · 7.4 · 7.3 · 7.2 · 7.1 · 7.0 · 6.5

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

要約

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

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

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

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

履歴

AEG の導入前は、実行プラットフォームはルールレベルで選択されていました。次に例を示します。

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

ルール my_rule は 2 種類のツールチェーンを登録します。つまり、Toolchain Resolution を使用して、両方のツールチェーン タイプをサポートする実行プラットフォームが見つかります。exec_groups で別途指定しない限り、選択した実行プラットフォームがルール内の登録済みアクションごとに使用されました。つまり、以前は、ルール内のすべてのアクションが、異なる toolchain のツールを使用していても、単一の実行プラットフォームを使用していました(実行プラットフォームはターゲットごとに選択されます)。これにより、すべてのツールチェーンをサポートする実行プラットフォームがない場合、失敗が発生しました。

現在の状態

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',
    )

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

ctx.actions.run_shell でも同様です。tools が toolchain から取得された場合は、toolchain パラメータを追加する必要があります。

カスタム実行グループと自動実行グループの違い

名前が示すように、AEG は、ルールに登録されている toolchain タイプごとに自動的に作成される実行グループです。「従来型」の exec グループとは異なり、手動で指定する必要はありません。

カスタム exec_group を使用するタイミング

カスタム exec_groups は、複数の toolchain を 1 つの実行プラットフォームで実行する必要がある場合にのみ必要です。それ以外の場合は、カスタム 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),
    }
)

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

エラーが発生した場合に AEG を無効にする方法

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

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

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

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

存在しないツールチェーン「[toolchain_type]」に対して宣言されたアクション。

  • つまり、アクションに toolchain パラメータを設定しましたが、ルールに登録しなかったということです。ツールチェーンを登録するか、アクション内で None を設定します。

その他の資料

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