मैक्रो बनाना

किसी समस्या की शिकायत करें सोर्स देखें रात · 7.3 · 7.2 · 7.1 · 7.0 · 6.5

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

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

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