هناك نوعان من وحدات مكتبة 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 | توفّر هذه السمة نوع rlib فقط من مكتبة Rust، ولا يمكن ضمان عمل الوحدات التي توفّر أنواع rlib فقط مع السمة rustlibs. |
| rust_library_dylib | توفّر هذه السمة إصدار dylib فقط من مكتبة Rust،
ولا يمكن ضمان عمل الوحدات التي توفّر إصدارات dylib فقط مع السمة rustlibs. |
rust_ffi
تنتج الوحدة rust_ffi مكتبات متوافقة مع لغة C لتتكامل مع وحدات CC.
بالإضافة إلى متغيرات _host، تحتوي مكتبات Rust FFI على أنواع وحدات تتحكّم في الربط المتاح، كما هو موضّح في الجدول التالي.
| Rust FFI Library Module Type | التعريف |
|---|---|
| rust_ffi | توفّر كلا نوعَي مكتبة C: الثابتة والمشترَكة. |
| rust_ffi_shared | توفّر هذه السمة صيغة مكتبة C المشتركة فقط. |
| rust_ffi_static | توفّر هذه السمة نوع مكتبة C الثابتة فقط. |
للاطّلاع على مثال أساسي لاستخدام rust_ffi من أجل استدعاء Rust من C، راجِع صفحة
نماذج Android Rust.
للحصول على معلومات حول الاستخدام الأكثر تقدّمًا، يُرجى الانتقال إلى مستندات Rust الرسمية.
rust_proc_macro
يمكن أن تكون وحدات الماكرو الإجرائية (proc-macros) في Rust مفيدة لتوسيع نطاق المترجم البرمجي بهدف إجراء عمليات تحويل على رمز المصدر أو توفير سمات جديدة. يمكنك الاطّلاع على مزيد من المعلومات حول هذه العناصر في صفحة وحدات الماكرو الإجرائية ضمن مستندات Rust الرسمية.
لأغراض نظام التصميم، يعمل نموذج rust_proc_macro بشكل مشابه لنماذج rust_library. بالنسبة إلى الوحدات التي تعتمد على rust_proc_macros،
أضِف اسم الوحدة إلى السمة proc_macros.
بما أنّ proc_macros هي مكوّنات إضافية للمترجم، فإنّها تستهدف المضيف بالضرورة ولا تنتج أي رمز برمجي يمكن تشغيله على جهاز.
خصائص مكتبة Rust البارزة
إنّ الخصائص المحدّدة في الجدول أدناه هي بالإضافة إلى الخصائص المشتركة المهمة التي تنطبق على جميع الوحدات. وهي إما مهمة بشكل خاص لوحدات مكتبة Rust، أو تعرض سلوكًا فريدًا خاصًا بنوع الوحدة rust_library.
| خصائص مكتبة Rust | التعريف |
|---|---|
| الجذر / الاسم | تتحكّم السمة stem في اسم ملف المكتبة الناتج،
والذي يتم ضبطه تلقائيًا على name.
يفرض برنامج الترجمة البرمجية Rust متطلبات معيّنة على أسماء ملفات المكتبات، ونتيجةً لذلك، يفرض نظام الإنشاء هذه المتطلبات لتجنُّب مشاكل الترجمة البرمجية.
يجب أن يتوافق اسم ملف الإخراج مع التنسيق |
| crate_name | هذه السمة مطلوبة للوحدات التي تنتج مكتبات،
ولها أيضًا علاقة باسم ملف الإخراج. (يمكنك الاطّلاع على تعريف stem). |
| export_include_dirs | بالنسبة إلى وحدات rust_ffi، تحدّد هذه السمة قائمة بالسلاسل التي تمثّل مسارات التضمين النسبية، وهي المسارات التي تحتوي على العناوين التي يمكن أن تستخدمها وحدات cc التابعة. |
ربط rust_library أو rust_ffi
بشكلٍ تلقائي، يتم دائمًا ربط وحدات مكتبة Rust التي تستهدف الأجهزة بشكل ديناميكي
بـ libstd. ومع ذلك، يتم دائمًا ربط وحدات المضيف بشكل ثابت
بـ libstd.
يعتمد الربط المستخدَم في التبعيات rustlibs على إعدادات الربط المفضّلة في الوحدة الرئيسية. (على سبيل المثال، سيستخدم rust_binary الذي يتضمّن prefer_rlib: true صيغ مكتبة Rust التي تربط rustlibs باسم rlibs).
للسماح بإنتاج وحدات الاعتمادية الجذرية التي لا تعتمد على أي مكتبات ديناميكية بلغة Rust (مثل الملفات التنفيذية الثابتة)، يوفّر rlibs كلا النوعين الديناميكي والثابت من خيارات الربط libstd. يتم ربط الصيغة الصحيحة تلقائيًا بواسطة Soong.