लाइब्रेरी मॉड्यूल

Rust लाइब्रेरी मॉड्यूल दो तरह के होते हैं. एक Rust लाइब्रेरी बनाता है और दूसरा C के साथ काम करने वाली लाइब्रेरी बनाता है. इसके अलावा, बिल्ड सिस्टम के लिए, Rust के प्रोसीजरल मैक्रोज़ (proc-macros) को एक खास तरह की लाइब्रेरी के तौर पर इस्तेमाल किया जा सकता है.

rust_library

rust_library मॉड्यूल, अन्य Rust मॉड्यूल के इस्तेमाल के लिए Rust लाइब्रेरी बनाता है.

_host वैरिएंट के अलावा, Rust लाइब्रेरी में मॉड्यूल टाइप होते हैं. ये मॉड्यूल टाइप, उपलब्ध लिंकेज को कंट्रोल करते हैं.

Rust Library Module Type परिभाषा
rust_library लाइब्रेरी के दोनों वैरिएंट, rlib और dylib उपलब्ध कराता है. AOSP, Rust लाइब्रेरी के लिए इस मॉड्यूल टाइप का सुझाव देता है. इससे मॉड्यूल, rustlibs प्रॉपर्टी के तहत डिपेंडेंसी के तौर पर लिस्ट होने पर सही तरीके से काम कर पाते हैं
rust_library_rlib सिर्फ़ Rust लाइब्रेरी का rlib वैरिएंट उपलब्ध कराता है; सिर्फ़ rlib वैरिएंट उपलब्ध कराने वाले मॉड्यूल, rustlibs प्रॉपर्टी के साथ काम करेंगे, इसकी गारंटी नहीं दी जा सकती.
rust_library_dylib सिर्फ़ Rust लाइब्रेरी का dylib वैरिएंट उपलब्ध कराता है; सिर्फ़ dylib वैरिएंट उपलब्ध कराने वाले मॉड्यूल, rustlibs प्रॉपर्टी के साथ काम करेंगे, इसकी गारंटी नहीं दी जा सकती.

rust_ffi

rust_ffi मॉड्यूल, C के साथ काम करने वाली लाइब्रेरी बनाता है, ताकि CC मॉड्यूल के साथ इंटरऑप किया जा सके.

_host के वैरिएंट के अलावा, Rust FFI लाइब्रेरी में ऐसे मॉड्यूल टाइप होते हैं जो उपलब्ध लिंकेज को कंट्रोल करते हैं. इन्हें इस टेबल में दिखाया गया है.

Rust FFI लाइब्रेरी मॉड्यूल का टाइप परिभाषा
rust_ffi यह C लाइब्रेरी के दोनों वैरिएंट उपलब्ध कराता है: स्टैटिक और शेयर की गई.
rust_ffi_shared यह सिर्फ़ C शेयर की गई लाइब्रेरी का वैरिएंट उपलब्ध कराता है.
rust_ffi_static सिर्फ़ C स्टैटिक लाइब्रेरी वैरिएंट उपलब्ध कराता है.

C से Rust को कॉल करने के लिए rust_ffi का इस्तेमाल करने का बुनियादी उदाहरण देखने के लिए, Android Rust Patterns पेज देखें.

ज़्यादा बेहतर तरीके से इस्तेमाल करने के बारे में जानने के लिए, Rust का आधिकारिक दस्तावेज़ पढ़ें.

rust_proc_macro

Rust के प्रोसीजरल मैक्रो (प्रॉक-मैक्रो), कंपाइलर को बढ़ाने के लिए काम आ सकते हैं. इनका इस्तेमाल सोर्स कोड में बदलाव करने या नए एट्रिब्यूट देने के लिए किया जा सकता है. इनके बारे में ज़्यादा जानकारी, Rust के आधिकारिक दस्तावेज़ के Procedural Macros पेज पर मिल सकती है.

