मैक्रो बनाना

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

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

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