실행 그룹을 사용하면 단일 타겟 내에 여러 실행 플랫폼을 사용할 수 있습니다. 각 실행 그룹에는 자체 도구 모음 종속 항목이 있으며 자체 도구 모음 확인을 실행합니다.
배경
실행 그룹을 사용하면 규칙 작성자가 실행 플랫폼이 각각 다를 수 있는 작업 세트를 정의할 수 있습니다. 여러 실행 플랫폼에서 작업을 서로 다르게 실행할 수 있습니다. 예를 들어 원격(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"],
)
구성된 타겟 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"
가 있는 모든 작업은 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
보다 우선 적용됩니다.