बिल्ड सिस्टम के लिए, rust_proc_macro मॉड्यूल, rust_library मॉड्यूल की तरह ही काम करता है. rust_proc_macros पर निर्भर रहने वाले मॉड्यूल के लिए, proc_macros प्रॉपर्टी में मॉड्यूल का नाम जोड़ें.

proc_macros कंपाइलर प्लगिन होते हैं. इसलिए, ये होस्ट को टारगेट करते हैं और ऐसा कोई कोड नहीं बनाते जो किसी डिवाइस पर चल सके.

Rust लाइब्रेरी की खास प्रॉपर्टी

नीचे दी गई टेबल में बताई गई प्रॉपर्टी के अलावा, ज़रूरी सामान्य प्रॉपर्टी भी होती हैं. ये प्रॉपर्टी सभी मॉड्यूल पर लागू होती हैं. ये Rust लाइब्रेरी मॉड्यूल के लिए खास तौर पर ज़रूरी होते हैं या rust_library मॉड्यूल टाइप के लिए खास तौर पर यूनीक व्यवहार दिखाते हैं.

Rust लाइब्रेरी की प्रॉपर्टी परिभाषा
stem / name stem प्रॉपर्टी, आउटपुट लाइब्रेरी के फ़ाइल नाम को कंट्रोल करती है. हालांकि, यह डिफ़ॉल्ट रूप से name पर सेट होती है.

Rust कंपाइलर, लाइब्रेरी के फ़ाइल नामों के लिए कुछ ज़रूरी शर्तें लागू करता है. इसलिए, बिल्ड सिस्टम इन शर्तों को लागू करता है, ताकि कंपाइल करने से जुड़ी समस्याओं से बचा जा सके. आउटपुट फ़ाइल का नाम, lib<crate_name><suffix> फ़ॉर्मैट के मुताबिक होना चाहिए. (यहां crate_name प्रॉपर्टी पर निर्भरता है).

crate_name यह लाइब्रेरी बनाने वाले मॉड्यूल के लिए ज़रूरी प्रॉपर्टी है. साथ ही, इसका संबंध आउटपुट फ़ाइल के नाम से भी है. (stem की परिभाषा देखें.)
export_include_dirs rust_ffi मॉड्यूल के लिए, यह प्रॉपर्टी ऐसी स्ट्रिंग की सूची तय करती है जो शामिल किए गए पाथ को दिखाती हैं. ये ऐसे पाथ होते हैं जिनमें हेडर शामिल होते हैं. इन हेडर का इस्तेमाल, डिपेंडेंट cc मॉड्यूल कर सकते हैं.

rust_library या rust_ffi को लिंक करना

डिफ़ॉल्ट रूप से, डिवाइसों को टारगेट करने वाले Rust लाइब्रेरी मॉड्यूल, हमेशा libstd के साथ डाइनैमिक रूप से लिंक होते हैं. हालांकि, होस्ट मॉड्यूल हमेशा libstd के साथ स्टैटिक तौर पर लिंक होते हैं.

rustlibs डिपेंडेंसी के लिए इस्तेमाल किया गया लिंक, रूट मॉड्यूल की लिंक करने की प्राथमिकताओं पर निर्भर करता है. (उदाहरण के लिए, prefer_rlib: true के साथ rust_binary, Rust लाइब्रेरी के उन वैरिएंट का इस्तेमाल करेगा जो rustlibs को rlibs के तौर पर लिंक करते हैं.)

ऐसे रूट डिपेंडेंसी मॉड्यूल बनाने के लिए जो किसी डाइनैमिक रस्ट लाइब्रेरी (जैसे कि स्टैटिक एक्ज़ीक्यूटेबल) पर निर्भर नहीं होते, rlibs, डाइनैमिक और स्टैटिक, दोनों तरह के libstd लिंकेज वैरिएंट उपलब्ध कराता है. Soong, सही वैरिएंट को अपने-आप लिंक कर देता है.