Yürütme Grupları

Sorun bildirin Kaynağı göster

Yürütme grupları, tek bir hedef içinde birden çok yürütme platformuna izin verir. Her yürütme grubu kendi araç zinciri bağımlılıklarına sahiptir ve kendi araç zinciri çözünürlüğünü 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ı uzaktan (linux) çalışanda derleme ve ardından yerel bir mac çalışanı üzerinde bağlantı/kod imzalama gibi işlemleri yapabilir.

İşlem gruplarını tanımlayabilmek, eylemleri belirtmek için bir aracı 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 tanımı sırasında, kural yazarları bir dizi yürütme grubu bildirebilir. Kural yazarı, her yürütme grubunda o yürütme grubu için bir yürütme platformu seçmek üzere gereken her şeyi, yani exec_compatible_with üzerinden gerçekleşen 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, cfg özellik parametresini ve config modülünü kullanarak araç bağımlılıklarının bir yönetici grubu için geçişi de belirtebildiğ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 grubu 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 de bildirebilir. copy_from_rule değerinin doğru değerine ayarlanması ve ayrıca exec_compatible_with veya toolchains değerinin iletilmesi hatadır.

Varsayılan yürütme grubundan devralan bir yürütme grubu varsayılandaki kısıtlamaları, araç zincirlerini ve yürütme özelliklerini kopyalar. Buna yalnızca kuralın kendisi tarafından belirtilenler değil, hedef düzeyde ayarlanan kısıtlamalar ve yürütme özellikleri dahildir. Başka bir deyişle, aşağıdaki 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ın tümünü içerecektir: - //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, 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 entegre edilir ve hedef yazıcının, daha sonra yürütme makinesine iletilen özelliklerin dize listesini 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 anahtar içeren 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ı

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önetici özelliklerini ayarlamak için yönetici grupları oluşturma

Bazen belirli eylemlere farklı exec özellikleri vermek için bir yönetici grubu kullanmak istiyorsunuz, ancak kuraldan farklı araç zincirleri veya kısıtlamalar istemiyorsunuz. Bu durumlarda copy_from_rule parametresini kullanarak exec 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 (bilinmeyen yürütme gruplarının özelliklerinin reddedildiği bir hedefte doğrudan ayarlanan exec_properties'ın aksine). Daha sonra hedefler, varsayılan yürütme grubunu ve diğer ilgili yürütme gruplarını etkileyen yürütme platformunun exec_properties ayarını devralır.

Örneğin, bir C++ testi çalıştırmak için bazı kaynakların kullanılabilir olması gerektiğini ancak derleme ve bağlantı oluşturma için gerekli olmadığını varsayalım. Bu, 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.