Makro Oluşturma

Sorun bildirin Kaynağı göster

Derlemenizin parçası olarak bir araç çalıştırmanız gerektiğini hayal edin. Örneğin, bir kaynak dosya oluşturmak veya ön işlemesini yapmak ya da bir ikili programı sıkıştırmak isteyebilirsiniz. Bu eğitimde, bir resmi yeniden boyutlandıran bir makro oluşturacaksınız.

Makrolar basit görevler için uygundur. Daha karmaşık bir şey yapmak (ör. 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 kullanabilirsiniz. Bunu yapmak için ayrı bir .bzl dosyasında bir işlev tanımlayın ve 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
  )

Birkaç hatırlatma:

  • Kural olarak, makrolarda da kurallar gibi bir name bağımsız değişkeni vardır.

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

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

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