Eski bir makro oluşturma

Sorun bildir Kaynağı görüntüle Nightly · 8.3 · 8.2 · 8.1 · 8.0 · 7.6

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

Derlemenizin bir parçası olarak bir araç çalıştırmanız gerektiğini düşünün. Örneğin, bir kaynak dosyası oluşturmak veya önceden işlemek ya da bir ikili dosyayı sıkıştırmak isteyebilirsiniz. Bu eğitimde, bir görüntüyü yeniden boyutlandıran eski bir makro oluşturacaksınız.

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

Bir görüntüyü yeniden boyutlandıran 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ç not:

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

  • Eski bir makronun davranışını belgelemek için Python'daki gibi docstring kullanın.

  • genrule veya başka bir yerel kuralı çağırmak için native. ile önek ekleyin.

  • Ek bağımsız değişkenleri temel alınan genrule işlevine iletmek için **kwargs kullanın (Python'daki gibi çalışır). Bu özellik, kullanıcıların visibility veya tags gibi standart özellikleri kullanabilmesi açısından faydalıdır.

Şimdi BUILD dosyasındaki 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, bir uyarı notu: Makro, src öğesinin bir dosya adı dizesi olduğunu varsayar (aksi takdirde outs = ["small_" + src] başarısız olur). Bu nedenle src = "image.png" çalışır. Ancak BUILD dosyası bunun yerine src = "/versions/8.2.0//other/package:image.png" veya hatta src = select(...) kullanırsa ne olur?

Bu tür varsayımları makronuzun belgelerinde belirtmeniz gerekir. Maalesef eski makrolar, özellikle büyük olanlar, kodunuzdaki tüm bu varsayımları fark etmek ve belgelemek zor olabileceğinden genellikle hassas olur. Ayrıca, makronun bazı kullanıcıları belgeleri okumaz. Mümkünse bunun yerine, özellik türleriyle ilgili yerleşik kontrollere sahip olan sembolik makroları kullanmanızı öneririz.