매크로 만들기

빌드의 일부로 도구를 실행해야 한다고 가정해 보겠습니다. 예를 들어 소스 파일을 생성 또는 사전 처리하거나 바이너리를 압축해야 할 수 있습니다. 이 가이드에서는 이미지 크기를 조절하는 매크로를 만듭니다.

매크로는 간단한 작업에 적합합니다. 예를 들어 새로운 프로그래밍 언어에 대한 지원을 추가하는 등 복잡한 작업을 하려면 규칙을 만드는 것이 좋습니다. 규칙을 사용하면 더 유연하게 제어할 수 있습니다.

이미지의 크기를 조절하는 매크로를 만드는 가장 쉬운 방법은 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],
    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"],
)