실행 그룹

<ph type="x-smartling-placeholder"></ph> 문제 신고 소스 보기 1박 · 7.3 · 7.2 · 7.1 · 7.0 · 6.5

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

배경

실행 그룹을 사용하면 규칙 작성자가 작업 집합을 정의할 수 있으며, 각 작업에는 다른 실행 플랫폼이 있을 수 있습니다. 여러 실행 플랫폼에서는 작업을 다르게 실행해야 합니다(예: 원격으로 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에 있습니다. 테스트 규칙

실행 그룹 액세스

규칙 구현에서 실행 그룹의 실행 플랫폼입니다 이렇게 하려면 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_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가 실행 플랫폼에서 상속됩니다