Catat Tanggalnya: BazelCon 2023 akan diadakan pada 24-25 Oktober di Google Munich! Pelajari lebih lanjut

Membuat Makro

Laporkan masalah Lihat sumber

Bayangkan Anda perlu menjalankan alat sebagai bagian dari build. Misalnya, Anda mungkin ingin membuat atau memproses file sumber lebih awal, atau mengompresi biner. Dalam tutorial ini, Anda akan membuat makro yang mengubah ukuran gambar.

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

Cara termudah untuk membuat makro yang mengubah ukuran gambar adalah dengan 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 gambar lainnya, sebaiknya gunakan kembali kode tersebut. Untuk melakukannya, tentukan fungsi dalam file .bzl yang 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"],
)