सिंबल मैक्रो बनाना

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

अहम जानकारी: यह ट्यूटोरियल, सिंबल मैक्रो के लिए है. यह Bazel 8 में शुरू किया गया नया मैक्रो सिस्टम है. अगर आपको Bazel के पुराने वर्शन के साथ काम करना है, तो इसके बजाय लेगसी मैक्रो लिखें. लेगसी मैक्रो बनाना लेख पढ़ें.

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

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

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

# Implementation function
def _miniature_impl(name, visibility, src, size, **kwargs):
    native.genrule(
        name = name,
        visibility = visibility,
        srcs = [src],
        outs = [name + "_small_" + src.name],
        cmd = "convert $< -resize " + size + " $@",
        **kwargs,
    )

# Macro declaration
miniature = macro(
    doc = """Create a miniature of the src image.

    The generated file name will be prefixed with `name + "_small_"`.
    """,
    implementation = _miniature_impl,
    # Inherit most of genrule's attributes (such as tags and testonly)
    inherit_attrs = native.genrule,
    attrs = {
        "src": attr.label(
            doc = "Image file",
            allow_single_file = True,
            # Non-configurable because our genrule's output filename is
            # suffixed with src's name. (We want to suffix the output file with
            # srcs's name because some tools that operate on image files expect
            # the files to have the right file extension.)
            configurable = False,
        ),
        "size": attr.string(
            doc = "Output size in WxH format",
            default = "100x100",
        ),
        # Do not allow callers of miniature() to set srcs, cmd, or outs -
        # _miniature_impl overrides their values when calling native.genrule()
        "srcs": None,
        "cmd": None,
        "outs": None,
    },
)

कुछ बातें:

  • सिंबल वाले मैक्रो लागू करने वाले फ़ंक्शन में name और visibility पैरामीटर होने चाहिए. इनका इस्तेमाल, मैक्रो के मुख्य टारगेट के लिए किया जाना चाहिए.

  • किसी सिंबल मैक्रो के व्यवहार को दस्तावेज़ में शामिल करने के लिए, macro() और उसके एट्रिब्यूट के लिए doc पैरामीटर का इस्तेमाल करें.

  • genrule या किसी अन्य नेटिव नियम को कॉल करने के लिए, native. का इस्तेमाल करें.

  • इनहेरिट किए गए अतिरिक्त आर्ग्युमेंट को genrule फ़ंक्शन में भेजने के लिए, **kwargs का इस्तेमाल करें. यह ठीक वैसे ही काम करता है जैसे Python में होता है. यह सुविधा इसलिए ज़रूरी है, ताकि उपयोगकर्ता tags या testonly जैसे स्टैंडर्ड एट्रिब्यूट सेट कर सके.

अब, 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"],
)