Tạo Macro

Báo cáo sự cố Xem nguồn

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

Macro thích hợp cho các tác vụ đơn giản. Nếu bạn muốn thực hiện bất kỳ thao tác phức tạp nào, 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 một quy tắc. Quy tắc cho phép bạn kiểm soát nhiều hơn và 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 thêm hình ảnh, bạn nên sử dụng lại mã. Để làm việc đó, hãy xác định một hàm trong tệp .bzl riêng và 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
  )

Hãy lưu ý một vài điểm sau đây:

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

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

  • Để gọi genrule hoặc 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 tới genrule cơ bản (nó 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"],
)