وحدات المكتبة

هناك نوعان من وحدات مكتبة Rust، أحدهما يُنشئ مكتبات Rust و الآخر يُنشئ مكتبات متوافقة مع C. بالإضافة إلى ذلك، لأغراض نظام الإنشاء، يمكنك اعتبار وحدات الماكرو البروتوكولية في Rust (proc-macros) نوعًا special من المكتبات.

مكتبة rust

تُنشئ وحدة rust_library مكتبات Rust لاستخدامها من قِبل وحدات Rust الأخرى.

بالإضافة إلى أنواع _host، تحتوي مكتبات Rust على أنواع وحدات تتحكّم في عمليات الربط المتاحة.

نوع وحدة مكتبة Rust التعريف
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 التعريف
rust_ffi توفّر كل من الصيغتَين لـ C library: الثابتة والمشترَكة.
rust_ffi_shared يوفّر هذا الخيار الصيغة C من المكتبة المشتركة فقط.
rust_ffi_static توفّر هذه السياسة متغير مكتبة C الثابتة فقط.

للحصول على مثال أساسي لاستخدام rust_ffi للاتصال بـ Rust من C، اطّلِع على صفحة أنماط Rust في Android.

للحصول على معلومات عن الاستخدامات الأكثر تقدمًا، يُرجى الانتقال إلى مستندات Rust الرسمية.

rust_proc_macro

يمكن أن تكون وحدات الماكرو الإجرائية في Rust (proc-macros) مفيدة لتوسيع نطاق المُجمِّع لتنفيذ عمليات تحويل الرموز المصدر أو توفير سمات جديدة. يمكن العثور على مزيد من المعلومات حول هذه العناصر في صفحة وحدات الماكرو الإجرائية في مستندات Rust الرسمية.

لأغراض نظام التصميم، تعمل وحدة rust_proc_macro بشكل مشابه لوحدات rust_library. بالنسبة إلى الوحدات التي تعتمد على rust_proc_macros، أضِف اسم الوحدة إلى السمة proc_macros.

بما أنّ proc_macros هي إضافات للمُجمِّع، فإنّها تستهدف بالضرورة المضيف ولا تُنشئ أي رمز يمكن تشغيله على جهاز.

خصائص مكتبة Rust البارزة

إنّ الخصائص المحدّدة في الجدول أدناه هي بالإضافة إلى الخصائص الشائعة والمهمة التي تنطبق على جميع الوحدات. هذه الوحدات إما مهمة بشكل خاص لوحدات مكتبة Rust ، أو تُظهر سلوكًا فريدًا خاصًا بنوع وحدة rust_library.

خصائص مكتبة Rust التعريف
البادئة / الاسم يتحكّم السمة 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 على الإعدادات المفضّلة للربط في الوحدة الجذر. (على سبيل المثال، سيؤدي استخدام rust_binary مع prefer_rlib: true إلى استخدام صيغ مكتبة Rust التي تربط rustlibs باسم rlibs).

للسماح بإنشاء وحدات التبعيات الأساسية التي لا تعتمد على أي مكتبات rlibs ديناميكية (مثل ملفات التشغيل الثابتة)، يوفّر rlibs نوعَي ربط libstd، هما الربط الديناميكي والربط الثابت. يتم ربط المتغير الصحيح تلقائيًا بواسطة Soong.