従来のマクロを作成する

問題を報告 ソースを表示 Nightly · 8.3 · 8.2 · 8.1 · 8.0 · 7.6

重要: このチュートリアルは、以前のマクロを対象としています。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 = "//other/package:image.png"src = select(...) が使用された場合はどうなるでしょうか?

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