Yürütme Grupları

Sorun bildir 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 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ü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.