실행 그룹

문제 신고하기 소스 보기

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

배경

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

또한 작업 그룹을 정의할 수 있으면 작업 지정을 위한 프록시로 작업 니모닉을 사용하는 일을 줄일 수 있습니다. 니모닉은 고유하지 않을 수도 있으며 단일 작업만 참조할 수 있습니다. 이는 특정 메모리에 추가 리소스를 할당하고 덜 까다로운 작업에 과도하게 할당하지 않고 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 그룹의 이름인 단일 문자열 매개변수를 사용하는 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"가 있는 모든 작업에서는 실행 속성 사전이 {"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 대상에 직접 정의된 것이 실행 플랫폼에서 상속된 항목보다 우선합니다.