โมดูลคลัง

โมดูลไลบรารี Rust มี 2 ประเภท ได้แก่ โมดูลที่สร้างไลบรารี Rust และโมดูลที่สร้างไลบรารีที่ใช้ร่วมกับ C ได้ นอกจากนี้ คุณยังพิจารณามาโครแบบโพรซีเดอรัลของ Rust (proc-macros) เป็นไลบรารีประเภทพิเศษ เพื่อวัตถุประสงค์ของระบบบิลด์ได้ด้วย

rust_library

โมดูล rust_library จะสร้างไลบรารี Rust เพื่อให้โมดูล Rust อื่นๆ ใช้

นอกจากตัวแปร _host แล้ว ไลบรารี Rust ยังมีประเภทโมดูลที่ควบคุม การลิงก์ที่ใช้ได้

ประเภทโมดูลไลบรารี Rust คำจำกัดความ
rust_library มีทั้งไลบรารี 2 รูปแบบ ได้แก่ rlib และ dylib AOSP ขอแนะนำให้ใช้โมดูลประเภทนี้สำหรับไลบรารี Rust เนื่องจากจะช่วยให้โมดูลทำงานได้อย่างถูกต้องเมื่อแสดงเป็นทรัพยากร Dependency ภายใต้พร็อพเพอร์ตี้ rustlibs
rust_library_rlib มีเฉพาะrlibไลบรารี Rust โมดูลที่มีเฉพาะตัวแปร rlib ไม่รับประกันว่าจะทำงานร่วมกับพร็อพเพอร์ตี้ rustlibs ได้
rust_library_dylib มีเฉพาะไลบรารี Rust เวอร์ชัน dylib โมดูลที่มีเฉพาะเวอร์ชัน dylib ไม่รับประกันว่าจะทำงานกับพร็อพเพอร์ตี้ rustlibs ได้

rust_ffi

โมดูล rust_ffi จะสร้างไลบรารีที่ใช้ร่วมกับ C ได้เพื่อทำงานร่วมกับโมดูล CC

นอกเหนือจากตัวแปร _host แล้ว ไลบรารี Rust FFI ยังมีประเภทโมดูลที่ควบคุมการลิงก์ที่ใช้ได้ ซึ่งแสดงในตารางต่อไปนี้

ประเภทโมดูลไลบรารี Rust FFI คำจำกัดความ
rust_ffi มีทั้งไลบรารี C แบบคงที่และแบบแชร์
rust_ffi_shared มีเฉพาะตัวแปรไลบรารีที่ใช้ร่วมกันของ C
rust_ffi_static มีเฉพาะตัวแปรไลบรารีแบบคงที่ของ C

ดูตัวอย่างพื้นฐานของการใช้ rust_ffi เพื่อเรียกใช้ Rust จาก C ได้ที่หน้ารูปแบบ Rust ของ Android

ดูข้อมูลเกี่ยวกับการใช้งานขั้นสูงเพิ่มเติมได้ที่เอกสารประกอบอย่างเป็นทางการของ 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 พร็อพเพอร์ตี้ 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 เสมอ

การลิงก์ที่ใช้สำหรับทรัพยากร Dependency ของ rustlibs จะขึ้นอยู่กับ ค่ากำหนดการลิงก์ของโมดูลราก (เช่น rust_binary ที่มี prefer_rlib: true จะ ใช้ตัวแปรของไลบรารี Rust ที่ลิงก์ rustlibs เป็น rlibs)

rlibs มีทั้งตัวแปรการลิงก์แบบไดนามิกและแบบคงที่ libstd เพื่ออนุญาตให้สร้างโมดูลการอ้างอิงรูทที่ไม่ต้องอาศัยไลบรารี Rust แบบไดนามิก (เช่น ไฟล์ปฏิบัติการแบบคงที่) Soong จะลิงก์ตัวแปรที่ถูกต้องโดยอัตโนมัติ