실행 그룹을 사용하면 단일 타겟 내에서 여러 실행 플랫폼을 사용할 수 있습니다. 각 실행 그룹에는 자체 도구 모음 종속 항목이 있으며 자체 도구 모음 해결을 실행합니다.
배경
실행 그룹을 사용하면 규칙 작성자가 잠재적으로 다른 실행 플랫폼을 사용하는 작업 집합을 정의할 수 있습니다. 여러 실행 플랫폼을 사용하면 작업을 다르게 실행할 수 있습니다. 예를 들어 원격(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 함수를 노출합니다.
네이티브 규칙과 마찬가지로 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"],
)
구성된 타겟 demo의 copied 실행 그룹에는 다음이 모두 포함됩니다. - //fool_tools:toolchain_type- @platforms//os:linux- :local_constraint
실행 그룹 액세스
규칙 구현에서 실행 그룹의 실행 플랫폼에서 작업을 실행해야 한다고 선언할 수 있습니다. 작업 생성 메서드의 exec_group
매개변수, 특히 ctx.actions.run 및
ctx.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++ 연결 작업
실행 그룹을 만들어 실행 속성 설정
실행 그룹을 사용하여 특정 작업에 다른 실행 속성을 제공하지만 규칙과 다른 도구 모음이나 제약조건을 실제로 원하지 않는 경우가 있습니다. 이러한 경우 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보다 우선합니다.