Yürütme Grupları

. Sorun bildirin Kaynağı göster Gece · 7,3 · 7,2 · 7,1 · 7,0 · 6,5

Yürütme grupları, tek bir hedef içinde birden çok yürütme platformuna izin verir. Her yürütme grubunun kendi araç zinciri bağımlılıkları vardır. kendi araç zinciri çözümünü gerçekleştirir.

Arka plan

Yürütme grupları, kural yazarının her biri bir işlem grubuna sahip olan farklı bir yürütme platformu kullanabilirsiniz. Birden fazla yürütme platformu, farklı şekilde yürütülmesine neden olan işlemler (ör. uzaktan kumandada bir iOS uygulaması derleme) (linux) çalışanı ve yerel bir mac işçisinde bağlantı/kod imzalama işlemi yapılır.

İşlem gruplarını tanımlayabilmek, aynı zamanda işlem kullanımını kolaylaştırmaya da anımsatıcılar (hatırlatıcılar, eylemlerin belirtilmesi için) Hafıza güçlendiricilerin benzersizdir ve yalnızca tek bir işleme referans verebilir. Bu, özellikle de Belirli belleğe ve yoğun işlem gerektiren işlemlere ek kaynak ayırma daha az çaba gerektiren görevlere fazla ayırmadan C++ derlemelerine bağlama gibi.

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

Kural tanımı sırasında, kural yazarları belirtmek bir dizi yürütme grubudur. Her yürütme grubunda, kural yazarı şunları belirtebilir: bir yürütme platformu seçmek için gereken her şeyi yani exec_compatible_with ve araç zinciri türleri aracılığıyla toolchain.

# 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 da bir yönetici grubu için cfg özellik parametresi ve config modülünü kullanabilirsiniz. Modül, tek bir dize alan bir exec işlevi sunar. Bu parametre, bağımlılığın olması gereken yönetici grubunun adıdır. geliştirmenizi sağlar.

Yerel kurallarda olduğu gibi test yürütme grubu Starlark'ta varsayılan olarak mevcuttur test kuralları.

Yürütme grubu devralma

Kendi kısıtlamalarını ve araç zincirlerini tanımlamanın yanı sıra yeni bir yürütme grubu, kuralın varsayılan yürütmesini devralmak istediğini belirtebilir grubunu copy_from_rule = True parametresini ileterek. Bu, yanlış copy_from_rule değerini true (doğru) olarak ayarlayın ve ayrıca exec_compatible_with veya toolchains.

Varsayılan yürütme grubu kopyalarından devralan bir yürütme grubu kopyalanıyor kısıtlamaları, araç zincirlerini ve yürütme özelliklerini varsayılan olarak ayarlar. Bu Yalnızca değil, hedef düzeyde ayarlanan kısıtlamaları ve yürütme özelliklerini içerir tarafından belirlenen anahtar kelimeler. 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 tüm öğeleri içerecek / - //fool_tools:toolchain_type - @platforms//os:linux - :local_constraint

Yürütme gruplarına erişme

Kural uygulamasında, işlemlerin yürütme platformuna gidin. Bunu, exec_group aracını kullanarak yapabilirsiniz: özellikle ctx.actions.run ve ctx.actions.run_shell.

# foo.bzl
def _impl(ctx):
  ctx.actions.run(
     inputs = [ctx.attr._some_tool, ctx.srcs[0]]
     exec_group = "compile",
     # ...
  )

Kural yazarları, çözülmüş araç zincirlerine de erişebilir sizinkine benzer şekilde iki farklı yürütme grubu bir hedefin çözümlenmiş araç zincirine 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ı, exec_properties özelliğini kullanabilir ve hedef yazarın bir daha sonra yürütme makinesine iletilen özelliklerin dize yönergesi. Örneğin, Mesela, hedef için bellek gibi bir özellik ayarlamak ve bu işlem için daha yüksek bellek ayırması kullanıyorsanız exec_properties ve yürütme grubu artırılmış anahtara sahip bir giriştir. Ö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önetici özelliklerini görür sözlüğü {"mem": "16g"} olarak belirleyin. Gördüğünüz gibi, uygulama grubu düzeyinde 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 işlemlere farklı bir yönetici vermek için bir yönetici grubu kullanmak istemeyen bir modeldir, ancak gerçekte kuralı. Bu durumlar için copy_from_rule kullanarak yönetici grupları oluşturabilirsiniz. parametresi:

# 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

Şuralarda rastgele yürütme grupları için exec_properties tanımlamak mümkündür: (doğrudan bir hedef üzerinde ayarlanan exec_properties'den farklı olarak, özellikleri reddedilir). Daha sonra hedefler, varsayılan yürütme grubunu etkileyen yürütme platformunun exec_properties parametresi ve diğer ilgili yürütme grupları için de geçerli.

Örneğin, bir C++ testi çalıştırmak için kullanılabilir bir kaynak gerektiğini varsayalım. Ancak derleme ve bağlantı oluşturma için gerekli değildir. bu durum şu şekilde modellenebilir: şöyle olur:

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ınır.