পরিকল্পনা অনুযায়ী, Android.bp ফাইলগুলো সরল হয়। এগুলোতে কোনো কন্ডিশনাল বা কন্ট্রোল ফ্লো স্টেটমেন্ট থাকে না; সমস্ত জটিলতা Go-তে লেখা বিল্ড লজিক দ্বারা সামলানো হয়।
মডিউল
একটি Android.bp ফাইলের মডিউল শুরু হয় মডিউল টাইপ দিয়ে, যার পরে name: "value", format: ফরম্যাটে এক সেট প্রোপার্টি থাকে।
cc_binary {
name: "gzip",
srcs: ["src/test/minigzip.c"],
shared_libs: ["libz"],
stl: "none",
}
প্রতিটি মডিউলের একটি name প্রপার্টি থাকতে হবে এবং এর মান সমস্ত Android.bp ফাইলের মধ্যে অনন্য হতে হবে, তবে নেমস্পেস এবং প্রি-বিল্ট মডিউলের name প্রপার্টির মান পুনরাবৃত্তি হতে পারে।
srcs প্রপার্টিটি স্ট্রিং-এর একটি তালিকা হিসাবে মডিউলটি তৈরি করতে ব্যবহৃত সোর্স ফাইলগুলিকে নির্দিষ্ট করে। আপনি ":<module-name>" মডিউল রেফারেন্স সিনট্যাক্স ব্যবহার করে genrule বা filegroup মতো সোর্স ফাইল তৈরি করে এমন অন্যান্য মডিউলের আউটপুট উল্লেখ করতে পারেন।
বৈধ মডিউল টাইপ এবং তাদের প্রোপার্টিগুলোর তালিকার জন্য, m soong_docs চালিয়ে তৈরি হওয়া Soong Modules Reference দেখুন। আউটপুটটি out/soong/docs/soong_build.html ফাইলে পাওয়া যাবে।
প্রকারভেদ
ভেরিয়েবল এবং প্রোপার্টিগুলো স্ট্রংলি টাইপড, যেখানে ভেরিয়েবলগুলো প্রথম অ্যাসাইনমেন্টের উপর ভিত্তি করে ডাইনামিকভাবে নির্ধারিত হয় এবং প্রোপার্টিগুলো মডিউল টাইপ দ্বারা স্ট্যাটিক্যালি সেট করা হয়। সমর্থিত টাইপগুলো হলো:
- বুলিয়ান (
trueবাfalse) - পূর্ণসংখ্যা (
int) - স্ট্রিং (
"string") - স্ট্রিংগুলির তালিকা (
["string1", "string2"]) - মানচিত্র (
{key1: "value1", key2: ["value2"]})
ম্যাপে যেকোনো ধরনের ভ্যালু থাকতে পারে, যার মধ্যে নেস্টেড ম্যাপও অন্তর্ভুক্ত। লিস্ট এবং ম্যাপের শেষ ভ্যালুর পরে অতিরিক্ত কমা থাকতে পারে।
গ্লোবস
যেসব প্রোপার্টি ফাইলের তালিকা গ্রহণ করে, যেমন srcs , সেগুলো গ্লোব প্যাটার্নও গ্রহণ করতে পারে। গ্লোব প্যাটার্নে সাধারণ UNIX ওয়াইল্ডকার্ড * থাকতে পারে, যেমন *.java । গ্লোব প্যাটার্নে পাথ এলিমেন্ট হিসেবে একটিমাত্র ** ওয়াইল্ডকার্ডও থাকতে পারে, যা শূন্য বা তার বেশি পাথ এলিমেন্টের সাথে মেলে। উদাহরণস্বরূপ, java/**/*.java প্যাটার্নটি java/Main.java এবং java/com/android/Main.java উভয় প্যাটার্নের সাথেই মেলে।
ভেরিয়েবল
একটি Android.bp ফাইলে শীর্ষ-স্তরের ভেরিয়েবল অ্যাসাইনমেন্ট থাকতে পারে:
gzip_srcs = ["src/test/minigzip.c"],
cc_binary {
name: "gzip",
srcs: gzip_srcs,
shared_libs: ["libz"],
stl: "none",
}
ভেরিয়েবলগুলো যে ফাইলে ডিক্লেয়ার করা হয়, সেই ফাইলের বাকি অংশ এবং যেকোনো চাইল্ড ব্লুপ্রিন্ট ফাইলের মধ্যেই সীমাবদ্ধ থাকে। ভেরিয়েবলগুলো একটি ব্যতিক্রম ছাড়া অপরিবর্তনীয়: += অ্যাসাইনমেন্টের মাধ্যমে এগুলোর সাথে কিছু যুক্ত করা যায়, কিন্তু শুধুমাত্র রেফারেন্স করার আগে।
মন্তব্য
Android.bp ফাইলে C-স্টাইলের একাধিক লাইনের /* */ এবং C++-স্টাইলের এক লাইনের // কমেন্ট থাকতে পারে।
অপারেটররা
+ অপারেটর ব্যবহার করে স্ট্রিং, স্ট্রিং-এর তালিকা এবং ম্যাপ যুক্ত করা যায়। + অপারেটর ব্যবহার করে পূর্ণসংখ্যার যোগফল বের করা যায়। একটি ম্যাপ যুক্ত করলে উভয় ম্যাপের কী-গুলোর ইউনিয়ন তৈরি হয় এবং উভয় ম্যাপে উপস্থিত কী-গুলোর ভ্যালুও যুক্ত হয়ে যায়।
ডিফল্ট মডিউল
ডেভেলপাররা একাধিক মডিউলে একই প্রোপার্টিগুলোর পুনরাবৃত্তি করতে একটি ডিফল্টস মডিউল ব্যবহার করতে পারেন। উদাহরণস্বরূপ:
cc_defaults {
name: "gzip_defaults",
shared_libs: ["libz"],
stl: "none",
}
cc_binary {
name: "gzip",
defaults: ["gzip_defaults"],
srcs: ["src/test/minigzip.c"],
}
পূর্ব-নির্মিত মডিউল
কিছু প্রি-বিল্ট মডিউল টাইপ একটি মডিউলকে তার সোর্স-ভিত্তিক প্রতিরূপের সাথে একই নাম রাখার অনুমতি দেয়। উদাহরণস্বরূপ, যখন একই নামের একটি cc_binary আগে থেকেই থাকে, তখন foo নামের একটি cc_prebuilt_binary থাকতে পারে। এটি ডেভেলপারদের তাদের চূড়ান্ত পণ্যে কোন সংস্করণটি অন্তর্ভুক্ত করবেন তা বেছে নেওয়ার স্বাধীনতা দেয়। যদি একটি বিল্ড কনফিগারেশনে উভয় সংস্করণই থাকে, তবে প্রি-বিল্ট মডিউল সংজ্ঞায় থাকা prefer ’ ফ্ল্যাগের মান নির্ধারণ করে কোন সংস্করণটি অগ্রাধিকার পাবে। উল্লেখ্য যে, কিছু প্রি-বিল্ট মডিউলের নাম prebuilt দিয়ে শুরু হয় না, যেমন android_app_import ।
নেমস্পেস মডিউল
যতক্ষণ না অ্যান্ড্রয়েড সম্পূর্ণরূপে Make থেকে Soong-এ রূপান্তরিত হচ্ছে, ততক্ষণ পর্যন্ত Make প্রোডাক্ট কনফিগারেশনে অবশ্যই একটি PRODUCT_SOONG_NAMESPACES ভ্যালু নির্দিষ্ট করতে হবে। এর ভ্যালুটি হবে নেমস্পেসগুলোর একটি স্পেস-সেপারেটেড তালিকা, যেগুলো Soong, m কমান্ড দ্বারা বিল্ড করার জন্য Make-এ এক্সপোর্ট করে। অ্যান্ড্রয়েডের Soong-এ রূপান্তর সম্পূর্ণ হওয়ার পর, নেমস্পেস সক্রিয় করার বিবরণ পরিবর্তিত হতে পারে।
Soong বিভিন্ন ডিরেক্টরিতে থাকা মডিউলগুলোকে একই নাম ব্যবহার করার সুযোগ দেয়, তবে শর্ত হলো প্রতিটি মডিউলকে একটি পৃথক নেমস্পেসের মধ্যে ঘোষণা করতে হবে। ডেভেলপাররা একটি নেমস্পেস ঘোষণা করতে পারেন:
soong_namespace {
imports: ["path/to/otherNamespace1", "path/to/otherNamespace2"],
}
উল্লেখ্য যে, একটি নেমস্পেসের কোনো name প্রপার্টি থাকে না; এর পাথটি স্বয়ংক্রিয়ভাবে এর নাম হিসেবে নির্ধারিত হয়।
ট্রি-তে প্রতিটি Soong মডিউলের অবস্থানের উপর ভিত্তি করে তাকে একটি নেমস্পেস বরাদ্দ করা হয়। প্রতিটি Soong মডিউলকে বর্তমান ডিরেক্টরি বা নিকটতম পূর্বপুরুষ ডিরেক্টরিতে থাকা Android.bp ফাইলে পাওয়া soong_namespace দ্বারা সংজ্ঞায়িত নেমস্পেসের অন্তর্ভুক্ত বলে মনে করা হয়। যদি এই ধরনের কোনো soong_namespace মডিউল খুঁজে না পাওয়া যায়, তবে মডিউলটিকে অন্তর্নিহিত রুট নেমস্পেসের অন্তর্ভুক্ত বলে মনে করা হয়।
এখানে একটি উদাহরণ দেওয়া হলো: Soong, N নেমস্পেসে অবস্থিত M মডিউল দ্বারা ঘোষিত D ডিপেন্ডেন্সিটি রিজলভ করার চেষ্টা করে, যেটি I1, I2, I3… নেমস্পেসগুলো ইম্পোর্ট করে।
- এরপর যদি D
//namespace:moduleআকারের একটি পূর্ণাঙ্গ নাম হয়, তাহলে নির্দিষ্ট মডিউল নামটি খোঁজার জন্য শুধুমাত্র নির্দিষ্ট নেমস্পেসটিতেই অনুসন্ধান করা হয়। - অন্যথায়, সুং প্রথমে N নেমস্পেসে ঘোষিত D নামের একটি মডিউল খোঁজে।
- যদি সেই মডিউলটি বিদ্যমান না থাকে, তাহলে সুং I1, I2, I3… নেমস্পেসগুলোতে D নামের একটি মডিউল খোঁজে।
- সুং রুট নেমস্পেসে অনুসন্ধান করে।
শর্তসাপেক্ষ
Soong, Android.bp ফাইলে কন্ডিশনাল সমর্থন করে না। এর পরিবর্তে, বিল্ড রুলের যে জটিলতাগুলোতে কন্ডিশনালের প্রয়োজন হয়, সেগুলো Go-তে সামলানো হয়, যেখানে উচ্চ-স্তরের ভাষার বৈশিষ্ট্য ব্যবহার করা যায় এবং কন্ডিশনালের কারণে সৃষ্ট অন্তর্নিহিত নির্ভরতাগুলো ট্র্যাক করা যায়। বেশিরভাগ কন্ডিশনালকে একটি ম্যাপ প্রপার্টিতে রূপান্তর করা হয়, যেখানে ম্যাপের ভ্যালুগুলোর মধ্যে একটি নির্বাচন করে টপ-লেভেল প্রপার্টিগুলোর সাথে যুক্ত করা হয়।
উদাহরণস্বরূপ, আর্কিটেকচার-নির্দিষ্ট ফাইলগুলিকে সমর্থন করার জন্য:
cc_library {
...
srcs: ["generic.cpp"],
arch: {
arm: {
srcs: ["arm.cpp"],
},
x86: {
srcs: ["x86.cpp"],
},
},
}
ফরম্যাটার
Soong-এ ব্লুপ্রিন্ট ফাইলের জন্য gofmt-এর মতো একটি ক্যানোনিকাল ফরম্যাটার রয়েছে। বর্তমান ডিরেক্টরিতে থাকা সমস্ত Android.bp ফাইলকে রিকার্সিভলি রিফরম্যাট করতে, চালান:
bpfmt -w .
প্রামাণ্য বিন্যাসে চার-স্পেস ইন্ডেন্ট, একাধিক উপাদানের তালিকার প্রতিটি উপাদানের পরে নতুন লাইন এবং তালিকা ও ম্যাপের শেষে একটি কমা অন্তর্ভুক্ত থাকে।