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. kendi araç zinciri çözümünü gerçekleştirir.
Arka plan
Yürütme grupları, kural yazarının her biri bir işlem grubuna sahip olan farklı bir yürütme platformu kullanabilirsiniz. Birden fazla yürütme platformu, farklı şekilde yürütülmesine neden olan işlemler (ör. uzaktan kumandada bir iOS uygulaması derleme) (linux) çalışanı ve yerel bir mac işçisinde bağlantı/kod imzalama işlemi yapılır.
İşlem gruplarını tanımlayabilmek, aynı zamanda işlem kullanımını kolaylaştırmaya da anımsatıcılar (hatırlatıcılar, eylemlerin belirtilmesi için) Hafıza güçlendiricilerin benzersizdir ve yalnızca tek bir işleme referans verebilir. Bu, özellikle de Belirli belleğe ve yoğun işlem gerektiren işlemlere ek kaynak ayırma daha az çaba gerektiren görevlere fazla ayırmadan C++ derlemelerine bağlama gibi.
Yürütme gruplarını tanımlama
Kural tanımı sırasında, kural yazarları
belirtmek
bir dizi yürütme grubudur. Her yürütme grubunda, kural yazarı şunları belirtebilir:
bir yürütme platformu seçmek için gereken her şeyi
yani exec_compatible_with
ve araç zinciri türleri aracılığıyla
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"))
},
)
Yukarıdaki kod snippet'inde, araç bağımlılıklarının da
bir yönetici grubu için
cfg
özellik parametresi ve
config
modülünü kullanabilirsiniz. Modül, tek bir dize alan bir exec
işlevi sunar.
Bu parametre, bağımlılığın olması gereken yönetici grubunun adıdır.
geliştirmenizi sağlar.
Yerel kurallarda olduğu gibi test
yürütme grubu Starlark'ta varsayılan olarak mevcuttur
test kuralları.
Yürütme gruplarına erişme
Kural uygulamasında, işlemlerin
yürütme platformuna gidin. Bunu, exec_group
aracını kullanarak yapabilirsiniz:
özellikle ctx.actions.run
ve
ctx.actions.run_shell
.
# foo.bzl
def _impl(ctx):
ctx.actions.run(
inputs = [ctx.attr._some_tool, ctx.srcs[0]]
exec_group = "compile",
# ...
)
Kural yazarları, çözülmüş araç zincirlerine de erişebilir sizinkine benzer şekilde iki farklı yürütme grubu bir hedefin çözümlenmiş araç zincirine 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ı,
exec_properties
özelliğini kullanabilir ve hedef yazarın bir
daha sonra yürütme makinesine iletilen özelliklerin dize yönergesi. Örneğin,
Mesela, hedef için bellek gibi bir özellik ayarlamak ve
bu işlem için daha yüksek bellek ayırması kullanıyorsanız exec_properties
ve yürütme grubu artırılmış anahtara sahip bir giriştir. Ö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önetici özelliklerini görür
sözlüğü {"mem": "16g"}
olarak belirleyin. Gördüğünüz gibi, uygulama grubu düzeyinde
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 kurallarla tanımlanan işlemler için 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
Şuralarda rastgele yürütme grupları için exec_properties
tanımlamak mümkündür:
(doğrudan bir hedef üzerinde ayarlanan exec_properties
'den farklı olarak,
özellikleri reddedilir). Daha sonra hedefler,
varsayılan yürütme grubunu etkileyen yürütme platformunun exec_properties
parametresi
ve diğer ilgili yürütme grupları için de geçerli.
Örneğin, bir C++ testi çalıştırmak için kullanılabilir bir kaynak gerektiğini varsayalım. Ancak derleme ve bağlantı oluşturma için gerekli değildir. bu durum şu şekilde modellenebilir: şöyle olur:
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ınır.