Android Rust मॉड्यूल

सामान्य नियम के तौर पर, 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 इन्फ़्रास्ट्रक्चर के बनाए गए टूल जैसा ही होना चाहिए, तो इस वैल्यू को सेट न करें.