एक सामान्य सिद्धांत के रूप में, 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% समान हैं, इस मान को सेट न करें।