ตามหลักการทั่วไป คําจํากัดความของโมดูล 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 มาตรฐาน | หน้าโมดูลทดสอบ |
rust_fuzz | ทำให้เกิดการใช้ประโยชน์จากไบนารี Fuzz Rust
libfuzzer |
ตัวอย่างโมดูล rust_fuzz |
rust_protobuf | สร้างแหล่งที่มาและทำให้เกิด Rust ไลบรารีที่มีอินเทอร์เฟซสำหรับ Protobuf โดยเฉพาะ | หน้าโมดูลโปรโตคอลและเครื่องมือสร้างแหล่งที่มา |
rust_bindgen | สร้างแหล่งที่มาและสร้าง ไลบรารี Rust ที่มีการเชื่อมโยง Rust กับไลบรารี C | โมดูลการเชื่อมโยง Bindgen และหน้าเครื่องมือสร้างแหล่งที่มา |
พร็อพเพอร์ตี้ทั่วไปที่สำคัญ
พร็อพเพอร์ตี้เหล่านี้เหมือนกันใน Rust ทั้งหมดของ Android โมดูล พร็อพเพอร์ตี้เพิ่มเติม (ไม่ซ้ำกัน) ใดๆ ที่เกี่ยวข้องกับบุคคลธรรมดา โมดูล 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.*
src
srcs
มีไฟล์ต้นฉบับไฟล์เดียวที่แสดงจุดแรกเข้าไปยัง
โมดูล (ปกติจะเป็น main.rs
หรือ lib.rs
) rustc
จะจัดการความละเอียดและ
ค้นพบไฟล์ต้นฉบับอื่นๆ ทั้งหมดที่จำเป็นสำหรับการคอมไพล์ และไฟล์เหล่านี้
ระบุในไฟล์ deps
ที่สร้างขึ้น
หากเป็นไปได้ ให้หลีกเลี่ยงการใช้โค้ดแพลตฟอร์มนี้ ดู เครื่องมือสร้างแหล่งที่มา เพื่อดูข้อมูลเพิ่มเติม
ชื่อลัง
crate_name
ตั้งค่าข้อมูลเมตาของชื่อลังผ่าน --crate_name
ของ rustc
แจ้ง สำหรับโมดูลที่สร้างไลบรารี พารามิเตอร์นี้ต้องตรงกับที่คาดไว้
ชื่อลังที่ใช้ในแหล่งที่มา ตัวอย่างเช่น หากมีการอ้างอิงโมดูล 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
และชื่อไฟล์เอาต์พุต สำหรับข้อมูลเพิ่มเติม โปรดดู
โมดูลไลบรารี
Lints
rustc Linter จะทำงานโดยค่าเริ่มต้นสำหรับโมดูลทุกประเภท ยกเว้นโปรแกรมสร้างแหล่งที่มา ชุด Lint บางส่วน ได้รับการกำหนดไว้และใช้เพื่อตรวจสอบแหล่งที่มาของโมดูล ค่าที่เป็นไปได้สำหรับ Lint ดังกล่าว ดังนี้
default
ชุด Lint เริ่มต้นโดยขึ้นอยู่กับตำแหน่งของโมดูลandroid
ชุด Lint ที่เข้มงวดที่สุดที่ใช้กับโค้ดแพลตฟอร์ม Android ทั้งหมดvendor
ชุด Lint แบบผ่อนคลายที่ใช้กับโค้ดของผู้ให้บริการnone
เพื่อเพิกเฉยต่อคำเตือนและข้อผิดพลาดทั้งหมดของ Lint
โปรแกรมลบลิงก์
นอกจากนี้ โปรแกรมวิเคราะห์เนื้อหาแบบคลิปก็ จะทำงานโดยค่าเริ่มต้นสำหรับโมดูลทุกประเภท ยกเว้นโปรแกรมสร้างแหล่งที่มา ผ้าขนสัตว์ 2-3 ชุด ได้รับการกำหนดซึ่งใช้เพื่อตรวจสอบแหล่งที่มาของโมดูล สิ่งเหล่านี้อาจเป็นไปได้ มีดังนี้
- ชุด Lint เริ่มต้น
default
ชุดโดยขึ้นอยู่กับตำแหน่งของโมดูล android
ชุด Lint ที่เข้มงวดที่สุดที่ใช้กับโค้ดแพลตฟอร์ม Android ทั้งหมดvendor
ชุด Lint แบบผ่อนคลายที่ใช้กับโค้ดของผู้ให้บริการnone
เพื่อเพิกเฉยต่อคำเตือนและข้อผิดพลาดทั้งหมดของ Lint
ฉบับ
edition
กำหนดรุ่น Rust ที่จะใช้สำหรับ
ในการคอมไพล์โค้ดนี้ ซึ่งคล้ายกับเวอร์ชัน STD สำหรับ C และ C++ ค่าที่ถูกต้อง
เท่ากับ 2015
และ 2018
(ค่าเริ่มต้น)
แฟล็ก
flags
มีรายการสตริงของแฟล็กที่จะส่งไปยัง rustc
ระหว่างการคอมไพล์
ld_flags
ld-flags
มีรายการสตริงของแฟล็กที่จะส่งไปยัง Linker เมื่อคอมไพล์
แหล่งที่มา ค่าเหล่านี้ส่งมาโดยธงรัสเซีย -C linker-args
มีการใช้ clang
เป็น
ฟรอนท์เอนด์ของ Linker ซึ่งเรียกใช้ lld
สำหรับการลิงก์จริง
ฟีเจอร์
features
คือรายการสตริงของฟีเจอร์ที่ต้องเปิดใช้ระหว่างการคอมไพล์
รายการนี้ส่งผ่านไปยัง rustc โดย --cfg 'feature="foo"'
ฟีเจอร์ส่วนใหญ่จะเป็นส่วนเสริม
ดังนั้นในหลายกรณี โซลูชันนี้จะประกอบด้วยชุดฟีเจอร์ทั้งหมดซึ่งจำเป็นต้องใช้
โมดูล แต่ในกรณีที่ฟีเจอร์หนึ่งไม่มีให้กัน
กำหนดโมดูลเพิ่มเติมในไฟล์บิลด์ที่มีฟีเจอร์ที่ขัดแย้งกัน
cfgs
cfgs
มีรายการสตริงของแฟล็ก cfg
ที่จะเปิดใช้ระหว่างการคอมไพล์
--cfg foo
และ --cfg "fizz=buzz"
จะส่งข้อมูลนี้ไปให้ rustc
ระบบบิลด์จะตั้งค่าแฟล็ก cfg
บางรายการโดยอัตโนมัติ
รายการด้านล่าง
โมดูลที่สร้างเป็น Dylib จะมีการตั้งค่า
android_dylib
cfgโมดูลที่จะใช้ VNDK จะมีชุด
android_vndk
cfg นี่คือ คล้ายกับ__ANDROID_VNDK__
ของ C++
แถบ
strip
ควบคุมว่าจะมีการตัดไฟล์เอาต์พุตหรือไม่และอย่างไร (หากมี)
หากไม่ได้ตั้งค่า โมดูลอุปกรณ์จะตัดทุกอย่างออกโดยค่าเริ่มต้น ยกเว้นข้อมูลการแก้ไขข้อบกพร่องย่อย
โดยค่าเริ่มต้น โมดูลโฮสต์จะไม่ตัดสัญลักษณ์ใดๆ ออก ค่าที่ถูกต้อง ได้แก่ none
เพื่อปิดใช้การตัด และ all
เพื่อตัดทุกอย่าง รวมถึงข้อมูลการแก้ไขข้อบกพร่องขนาดเล็ก
ค่าเพิ่มเติมได้ใน
ข้อมูลอ้างอิงเกี่ยวกับโมดูล Soong
รองรับโฮสต์
สำหรับโมดูลอุปกรณ์ พารามิเตอร์ host_supported
จะระบุว่าโมดูล
ควรระบุตัวแปรโฮสต์ด้วย
กำหนดทรัพยากร Dependency ของไลบรารี
โมดูล Rust อาจขึ้นอยู่กับทั้ง CC และ Rust ของไลบรารีผ่านพร็อพเพอร์ตี้ต่อไปนี้
ชื่อพร็อพเพอร์ตี้ | คำอธิบาย |
---|---|
rustlibs |
รายการโมดูล rust_library ที่เป็นทรัพยากร Dependency ด้วย ใช้เป็นชื่อ
วิธีในการประกาศทรัพยากร Dependency ที่ต้องการ เนื่องจากช่วยให้ระบบบิลด์
ให้เลือกการลิงก์ที่ต้องการ (ดูเมื่อลิงก์กับไลบรารี 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
เว้นแต่คุณจะมีเหตุผลที่เจาะจงในการดำเนินการดังกล่าว ซึ่งช่วยให้สร้าง
ระบบเพื่อเลือกการลิงก์ที่ถูกต้องโดยพิจารณาจากสิ่งที่โมดูลรูทต้องการ
และลดโอกาสที่แผนผัง Dependency จะมีทั้ง rlib
และ
dylib
เวอร์ชันไลบรารี (ซึ่งจะทำให้การคอมไพล์ล้มเหลว)
ฟีเจอร์บิลด์ที่ไม่รองรับและรับการสนับสนุนแบบจำกัด
Rust ของ Soong ให้การสนับสนุนแบบจำกัดสำหรับ vendor
และ
รูปภาพและสแนปชอต vendor_ramdisk
รายการ อย่างไรก็ตาม staticlibs
, cdylibs
รองรับ rlibs
และ binaries
สำหรับเป้าหมายบิลด์อิมเมจของผู้ให้บริการ
ตั้งค่าพร็อพเพอร์ตี้ android_vndk
cfg
แล้ว คุณใช้คีย์นี้ในโค้ดได้หากมี
ความแตกต่างระหว่างเป้าหมายของระบบและของผู้ให้บริการ rust_proc_macros
ไม่เท่ากับ
ที่บันทึกเป็นส่วนหนึ่งของสแนปชอตผู้ให้บริการ ถ้าบริการเหล่านั้นขึ้นอยู่กับ
ควบคุมเวอร์ชันได้อย่างเหมาะสม
ระบบไม่รองรับรูปภาพผลิตภัณฑ์ VNDK และรูปภาพการกู้คืน
บิลด์ส่วนเพิ่ม
นักพัฒนาซอฟต์แวร์สามารถเปิดใช้การคอมไพล์แบบเพิ่มขึ้นเรื่อยๆ
สั่นโดยการตั้งค่า SOONG_RUSTC_INCREMENTAL
ตัวแปรสภาพแวดล้อมเป็น true
คำเตือน: ไม่มีการรับประกันว่าจะสร้างไบนารีที่เหมือนกับ ที่บิลด์บ็อตสร้างขึ้น ที่อยู่ของฟังก์ชันหรือข้อมูลที่อยู่ใน ไฟล์ออบเจ็กต์อาจแตกต่างกัน หากต้องการตรวจสอบว่าอาร์ติแฟกต์ที่สร้างขึ้นนั้นสมบูรณ์ 100% เหมือนกันกับที่โครงสร้างพื้นฐานของ EngProd สร้างขึ้น ไม่ต้องระบุค่านี้