기존 매크로 만들기

문제 신고 소스 보기 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과 동일하게 작동). 이는 사용자가 visibility 또는 tags와 같은 표준 속성을 사용할 수 있도록 하는 데 유용합니다.

이제 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(...)을 사용하는 경우 어떻게 될까요?

매크로 문서에서 이러한 가정을 선언해야 합니다. 안타깝게도 기존 매크로, 특히 대규모 매크로는 코드에서 이러한 모든 가정을 발견하고 문서화하기가 어려울 수 있으므로 취약한 경향이 있습니다. 물론 일부 매크로 사용자는 문서를 읽지 않습니다. 가능하면 속성 유형에 대한 검사가 내장된 기호 매크로를 대신 사용하는 것이 좋습니다.