Makro Oluşturma

Sorun bildirin Kaynağı göster

Derlemenizin bir parçası olarak bir araç çalıştırmanız gerektiğini düşünün. Örneğin, bir kaynak dosya oluşturabilir veya önceden işleyebilir ya da ikili programı sıkıştırabilirsiniz. Bu eğiticide, resmi yeniden boyutlandıran bir makro oluşturacaksınız.

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

Bir resmi yeniden boyutlandıran 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. Bunun 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ç not:

  • Kurallara göre, makrolar tıpkı kurallar gibi 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 kuralını veya başka bir yerel kuralı çağırmak için native. işlevini kullanın.

  • Fazladan bağımsız değişkenleri temel genrule öğesine yönlendirmek için **kwargs öğesini kullanın (Python'da olduğu gibi çalışır). Bu, bir kullanıcının visibility veya tags gibi standart özellikleri kullanabilmesi açısından yararlıdır.

Şimdi de 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"],
)