إنشاء ماكرو

تخيّل أنك بحاجة إلى تشغيل أداة كجزء من عملية الإنشاء. على سبيل المثال، قد تحتاج إلى إنشاء ملف مصدر أو معالجته مسبقًا، أو ضغط برنامج ثنائي. في هذا البرنامج التعليمي، ستنشئ وحدة ماكرو لتغيير حجم الصورة.

وحدات الماكرو مناسبة للمهام البسيطة. وإذا أردت تنفيذ أي إجراء أكثر تعقيدًا، مثل إضافة دعم للغة برمجة جديدة، يمكنك إنشاء قاعدة. تمنحك القواعد قدرًا أكبر من التحكم والمرونة.

أسهل طريقة لإنشاء وحدة ماكرو لتغيير حجم الصورة هي استخدام 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 كما هو الحال في Python.

  • للاتصال بـ 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"],
)