एंड्रॉइड रस्ट मॉड्यूल

एक सामान्य सिद्धांत के रूप में, 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 स्रोत उत्पन्न करता है और एक रस्ट लाइब्रेरी तैयार करता है जो एक विशेष प्रोटोबफ़ के लिए एक इंटरफ़ेस प्रदान करता है। प्रोटोबफ़्स मॉड्यूल और सोर्स जेनरेटर पेज
rust_bindgen स्रोत उत्पन्न करता है और एक रस्ट लाइब्रेरी तैयार करता है जिसमें सी लाइब्रेरीज़ के लिए रस्ट बाइंडिंग होती है। बाइंडजेन बाइंडिंग मॉड्यूल और सोर्स जेनरेटर पेज

महत्वपूर्ण सामान्य गुण

ये गुण सभी एंड्रॉइड रस्ट मॉड्यूल में सामान्य हैं। व्यक्तिगत रस्ट मॉड्यूल से जुड़ी कोई भी अतिरिक्त (अद्वितीय) संपत्ति उस मॉड्यूल के पृष्ठ पर सूचीबद्ध होती है।

नाम

name आपके मॉड्यूल का नाम है। अन्य सूंग मॉड्यूल की तरह, यह अधिकांश 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 में एक एकल स्रोत फ़ाइल होती है जो आपके मॉड्यूल (आमतौर पर 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

clippy_lints

क्लिपी लिंटर स्रोत जनरेटर को छोड़कर सभी मॉड्यूल प्रकारों के लिए डिफ़ॉल्ट रूप से भी चलाया जाता है। लिंट के कुछ सेट परिभाषित किए गए हैं जिनका उपयोग मॉड्यूल स्रोत को मान्य करने के लिए किया जाता है। ये कुछ संभावित मूल्य हैं:

  • मॉड्यूल के स्थान के आधार पर लिंट का default डिफ़ॉल्ट सेट
  • android सबसे सख्त लिंट सेट है जो सभी एंड्रॉइड प्लेटफॉर्म कोड पर लागू होता है
  • vendor विक्रेता कोड पर लागू लिंट का एक आरामदायक सेट मिलता है
  • सभी लिंट चेतावनियों और त्रुटियों को नजरअंदाज करने वाला none

संस्करण

edition इस कोड को संकलित करने के लिए उपयोग किए जाने वाले रस्ट संस्करण को परिभाषित करता है। यह C और C++ के std संस्करणों के समान है। मान्य मान 2015 और 2018 (डिफ़ॉल्ट) हैं।

झंडे

flags में संकलन के दौरान rustc को पास करने के लिए फ़्लैग्स की एक स्ट्रिंग सूची होती है।

ld_flags

ld-flags स्रोत संकलित करते समय लिंकर को पास करने के लिए झंडे की एक स्ट्रिंग सूची होती है। इन्हें -C linker-args रस्टसी ध्वज द्वारा पारित किया जाता है। clang उपयोग लिंकर फ्रंट-एंड के रूप में किया जाता है, जो वास्तविक लिंकिंग के लिए lld आमंत्रित करता है।

विशेषताएँ

features उन फीचर्स की एक स्ट्रिंग सूची है जिन्हें संकलन के दौरान सक्षम किया जाना चाहिए। इसे --cfg 'feature="foo"' द्वारा रस्टसी को पास कर दिया जाता है। अधिकांश सुविधाएँ योगात्मक होती हैं, इसलिए कई मामलों में इसमें सभी आश्रित मॉड्यूलों के लिए आवश्यक पूर्ण सुविधाएँ शामिल होती हैं। हालाँकि, ऐसे मामलों में जहां सुविधाएँ एक-दूसरे से अलग हैं, किसी भी बिल्ड फ़ाइल में अतिरिक्त मॉड्यूल परिभाषित करें जो परस्पर विरोधी सुविधाएँ प्रदान करते हैं।

सीएफजीएस

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 दोनों संस्करण शामिल हैं (जिसके कारण संकलन विफल हो जाएगा)।

असमर्थित और सीमित समर्थन निर्माण सुविधाएँ

सूंग का रस्ट vendor और vendor_ramdisk छवियों और स्नैपशॉट के लिए सीमित समर्थन प्रदान करता है। हालाँकि, staticlibs , cdylibs , rlibs , और binaries समर्थित हैं। विक्रेता छवि निर्माण लक्ष्य के लिए, android_vndk cfg गुण सेट किया गया है। यदि सिस्टम और विक्रेता लक्ष्य के बीच अंतर हैं तो आप इसे कोड में उपयोग कर सकते हैं। rust_proc_macros विक्रेता स्नैपशॉट के भाग के रूप में कैप्चर नहीं किया गया है; यदि ये इन पर निर्भर हैं, तो सुनिश्चित करें कि आप इन्हें उचित रूप से संस्करण-नियंत्रित करें।

उत्पाद, VNDK और पुनर्प्राप्ति छवियाँ समर्थित नहीं हैं।

वृद्धिशील निर्माण

डेवलपर्स SOONG_RUSTC_INCREMENTAL पर्यावरण चर को true पर सेट करके रस्ट स्रोत के वृद्धिशील संकलन को सक्षम कर सकते हैं।

चेतावनी : यह बिल्डबॉट्स द्वारा उत्पन्न बायनेरिज़ के समान बाइनरी उत्पन्न करने की गारंटी नहीं है। ऑब्जेक्ट फ़ाइलों में मौजूद फ़ंक्शन या डेटा के पते भिन्न हो सकते हैं। यह सुनिश्चित करने के लिए कि उत्पन्न कलाकृतियाँ EngProd बुनियादी ढांचे द्वारा निर्मित कलाकृतियों के 100% समान हैं, इस मान को सेट न करें।