मैक्रो बनाना

मान लें कि आपको अपने बिल्ड के हिस्से के तौर पर किसी टूल की ज़रूरत है. उदाहरण के लिए, हो सकता है कि आप स्रोत फ़ाइल जनरेट या पहले से प्रोसेस करना या बाइनरी को कंप्रेस करना चाहें. इस ट्यूटोरियल में, आप एक मैक्रो बना रहे हैं, जो इमेज का आकार बदलता है.

मैक्रोज़ आसान कामों के लिए सही हैं. अगर आप ज़्यादा मुश्किल काम करना चाहते हैं, जैसे कि किसी नई प्रोग्रामिंग भाषा के लिए मदद जोड़ना, तो नियम बनाएं. नियमों से आपको ज़्यादा कंट्रोल और विकल्प मिलता है.

इमेज का आकार बदलने वाला मैक्रो बनाने का सबसे आसान तरीका 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"],
)