Yürütme grupları, tek bir hedef içinde birden çok yürütme platformuna izin verir. Her yürütme grubunun kendi araç zinciri bağımlılıkları vardır ve kendi araç zinciri çözümlemesini gerçekleştirir.
Arka plan
Yürütme grupları, kural yazarının her biri potansiyel olarak farklı bir yürütme platformuna sahip olan işlem grupları tanımlamasına olanak tanır. Birden fazla yürütme platformu, işlemlerin farklı şekilde yürütülmesine izin verebilir. Örneğin, bir iOS uygulamasını uzak (Linux) bir çalışanda derleyip ardından yerel bir Mac çalışanda bağlama/kod imzalama işlemini gerçekleştirebilirsiniz.
İşlem gruplarını tanımlayabilmek, eylemleri belirtmek için bir proxy olarak işlem anımsatıcılarının kullanımını azaltmaya da yardımcı olur. Anımsatıcıların benzersiz olacağı garanti edilmez ve yalnızca tek bir işleme referans verilebilir. Bu, özellikle belirli belleğe ek kaynak ayırma ve daha az çaba gerektiren görevlere fazla ayırmadan C++ derlemelerinde bağlantı oluşturma gibi yoğun işlemlerin işlenmesi açısından faydalıdır.
Yürütme gruplarını tanımlama
Kural yazarları, kural tanımı sırasında bir dizi yürütme grubu belirleyebilir. Kural yazarı, her yürütme grubunda söz konusu 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 tüm 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ı cfg
özellik parametresini ve config
modülünü kullanarak bir yürütme grubu için geçişi de belirtebileceğini görebilirsiniz. Modül, bağımlılığın derlenmesi gereken yönetici grubunun adı olan tek bir dize parametresini alan bir exec
işlevi sunar.
Yerel kurallarda olduğu gibi test
yürütme grubu da Starlark test kurallarında varsayılan olarak mevcuttur.
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. Bunu, işlem oluşturma yöntemlerinin exec_group
parametresini, özellikle de 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ı, bir hedefin çözümlenmiş araç zincirine erişebileceğiniz gibi, yürütme gruplarının çözülmüş 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 exec_properties
özelliğiyle entegredir ve hedef yazarın, daha sonra yürütme mekanizmasına iletilen bir özellik dizesi dizini belirtmesine olanak tanır. Örneğin, hedef için bellek gibi bir özellik ayarlamak ve belirli işlemlere daha yüksek bir bellek tahsisi sağlamak istiyorsanız yürütme grubu ile artırılmış bir anahtara sahip bir exec_properties
girişi yazarsınız. Örneğin:
# BUILD
my_rule(
name = 'my_target',
exec_properties = {
'mem': '12g',
'link.mem': '16g'
}
…
)
exec_group = "link"
içeren tüm işlemler, yönetici özellikleri 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ı
Doğal kurallarla tanımlanan işlemler için aşağıdaki yürütme grupları kullanılabilir:
test
: Test koşucusu işlemleri.cpp_link
: C++ bağlantı işlemleri.
Yürütme grupları ve platform yürütme özellikleri
Platform hedeflerindeki rastgele yürütme grupları için exec_properties
tanımlamak mümkündür (bilinmeyen yürütme gruplarının özelliklerinin reddedildiği bir hedefte doğrudan ayarlanan exec_properties
'ın aksine). 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
özelliğini 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 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"],
)
Doğrudan hedeflerde tanımlanan exec_properties
, yürütme platformundan devralınanlardan önceliklidir.