অ্যান্ড্রয়েড মরিচা মডিউল

সাধারণ নীতি হিসেবে, rust_* মডিউল সংজ্ঞাগুলো cc_* ব্যবহার ও প্রত্যাশা কঠোরভাবে মেনে চলে। নিচে একটি রাস্ট বাইনারির মডিউল সংজ্ঞার উদাহরণ দেওয়া হলো:

rust_binary {
    name: "hello_rust",
    crate_name: "hello_rust",
    srcs: ["src/hello_rust.rs"],
    host_supported: true,
}

এই পৃষ্ঠায় rust_* মডিউলগুলোর সবচেয়ে প্রচলিত বৈশিষ্ট্যগুলো আলোচনা করা হয়েছে। নির্দিষ্ট মডিউলের প্রকারভেদ এবং উদাহরণ মডিউল সংজ্ঞা সম্পর্কে আরও তথ্যের জন্য, বাইনারি মডিউল , লাইব্রেরি মডিউল , অথবা টেস্ট মডিউল দেখুন।

মৌলিক মডিউল প্রকার

প্রকার সংজ্ঞা আরও তথ্যের জন্য
rust_binary একটি রাস্ট বাইনারি বাইনারি মডিউল পৃষ্ঠা
rust_library একটি রাস্ট লাইব্রেরি তৈরি করে এবং rlibdylib উভয় সংস্করণই সরবরাহ করে। rust_library , লাইব্রেরি মডিউল পৃষ্ঠা।
rust_ffi এটি cc মডিউল দ্বারা ব্যবহারযোগ্য একটি রাস্ট সি লাইব্রেরি তৈরি করে এবং এর স্ট্যাটিক ও শেয়ার্ড উভয় সংস্করণই প্রদান করে। rust_ffi , লাইব্রেরি মডিউল পৃষ্ঠা
rust_proc_macro একটি proc-macro রাস্ট লাইব্রেরি তৈরি করে। (এগুলো কম্পাইলার প্লাগইনের অনুরূপ।) rust_proc_macro , লাইব্রেরি মডিউল পৃষ্ঠা
rust_test একটি রাস্ট টেস্ট বাইনারি তৈরি করে যা স্ট্যান্ডার্ড রাস্ট টেস্ট হারনেস ব্যবহার করে। টেস্ট মডিউল পৃষ্ঠা
rust_fuzz libfuzzer ব্যবহার করে একটি রাস্ট ফাজ বাইনারি তৈরি করে। rust_fuzz মডিউল উদাহরণ
rust_protobuf সোর্স কোড তৈরি করে এবং একটি রাস্ট লাইব্রেরি প্রস্তুত করে যা একটি নির্দিষ্ট প্রোটোবাফের জন্য ইন্টারফেস প্রদান করে। প্রোটোবাফস মডিউল এবং সোর্স জেনারেটর পৃষ্ঠাগুলি
rust_bindgen সোর্স কোড তৈরি করে এবং একটি রাস্ট লাইব্রেরি প্রস্তুত করে, যাতে সি লাইব্রেরির রাস্ট বাইন্ডিং অন্তর্ভুক্ত থাকে। বাইন্ডজেন বাইন্ডিং মডিউল এবং সোর্স জেনারেটর পৃষ্ঠাগুলি

গুরুত্বপূর্ণ সাধারণ বৈশিষ্ট্য

এই প্রোপার্টিগুলো সমস্ত অ্যান্ড্রয়েড রাস্ট মডিউলের জন্য সাধারণ। স্বতন্ত্র রাস্ট মডিউলের সাথে যুক্ত কোনো অতিরিক্ত (অনন্য) প্রোপার্টি থাকলে, তা সেই মডিউলের পৃষ্ঠায় তালিকাভুক্ত করা থাকে।

নাম

