빌드의 일부로 도구를 실행해야 한다고 가정해 보겠습니다. 예를 들어 소스 파일을 생성 또는 전처리하거나 바이너리를 압축하려고 할 수 있습니다. 이 이미지 크기를 조절하는 매크로를 만들어 보겠습니다.
매크로는 간단한 작업에 적합합니다. 추가 작업을 하려면 예를 들어 새로운 프로그래밍 언어에 대한 지원을 추가하고, 규칙 만들기 규칙을 사용하면 더 세밀하고 유연하게 관리할 수 있습니다.
이미지 크기를 조절하는 매크로를 만드는 가장 쉬운 방법은 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
인수를 갖습니다.매크로의 동작을 기록하려면 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"],
)