अहम जानकारी: यह ट्यूटोरियल, लेगसी मैक्रो के लिए है. अगर आपको सिर्फ़ Bazel 8 या उसके बाद के वर्शन के लिए सहायता चाहिए, तो हमारा सुझाव है कि इसके बजाय सिंबॉलिक मैक्रो का इस्तेमाल करें. इसके लिए, सिंबॉलिक मैक्रो बनाना लेख पढ़ें.
मान लें कि आपको अपने बिल्ड के हिस्से के तौर पर कोई टूल चलाना है. उदाहरण के लिए, हो सकता है कि आपको कोई सोर्स फ़ाइल जनरेट करनी हो या उसे प्री-प्रोसेस करना हो या किसी बाइनरी को कंप्रेस करना हो. इस ट्यूटोरियल में, आपको एक लेगसी मैक्रो बनाना है, जो किसी इमेज का साइज़ बदलता है.
मैक्रो, आसान टास्क के लिए सही होते हैं. अगर आपको कोई ज़्यादा मुश्किल काम करना है, जैसे कि कोई नई प्रोग्रामिंग भाषा जोड़ना, तो हमारा सुझाव है कि आप कोई नियम बनाएं. नियमों से आपको ज़्यादा कंट्रोल और फ़्लेक्सिबिलिटी मिलती है.
किसी इमेज का साइज़ बदलने वाला मैक्रो बनाने का सबसे आसान तरीका है कि आप 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],
# Note that the line below will fail if `src` is not a filename string
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"],
)
आखिर में, चेतावनी: मैक्रो यह मानकर चलता है कि src एक फ़ाइल नेम
स्ट्रिंग है. ऐसा न होने पर, outs = ["small_" + src] काम नहीं करेगा. इसलिए, src = "image.png"
काम करता है. हालांकि, अगर BUILD फ़ाइल में src =
"/versions/8.0.0//other/package:image.png" या src = select(...) का इस्तेमाल किया गया हो, तो क्या होगा?
आपको अपने मैक्रो के दस्तावेज़ में, इस तरह की मान्यताओं के बारे में बताना चाहिए. माफ़ करें, लेगसी मैक्रो, खास तौर पर बड़े मैक्रो, आसानी से खराब हो सकते हैं. इसकी वजह यह है कि आपके कोड में इस तरह की सभी मान्यताओं को नोटिस करना और उनके बारे में बताना मुश्किल हो सकता है. इसके अलावा, कुछ उपयोगकर्ता मैक्रो के दस्तावेज़ नहीं पढ़ते हैं. हमारा सुझाव है कि, अगर हो सके, तो इसके बजाय सिंबॉलिक मैक्रो का इस्तेमाल करें. इनमें एट्रिब्यूट टाइप की बिल्ट-इन जांच होती है.