name হলো আপনার মডিউলের নাম। অন্যান্য Soong মডিউলের মতো, এটিও অধিকাংশ Android.bp মডিউল টাইপের মধ্যে অনন্য হতে হবে। ডিফল্টরূপে, name আউটপুট ফাইলের নাম হিসেবে ব্যবহৃত হয়। যদি আউটপুট ফাইলের নাম মডিউলের নাম থেকে ভিন্ন হতে হয়, তবে তা নির্ধারণ করতে stem প্রপার্টি ব্যবহার করুন।

কাণ্ড

stem (ঐচ্ছিক) আউটপুট ফাইলের নামের উপর সরাসরি নিয়ন্ত্রণ প্রদান করে (ফাইল এক্সটেনশন এবং অন্যান্য সাফিক্স ছাড়া)। উদাহরণস্বরূপ, libfoo stem ভ্যালু সহ একটি rust_library_rlib লাইব্রেরি ` libfoo.rlib ফাইল তৈরি করে। আপনি যদি stem প্রপার্টির জন্য কোনো ভ্যালু প্রদান না করেন, তাহলে আউটপুট ফাইলের নামটি ডিফল্টরূপে মডিউলের নামটি গ্রহণ করে।

যখন আপনি মডিউলের নামটি কাঙ্ক্ষিত আউটপুট ফাইলের নামে সেট করতে পারেন না, তখন stem ফাংশনটি ব্যবহার করুন। উদাহরণস্বরূপ, log ক্রেটের জন্য rust_library টির নাম liblog_rust , কারণ একটি liblog cc_library আগে থেকেই বিদ্যমান। এই ক্ষেত্রে stem প্রপার্টি ব্যবহার করলে এটি নিশ্চিত হয় যে আউটপুট ফাইলের নাম liblog.* এর পরিবর্তে liblog_rust.*

srcs

srcs একটিমাত্র সোর্স ফাইল থাকে যা আপনার মডিউলের এন্ট্রি পয়েন্টকে নির্দেশ করে (সাধারণত main.rs বা lib.rs )। rustc কম্পাইলেশনের জন্য প্রয়োজনীয় অন্যান্য সমস্ত সোর্স ফাইলের রেজোলিউশন এবং ডিসকভারি পরিচালনা করে, এবং উৎপাদিত deps ফাইলে এগুলোর তালিকা দেওয়া থাকে।

সম্ভব হলে প্ল্যাটফর্ম কোডের জন্য এই ব্যবহার পরিহার করুন; আরও তথ্যের জন্য সোর্স জেনারেটর দেখুন।

ক্রেট_নাম

crate_name rustc --crate_name ফ্ল্যাগের মাধ্যমে ক্রেট নামের মেটাডেটা নির্ধারণ করে। যে মডিউলগুলো লাইব্রেরি তৈরি করে, তাদের ক্ষেত্রে এটি অবশ্যই সোর্সে ব্যবহৃত প্রত্যাশিত ক্রেট নামের সাথে মিলতে হবে। উদাহরণস্বরূপ, যদি libfoo_bar মডিউলটি সোর্সে extern crate foo_bar হিসেবে উল্লেখ করা থাকে, তাহলে এটি অবশ্যই crate_name: "foo_bar" হতে হবে।

এই প্রপার্টিটি সকল rust_* মডিউলের জন্য সাধারণ, কিন্তু যে মডিউলগুলো রাস্ট লাইব্রেরি তৈরি করে (যেমন rust_library , rust_ffi , rust_bindgen , rust_protobuf , এবং rust_proc_macro ) তাদের জন্য এটি আবশ্যক । এই মডিউলগুলো crate_name এবং আউটপুট ফাইলের নামের মধ্যকার সম্পর্কের ক্ষেত্রে rustc আবশ্যকতাগুলো প্রয়োগ করে। আরও তথ্যের জন্য, লাইব্রেরি মডিউল বিভাগটি দেখুন।

লিন্ট

সোর্স জেনারেটর ছাড়া অন্য সব ধরনের মডিউলের জন্য রাস্টসি লিন্টার ডিফল্টভাবে চালানো হয়। মডিউলের সোর্স যাচাই করার জন্য কিছু লিন্ট সেট সংজ্ঞায়িত ও ব্যবহৃত হয়। এই ধরনের লিন্ট সেটের সম্ভাব্য মানগুলো নিচে দেওয়া হলো:

  • মডিউলের অবস্থানের উপর নির্ভর করে default লিন্ট সেট।
  • android সবচেয়ে কঠোর লিন্ট সেট যা সমস্ত অ্যান্ড্রয়েড প্ল্যাটফর্ম কোডে প্রযোজ্য।
  • vendor কোডে প্রয়োগ করা লিন্টগুলির একটি শিথিল সেট।
  • সমস্ত লিন্ট সতর্কতা এবং ত্রুটি উপেক্ষা করতে none নির্বাচন করুন।

ক্লিপি_লিন্টস

সোর্স জেনারেটর ছাড়া অন্য সব মডিউল টাইপের জন্য ক্লিপি লিন্টারও ডিফল্টভাবে চালানো হয়। মডিউলের সোর্স যাচাই করার জন্য কয়েকটি লিন্ট সেট সংজ্ঞায়িত করা আছে। এগুলোর কয়েকটি সম্ভাব্য মান হলো:

  • মডিউলের অবস্থানের উপর নির্ভর করে default লিন্ট সেট।
  • android সবচেয়ে কঠোর লিন্ট সেট যা সমস্ত অ্যান্ড্রয়েড প্ল্যাটফর্ম কোডে প্রযোজ্য।
  • vendor কোডে প্রয়োগ করা লিন্টগুলির একটি শিথিল সেট।
  • সমস্ত লিন্ট সতর্কতা এবং ত্রুটি উপেক্ষা করতে none নির্বাচন করুন।

সংস্করণ

edition এই কোডটি কম্পাইল করার জন্য ব্যবহৃত রাস্ট সংস্করণ নির্ধারণ করে। এটি C এবং C++ এর std সংস্করণের অনুরূপ। বৈধ মানগুলি হলো 2015 , 2018 এবং 2021 (ডিফল্ট)।

পতাকা

flags কম্পাইলেশনের সময় rustc তে পাঠানোর জন্য ফ্ল্যাগগুলির একটি স্ট্রিং তালিকা থাকে।

ld_flags

ld-flags সোর্স কম্পাইল করার সময় লিঙ্কারে পাঠানোর জন্য ফ্ল্যাগগুলির একটি স্ট্রিং তালিকা থাকে। এই ফ্ল্যাগগুলি rustc-এর -C linker-args ফ্ল্যাগের মাধ্যমে পাঠানো হয়। clang লিঙ্কার ফ্রন্ট-এন্ড হিসেবে ব্যবহৃত হয়, যা প্রকৃত লিঙ্কিংয়ের জন্য lld আহ্বান করে।

বৈশিষ্ট্য

features হলো এমন সব ফিচারের একটি স্ট্রিং তালিকা যা কম্পাইলেশনের সময় অবশ্যই সক্রিয় করতে হবে। এটি --cfg 'feature="foo"' এর মাধ্যমে `rustc`-তে পাঠানো হয়। বেশিরভাগ ফিচারই সংযোজনযোগ্য, তাই অনেক ক্ষেত্রে এতে সমস্ত নির্ভরশীল মডিউলের জন্য প্রয়োজনীয় সম্পূর্ণ ফিচার সেটটি অন্তর্ভুক্ত থাকে। তবে, যেসব ক্ষেত্রে ফিচারগুলো একে অপরের থেকে স্বতন্ত্র, সেসব ক্ষেত্রে সাংঘর্ষিক ফিচার প্রদানকারী যেকোনো বিল্ড ফাইলে অতিরিক্ত মডিউল সংজ্ঞায়িত করুন।

সিএফজিএস

cfgs কম্পাইলেশনের সময় সক্রিয় করার জন্য cfg ফ্ল্যাগগুলির একটি স্ট্রিং তালিকা থাকে। এটি --cfg foo এবং --cfg "fizz=buzz" এর মাধ্যমে rustc তে পাঠানো হয়।

বিল্ড সিস্টেম নির্দিষ্ট পরিস্থিতিতে স্বয়ংক্রিয়ভাবে কিছু cfg ফ্ল্যাগ সেট করে, যা নিচে তালিকাভুক্ত করা হলো:

  • dylib হিসেবে বিল্ড করা মডিউলগুলিতে android_dylib cfg সেট করা থাকবে।

  • যে মডিউলগুলো VNDK ব্যবহার করবে, সেগুলোতে android_vndk cfg সেট করা থাকবে। এটি C++ এর __ANDROID_VNDK__ সংজ্ঞার অনুরূপ।

স্ট্রিপ

আউটপুট ফাইল থেকে কোনো কিছু বাদ দেওয়া হবে কি না এবং কীভাবে বাদ দেওয়া হবে (যদি প্রযোজ্য হয়), তা strip নিয়ন্ত্রিত হয়। এটি সেট করা না থাকলে, ডিভাইস মডিউলগুলো ডিফল্টরূপে মিনি ডিবাগইনফো ছাড়া বাকি সবকিছু বাদ দিয়ে দেয়। হোস্ট মডিউলগুলো ডিফল্টরূপে কোনো সিম্বলই বাদ দেয় না। বৈধ মানগুলোর মধ্যে রয়েছে স্ট্রিপিং নিষ্ক্রিয় করার জন্য none এবং মিনি ডিবাগইনফোসহ সবকিছু বাদ দেওয়ার জন্য all । অতিরিক্ত মানগুলো Soong Modules Reference- এ পাওয়া যাবে।

হোস্ট_সমর্থিত

ডিভাইস মডিউলগুলোর ক্ষেত্রে, host_supported প্যারামিটারটি নির্দেশ করে যে মডিউলটি একটি হোস্ট ভ্যারিয়েন্টও প্রদান করবে কি না।

লাইব্রেরি নির্ভরতা সংজ্ঞায়িত করুন

রাস্ট মডিউলগুলো নিম্নলিখিত প্রোপার্টিগুলোর মাধ্যমে CC এবং রাস্ট লাইব্রেরি উভয়ের উপর নির্ভর করতে পারে:

সম্পত্তির নাম বর্ণনা
rustlibs rust_library মডিউলগুলোর তালিকা, যেগুলো ডিপেন্ডেন্সিও বটে। ডিপেন্ডেন্সি ঘোষণার জন্য এটিকে আপনার পছন্দের পদ্ধতি হিসেবে ব্যবহার করুন, কারণ এটি বিল্ড সিস্টেমকে পছন্দের লিঙ্কেজ বেছে নিতে সাহায্য করে। (নিচে ‘রাস্ট লাইব্রেরির সাথে লিঙ্কিং করার সময়’ দেখুন)
rlibs rust_library মডিউলগুলির তালিকা যেগুলিকে অবশ্যই rlibs হিসাবে স্ট্যাটিক্যালি লিঙ্ক করতে হবে। (সাবধানতার সাথে ব্যবহার করুন; নিচে ‘When linking against Rust libraries’ অংশটি দেখুন।)
shared_libs cc_library মডিউলগুলোর তালিকা, যেগুলোকে শেয়ার্ড লাইব্রেরি হিসেবে ডায়নামিকভাবে লিঙ্ক করতে হবে।
static_libs cc_library মডিউলগুলোর তালিকা, যেগুলোকে স্ট্যাটিক লাইব্রেরি হিসেবে স্ট্যাটিক্যালি লিঙ্ক করতে হবে।
whole_static_libs cc_library মডিউলগুলির তালিকা, যেগুলিকে স্ট্যাটিক লাইব্রেরি হিসাবে স্ট্যাটিক্যালি লিঙ্ক করা উচিত এবং চূড়ান্ত লাইব্রেরিতে সম্পূর্ণভাবে অন্তর্ভুক্ত করা উচিত। rust_ffi_static ভ্যারিয়েন্টগুলির জন্য, whole_static_libraries চূড়ান্ত স্ট্যাটিক লাইব্রেরি আর্কাইভে অন্তর্ভুক্ত করা হবে। rust_library_rlib ভ্যারিয়েন্টগুলির জন্য, whole_static_libraries লাইব্রেরিগুলি চূড়ান্ত rlib লাইব্রেরির মধ্যে বান্ডল করা হবে।

রাস্ট লাইব্রেরির সাথে লিঙ্ক করার সময় , একটি উত্তম অনুশীলন হিসেবে, কোনো বিশেষ কারণ না থাকলে rlibs বা dylibs পরিবর্তে rustlibs প্রপার্টি ব্যবহার করুন। এটি বিল্ড সিস্টেমকে রুট মডিউলের প্রয়োজনীয়তার উপর ভিত্তি করে সঠিক লিঙ্কেজ নির্বাচন করতে সাহায্য করে এবং একটি ডিপেন্ডেন্সি ট্রিতে কোনো লাইব্রেরির rlibdylib উভয় সংস্করণ থাকার সম্ভাবনা কমিয়ে দেয় (যা কম্পাইলেশন ব্যর্থ করে দেবে)।

অসমর্থিত এবং সীমিত সমর্থন বিল্ড বৈশিষ্ট্য

সুং-এর রাস্ট (Soong's Rust) vendor এবং vendor_ramdisk ইমেজ ও স্ন্যাপশটের জন্য সীমিত সমর্থন প্রদান করে। তবে, staticlibs , cdylibs , rlibs , এবং binaries সমর্থিত। ভেন্ডর ইমেজ বিল্ড টার্গেটের জন্য, android_vndk cfg প্রপার্টিটি সেট করা থাকে। সিস্টেম এবং ভেন্ডর টার্গেটের মধ্যে কোনো পার্থক্য থাকলে আপনি কোডে এটি ব্যবহার করতে পারেন। ভেন্ডর স্ন্যাপশটের অংশ হিসেবে rust_proc_macros ক্যাপচার করা হয় না; যদি এগুলোর উপর নির্ভর করতে হয়, তবে নিশ্চিত করুন যে আপনি সেগুলোর যথাযথ ভার্সন-কন্ট্রোল করছেন।

প্রোডাক্ট, ভিএনডিকে এবং রিকভারি ইমেজ সমর্থিত নয়।

ক্রমবর্ধমান নির্মাণ

ডেভেলপাররা SOONG_RUSTC_INCREMENTAL এনভায়রনমেন্ট ভেরিয়েবলটির মান true সেট করে রাস্ট সোর্সের ইনক্রিমেন্টাল কম্পাইলেশন চালু করতে পারেন।

সতর্কীকরণ : এটি বিল্ডবট দ্বারা উৎপাদিত বাইনারিগুলোর সাথে হুবহু একই বাইনারি তৈরি করবে এমন কোনো নিশ্চয়তা নেই। অবজেক্ট ফাইলগুলোতে থাকা ফাংশন বা ডেটার অ্যাড্রেস ভিন্ন হতে পারে। উৎপাদিত আর্টিফ্যাক্টগুলো যেন EngProd ইনফ্রাস্ট্রাকচার দ্বারা নির্মিত আর্টিফ্যাক্টগুলোর সাথে ১০০% অভিন্ন হয়, তা নিশ্চিত করতে এই মানটি অনির্ধারিত রাখুন।