मैक्रो बनाना

किसी समस्या की शिकायत करें स्रोत देखें

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

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

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