একটি ম্যাক্রো তৈরি করা হচ্ছে

কল্পনা করুন যে আপনার বিল্ডের অংশ হিসাবে আপনাকে একটি টুল চালাতে হবে। উদাহরণস্বরূপ, আপনি একটি উত্স ফাইল তৈরি বা প্রিপ্রসেস করতে চাইতে পারেন, বা একটি বাইনারি সংকুচিত করতে পারেন। এই টিউটোরিয়ালে, আপনি একটি ম্যাক্রো তৈরি করতে যাচ্ছেন যা একটি চিত্রের আকার পরিবর্তন করে।

ম্যাক্রো সাধারণ কাজের জন্য উপযুক্ত। আপনি যদি আরও জটিল কিছু করতে চান, উদাহরণস্বরূপ একটি নতুন প্রোগ্রামিং ভাষার জন্য সমর্থন যোগ করুন, একটি নিয়ম তৈরি করার কথা বিবেচনা করুন। নিয়মগুলি আপনাকে আরও নিয়ন্ত্রণ এবং নমনীয়তা দেয়।

একটি ম্যাক্রো তৈরি করার সবচেয়ে সহজ উপায় যা একটি চিত্রের আকার পরিবর্তন করে একটি 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 যুক্তি আছে, ঠিক নিয়মের মতো।

  • একটি ম্যাক্রোর আচরণ নথিভুক্ত করতে, পাইথনের মতো ডকস্ট্রিং ব্যবহার করুন।

  • একটি genrule , বা অন্য কোন স্থানীয় নিয়ম কল করতে, native. .

  • অন্তর্নিহিত genrule অতিরিক্ত আর্গুমেন্ট ফরোয়ার্ড করতে **kwargs ব্যবহার করুন (এটি 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"],
)