自動実行グループは、ツールチェーン タイプごとに実行プラットフォームを選択します。つまり、実行グループを定義しなくても、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 つの実行プラットフォームで複数のツールチェーンを使用する必要がある場合(1 つのアクションで 2 つ以上のツールチェーンの実行可能ファイルを使用する)場合は、exec_groups を手動で定義する必要があります(カスタム exec_group を使用すべき状況のセクションを参照)。
履歴
AEG が登場する前は、実行プラットフォームはルールレベルで選択されていました。次に例を示します。
my_rule = rule(
_impl,
toolchains = ['//tools:toolchain_type_1', '//tools:toolchain_type_2'],
)
ルール my_rule
は 2 つのツールチェーン タイプを登録します。つまり、両方のツールチェーン タイプをサポートする実行プラットフォームを見つけるには、ツールチェーンの解決を使用します。exec_groups で異なる指定がない限り、ルール内の登録済みアクションごとに選択された実行プラットフォームが使用されました。つまり、ルール内のすべてのアクションは、異なるツールチェーンのツールを使用した場合でも、1 つの実行プラットフォームがありました(ターゲットごとに実行プラットフォームが選択されます)。この結果、すべてのツールチェーンをサポートする実行プラットフォームが存在しない場合に失敗しました。
現在の状態
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
パラメータを追加することで、ツールチェーンを提供する実行プラットフォームで各アクションが実行されます。アクションは、異なる実行プラットフォームで実行できます。
同じことが ctx.actions.run_shell でも有効です。tools
がツールチェーンからのものである場合、toolchain
パラメータを追加する必要があります。
カスタム実行グループと自動実行グループの違い
その名前が示すように、AEG はルールに登録されたツールチェーン タイプごとに自動的に作成される実行グループです。「従来」の exec グループとは異なり、手動で指定する必要はありません。また、AEG の名前はツールチェーン タイプ(//tools:toolchain_type_1
など)に自動的に設定されます。
カスタム 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),
}
)
これにより、my_rule
でのみ AEG が有効になり、実行プラットフォームを選択する際に、そのアクションは新しいロジックを使用して開始されます。互換性のないフラグは、この属性でオーバーライドされます。
エラーが発生した場合に AEG を無効にする方法
プロジェクトで AEG を完全に無効にするには(フラグの GitHub の問題)、--incompatible_auto_exec_groups
を false に設定します。または、_use_auto_exec_groups
属性を False
に設定して特定のルールを無効にします(属性の詳細)。
AEG への移行中のエラー メッセージ
ツールが暗黙的な依存関係からのものか、ツールチェーンからのものかを特定できませんでした。ツールチェーン パラメータを設定してください。ツールチェーンを使用していない場合は、「None」に設定します。
- この場合、エラーが発生する前にスタックの呼び出しが得られ、ツールチェーン パラメータが必要なアクションが明確にわかります。アクションにどのツールチェーンが使用されているかを確認し、ツールチェーン パラメータで設定します。ツールまたは実行可能ファイルのアクション内でツールチェーンを使用しない場合は、
None
に設定します。
存在しないツールチェーン「[ツールチェーン タイプ]」に対してアクションが宣言されています。
- これは、ツールチェーン パラメータをアクションに設定したものの、ルールに登録していないことを意味します。ツールチェーンを登録するか、アクション内で
None
を設定します。
その他の資料
詳細については、設計ドキュメント(ツールチェーンの自動実行グループ)をご覧ください。