従来のマクロを作成する

問題を報告する ソースを表示 Nightly · 8.0 . 7.4 . 7.3 · 7.2 · 7.1 · 7.0 · 6.5

重要: このチュートリアルは、以前のマクロを対象としています。Bazel 8 以降のみをサポートする必要がある場合は、代わりにシンボリック マクロを使用することをおすすめします。シンボリック マクロの作成をご覧ください。

ビルドの一部としてツールを実行する必要がある場合を考えてみましょう。たとえば、ソースファイルの生成やプリプロセッシング、バイナリの圧縮を行うことができます。このチュートリアルでは、画像のサイズを変更する従来のマクロを作成します。

マクロは単純なタスクに適しています。新しいプログラミング言語のサポートを追加するなど、より複雑な処理を行う場合は、ルールの作成を検討してください。ルールを使用すると、より細かく柔軟に管理できます。

画像のサイズを変更するマクロを作成する最も簡単な方法は、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],
        # Note that the line below will fail if `src` is not a filename string
        outs = ["small_" + src],
        cmd = "convert $< -resize " + size + " $@",
        **kwargs
    )

注意点:

  • 従来のマクロには、ルールと同様に name 引数があります。

  • 以前のマクロの動作を記述するには、Python のように docstring を使用します。

  • genrule や他のネイティブ ルールを呼び出すには、接頭辞に native. を付けます。

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

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

最後に、警告: このマクロは、src がファイル名の文字列であることを前提としています(そうでない場合、outs = ["small_" + src] は失敗します)。src = "image.png" は機能しますが、BUILD ファイルで src = "/versions/8.0.0//other/package:image.png"src = select(...) が使用された場合はどうなりますか?

このような前提条件は、マクロのドキュメントで宣言する必要があります。残念ながら、レガシー マクロ(特に大規模なマクロ)は脆弱になりがちです。このような前提条件をすべてコードで認識して文書化するのは難しいためです。もちろん、マクロのユーザーの中には、ドキュメントを読まない人もいます。可能であれば、代わりにシンボリック マクロを使用することをおすすめします。シンボリック マクロには、属性タイプのチェックが組み込まれています。