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

अहम जानकारी: यह ट्यूटोरियल, सिंबॉलिक मैक्रो के लिए है. यह 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"],
)