কল্পনা করুন যে আপনার বিল্ডের অংশ হিসাবে আপনাকে একটি টুল চালাতে হবে। উদাহরণস্বরূপ, আপনি একটি উত্স ফাইল তৈরি বা প্রিপ্রসেস করতে চাইতে পারেন, বা একটি বাইনারি সংকুচিত করতে পারেন। এই টিউটোরিয়ালে, আপনি একটি ম্যাক্রো তৈরি করতে যাচ্ছেন যা একটি চিত্রের আকার পরিবর্তন করে।
ম্যাক্রো সাধারণ কাজের জন্য উপযুক্ত। আপনি যদি আরও জটিল কিছু করতে চান, উদাহরণস্বরূপ একটি নতুন প্রোগ্রামিং ভাষার জন্য সমর্থন যোগ করুন, একটি নিয়ম তৈরি করার কথা বিবেচনা করুন। নিয়মগুলি আপনাকে আরও নিয়ন্ত্রণ এবং নমনীয়তা দেয়।
একটি ম্যাক্রো তৈরি করার সবচেয়ে সহজ উপায় যা একটি চিত্রের আকার পরিবর্তন করে একটি 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"],
)