実行グループ

問題を報告 ソースを表示

実行グループを使用すると、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 グループの遷移も指定できることがわかります。このモジュールは、依存関係をビルドする実行グループの名前である単一の文字列パラメータを受け取る exec 関数を公開しています。

ネイティブ ルールと同様に、Starlark テストルールには test 実行グループがデフォルトで存在します。

実行グループへのアクセス

ルールの実装では、実行グループの実行プラットフォームでアクションを実行することを宣言できます。これを行うには、アクション生成メソッドの exec_group パラメータ(具体的には ctx.actions.runctx.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 ターゲットに直接定義された設定は、実行プラットフォームから継承される設定よりも優先されます。