تقدّم هذه الصفحة نظرة عامة على كيفية توفّر المصدر الذي تم إنشاؤه و كيفية استخدامه في نظام الإنشاء.
توفّر جميع أدوات إنشاء المصادر وظائف مماثلة لنظام الإنشاء. الثلاثة إنّ حالات استخدام إنشاء المصدر المتوافقة مع نظام الإنشاء تؤدي إلى إنشاء عمليات ربط C. باستخدام واجهات bindgen وAIDL وواجهات Protobuf.
الصناديق من مصدر تم إنشاؤه
يمكن استخدام كل وحدة Rust تُنشئ رمز المصدر كصندوق، تمامًا كما
إذا تم تعريفها على أنّها rust_library
. (يعني ذلك أنّه يمكن تعريفه على أنّه ملف
مستند في السمات rustlibs
وrlibs
وdylibs
). إنّ أفضل نمط استخدام
لرمز النظام الأساسي هو استخدام المصدر الذي تم إنشاؤه كحزمة. وعلى الرغم من أن
وحدة ماكرو include!
متوافقة مع المصدر الذي تم إنشاؤه، والغرض الأساسي منه هو
يتيح استخدام رمز برمجي تابع لجهة خارجية ومتوفّر في external/
.
في بعض الحالات، قد يستمر رمز النظام الأساسي في استخدام المصدر الذي تم إنشاؤه من خلال الماكرو
include!()
، مثل استخدام وحدة genrule
لإنشاء مصدر
بطريقة فريدة.
استخدِم include!() لتضمين المصدر الذي تم إنشاؤه.
يتم تناول استخدام المصدر الذي تم إنشاؤه كصندوق في الأمثلة الواردة في كل
(على التوالي). يعرض هذا القسم كيفية الإشارة إلى المصدر الذي تم إنشاؤه.
من خلال وحدة ماكرو include!()
. تجدر الإشارة إلى أنّ هذه العملية متشابهة لجميع أدوات توليد
المصادر.
المتطلبات الأساسية
يستند هذا المثال إلى الافتراض بأنّك حدّدت rust_bindgen
وحدة (libbuzz_bindgen
) ويمكنك المتابعة إلى خطوات تضمين المصدر الذي تم إنشاؤه
لاستخدام الماكروinclude!()
. إذا لم يسبق لك ذلك، يُرجى الانتقال إلى مقالة تحديد وحدة rust bindgen،
إنشاء 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 للتعامل مع هذا الاختلاف.
عند إنشاء الإصدار، يضبط الأمر cargo
متغيّر البيئة OUT_DIR
الذي من المتوقّع أن تضع فيه نصوص build.rs
البرمجية رمز المصدر الذي تم إنشاؤه. استخدِم الرمز التالي لتضمين رمز المصدر:
include!(concat!(env!("OUT_DIR"), "/hello.rs"));
يمثل هذا تحديًا لسونغ حيث يتم وضع مخرجات كل وحدة في
دليل out/
الخاص بها1. لا يوجد OUT_DIR
واحد حيث
تعمل التبعيات على إخراج المصدر الذي تم إنشاؤه منها.
بالنسبة إلى رمز النظام الأساسي، يفضّل AOSP تجميع المصدر الذي تم إنشاؤه في حزمة يمكن استيرادها، وذلك لعدة أسباب:
- منع تداخل أسماء ملفات المصدر التي تم إنشاؤها
- تقليل الرموز النموذجية وتسجيل الوصول في جميع أنحاء الشجرة التي تتطلب صيانة. أي نص نموذجي لتجميع المصدر الذي يتم إنشاؤه في قفص يمكن الاحتفاظ بها مركزيًا.
- تجنَّب التفاعلات الضمنية2 بين الرمز الذي تم إنشاؤه والصندوق المحيط به.
- تقليل الضغط على الذاكرة والقرص من خلال الربط الديناميكي للمصادر التي يتم إنشاؤها شائع الاستخدام.
نتيجةً لذلك، تُنشئ جميع أنواع وحدات إنشاء رمز المصدر باستخدام Rust في Android رمزًابرمجيًا
يمكن تجميعه واستخدامه كحزمة.
لا يزال تطبيق Sung يدعم الصناديق التابعة لجهات خارجية بدون أي تعديل في حال عدم إجراء أي تعديلات
يتم نسخ تبعيات المصدر التي تم إنشاؤها لوحدة ما في وحدة واحدة
الدليل، وهو مشابه لـ Cargo. في مثل هذه الحالات، يضبط تطبيق Sayg متغيّر البيئة OUT_DIR
.
إلى هذا الدليل عند تجميع الوحدة، بحيث يمكن العثور على المصدر الذي تم إنشاؤه.
ومع ذلك، للأسباب الموضحة سابقًا، فمن الأفضل استخدام
في رمز النظام الأساسي عندما يكون ذلك ضروريًا تمامًا.
-
ولا يمثل هذا أي مشكلات مع لغة C/C++ واللغات المشابهة، مثل يتم توفير المسار إلى المصدر الذي تم إنشاؤه مباشرةً إلى برنامج التحويل البرمجي.↩
-
بما أنّ الدالة
include!
تعمل من خلال التضمين النصي، قد تشير إلى قيم من مساحة الاسم المُحيطة أو تعدّل مساحة الاسم أو تستخدِم بنى مثل#![foo]
. وقد يكون من الصعب الحفاظ على هذه التفاعلات الضمنية. ننصحك دائمًا باستخدام وحدات الماكرو عندما يكون التفاعل مع بقية الحزمة مطلوبًا حقًا.↩