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 grubunu 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 beyan edebilir. copy_from_rule
politikasının doğru değerine ayarlanması ve exec_compatible_with
veya toolchains
parametresini iletmesi hatadır.
Varsayılan yürütme grubundan devralan bir yürütme grubu kısıtlamaları, araç zincirlerini ve yürütme özelliklerini varsayılandan kopyalar. Buna, yalnızca kuralın kendisi tarafından belirtilenleri değil, hedef düzeyde ayarlanan kısıtlamalar ve yürütme özellikleri dahildir. Başka bir deyişle, aşağıda açıklandığı gibi:
# 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ılmış demo
hedefi için copied
yürütme grubu şunları 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. 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önetici özelliklerini ayarlamak için yönetici grupları oluşturma
Bazen belirli işlemlere farklı yönetici özellikleri vermek için bir yönetici grubu kullanmak istersiniz, ancak aslında 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 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.