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