Tạo Macro

Báo cáo vấn đề Xem nguồn Hằng đêm · 7.3 · 7.2 · 7.1 · 7 · 6,5

Hãy tưởng tượng rằng bạn cần chạy một công cụ trong bản dựng. Ví dụ: bạn nên tạo hoặc xử lý trước tệp nguồn hoặc nén tệp nhị phân. Trong phần này bạn sẽ tạo macro đổi kích thước hình ảnh.

Macro phù hợp cho các tác vụ đơn giản. Nếu bạn muốn làm gì thêm phức tạp, chẳng hạn như thêm hỗ trợ cho một ngôn ngữ lập trình mới, hãy cân nhắc tạo quy tắc. Quy tắc mang đến cho bạn nhiều quyền kiểm soát và sự linh hoạt hơn.

Cách dễ nhất để tạo macro đổi kích thước hình ảnh là sử dụng 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"],
)

Nếu cần đổi kích thước các hình ảnh khác, bạn có thể muốn sử dụng lại mã. Để làm được điều đó, xác định một hàm trong một tệp .bzl riêng biệt rồi gọi tệp 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
  )

Một vài lưu ý:

  • Theo quy ước, macro có đối số name, giống như quy tắc.

  • Để ghi lại hành vi của macro, hãy sử dụng docstring tương tự như trong Python.

  • Để gọi genrule hay bất kỳ quy tắc gốc nào khác, hãy sử dụng native..

  • Sử dụng **kwargs để chuyển tiếp các đối số bổ sung đến genrule cơ bản (công cụ này hoạt động giống như trong Python). Điều này hữu ích để người dùng có thể sử dụng các thuộc tính chuẩn như visibility, hoặc tags.

Bây giờ, hãy sử dụng macro từ tệp 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"],
)