Sembolik makro oluşturma

Sorun bildir Kaynağı görüntüle Nightly · 8.4 · 8.3 · 8.2 · 8.1 · 8.0 · 7.6

ÖNEMLİ: Bu eğitim, Bazel 8'de kullanıma sunulan yeni makro sistemi olan sembolik makrolar içindir. Eski Bazel sürümlerini desteklemeniz gerekiyorsa bunun yerine bir eski makro yazmanız gerekir. Eski Makro Oluşturma başlıklı makaleyi inceleyin.

Derlemenizin bir parçası olarak bir aracı çalıştırmanız gerektiğini düşünün. Örneğin, bir kaynak dosyası oluşturmak veya önceden işlemek ya da bir ikili dosyayı sıkıştırmak isteyebilirsiniz. Bu eğitimde, bir görüntüyü yeniden boyutlandıran sembolik bir makro oluşturacaksınız.

Makrolar basit görevler için uygundur. Daha karmaşık işlemler yapmak istiyorsanız (ör. yeni bir programlama dili için destek eklemek) kural oluşturmayı düşünebilirsiniz. Kurallar, daha fazla kontrol ve esneklik sağlar.

Bir görüntüyü yeniden boyutlandıran makro oluşturmanın en kolay yolu genrule kullanmaktır:

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

Daha fazla resmi yeniden boyutlandırmanız gerekiyorsa kodu yeniden kullanabilirsiniz. Bunu yapmak için ayrı bir .bzl dosyasında uygulama işlevi ve makro bildirimi tanımlayın ve dosyayı miniature.bzl olarak adlandırın:

# 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,
    },
)

Birkaç not:

  • Sembolik makro uygulama işlevleri name ve visibility parametrelerine sahip olmalıdır. Makronun ana hedefi için kullanılmalıdır.

  • Sembolik bir makronun davranışını belgelemek için doc ve özellikleriyle ilgili macro() parametrelerini kullanın.

  • genrule veya başka bir yerel kuralı çağırmak için native. kullanın.

  • Ek devralınan bağımsız değişkenleri temel **kwargs'a iletmek için **kwargs kullanın (Python'daki gibi çalışır).genrule Bu özellik, kullanıcıların tags veya testonly gibi standart özellikleri ayarlayabilmesi için kullanışlıdır.

Şimdi BUILD dosyasındaki makroyu kullanın:

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