Makro Oluşturma

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

Makrolar, basit görevler için uygundur. Daha karmaşık bir işlem yapmak istiyorsanız (örneğin, yeni bir programlama dili için destek eklemek istiyorsanız) bir kural oluşturabilirsiniz. Kurallar size 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 gerekirse kodu yeniden kullanmak isteyebilirsiniz. Bunu yapmak için ayrı bir .bzl dosyasında bir işlev tanımlayıp miniature.bzl dosyasını çağı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
  )

Bazı açıklamalar:

  • Kural olarak, 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.

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

  • Ekstra bağımsız değişkenleri temel genrule öğesine yönlendirmek için **kwargs kullanın (Python'da olduğu gibi çalışır). Bu, kullanıcının visibility veya tags gibi standart özellikleri kullanabilmesi için yararlı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"],
)