به عنوان یک اصل کلی، تعاریف ماژول rust_*
دقیقاً به استفاده و انتظارات cc_*
پایبند است. مثال زیر نمونه ای از تعریف ماژول برای Rust باینری است:
rust_binary {
name: "hello_rust",
crate_name: "hello_rust",
srcs: ["src/hello_rust.rs"],
host_supported: true,
}
این صفحه رایج ترین ویژگی های ماژول های rust_*
را پوشش می دهد. برای اطلاعات بیشتر در مورد انواع ماژول های خاص و تعاریف نمونه ماژول، ماژول های باینری ، ماژول های کتابخانه ، یا ماژول های تست را ببینید.
انواع ماژول های پایه
تایپ کنید | تعریف | برای اطلاعات بیشتر |
---|---|---|
rust_binary | یک باینری Rust | صفحه ماژول های باینری |
rust_library | یک کتابخانه Rust تولید می کند و انواع rlib و dylib را ارائه می دهد. | rust_library ، صفحه ماژول های کتابخانه. |
rust_ffi | یک کتابخانه Rust C قابل استفاده توسط ماژولهای cc تولید میکند و انواع ثابت و مشترک را ارائه میکند. | rust_ffi ، صفحه ماژول های کتابخانه |
rust_proc_macro | یک کتابخانه proc-macro Rust تولید می کند. (اینها مشابه افزونه های کامپایلر هستند.) | rust_proc_macro ، صفحه ماژول های کتابخانه ها |
rust_test | یک باینری تست Rust تولید می کند که از مهار استاندارد Rust test استفاده می کند. | صفحه ماژول های تست |
rust_fuzz | یک libfuzzer باینری Rust fuzz تولید می کند. | نمونه ماژول rust_fuzz |
rust_protobuf | منبع تولید می کند و یک کتابخانه Rust تولید می کند که یک رابط برای یک پروتوباف خاص فراهم می کند. | صفحات Protobufs Modules و Source Generators |
rust_bindgen | منبع تولید می کند و یک کتابخانه Rust حاوی پیوندهای Rust به کتابخانه های C تولید می کند. | صفحات Bindgen Bindings Modules و Source Generators |
خواص مشترک مهم
این ویژگی ها در همه ماژول های Android Rust مشترک هستند. هر ویژگی اضافی (منحصر به فرد) مرتبط با ماژول های Rust در صفحه آن ماژول فهرست شده است.
نام
name
نام ماژول شما است. مانند سایر ماژولهای Soong، این ماژول باید در اکثر انواع ماژولهای Android.bp
منحصربهفرد باشد. به طور پیش فرض، name
به عنوان نام فایل خروجی استفاده می شود. اگر نام فایل خروجی باید با نام ماژول متفاوت باشد، از ویژگی stem
برای تعریف آن استفاده کنید.
ساقه
stem
(اختیاری) کنترل مستقیم روی نام فایل خروجی (به استثنای پسوند فایل و سایر پسوندها) را فراهم می کند. به عنوان مثال، یک کتابخانه rust_library_rlib
با مقدار پایه libfoo
یک فایل libfoo.rlib
تولید می کند. اگر مقداری برای ویژگی stem
ارائه نکنید، نام فایل خروجی به طور پیش فرض از نام ماژول استفاده می کند.
زمانی که نمی توانید نام ماژول را روی نام فایل خروجی دلخواه تنظیم کنید، از تابع stem
استفاده کنید. به عنوان مثال، rust_library
برای جعبه log
، liblog_rust
نام دارد، زیرا یک liblog cc_library
از قبل وجود دارد. استفاده از ویژگی stem
در این مورد تضمین می کند که فایل خروجی به جای liblog.*
liblog_rust.*
نامگذاری شده است.
srcs
srcs
حاوی یک فایل منبع واحد است که نشان دهنده نقطه ورود به ماژول شما است (معمولا main.rs
یا lib.rs
). rustc
وضوح و کشف سایر فایلهای منبع مورد نیاز برای کامپایل را کنترل میکند، و این موارد در فایل deps
که تولید میشود، شمارش میشود.
در صورت امکان، از این استفاده برای کد پلت فرم خودداری کنید. برای اطلاعات بیشتر به منبع تولیدکنندگان مراجعه کنید.
crate_name
crate_name
فراداده نام جعبه را از طریق پرچم rustc
--crate_name
تنظیم می کند. برای ماژول هایی که کتابخانه تولید می کنند، این باید با نام جعبه مورد انتظار استفاده شده در منبع مطابقت داشته باشد. به عنوان مثال، اگر ماژول libfoo_bar
در منبع به عنوان extern crate foo_bar
ارجاع داده شود، باید crate_name: "foo_bar" باشد.
این ویژگی برای همه ماژولهای rust_*
مشترک است، اما برای ماژولهایی که کتابخانههای Rust تولید میکنند (مانند rust_library
rust_ffi
، rust_bindgen
، rust_protobuf
، و rust_proc_macro
) مورد نیاز است. این ماژول ها الزامات rustc
را در رابطه بین crate_name
و نام فایل خروجی اعمال می کنند. برای اطلاعات بیشتر به بخش ماژول های کتابخانه مراجعه کنید.
پرزها
rustc linter به طور پیش فرض برای همه انواع ماژول به جز ژنراتورهای منبع اجرا می شود. برخی از مجموعههای لینت برای اعتبارسنجی منبع ماژول تعریف و استفاده میشوند. مقادیر ممکن برای چنین مجموعه های پرز به شرح زیر است:
- بسته به مکان ماژول، مجموعه پیشفرض پرزها
default
-
android
سختترین مجموعه لینت که برای همه کدهای پلتفرم اندروید اعمال میشود -
vendor
مجموعه ای آرام از خطوط اعمال شده به کد فروشنده -
none
برای نادیده گرفتن همه هشدارها و خطاهای پرز
clippy_lints
clippy linter نیز به طور پیش فرض برای همه انواع ماژول به جز ژنراتورهای منبع اجرا می شود. مجموعهای از پرزها تعریف شدهاند که برای اعتبارسنجی منبع ماژول استفاده میشوند. اینها برخی از مقادیر ممکن هستند:
- مجموعه
default
پیشفرض پرزها بسته به محل ماژول -
android
سختترین مجموعه لینت که برای همه کدهای پلتفرم اندروید اعمال میشود -
vendor
مجموعه ای آرام از خطوط اعمال شده به کد فروشنده -
none
برای نادیده گرفتن همه هشدارها و خطاهای پرز
نسخه
edition
نسخه Rust را برای کامپایل کردن این کد تعریف می کند. این شبیه به نسخه های std برای C و C ++ است. مقادیر معتبر 2015
و 2018
(پیشفرض) هستند.
پرچم ها
flags
شامل یک لیست رشته ای از پرچم ها برای ارسال به rustc
در طول کامپایل است.
ld_flags
ld-flags
حاوی یک لیست رشته ای از پرچم ها است که هنگام کامپایل منبع به پیوند دهنده منتقل می شود. اینها توسط پرچم -C linker-args
rustc منتقل می شوند. clang
به عنوان اتصال دهنده جلویی استفاده می شود و lld
برای پیوند واقعی فراخوانی می کند.
ویژگی ها
features
یک لیست رشته ای از ویژگی هایی است که باید در حین کامپایل فعال شوند. این توسط --cfg 'feature="foo"'
به rustc منتقل می شود. اکثر ویژگی ها افزودنی هستند، بنابراین در بسیاری از موارد این شامل مجموعه ویژگی های کامل مورد نیاز همه ماژول های وابسته است. با این حال، در مواردی که ویژگیها منحصر به یکدیگر هستند، ماژولهای اضافی را در هر فایل ساختی که ویژگیهای متناقضی را ارائه میکند، تعریف کنید.
cfgs
cfgs
حاوی یک لیست رشته ای از پرچم های cfg
است که باید در طول کامپایل فعال شوند. این توسط --cfg foo
و --cfg "fizz=buzz"
به rustc
منتقل می شود.
سیستم ساخت به طور خودکار فلگ های cfg
خاصی را در شرایط خاص تنظیم می کند که در زیر لیست شده است:
ماژول های ساخته شده به عنوان dylib دارای مجموعه
android_dylib
cfg خواهند بود.ماژول هایی که از VNDK استفاده می کنند دارای مجموعه cfg
android_vndk
خواهند بود. این شبیه به تعریف__ANDROID_VNDK__
برای C++ است.
نوار
strip
کنترل می کند که آیا و چگونه فایل خروجی حذف می شود (در صورت وجود). اگر این تنظیم نشده باشد، ماژولهای دستگاه بهطور پیشفرض همه چیز را به جز اشکالزدایی کوچک حذف میکنند. ماژولهای میزبان، بهطور پیشفرض، هیچ نمادی را حذف نمیکنند. مقادیر معتبر شامل none
برای غیرفعال کردن حذف، و all
برای حذف همه چیز، از جمله اطلاعات اشکال زدایی کوچک است. مقادیر اضافی را می توان در مرجع Soong Modules یافت.
host_supported
برای ماژول های دستگاه، پارامتر host_supported
نشان می دهد که آیا ماژول باید یک نوع میزبان را نیز ارائه دهد.
وابستگی های کتابخانه را تعریف کنید
ماژولهای Rust میتوانند از طریق ویژگیهای زیر به کتابخانههای CC و Rust وابسته باشند:
نام ملک | توضیحات |
---|---|
rustlibs | لیست ماژول های rust_library که وابستگی نیز هستند. از این به عنوان روش ترجیحی خود برای اعلام وابستگی ها استفاده کنید، زیرا به سیستم ساخت اجازه می دهد پیوند ترجیحی را انتخاب کند. ( به هنگام پیوند در برابر کتابخانه های Rust ، در زیر مراجعه کنید) |
rlibs | فهرستی از ماژولهای rust_library که باید به صورت rlibs به صورت ایستا پیوند داده شوند. (با احتیاط استفاده کنید؛ هنگام پیوند در برابر کتابخانه های Rust ، در زیر ببینید.) |
shared_libs | لیست ماژول های cc_library که باید به صورت پویا به عنوان کتابخانه های مشترک پیوند داده شوند. |
static_libs | لیست ماژول های cc_library که باید به صورت ایستا به عنوان کتابخانه های ایستا پیوند داده شوند. |
whole_static_libs | فهرستی از ماژولهای cc_library که باید بهعنوان کتابخانههای استاتیک بهصورت ایستا پیوند داده شوند و بهطور کامل در کتابخانه بهدستآمده گنجانده شوند. برای انواع rust_ffi_static ، whole_static_libraries در آرشیو کتابخانه ایستا به دست میآیند. برای انواع rust_library_rlib ، کتابخانه های whole_static_libraries در کتابخانه rlib حاصل جمع می شوند. |
هنگام پیوند در برابر کتابخانه های Rust ، به عنوان بهترین روش، این کار را با استفاده از ویژگی rustlibs
به جای rlibs
یا dylibs
انجام دهید، مگر اینکه دلیل خاصی برای این کار داشته باشید. این به سیستم ساخت اجازه می دهد تا پیوند صحیح را بر اساس آنچه ماژول ریشه نیاز دارد انتخاب کند، و این احتمال را کاهش می دهد که درخت وابستگی شامل هر دو نسخه rlib
و dylib
یک کتابخانه باشد (که باعث شکست کامپایل می شود).
ویژگی های ساخت پشتیبانی پشتیبانی نشده و محدود
Soong's Rust پشتیبانی محدودی از تصاویر و عکسهای فوری vendor
و vendor_ramdisk
ارائه میکند. با این حال، staticlibs
، cdylibs
، rlibs
و binaries
پشتیبانی می شوند. برای اهداف ساخت تصویر فروشنده، ویژگی android_vndk
cfg
تنظیم شده است. اگر بین اهداف سیستم و فروشنده تفاوت هایی وجود دارد، می توانید از این در کد استفاده کنید. rust_proc_macros
به عنوان بخشی از عکس های فوری فروشنده گرفته نمی شوند. اگر به اینها بستگی دارد، مطمئن شوید که به طور مناسب آنها را کنترل کنید.
تصاویر محصول، VNDK و بازیابی پشتیبانی نمی شوند.
ساخت های افزایشی
توسعه دهندگان می توانند با تنظیم متغیر محیطی SOONG_RUSTC_INCREMENTAL
روی true
کامپایل تدریجی منبع Rust را فعال کنند.
اخطار : تضمینی برای تولید باینریهایی که مشابه آنهایی که توسط buildbots ایجاد میشوند، وجود ندارد. آدرس توابع یا داده های موجود در فایل های شی ممکن است متفاوت باشد. برای اطمینان از اینکه مصنوعات تولید شده 100٪ با موارد ساخته شده توسط زیرساخت EngProd یکسان هستند، این مقدار را تنظیم نشده بگذارید.