Bayangkan Anda perlu menjalankan alat sebagai bagian dari build. Misalnya, Anda mungkin ingin membuat atau memproses file sumber sebelumnya, 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, sebaiknya buat aturan. Aturan memberi Anda lebih banyak kontrol dan fleksibilitas.
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 lebih banyak gambar, sebaiknya gunakan 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 catatan:
Secara umum, makro memiliki argumen
name
, seperti aturan.Untuk mendokumentasikan perilaku makro, gunakan docstring seperti di Python.
Untuk memanggil
genrule
, atau aturan native lainnya, gunakannative.
.Gunakan
**kwargs
untuk meneruskan argumen tambahan kegenrule
yang mendasarinya (berfungsi seperti di Python). Hal ini berguna, sehingga pengguna dapat menggunakan atribut standar sepertivisibility
, atautags
.
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"],
)