Yürütme Grupları

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.

Arka plan

Yürütme grupları, kural yazarının her biri farklı bir yürütme platformuna sahip olabilecek bir dizi işlem tanımlamasına olanak 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 vekil olarak 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 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 belirtebilir. copy_from_rule değerini true olarak ayarlamak ve exec_compatible_with veya toolchains değerini de iletmek 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. Bu, yalnızca kuralın kendisi tarafından belirtilenleri değil, hedef düzeyinde ayarlanan kısıtlamaları ve yürütme özelliklerini de içerir. Başka bir deyişle, aşağıdakiler göz önünde bulundurulduğunda:

# 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ılan hedef demo için copied yürütme grubu aşağıdakilerin tümünü 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. Bu işlemi, işlem oluşturan yöntemlerin exec_group param parametresini (ö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ı, 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",
     # ...
  )

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.

Yerel kurallar için yürütme grupları

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

Bazen, belirli işlemlere farklı yürütme özellikleri vermek için bir yürütme grubu kullanmak istersiniz ancak 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 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, bir C++ testinin çalıştırılması için bazı kaynakların kullanılabilir olması gerektiğini ancak derleme ve bağlama için bunun gerekli olmadığını 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.