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