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, gunakannative.
.Gunakan
**kwargs
untuk meneruskan argumen tambahan kegenrule
yang mendasarinya (cara kerjanya sama 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"],
)