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