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