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.
Mevcut durum
CppLink
gibi belirli yerel olarak tanımlanmış işlemler için yürütme grupları, işlem başına, hedef başına yürütme koşullarını ayarlamak üzere exec_properties
içinde kullanılabilir. Daha fazla bilgi için Varsayılan yürütme grupları bölümüne bakın.
Arka plan
Yürütme grupları, kural yazarına her biri farklı bir yürütme platformuna sahip olabilecek bir dizi işlem tanımlama olanağı 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 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 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şturma yöntemlerinin exec_group
<0x0x0A>param parametresini (özellikle ctx.actions.run
ve<0x0x0A>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",
# ...
)
Varsayılan yürütme grupları
Aşağıdaki yürütme grupları önceden tanımlanmıştır:
test
: Test çalıştırıcı işlemleri (daha fazla bilgi için Test Ansiklopedisi'nin yürütme platformu bölümüne bakın).cpp_link
: C++ bağlama işlemleri.
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.
Platform kısıtlamalarını ayarlamak için yürütme gruplarını kullanma
Yürütme grupları, her kuralda bulunan ve hedef yazıcının, hedefin işlemleri için seçilen yürütme platformları tarafından karşılanması gereken ek kısıtlamaları belirtmesine olanak tanıyan exec_compatible_with
ve exec_group_compatible_with
özellikleriyle de entegre edilmiştir.
Örneğin, my_test
kuralı, varsayılan ve test
yürütme grubuna ek olarak link
yürütme grubunu tanımlarsa bu özelliklerin aşağıdaki kullanımı, yüksek sayıda CPU'ya sahip bir platformda varsayılan yürütme grubundaki işlemleri, Linux'taki test işlemini ve varsayılan yürütme platformundaki bağlantı işlemini çalıştırır:
# BUILD
constraint_setting(name = "cpu")
constraint_value(name = "high_cpu", constraint_setting = ":cpu")
platform(
name = "high_cpu_platform",
constraint_values = [":high_cpu"],
exec_properties = {
"cpu": "256",
},
)
my_test(
name = "my_test",
exec_compatible_with = ["//constraints:high_cpu"],
exec_group_compatible_with = {
"test": ["@platforms//os:linux"],
},
...
)
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 çalıştırıcı işlemleri.cpp_link
: C++ bağlama işlemleri.
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, yürütme platformunda test çalıştırmak için bazı kaynakların kullanılabilir olması gerektiğini ancak derleme ve bağlama için gerekmediğini 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.