Yürütme Grupları

Sorun bildir Kaynağı görüntüleyin Nightly · 7.4 .

Yürütme grupları, tek bir hedef içinde birden fazla yürütme platformuna olanak tanır. 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ı uzak (Linux) bir çalışanda derleyip ardından yerel bir Mac çalışanda bağlama/kod imzalama işlemini gerçekleştirebilirsiniz.

İşlem grupları tanımlayabilmek, işlemleri belirtmek için proxy olarak işlem anımsalları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 declare. 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 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 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ş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 exec_properties özelliğiyle entegre edilir ve hedef yazıcının, daha sonra yürütme makinesine iletilen özelliklerin dize dizesini 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, 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ğlama işlemleri.

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.