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

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

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

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

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

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

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

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

নাম

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

স্টেম

stem (ঐচ্ছিক) আউটপুট ফাইলের নাম (ফাইল এক্সটেনশন এবং অন্যান্য প্রত্যয় ব্যতীত) সরাসরি নিয়ন্ত্রণ প্রদান করে। উদাহরণস্বরূপ, libfoo এর স্টেম মান সহ একটি 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

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 প্রয়োজনীয়তা প্রয়োগ করে। আরও তথ্যের জন্য, লাইব্রেরি মডিউল বিভাগটি দেখুন।

লিন্টস

সোর্স জেনারেটর ব্যতীত সমস্ত মডিউল প্রকারের জন্য rustc linter ডিফল্টরূপে চালিত হয়। কিছু লিন্ট সেট সংজ্ঞায়িত করা হয় এবং মডিউল উৎস যাচাই করতে ব্যবহৃত হয়। এই ধরনের লিন্ট সেটগুলির সম্ভাব্য মানগুলি নিম্নরূপ:

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

clippy_lints

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

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

সংস্করণ

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

পতাকা

flags সংকলনের সময় rustc এ পাস করার জন্য পতাকার একটি স্ট্রিং তালিকা রয়েছে।

ld_পতাকা

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

বৈশিষ্ট্য

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

cfgs

cfgs cfg পতাকার একটি স্ট্রিং তালিকা রয়েছে যা সংকলনের সময় সক্রিয় করা হবে। এটি --cfg foo এবং --cfg "fizz=buzz" দ্বারা rustc এ পাঠানো হয়।

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

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

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

ফালা

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

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

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

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

মরিচা মডিউলগুলি নিম্নলিখিত বৈশিষ্ট্যগুলির মাধ্যমে সিসি এবং মরিচা লাইব্রেরির উপর নির্ভর করতে পারে:

সম্পত্তির নাম বর্ণনা
rustlibs rust_library মডিউলের তালিকা যা নির্ভরতাও। নির্ভরতা ঘোষণা করার জন্য এটি আপনার পছন্দের পদ্ধতি হিসাবে ব্যবহার করুন, কারণ এটি বিল্ড সিস্টেমকে পছন্দের লিঙ্কেজ নির্বাচন করতে দেয়। (নিচে মরিচা লাইব্রেরির বিরুদ্ধে লিঙ্ক করার সময় দেখুন)
rlibs rust_library মডিউলগুলির তালিকা যা অবশ্যই স্ট্যাটিকভাবে rlibs হিসাবে লিঙ্ক করা উচিত। (সতর্কতার সাথে ব্যবহার করুন; নীচে জং লাইব্রেরির বিরুদ্ধে লিঙ্ক করার সময় দেখুন।)
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 সম্পত্তি ব্যবহার করে তা করুন যদি না আপনার কাছে এটি করার একটি নির্দিষ্ট কারণ থাকে। এটি রুট মডিউলের প্রয়োজনীয়তার উপর ভিত্তি করে বিল্ড সিস্টেমকে সঠিক সংযোগ নির্বাচন করতে দেয় এবং এটি একটি নির্ভরতা গাছে একটি লাইব্রেরির rlib এবং dylib উভয় সংস্করণই ধারণ করার সম্ভাবনা হ্রাস করে (যা সংকলন ব্যর্থ হবে)।

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

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

পণ্য, VNDK, এবং পুনরুদ্ধারের ছবি সমর্থিত নয়।

ক্রমবর্ধমান বিল্ড

বিকাশকারীরা SOONG_RUSTC_INCREMENTAL এনভায়রনমেন্ট ভেরিয়েবলকে true সেট করে রাস্ট উত্সের ক্রমবর্ধমান সংকলন সক্ষম করতে পারে।

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