सोर्स जनरेटर

इस पेज पर, इस बारे में अहम जानकारी दी गई है कि जनरेट किया गया सोर्स कैसे काम करता है और बिल्ड सिस्टम में इसका इस्तेमाल कैसे किया जा सकता है.

सभी सोर्स जनरेटर, बिल्ड-सिस्टम से मिलती-जुलती सुविधाएं देते हैं. तीनों सी बाइंडिंग, बिल्ड-सिस्टम के साथ काम करने वाले सोर्स-जनरेशन इस्तेमाल के उदाहरण जनरेट कर रहे हैं bindgen, AIDL इंटरफ़ेस, और प्रोटोबफ़ इंटरफ़ेस का इस्तेमाल करता है.

जनरेट किए गए सोर्स से मिले क्रैट

सोर्स कोड जनरेट करने वाले हर Rust मॉड्यूल को क्रेट की तरह इस्तेमाल किया जा सकता है अगर इसे rust_library के तौर पर परिभाषित किया जाता. (इसका मतलब है कि इसे rustlibs, rlibs, और dylibs प्रॉपर्टी पर निर्भर है.) सबसे सही इस्तेमाल प्लैटफ़ॉर्म कोड का पैटर्न, जनरेट किए गए सोर्स को क्रेट के तौर पर इस्तेमाल करना है. हालांकि, include! मैक्रो, जनरेट किए गए सोर्स के साथ काम करता है. इसका मुख्य मकसद यह है कि तीसरे पक्ष के ऐसे कोड के साथ काम करता है जो external/ में मौजूद है.

कुछ मामलों में प्लैटफ़ॉर्म कोड, जनरेट किए गए सोर्स का इस्तेमाल अब भी include!() मैक्रो, जैसे कि जब सोर्स जनरेट करने के लिए genrule मॉड्यूल का इस्तेमाल किया जाता है एक अलग अंदाज़ में.

जनरेट किए गए सोर्स को शामिल करने के लिए, include!() का इस्तेमाल करना

जनरेट किए गए सोर्स को क्रेट के तौर पर इस्तेमाल करने के बारे में हर मामले में दिए गए उदाहरणों में बताया गया है (क्रम में) मॉड्यूल पेज पर जाने के लिए यहां क्लिक करें. इस सेक्शन में, जनरेट किए गए सोर्स का रेफ़रंस देने का तरीका बताया गया है include!() मैक्रो के माध्यम से. ध्यान दें कि यह प्रोसेस सभी सोर्स के लिए एक जैसी है जनरेटर.

पूर्वापेक्षा

यह उदाहरण यह मानकर बनाया गया है कि आपने rust_bindgen को तय किया है मॉड्यूल (libbuzz_bindgen) का इस्तेमाल करके, जनरेट किए गए सोर्स को शामिल करने के चरणों पर जा सकता है. include!() मैक्रो का इस्तेमाल करने के लिए. अगर आपने ऐसा नहीं किया है, तो कृपया रस्ट बाइंडिंग मॉड्यूल तय करना पर जाएं, libbuzz_bindgen बनाएं और फिर यहां वापस आएं.

ध्यान रखें कि इसके बिल्ड-फ़ाइल वाले हिस्से, सभी सोर्स जनरेटर के लिए लागू होते हैं.

जनरेट किए गए सोर्स को शामिल करने का तरीका

इस कॉन्टेंट का इस्तेमाल करके external/rust/hello_bindgen/Android.bp बनाएं:

rust_binary {
   name: "hello_bzip_bindgen_include",
   srcs: [
         // The primary rust source file must come first in this list.
         "src/lib.rs",

         // The module providing the bindgen bindings is
         // included in srcs prepended by ":".
         ":libbuzz_bindgen",
    ],

    // Dependencies need to be redeclared when generated source is used via srcs.
    shared_libs: [
        "libbuzz",
    ],
}
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है

इस कॉन्टेंट का इस्तेमाल करके external/rust/hello_bindgen/src/bindings.rs बनाएं:

#![allow(clippy::all)]
#![allow(non_upper_case_globals)]
#![allow(non_camel_case_types)]
#![allow(non_snake_case)]
#![allow(unused)]
#![allow(missing_docs)]

// Note that "bzip_bindings.rs" here must match the source_stem property from
// the rust_bindgen module.
include!(concat!(env!("OUT_DIR"), "/bzip_bindings.rs"));

इस कॉन्टेंट का इस्तेमाल करके external/rust/hello_bindgen/src/lib.rs बनाएं:

mod bindings;

fn main() {
    let mut x = bindings::foo { x: 2 };
    unsafe { bindings::fizz(1, &mut x as *mut bindings::foo) }
}

