Makro Oluşturma

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

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 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],
    outs = ["small_" + src],
    cmd = "convert $< -resize " + size + " $@",
    **kwargs
  )

Birkaç açıklama:

  • Kurallara benzer şekilde, makrolar da name bağımsız değişkenine sahiptir.

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

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

  • Ek bağımsız değişkenleri temel genrule işlevine iletmek için **kwargs kullanın (tıpkı 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"],
)