หลักการทั่วไปคือ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 | สร้างไลบรารี C ของ Rust ที่โมดูล 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 บางรายการ | หน้าโมดูล 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
ตั้งค่าข้อมูลเมตาของชื่อลังผ่าน --crate_name
ของ rustc
แจ้ง สําหรับโมดูลที่สร้างไลบรารี ค่านี้ต้องตรงกับชื่อ crate ที่คาดไว้ซึ่งใช้ในแหล่งที่มา ตัวอย่างเช่น หากมีการอ้างอิงโมดูล 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
ชุดโปรแกรมตรวจภาษาเริ่มต้น โดยขึ้นอยู่กับตำแหน่งของโมดูลandroid
ชุด Lint ที่เข้มงวดที่สุดที่ใช้กับโค้ดแพลตฟอร์ม Android ทั้งหมดvendor
ชุดการตรวจสอบโค้ดแบบผ่อนปรนที่ใช้กับโค้ดของผู้ให้บริการnone
เพื่อละเว้นคำเตือนและข้อผิดพลาดจาก Lint ทั้งหมด
โปรแกรมลบลิงก์
นอกจากนี้ โปรแกรมวิเคราะห์เนื้อหาแบบคลิปก็ จะทำงานโดยค่าเริ่มต้นสำหรับโมดูลทุกประเภท ยกเว้นโปรแกรมสร้างแหล่งที่มา ผ้าขนสัตว์ 2-3 ชุด ได้รับการกำหนดซึ่งใช้เพื่อตรวจสอบแหล่งที่มาของโมดูล ค่าที่เป็นไปได้มีดังนี้
default
ชุด lint เริ่มต้นโดยขึ้นอยู่กับตำแหน่งของโมดูลandroid
ชุด Lint ที่เข้มงวดที่สุดที่ใช้กับโค้ดแพลตฟอร์ม Android ทั้งหมดvendor
ชุดการตรวจสอบโค้ดแบบผ่อนปรนที่ใช้กับโค้ดของผู้ให้บริการnone
เพื่อละเว้นคำเตือนและข้อผิดพลาดจาก Lint ทั้งหมด
ฉบับ
edition
กำหนดรุ่น Rust ที่จะใช้ในการคอมไพล์โค้ดนี้ ซึ่งคล้ายกับเวอร์ชัน std สําหรับ C และ C++ ค่าที่ใช้ได้คือ 2015
และ 2018
(ค่าเริ่มต้น)
แฟล็ก
flags
มีรายการสตริงของแฟล็กที่จะส่งไปยัง rustc
ระหว่างการคอมไพล์
ld_flags
ld-flags
มีรายการสตริงของแฟล็กที่จะส่งไปยัง Linker เมื่อคอมไพล์
แหล่งที่มา ซึ่งจะส่งผ่านโดย-C linker-args
Flag rustc มีการใช้ 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
เพื่อลบข้อมูลทั้งหมด รวมถึง mini debuginfo
ค่าเพิ่มเติมได้ใน
ข้อมูลอ้างอิงเกี่ยวกับโมดูล Soong
host_supported
สำหรับโมดูลอุปกรณ์ พารามิเตอร์ 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 สร้างขึ้น ไม่ต้องระบุค่านี้