BazelCon 2022 akan hadir pada 16-17 November ke New York dan online.
Daftar sekarang.

Membuat Makro

Tetap teratur dengan koleksi Simpan dan kategorikan konten berdasarkan preferensi Anda.

Bayangkan Anda perlu menjalankan alat sebagai bagian dari versi. Misalnya, Anda mungkin ingin membuat atau melakukan pra-proses file sumber, atau mengompresi biner. Dalam tutorial ini, Anda akan membuat makro yang mengubah ukuran gambar.

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

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 Anda perlu mengubah ukuran gambar lainnya, sebaiknya gunakan kembali kode tersebut. Untuk melakukannya, tentukan fungsi dalam file .bzl terpisah, lalu 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 keterangan:

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

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

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

  • Gunakan **kwargs untuk meneruskan argumen tambahan ke genrule yang mendasarinya (fungsinya 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"],
)