実行グループを使用すると、1 つのターゲット内で複数の実行プラットフォームを使用できます。 各実行グループには独自のツールチェーンの依存関係があり、 独自のツールチェーン解決を実行します。
背景
実行グループを使用すると、ルール作成者は、それぞれ異なる実行プラットフォームを持つ可能性のある一連のアクションを定義できます。複数の実行プラットフォームを使用すると、アクションの実行方法が異なる場合があります。たとえば、リモート(Linux)ワーカーで iOS アプリをコンパイルし、ローカルの Mac ワーカーでリンク/コード署名を行うことができます。
アクションのグループを定義できると、アクションを指定するプロキシとしてアクションのニーモニックを使用する必要がなくなります。ニーモニックは一意であることが保証されておらず、1 つのアクションのみを参照できます。これは、要求の少ないタスクに過剰に割り当てることなく、C++ ビルドでのリンクなど、特定のメモリと処理を必要とするアクションに余分なリソースを割り当てる場合に特に役立ちます。
実行グループを定義する
ルール定義時に、ルール作成者は
一連の実行グループを宣言
できます。各実行グループで、ルール作成者は、その実行グループの実行プラットフォームを選択するために必要なすべてのもの(exec_compatible_with による制約と toolchain によるツールチェーン タイプ)を指定できます。
# foo.bzl
my_rule = rule(
_impl,
exec_groups = {
“link”: exec_group(
exec_compatible_with = [ "@platforms//os:linux" ]
toolchains = ["//foo:toolchain_type"],
),
“test”: exec_group(
toolchains = ["//foo_tools:toolchain_type"],
),
},
attrs = {
"_compiler": attr.label(cfg = config.exec("link"))
},
)
上記のコード スニペットでは、ツール依存関係で実行グループの移行を
cfg
属性パラメータと
config
モジュールを使用して指定することもできます。このモジュールは、依存関係をビルドする実行グループの名前である単一の文字列パラメータを受け取る exec 関数を公開します。
ネイティブ ルールと同様に、test 実行グループは Starlark テストルールでデフォルトで存在します。
実行グループにアクセスする
ルール実装では、アクションを実行グループの実行プラットフォームで実行するように宣言できます。これを行うには、アクション生成メソッドの exec_group
param(特に ctx.actions.run および
ctx.actions.run_shell)を使用します。
# foo.bzl
def _impl(ctx):
ctx.actions.run(
inputs = [ctx.attr._some_tool, ctx.srcs[0]]
exec_group = "compile",
# ...
)
ルール作成者は、ターゲットの解決済みツールチェーンにアクセスできるのと同様に、実行グループの解決済みツールチェーン にもアクセスできます。
# foo.bzl
def _impl(ctx):
foo_info = ctx.exec_groups["link"].toolchains["//foo:toolchain_type"].fooinfo
ctx.actions.run(
inputs = [foo_info, ctx.srcs[0]]
exec_group = "link",
# ...
)
実行グループを使用して実行プロパティを設定する
実行グループは、すべてのルールに存在する
exec_properties
属性と統合されており、ターゲット ライターは、実行メカニズムに渡されるプロパティの
文字列ディクショナリを指定できます。たとえば、ターゲットにメモリなどのプロパティを設定し、特定のアクションに高いメモリ割り当てを行う場合は、次のように、実行グループで拡張されたキーを使用して exec_properties エントリを作成します。
# BUILD
my_rule(
name = 'my_target',
exec_properties = {
'mem': '12g',
'link.mem': '16g'
}
…
)
exec_group = "link" のすべてのアクションは、実行プロパティ
ディクショナリを {"mem": "16g"} として認識します。ご覧のとおり、実行グループ レベルの設定はターゲット レベルの設定よりも優先されます。
ネイティブ ルールの実行グループ
ネイティブ ルールで定義されたアクションには、次の実行グループを使用できます。
test: テストランナー アクション。cpp_link: C++ リンク アクション。
実行グループとプラットフォーム実行プロパティ
プラットフォーム ターゲットで任意の実行グループの exec_properties を定義できます(ターゲットに直接設定された exec_properties とは異なり、不明な実行グループのプロパティは拒否されます)。ターゲットは、デフォルトの実行グループとその他の関連する実行グループに影響する実行プラットフォームの exec_properties を継承します。
たとえば、C++ テストの実行にはリソースが必要だが、コンパイルとリンクには必要ない場合、次のようにモデル化できます。
constraint_setting(name = "resource")
constraint_value(name = "has_resource", constraint_setting = ":resource")
platform(
name = "platform_with_resource",
constraint_values = [":has_resource"],
exec_properties = {
"test.resource": "...",
},
)
cc_test(
name = "my_test",
srcs = ["my_test.cc"],
exec_compatible_with = [":has_resource"],
)
ターゲットに直接定義された exec_properties は、実行プラットフォームから継承されたものよりも優先されます。