Yürütme Grupları

Sorun bildir Kaynağı göster

Yürütme grupları, tek bir hedefte 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ünürlüğünü yürütür.

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ı uzaktaki (linux) çalışanda derleyip ardından yerel mac çalışanında bağlantı oluşturabilir/kod imzalamayı kullanabilirsiniz.

İşlem grupları tanımlayabilmek, işlemleri belirtmenin bir göstergesi olarak işlem anımsatıcılarının kullanımını hafifletmeye de yardımcı olur. Anımsatıcıların benzersiz olacağı garanti edilmez ve yalnızca tek bir işleme referans verebilirler. Bu, özellikle belirli belleğe ek kaynak ayırmada ve daha az zorlu görevlere aşırı ayırmadan C++ derlemelerinde bağlantı oluşturma gibi yoğun işlemleri işlemede yardımcı olur.

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

Kural tanımı sırasında, kural yazarları bir dizi yürütme grubu bildirebilir. Her yürütme grubunda, kural yazarı, söz konusu yürütme grubu için yürütme platformu seçmek üzere gereken her şeyi, exec_compatible_with aracılığıyla tüm kısıtlamaları ve toolchain aracılığıyla araç zinciri türlerini belirleyebilir.

# 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 parametresini ve config modülünü kullanarak bir exec grubu için geçişi de belirtebildiğini görebilirsiniz. Modül, bağımlılığın oluşturulması gereken yönetici grubunun adı olan tek bir dize parametresi alan exec işlevini gösterir.

Yerel kurallarda olduğu gibi, test yürütme grubu 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, exec_group parametresi olan işlem oluşturma yöntemlerini (ö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şiminize benzer şekilde, 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 mevcut olan exec_properties özelliğiyle entegredir ve hedef yazarın daha sonra yürütme makinesine iletilen özellikleri içeren bir dize dizesi belirtmesine olanak tanır. Örneğin, hedef için bellek gibi bir özellik ayarlamak ve belirli işlemlere daha yüksek bellek tahsisi vermek isterseniz yürütme grubu ile artırılmış bir anahtara sahip 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" ile yapılan tüm işlemler, yürütme ö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 kurallar tarafından tanımlanan işlemler için kullanılabilir:

  • test: Test çalıştırıcı işlemleri.
  • cpp_link: C++ bağlantı işlemleri.

Yürütme grupları ve platform yürütme özellikleri

Platform hedeflerindeki rastgele yürütme grupları için exec_properties tanımlamak mümkündür (exec_properties doğrudan hedef üzerinde ayarlanan, bilinmeyen yürütme gruplarına ait özelliklerin reddedildiğinde farklı). Daha sonra hedefler, varsayılan yürütme grubunu ve ilgili diğer yürütme gruplarını etkileyen yürütme platformunun exec_properties değerini devralır.

Örneğin, C++ testi çalıştırmak için bazı kaynakların kullanılabilir olması gerektiğini ancak derleme ve bağlantı oluşturmak için gerekli olmadığını varsayalım. Bu, aşağıdaki şekilde 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"],
)

Doğrudan hedeflerde tanımlanan exec_properties, yürütme platformundan devralınan öğelere göre önceliklidir.