Yürütme grupları, tek bir hedefte birden fazla yürütme platformuna olanak tanır. Her yürütme grubunun kendi araç zinciri bağımlılıkları vardır ve kendi araç zinciri çözünürlüğünü yürütür.
Arka plan
Yürütme grupları, kural yazarının her biri potansiyel olarak farklı bir yürütme platformuna sahip 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ı uzaktaki (linux) çalışanda derleyip ardından yerel mac çalışanında bağlantı oluşturabilir/kod imzalamayı kullanabilirsiniz.
İşlem grupları tanımlayabilmek, işlemleri belirtmenin bir göstergesi olarak işlem anımsatıcılarının kullanımını hafifletmeye de yardımcı olur. Anımsatıcıların benzersiz olacağı garanti edilmez ve yalnızca tek bir işleme referans verebilirler. Bu, özellikle belirli belleğe ek kaynak ayırmada ve daha az zorlu görevlere aşırı ayırmadan C++ derlemelerinde bağlantı oluşturma gibi yoğun işlemleri işlemede yardımcı olur.
Yürütme gruplarını tanımlama
Kural tanımı sırasında, kural yazarları bir dizi yürütme grubu bildirebilir. Her yürütme grubunda, kural yazarı, söz konusu yürütme grubu için yürütme platformu seçmek üzere gereken her şeyi, exec_compatible_with
aracılığıyla tüm kısıtlamaları ve toolchain
aracılığıyla araç zinciri türlerini belirleyebilir.
# 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 parametresini ve config
modülünü kullanarak bir exec grubu için geçişi de belirtebildiğini görebilirsiniz. Modül, bağımlılığın oluşturulması gereken yönetici grubunun adı olan tek bir dize parametresi alan exec
işlevini gösterir.
Yerel kurallarda olduğu gibi, test
yürütme grubu 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, exec_group
parametresi olan işlem oluşturma yöntemlerini (ö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ı, bir hedefin çözümlenmiş araç zincirine erişiminize benzer şekilde, 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 mevcut olan exec_properties
özelliğiyle entegredir ve hedef yazarın daha sonra yürütme makinesine iletilen özellikleri içeren bir dize dizesi belirtmesine olanak tanır. Örneğin, hedef için bellek gibi bir özellik ayarlamak ve belirli işlemlere daha yüksek bellek tahsisi vermek isterseniz 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"
ile yapılan tüm işlemler, yürütme ö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ı
Aşağıdaki yürütme grupları, yerel kurallar tarafından tanımlanan işlemler için kullanılabilir:
test
: Test çalıştırıcı 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 (exec_properties
doğrudan hedef üzerinde ayarlanan, bilinmeyen yürütme gruplarına ait özelliklerin reddedildiğinde farklı). Daha sonra hedefler, varsayılan yürütme grubunu ve ilgili diğer yürütme gruplarını etkileyen yürütme platformunun exec_properties
değerini devralır.
Örneğin, C++ testi çalıştırmak için bazı kaynakların kullanılabilir olması gerektiğini ancak derleme ve bağlantı oluşturmak için gerekli olmadığını varsayalım. Bu, aşağıdaki şekilde 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ınan öğelere göre önceliklidir.