मान लें कि आपको अपने बिल्ड के हिस्से के तौर पर एक टूल चलाना होगा. उदाहरण के लिए, आपके किसी सोर्स फ़ाइल को जनरेट या प्रीप्रोसेस करने या बाइनरी को कंप्रेस करने की इच्छा हो सकती है. इसमें ट्यूटोरियल, तो आप एक ऐसा मैक्रो बनाने जा रहे हैं जो किसी इमेज का साइज़ बदलता है.
मैक्रो आसान कामों के लिए काम करते हैं. अगर आपको कुछ और करना है मुश्किल है. उदाहरण के लिए, किसी नई प्रोग्रामिंग भाषा के लिए सहायता जोड़ना. नियम बनाकर. नियमों से आपको ज़्यादा कंट्रोल और सुविधा मिलती है.
किसी इमेज का साइज़ बदलने वाला मैक्रो बनाने का सबसे आसान तरीका, 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"],
)
अगर आपको और इमेज का साइज़ बदलना है, तो कोड को फिर से इस्तेमाल किया जा सकता है. ऐसा करने के लिए,
किसी अलग .bzl
फ़ाइल में फ़ंक्शन परिभाषित करें और फ़ाइल को 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
)
कुछ टिप्पणियां:
नियम के मुताबिक, मैक्रो में भी नियमों की तरह ही
name
आर्ग्युमेंट होता है.मैक्रो के व्यवहार का दस्तावेज़ तैयार करने के लिए, docstring. जैसे, Python.
genrule
या किसी दूसरे नेटिव नियम को कॉल करने के लिए,native.
का इस्तेमाल करें.अतिरिक्त आर्ग्युमेंट को मौजूदा
genrule
पर फ़ॉरवर्ड करने के लिए,**kwargs
का इस्तेमाल करें (यह Python की तरह ही काम करता है). यह काम का है, ताकि उपयोगकर्ता स्टैंडर्ड एट्रिब्यूट का इस्तेमाल कर सके. जैसे,visibility
, याtags
.
अब 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"],
)