सामान्य नियम के तौर पर, 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 | सोर्स जनरेट करता है और किसी रस्ट लाइब्रेरी, जिसमें C लाइब्रेरी की रस्ट बाइंडिंग होती हैं. | Bindgen बाइंडिंग मॉड्यूल और सोर्स जनरेटर पेज |
अहम सामान्य प्रॉपर्टी
ये प्रॉपर्टी सभी Android रस्ट में इस्तेमाल की जाती हैं मॉड्यूल. किसी व्यक्ति से जुड़ी कोई अन्य (यूनीक) प्रॉपर्टी रस्ट मॉड्यूल उस मॉड्यूल के पेज पर मौजूद हैं.
नाम
name
आपके मॉड्यूल का नाम है. अन्य सूंग मॉड्यूल की तरह, यह भी यूनीक होना चाहिए
ज़्यादातर Android.bp
मॉड्यूल टाइप में. डिफ़ॉल्ट रूप से, आउटपुट के तौर पर name
का इस्तेमाल किया जाता है
फ़ाइल नाम. अगर आउटपुट फ़ाइल का नाम, मॉड्यूल के नाम से अलग होना चाहिए, तो
इसे तय करने के लिए, stem
प्रॉपर्टी का इस्तेमाल करें.
स्टेम
stem
(ज़रूरी नहीं) आउटपुट फ़ाइल नाम पर सीधा कंट्रोल देता है (इसे छोड़कर)
फ़ाइल एक्सटेंशन और अन्य सफ़िक्स). उदाहरण के लिए, rust_library_rlib
libfoo
की स्टेम वैल्यू वाली लाइब्रेरी, libfoo.rlib
फ़ाइल बनाती है. अगर आपको
stem
प्रॉपर्टी के लिए कोई वैल्यू न दें, आउटपुट फ़ाइल नाम
मॉड्यूल का नाम डिफ़ॉल्ट रूप से शामिल होना चाहिए.
जब आप मॉड्यूल नाम को मनचाहे आउटपुट पर सेट नहीं कर पा रहे हों, तब stem
फ़ंक्शन का इस्तेमाल करें
फ़ाइल नाम. उदाहरण के लिए, log
क्रेट के rust_library
को नाम दिया गया है
liblog_rust
,
क्योंकि एक liblog cc_library
पहले से मौजूद है. इस मामले में stem
प्रॉपर्टी का इस्तेमाल करने से यह पक्का होता है कि आउटपुट
फ़ाइल का नाम liblog_rust.*
के बजाय liblog.*
है.
सोर्स
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
की ज़रूरी शर्तों को लागू करता है
और आउटपुट फ़ाइल का नाम डालें. ज़्यादा जानकारी के लिए, देखें
लाइब्रेरी मॉड्यूल
सेक्शन में जाएं.
लिंट
रस्ट लिंटर सोर्स जनरेटर को छोड़कर, सभी तरह के मॉड्यूल के लिए डिफ़ॉल्ट रूप से चलता है. कुछ लिंट सेट तय किए जाते हैं. इनका इस्तेमाल मॉड्यूल सोर्स की पुष्टि करने के लिए किया जाता है. ऐसे लिंट के लिए संभावित वैल्यू सेट इस तरह के हैं:
- मॉड्यूल की जगह के आधार पर, लिंट का डिफ़ॉल्ट सेट
default
android
सबसे सख्त लिंट सेट है, जो सभी Android प्लैटफ़ॉर्म कोड पर लागू होता हैvendor
वेंडर कोड पर लागू किए गए लिंट का आरामदेह सेट- लिंट से जुड़ी सभी चेतावनियों और गड़बड़ियों को अनदेखा करने के लिए,
none
क्लिपी_लिंट्स
क्लिपी लिंटर भी सोर्स जनरेटर को छोड़कर, सभी तरह के मॉड्यूल के लिए डिफ़ॉल्ट रूप से रन करता है. लिंट के कुछ सेट तय किए गए हैं, जिनका इस्तेमाल मॉड्यूल सोर्स की पुष्टि करने के लिए किया जाता है. ये कुछ तरीके हैं जिनकी मदद से, मान:
- मॉड्यूल की जगह के आधार पर, लिंट का
default
डिफ़ॉल्ट सेट android
सबसे सख्त लिंट सेट है, जो सभी Android प्लैटफ़ॉर्म कोड पर लागू होता हैvendor
वेंडर कोड पर लागू किए गए लिंट का आरामदेह सेट- लिंट से जुड़ी सभी चेतावनियों और गड़बड़ियों को अनदेखा करने के लिए,
none
वर्शन
edition
, रस्ट वर्शन के बारे में बताता है, ताकि इसे इस्तेमाल किया जा सके
इस कोड को कंपाइल किया जा रहा है. यह C और C++ के लिए एसटीडी वर्शन की तरह है. मान्य मान
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 सेट होगा.वीएनडीके का इस्तेमाल करने वाले मॉड्यूल में
android_vndk
सीएफ़जी सेट होगा. यह है__ANDROID_VNDK__
से मिलता-जुलता C++ की परिभाषा.
स्ट्रिप
strip
यह कंट्रोल करता है कि आउटपुट फ़ाइल को हटाया जाए या नहीं (अगर लागू हो).
अगर इसे सेट नहीं किया जाता है, तो डिवाइस के मॉड्यूल डिफ़ॉल्ट रूप से मिनी डीबगइन्फ़ो को छोड़कर बाकी सब कुछ स्ट्रिप कर देते हैं.
डिफ़ॉल्ट रूप से, होस्ट मॉड्यूल किसी भी सिंबल को नहीं हटाते हैं. मान्य वैल्यू में none
शामिल हैं
स्ट्रिपिंग बंद करने के लिए और all
.
अतिरिक्त वैल्यू यहां देखी जा सकती हैं:
Soong मॉड्यूल के बारे में जानकारी.
Host_supported
डिवाइस मॉड्यूल के लिए, host_supported
पैरामीटर से पता चलता है कि मॉड्यूल
भी एक होस्ट वैरिएंट देना चाहिए.
लाइब्रेरी डिपेंडेंसी तय करना
रस्ट मॉड्यूल, CC और इन प्रॉपर्टी की मदद से, लाइब्रेरी को रस्ट करें:
प्रॉपर्टी का नाम | ब्यौरा |
---|---|
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
के बजाय rustlibs
प्रॉपर्टी का इस्तेमाल करें या
dylibs
, अगर आपके पास ऐसा करने का कोई खास कारण न हो. इससे बिल्ड में
जिसे रूट मॉड्यूल की ज़रूरत के हिसाब से सही लिंकेज चुना जाता है.
और इससे डिपेंडेंसी ट्री में rlib
और
लाइब्रेरी के dylib
वर्शन (जिस वजह से कंपाइलेशन काम नहीं करेगा).
काम न करने वाली और सीमित सहायता के लिए बिल्ड सुविधाएं
सूंग के रस्ट में vendor
के लिए सीमित सहायता उपलब्ध है और
vendor_ramdisk
इमेज और स्नैपशॉट. हालांकि, staticlibs
, cdylibs
,
rlibs
और binaries
इस्तेमाल किए जा सकते हैं. वेंडर इमेज बिल्ड टारगेट के लिए,
android_vndk
cfg
प्रॉपर्टी सेट की गई. कोड में इसका इस्तेमाल तब किया जा सकता है, जब कोई
सिस्टम और वेंडर के टारगेट के बीच अंतर की जानकारी देता है. rust_proc_macros
,
इस जानकारी को वेंडर स्नैपशॉट के हिस्से के तौर पर कैप्चर किया गया है; अगर ये पहले से इस्तेमाल किए जा रहे हैं, तो पक्का करें कि
उन्हें सही वर्शन-कंट्रोल कर सकता है.
प्रॉडक्ट, VNDK, और रिकवरी इमेज का इस्तेमाल नहीं किया जा सकता.
इंक्रीमेंटल बिल्ड
डेवलपर
SOONG_RUSTC_INCREMENTAL
को सेट करके, रस्ट सोर्स
एनवायरमेंट वैरिएबल को true
के लिए सेट किया गया.
चेतावनी: इससे ऐसी बाइनरी बनाने की गारंटी नहीं मिलती है जो उन बाइनरी से मिलती-जुलती हैं और बिल्डबॉट की मदद से जनरेट किए गए होते हैं. फ़ंक्शन या डेटा, जो ऑब्जेक्ट फ़ाइलें अलग हो सकती हैं. यह पक्का करने के लिए कि जनरेट किए गए आर्टफ़ैक्ट 100% हों EngProd इन्फ़्रास्ट्रक्चर के बनाए गए टूल जैसा ही होना चाहिए, तो इस वैल्यू को सेट न करें.