जनरेट किए गए सोर्स के बारे में जानकारी क्यों देना

C/C++ कंपाइलर के उलट, rustc सिर्फ़ एक सोर्स फ़ाइल स्वीकार करता है जो बाइनरी या लाइब्रेरी के एंट्री पॉइंट को दिखाता है. उम्मीद है कि सोर्स ट्री को इस तरह से बनाया गया है कि सभी ज़रूरी सोर्स फ़ाइलें अपने-आप खोजा गया. इसका मतलब है कि जनरेट किए गए सोर्स को, सोर्स में रखा जाना चाहिए ट्री, या स्रोत में शामिल डायरेक्टिव के ज़रिए दिया गया हो:

include!("/path/to/hello.rs");

Rust समुदाय, build.rs स्क्रिप्ट और इस अंतर के साथ काम करने के लिए, कार्गो बिल्ड एनवायरमेंट की ज़रूरत है. जब यह बनता है, तो cargo निर्देश OUT_DIR एनवायरमेंट वैरिएबल सेट करता है जिसमें build.rs स्क्रिप्ट के लिए, जनरेट किए गए सोर्स कोड को शामिल करने की उम्मीद की जाती है. इसका इस्तेमाल करें सोर्स कोड को शामिल करने के लिए इस कमांड का इस्तेमाल करें:

include!(concat!(env!("OUT_DIR"), "/hello.rs"));

इससे सूंग के लिए एक चुनौती पैदा होती है, क्योंकि हर मॉड्यूल से मिलने वाले आउटपुट नीचे दिए जाते हैं उसकी out/ डायरेक्ट्री1. ऐसा कोई OUT_DIR नहीं है जहां डिपेंडेंसी अपने जनरेट किए गए सोर्स को आउटपुट करती हैं.

प्लैटफ़ॉर्म कोड के लिए, एओएसपी, पैकेजिंग के ज़रिए जनरेट किए गए सोर्स को एक क्रेट में प्राथमिकता देता है. इंपोर्ट न होने की कई वजहें हो सकती हैं:

  • जनरेट की गई सोर्स फ़ाइल के नामों को आपस में मिलने से रोकें.
  • बॉयलरप्लेट कोड कम करें पूरे पेड़ के आस-पास मौजूद चीज़ों के रखरखाव की ज़रूरत होती है. कोई भी बॉयलरप्लेट जनरेट किए गए सोर्स कंपाइल के लिए ज़रूरी है एक क्रेट में रखा जा सकता है.
  • जनरेट किए गए कोड और उसके आस-पास के क्रेट के बीच, इंप्लिसिट2 इंटरैक्शन से बचें.
  • आम तौर पर इस्तेमाल किए जाने वाले सोर्स को डाइनैमिक तरीके से लिंक करके, मेमोरी और डिस्क पर दबाव कम करें.

इस वजह से, Android के Rust सोर्स जनरेशन वाले सभी मॉड्यूल टाइप के लिए कोड जनरेट होते हैं जिसे कंपाइल करके क्रैट के तौर पर इस्तेमाल किया जा सकता हो. सूंग अब भी बिना किसी बदलाव के तीसरे पक्ष के बैंक स्टेटमेंट का इस्तेमाल करता है किसी मॉड्यूल के लिए जनरेट की गई सोर्स डिपेंडेंसी, एक हर मॉड्यूल में कॉपी हो जाती हैं डायरेक्टरी से मेल खाती है. ऐसे मामलों में, सूंग OUT_DIR एनवायरमेंट वैरिएबल सेट करता है ताकि जनरेट किया गया सोर्स ढूंढा जा सके. हालांकि, पहले से बताई गई वजहों से, बेहतर तरीका यह है कि आप सिर्फ़ इस सुविधा को प्लैटफ़ॉर्म कोड में तब ही शामिल किया जा सकता है, जब बहुत ज़रूरी हो.


  1. हालांकि, C/C++ और इससे मिलती-जुलती भाषाओं के लिए कोई समस्या मौजूद नहीं है, क्योंकि जनरेट किए गए सोर्स का पाथ सीधे कंपाइलर को दिया जाता है.

  2. include!, टेक्स्ट के तौर पर शामिल होता है. इसलिए, हो सकता है कि यह इन वैल्यू का रेफ़रंस दे पास में मौजूद नेमस्पेस, नेमस्पेस में बदलाव करें या #![foo] जैसे कंस्ट्रक्ट का इस्तेमाल करें. इस तरह के इंटरैक्शन को बनाए रखना मुश्किल हो सकता है. हमेशा प्राथमिकता दें मैक्रो तब, जब बाकी क्रेट के साथ इंटरैक्शन वाकई ज़रूरी हो.