실행 그룹

문제 신고 소스 보기 1박 · 7.2 · 7.1 · 7.0 · 6.5 · 6.4

실행 그룹은 단일 대상 내에서 여러 실행 플랫폼을 허용합니다. 각 실행 그룹에는 고유한 도구 모음 종속 항목이 있고 자체 도구 모음 해상도를 실행합니다.

배경

실행 그룹을 사용하면 규칙 작성자가 작업 집합을 정의할 수 있으며, 각 작업에는 다른 실행 플랫폼이 있을 수 있습니다. 여러 실행 플랫폼에서는 작업을 다르게 실행해야 합니다(예: 원격으로 iOS 앱을 컴파일하는 경우). (linux) worker를 사용한 다음 로컬 Mac worker에서 링크/코드 서명을 실행합니다.

작업 그룹을 정의할 수 있으면 작업 사용도 줄일 수 있습니다. 작업을 지정하기 위한 프록시로서의 니모닉을 사용합니다. 연상 기호는 항상 동일한 것은 아닙니다. 고유하며 단일 작업만 참조할 수 있습니다. 이는 특히 특정 메모리에 추가 리소스를 할당하고 집약적인 작업을 처리함 보다 덜 까다로운 작업에 과도하게 할당하지 않고 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 그룹의 이름인 매개변수 빌드되었습니다.

네이티브 규칙과 마찬가지로 test 실행 그룹은 기본적으로 Starlark에 있습니다. 테스트 규칙

실행 그룹 상속

자체 제약 조건과 도구 모음을 정의하는 것 외에도 그룹이 규칙의 기본 실행에서 상속하기를 원한다고 선언할 수 있습니다. copy_from_rule = True 매개변수를 전달하여 그룹화할 수 있습니다. 이 매개변수를 설정하는 것은 copy_from_rule를 true로 설정하고 exec_compatible_with 또는 toolchains입니다.

기본 실행 그룹 사본에서 상속되는 실행 그룹 제약 조건, 도구 모음, 실행 속성을 기본값에서 삭제할 수 있습니다. 이 대상 수준에 설정된 제약 조건 및 실행 속성이 규칙을 만들 수 있습니다. 즉, 다음과 같은 경우

# foo.bzl
my_rule = rule(
    _impl,
    exec_groups = {
        “copied”: exec_group(
            copy_from_rule = True,
            # This will inherit exec_compatible_with and toolchains.
            # Setting them here directly would be an error, however.
        ),
    },
    toolchains = ["//foo_tools:toolchain_type"],
    exec_compatible_with = ["@platforms//os:linux"],
)

# BUILD

my_rule(
    name = "demo",
    exec_compatible_with = [":local_constraint"],
)

구성된 타겟 democopied 실행 그룹에는 / - //fool_tools:toolchain_type - @platforms//os:linux - :local_constraint

실행 그룹 액세스

규칙 구현에서 실행 그룹의 실행 플랫폼입니다 이렇게 하려면 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"가 있는 모든 작업에는 exec 속성이 표시됩니다. 사전을 {"mem": "16g"}로 번역합니다. 보시다시피 실행 그룹 수준은 설정이 타겟 수준 설정보다 우선 적용됩니다.

기본 규칙의 실행 그룹

다음 실행 그룹은 네이티브 규칙에 의해 정의된 작업에 사용할 수 있습니다.

  • test: 테스트 실행기 작업.
  • cpp_link: C++ 연결 작업

실행 그룹을 만들어 exec 속성 설정

exec 그룹을 사용하여 특정 작업에 다른 exec를 부여해야 할 수 있습니다. 속성을 지원하지만 실제로는 있습니다. 이러한 상황에서는 copy_from_rule를 사용하여 실행 그룹을 만들 수 있습니다. 매개변수:

# foo.bzl

# Creating an exec group with `copy_from_rule=True` is the same as explicitly
# setting the exec group's toolchains and constraints to the same values as the
# rule's respective parameters.
my_rule = rule(
    _impl,
    exec_compatible_with = ["@platforms//os:linux"],
    toolchains = ["//foo:toolchain_type"],
    exec_groups = {
        # The following two groups have the same toolchains and constraints:
        “foo”: exec_group(copy_from_rule = True),
        "bar": exec_group(
            exec_compatible_with = ["@platforms//os:linux"],
            toolchains = ["//foo:toolchain_type"],
        ),
    },
)

#

실행 그룹 및 플랫폼 실행 속성

시스템의 임의 실행 그룹에 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가 실행 플랫폼에서 상속됩니다