Eski bir makro oluşturma

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

ÖNEMLİ: Bu eğitim, eski makrolar içindir. Yalnızca Bazel 8 veya sonraki sürümleri desteklemeniz gerekiyorsa bunun yerine sembolik makrolar kullanmanızı öneririz. Sembolik Makro Oluşturma başlıklı makaleyi inceleyin.

Derleme işleminiz kapsamında bir araç çalıştırmanız gerektiğini varsayalım. Örneğin, bir kaynak dosya oluşturmak veya önceden işlemek ya da bir ikili dosyayı sıkıştırmak isteyebilirsiniz. Bu eğitimde, bir resmin boyutunu değiştiren eski bir makro oluşturacaksınız.

Makrolar basit görevler için uygundur. Daha karmaşık bir işlem yapmak istiyorsanız (ör. yeni bir programlama dili için destek eklemek) kural oluşturabilirsiniz. Kurallar size daha fazla kontrol ve esneklik sağlar.

Bir resmin boyutunu değiştiren bir makro oluşturmanın en kolay yolu genrule kullanmaktır:

genrule(
    name = "logo_miniature",
    srcs = ["logo.png"],
    outs = ["small_logo.png"],
    cmd = "convert $< -resize 100x100 $@",
)

cc_binary(
    name = "my_app",
    srcs = ["my_app.cc"],
    data = [":logo_miniature"],
)

Daha fazla resmi yeniden boyutlandırmanız gerekiyorsa kodu yeniden kullanabilirsiniz. Bunu yapmak için ayrı bir .bzl dosyasında bir işlev tanımlayın ve dosyayı miniature.bzl olarak adlandırın:

def miniature(name, src, size = "100x100", **kwargs):
    """Create a miniature of the src image.

    The generated file is prefixed with 'small_'.
    """
    native.genrule(
        name = name,
        srcs = [src],
        # Note that the line below will fail if `src` is not a filename string
        outs = ["small_" + src],
        cmd = "convert $< -resize " + size + " $@",
        **kwargs
    )

Birkaç açıklama:

  • Eski makrolar, kurallar gibi name bağımsız değişkenine sahiptir.

  • Eski bir makronun davranışını belgelemek için Python'da olduğu gibi docstring kullanın.

  • genrule veya başka bir yerel kuralı çağırmak için ön ek olarak native. kullanın.

  • Ek bağımsız değişkenleri temel genrule işlevine iletmek için **kwargs kullanın (Python'da olduğu gibi çalışır). Bu, kullanıcıların visibility veya tags gibi standart özellikleri kullanabilmesi için kullanışlıdır.

Ardından, BUILD dosyasında bulunan makroyu kullanın:

load("//path/to:miniature.bzl", "miniature")

miniature(
    name = "logo_miniature",
    src = "image.png",
)

cc_binary(
    name = "my_app",
    srcs = ["my_app.cc"],
    data = [":logo_miniature"],
)

Son olarak, uyarı notu: Makro, src değerinin bir dosya adı dizesi olduğunu varsayar (aksi takdirde outs = ["small_" + src] başarısız olur). src = "image.png" işe yarar. Ancak BUILD dosyası yerine src = "//other/package:image.png" veya hatta src = select(...) kullanılsa ne olur?

Bu tür varsayımların makronuzun dokümanlarında belirtildiğinden emin olmalısınız. Maalesef eski makrolar (özellikle büyük olanlar) genellikle hassastır. Bunun nedeni, kodunuzdaki bu tür tüm varsayımları fark edip belgelemenin zor olması ve elbette makronun bazı kullanıcılarının dokümanları okumamasıdır. Mümkünse bunun yerine, özellik türleriyle ilgili yerleşik kontrollere sahip sembolik makrolar kullanmanızı öneririz.