मैक्रो बनाना

समस्या की शिकायत करें सोर्स देखें Nightly · 8.4 · 8.3 · 8.2 · 8.1 · 8.0 · 7.6

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

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

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

  • **kwargs का इस्तेमाल करके, अतिरिक्त आर्ग्युमेंट को genrule में फ़ॉरवर्ड करें (यह 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"],
)