Yürütme grupları, tek bir hedef içinde birden fazla yürütme platformuna izin verir. Her yürütme grubunun kendi toolchain bağımlılıkları vardır ve kendi toolchain çözümlemesini gerçekleştirir.
Arka plan
Yürütme grupları, kural yazarının her biri farklı bir yürütme platformuna sahip olabilecek bir dizi işlem tanımlamasına olanak tanır. Birden fazla yürütme platformu, işlemlerin farklı şekilde yürütülmesine olanak tanıyabilir. Örneğin, bir iOS uygulamasını uzak bir (Linux) çalışanda derleyip yerel bir Mac çalışanda bağlama/kod imzalama.
İşlem gruplarını tanımlayabilmek, işlemleri belirtmek için işlem anımsatıcılarının vekil olarak kullanılmasını da azaltır. Kısaltmaların benzersiz olduğu garanti edilmez ve yalnızca tek bir işleme referans verebilirler. Bu özellik, özellikle daha az kaynak gerektiren görevlere aşırı kaynak ayırmadan C++ derlemelerinde bağlantı oluşturma gibi belirli bellek ve işlem yoğunluklu işlemlere ek kaynak ayırma konusunda faydalıdır.
Yürütme gruplarını tanımlama
Kural yazarları, kural tanımı sırasında bir dizi yürütme grubu bildirebilir. Kuralı oluşturan kişi, her yürütme grubunda bu yürütme grubu için bir yürütme platformu seçmek üzere gereken her şeyi (yani exec_compatible_with
aracılığıyla tüm kısıtlamaları ve toolchain
aracılığıyla araç zinciri türlerini) belirtebilir.
# 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"))
},
)
Yukarıdaki kod snippet'inde, araç bağımlılıklarının cfg
özellik parametresi ve config
modülü kullanılarak bir yürütme grubu için geçiş de belirtebileceğini görebilirsiniz. Modül, bağımlılığın oluşturulması gereken yürütme grubunun adı olan tek bir dize parametresi alan bir exec
işlevi sunar.
Yerel kurallarda olduğu gibi, test
yürütme grubu varsayılan olarak Starlark test kurallarında bulunur.
Yürütme grubu devralma
Yeni bir yürütme grubu, kendi kısıtlamalarını ve araç zincirlerini tanımlamanın yanı sıra copy_from_rule = True
parametresini ileterek kuralın varsayılan yürütme grubundan devralmak istediğini de belirtebilir. copy_from_rule
değerini true olarak ayarlamak ve exec_compatible_with
veya toolchains
değerini de iletmek hatadır.
Varsayılan yürütme grubundan devralan bir yürütme grubu, varsayılandaki kısıtlamaları, araç zincirlerini ve yürütme özelliklerini kopyalar. Bu, yalnızca kuralın kendisi tarafından belirtilenleri değil, hedef düzeyinde ayarlanan kısıtlamaları ve yürütme özelliklerini de içerir. Başka bir deyişle, aşağıdakiler göz önünde bulundurulduğunda:
# 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"],
)
Yapılandırılan hedef demo
için copied
yürütme grubu aşağıdakilerin tümünü içerir:
- //fool_tools:toolchain_type
- @platforms//os:linux
- :local_constraint
Yürütme gruplarına erişme
Kural uygulamasında, işlemlerin bir yürütme grubunun yürütme platformunda çalıştırılması gerektiğini belirtebilirsiniz. Bu işlemi, işlem oluşturan yöntemlerin exec_group
param parametresini (özellikle ctx.actions.run
ve
ctx.actions.run_shell
) kullanarak yapabilirsiniz.
# foo.bzl
def _impl(ctx):
ctx.actions.run(
inputs = [ctx.attr._some_tool, ctx.srcs[0]]
exec_group = "compile",
# ...
)
Kural yazarları, hedef için çözümlenmiş araç zincirine erişebildiğiniz gibi, yürütme gruplarının çözümlenmiş araç zincirlerine de erişebilir:
# 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",
# ...
)
Yürütme özelliklerini ayarlamak için yürütme gruplarını kullanma
Yürütme grupları, her kuralda bulunan ve hedef yazıcının, yürütme mekanizmasına iletilen bir özellikler dizesi sözlüğü belirtmesine olanak tanıyan exec_properties
özelliğiyle entegre edilmiştir. Örneğin, hedef için bellek gibi bir özellik ayarlamak ve belirli işlemlere daha yüksek bellek ayırmak istiyorsanız exec_properties
gibi bir yürütme grubu artırılmış anahtara sahip bir giriş yazarsınız:
# BUILD
my_rule(
name = 'my_target',
exec_properties = {
'mem': '12g',
'link.mem': '16g'
}
…
)
exec_group = "link"
ile yapılan tüm işlemler, yönetici özelliklerinin sözlüğünü {"mem": "16g"}
olarak görür. Burada gördüğünüz gibi, yürütme grubu düzeyindeki ayarlar hedef düzeyindeki ayarları geçersiz kılar.
Yerel kurallar için yürütme grupları
Yerel kurallarla tanımlanan işlemler için aşağıdaki yürütme grupları kullanılabilir:
test
: Test çalıştırıcı işlemleri.cpp_link
: C++ bağlama işlemleri.
Yönetici özelliklerini ayarlamak için yönetici grupları oluşturma
Bazen, belirli işlemlere farklı yürütme özellikleri vermek için bir yürütme grubu kullanmak istersiniz ancak kuraldan farklı araç zincirleri veya kısıtlamalar istemezsiniz. Bu durumlarda, copy_from_rule
parametresini kullanarak yönetici grupları oluşturabilirsiniz:
# 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"],
),
},
)
#
Yürütme grupları ve platform yürütme özellikleri
Platform hedeflerinde rastgele yürütme grupları için exec_properties
tanımlamak mümkündür (doğrudan bir hedefte ayarlanan exec_properties
'dan farklı olarak, bilinmeyen yürütme gruplarının özellikleri reddedilir). Hedefler daha sonra varsayılan yürütme grubunu ve diğer ilgili yürütme gruplarını etkileyen yürütme platformunun exec_properties
değerlerini devralır.
Örneğin, bir C++ testinin çalıştırılması için bazı kaynakların kullanılabilir olması gerektiğini ancak derleme ve bağlama için bunun gerekli olmadığını varsayalım. Bu durum aşağıdaki gibi modellenebilir:
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
doğrudan hedeflerde tanımlananlar, yürütme platformundan devralınanlara göre önceliklidir.