シンボリック マクロを作成する

問題を報告する ソースを表示 ナイトリー · 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. を使用します。

  • **kwargs を使用して、追加の継承された引数を基盤となる genrule に転送します(これは Python の場合と同じように機能します)。これは、ユーザーが tagstestonly などの標準属性を設定できるようにするのに役立ちます。

次に、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"],
)