실행 그룹

문제 신고 소스 보기 Nightly · 7.4 . 7.3 · 7.2 · 7.1 · 7.0 · 6.5

실행 그룹을 사용하면 단일 타겟 내에 여러 실행 플랫폼을 사용할 수 있습니다. 각 실행 그룹에는 자체 도구 모음 종속 항목이 있으며 자체 도구 모음 확인을 실행합니다.

배경

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

또한 작업 그룹을 정의할 수 있으면 작업 지정을 위한 프록시로 작업 니모닉을 사용하는 일을 줄일 수 있습니다. 니모닉은 고유하지 않을 수 있으며 단일 작업만 참조할 수 있습니다. 이는 특히 덜 요구되는 작업에 과도하게 할당하지 않고 특정 메모리에 추가 리소스를 할당하고 C++ 빌드에서 연결과 같은 리소스 집약적인 작업을 처리하는 데 유용합니다.

실행 그룹 정의

규칙 작성자는 규칙 정의 중에 일련의 실행 그룹을 declare할 수 있습니다. 각 실행 그룹에서 규칙 작성자는 실행 그룹의 실행 플랫폼을 선택하는 데 필요한 모든 것을 지정할 수 있습니다. 즉, 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 테스트 규칙에 기본적으로 있습니다.

실행 그룹 상속

새 실행 그룹은 자체 제약 조건과 도구 모음을 정의하는 것 외에도 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 그룹을 사용하여 특정 작업에 다른 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는 실행 플랫폼에서 상속된 exec_properties보다 우선 적용됩니다.