Membuat Makro

Laporkan masalah Lihat sumber Per Malam · 7,2 · 7,1 · 7,0 · 6,5 · 6,4

Bayangkan Anda perlu menjalankan alat sebagai bagian dari build Anda. Sebagai contoh, Anda mungkin ingin membuat atau melakukan pra-pemrosesan file sumber, atau mengompresi biner. Di sini ini, Anda akan membuat makro yang mengubah ukuran gambar.

Makro cocok untuk tugas sederhana. Jika Anda ingin melakukan hal lain rumit, misalnya menambahkan dukungan untuk bahasa pemrograman baru, pertimbangkan membuat aturan. Aturan memberi Anda lebih banyak kontrol dan fleksibilitas.

Cara termudah untuk membuat makro yang mengubah ukuran gambar adalah menggunakan genrule:

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

Jika perlu mengubah ukuran lebih banyak gambar, Anda dapat menggunakan kembali kode tersebut. Untuk melakukannya, tentukan fungsi dalam file .bzl terpisah, dan panggil file miniature.bzl:

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
  )

Beberapa komentar:

  • Berdasarkan konvensi, makro memiliki argumen name, seperti aturan.

  • Untuk mendokumentasikan perilaku makro, gunakan docstring seperti di Python.

  • Untuk memanggil genrule, atau aturan native lainnya, gunakan native..

  • Gunakan **kwargs untuk meneruskan argumen tambahan ke genrule yang mendasarinya (cara kerjanya sama seperti di Python). Hal ini berguna sehingga pengguna dapat menggunakan atribut standar seperti visibility, atau tags.

Sekarang, gunakan makro dari file BUILD:

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