Yürütme Grupları

Sorun bildirme Kaynağı görüntüleme Nightly · 7.4 . 7.3 · 7.2 · 7.1 · 7.0 · 6.5

Yürütme grupları, tek bir hedef içinde 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ümlemesini gerçekleştirir.

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ı uzak (Linux) bir çalışanda derleyip ardından yerel bir Mac çalışanda bağlama/kod imzalama işlemini gerçekleştirebilirsiniz.

İşlem gruplarını tanımlayabilmek, eylemleri belirtmek için bir proxy olarak işlem anımsatıcılarının kullanımını azaltmaya da yardımcı olur. Hatırlatıcıların benzersiz olması garanti edilmez ve yalnızca tek bir işleme referans verebilir. Bu, özellikle daha az talep eden görevlere aşırı kaynak ayırmadan belirli bir belleğe ve yoğun işleme işlemleri (ör. C++ derlemelerinde bağlantı oluşturma) için ek kaynak ayırmada yararlıdır.

Yürütme gruplarını tanımlama

Kural yazarları, kural tanımı sırasında bir dizi yürütme grubu belirleyebilir. Kural yazarı, her yürütme grubunda söz konusu 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 tüm 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ı cfg özellik parametresini ve config modülünü kullanarak bir yürütme grubu için geçiş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 sağlar.

Yerel kurallarda olduğu gibi, test yürütme grubu Starlark test kurallarında varsayılan olarak 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 bildirebilir. copy_from_rule değerini true olarak ayarlamak ve exec_compatible_with veya toolchains değerini de iletmek bir 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üzeyde ayarlanan kısıtlamaları ve yürütme özelliklerini içerir. 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ç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, işlem oluşturma yöntemlerinin exec_groupparam 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ı, 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 entegredir ve hedef yazarın, daha sonra yürütme mekanizmasına iletilen bir özellik dizesi dizini belirtmesine olanak tanır. Örneğin, hedef için bir özellik (ör. bellek) ayarlamak ve belirli işlemlere daha yüksek bir bellek tahsisi yapmak istiyorsanız yürütme grubuyla genişletilmiş 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, exec properties 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ı

Doğal kurallarla tanımlanan işlemler için aşağıdaki yürütme grupları kullanılabilir:

  • test: Test koşucusu işlemleri.
  • cpp_link: C++ bağlama işlemleri.

Yürütme özelliklerini ayarlamak için yürütme 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 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 hedeflerinde 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 doğrudan bir hedefte ayarlanan exec_properties'ten farklı olarak). 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 özelliğini 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 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ınanlardan önceliklidir.