ไฟล์ Android.bp
ได้รับการออกแบบมาให้ใช้งานง่าย โดยไม่มี
คำสั่งแบบมีเงื่อนไขหรือคำสั่งควบคุมโฟลว์
ตรรกะการบิลด์ที่เขียนด้วยภาษา Go จะจัดการความซับซ้อนทั้งหมด
โมดูล
โมดูลในไฟล์ Android.bp
จะเริ่มต้นด้วย
ประเภทโมดูล
ตามด้วยชุดพร็อพเพอร์ตี้ในรูปแบบ name: "value",
cc_binary {
name: "gzip",
srcs: ["src/test/minigzip.c"],
shared_libs: ["libz"],
stl: "none",
}
ทุกโมดูลต้องมีพร็อพเพอร์ตี้ name
และค่าต้องไม่ซ้ำกันในไฟล์ Android.bp
ทั้งหมด ยกเว้นค่าพร็อพเพอร์ตี้ name
ในเนมสเปซและโมดูลที่สร้างไว้ล่วงหน้า ซึ่งอาจซ้ำกันได้
พร็อพเพอร์ตี้ srcs
จะระบุไฟล์แหล่งที่มาที่ใช้ในการสร้างโมดูลเป็นรายการสตริง คุณอ้างอิงเอาต์พุตของโมดูลอื่นๆ ที่สร้างไฟล์ต้นฉบับ เช่น genrule
หรือ filegroup
ได้โดยใช้ไวยากรณ์การอ้างอิงโมดูล ":<module-name>"
ดูรายการประเภทโมดูลที่ถูกต้องและพร็อพเพอร์ตี้ของโมดูลได้ที่ข้อมูลอ้างอิงโมดูล Soong
ประเภท
ตัวแปรและพร็อพเพอร์ตี้เป็นแบบกำหนดประเภทอย่างเข้มงวด โดยตัวแปรจะเปลี่ยนแปลงแบบไดนามิกตาม การกำหนดครั้งแรก และพร็อพเพอร์ตี้จะตั้งค่าแบบคงที่ตามประเภทโมดูล ประเภทที่รองรับมีดังนี้
- บูลีน (
true
หรือfalse
) - จำนวนเต็ม (
int
) - สตริง (
"string"
) - รายการสตริง (
["string1", "string2"]
) - แผนที่ (
{key1: "value1", key2: ["value2"]}
)
แผนที่อาจมีค่าประเภทใดก็ได้ รวมถึงแผนที่ที่ซ้อนกัน รายการและแผนที่อาจมีคอมมาต่อท้ายหลังจากค่าสุดท้าย
Globs
พร็อพเพอร์ตี้ที่ใช้รายการไฟล์ เช่น srcs
สามารถใช้รูปแบบ Glob
ได้ด้วย รูปแบบ Glob สามารถมีไวลด์การ์ด UNIX ปกติ *
ได้ เช่น
*.java
รูปแบบ Glob ยังมีไวลด์การ์ด **
เดียวเป็นองค์ประกอบเส้นทางได้ด้วย ซึ่งจะตรงกับองค์ประกอบเส้นทางตั้งแต่ 0 รายการขึ้นไป เช่น java/**/*.java
จะตรงกับทั้งรูปแบบ java/Main.java
และ java/com/android/Main.java
ตัวแปร
Android.bp
ไฟล์อาจมีการกำหนดตัวแปรระดับบนสุดดังนี้
gzip_srcs = ["src/test/minigzip.c"],
cc_binary {
name: "gzip",
srcs: gzip_srcs,
shared_libs: ["libz"],
stl: "none",
}
ตัวแปรจะมีขอบเขตครอบคลุมส่วนที่เหลือของไฟล์ที่ประกาศตัวแปรนั้น รวมถึงไฟล์ Blueprint ย่อยด้วย
ตัวแปรจะเปลี่ยนแปลงไม่ได้ ยกเว้นกรณีเดียวคือ
สามารถต่อท้ายด้วยการกำหนดค่า +=
แต่จะทำได้ก็ต่อเมื่อยังไม่ได้
อ้างอิงตัวแปร
ความคิดเห็น
ไฟล์ Android.bp
สามารถมีความคิดเห็นแบบหลายบรรทัดสไตล์ C /* */
และความคิดเห็นแบบบรรทัดเดียวสไตล์ C++
//
ผู้ให้บริการ
คุณสามารถผนวกสตริง รายการสตริง และแมปได้โดยใช้โอเปอเรเตอร์ +
คุณสามารถหาผลรวมของจำนวนเต็มได้โดยใช้โอเปอเรเตอร์ +
การต่อท้ายแมปจะสร้าง
การรวมคีย์ในทั้ง 2 แมป โดยต่อท้ายค่าของคีย์ที่อยู่ใน
ทั้ง 2 แมป
โมดูลเริ่มต้น
นักพัฒนาแอปสามารถใช้โมดูลค่าเริ่มต้น เพื่อใช้พร็อพเพอร์ตี้เดียวกันซ้ำในหลายโมดูล เช่น
cc_defaults {
name: "gzip_defaults",
shared_libs: ["libz"],
stl: "none",
}
cc_binary {
name: "gzip",
defaults: ["gzip_defaults"],
srcs: ["src/test/minigzip.c"],
}
โมดูลที่สร้างไว้ล่วงหน้า
โมดูลสำเร็จรูปบางประเภทอนุญาตให้โมดูลมีชื่อเดียวกันกับ
โมดูลที่อิงตามแหล่งที่มา เช่น อาจมี cc_prebuilt_binary
ชื่อ foo
เมื่อมี cc_binary
ที่มีชื่อเดียวกันอยู่แล้ว ซึ่งช่วยให้นักพัฒนาแอปเลือกเวอร์ชันที่จะรวมไว้ในผลิตภัณฑ์ขั้นสุดท้ายได้
อย่างยืดหยุ่น หากการกำหนดค่าบิลด์มีทั้ง 2 เวอร์ชัน ค่าของแฟล็ก prefer
ในการกำหนดโมดูลที่สร้างไว้ล่วงหน้าจะกำหนดว่าเวอร์ชันใดมีความสำคัญมากกว่า
โปรดทราบว่าโมดูลที่สร้างไว้ล่วงหน้าบางโมดูลมีชื่อที่ไม่ได้ขึ้นต้นด้วย prebuilt
เช่น android_app_import
โมดูลเนมสเปซ
จนกว่า Android จะเปลี่ยนจาก Make เป็น Soong อย่างสมบูรณ์ การกำหนดค่าผลิตภัณฑ์ Make
ต้องระบุค่า PRODUCT_SOONG_NAMESPACES
ค่าควรเป็นรายการเนมสเปซที่คั่นด้วยช่องว่างซึ่ง Soong ส่งออกไปยัง Make เพื่อให้สร้างโดยคำสั่ง m
หลังจากที่ Android แปลงเป็น Soong เสร็จสมบูรณ์แล้ว
รายละเอียดของการเปิดใช้เนมสเปซอาจมีการเปลี่ยนแปลง
Soong ช่วยให้โมดูลในไดเรกทอรีต่างๆ ระบุชื่อเดียวกันได้ ตราบใดที่โมดูลแต่ละโมดูลประกาศภายในเนมสเปซแยกต่างหาก นักพัฒนาแอปสามารถประกาศเนมสเปซได้โดยทำดังนี้
soong_namespace {
imports: ["path/to/otherNamespace1", "path/to/otherNamespace2"],
}
โปรดทราบว่าเนมสเปซไม่มีพร็อพเพอร์ตี้ name
ระบบจะกำหนดเส้นทางเป็นชื่อโดยอัตโนมัติ
โมดูล Soong แต่ละโมดูลจะได้รับการกำหนดเนมสเปซตามตำแหน่งในโครงสร้าง
โมดูล Soong แต่ละโมดูลจะถือว่าอยู่ในเนมสเปซที่กำหนดโดย soong_namespace
ที่พบในไฟล์ Android.bp
ในไดเรกทอรีปัจจุบันหรือไดเรกทอรีบรรพบุรุษที่ใกล้ที่สุด หากไม่พบโมดูล soong_namespace
ดังกล่าว ระบบจะถือว่าโมดูลอยู่ในเนมสเปซรูทโดยนัย
ตัวอย่างเช่น Soong พยายามแก้ไขการอ้างอิง D ที่ประกาศโดยโมดูล M ในเนมสเปซ N ที่นำเข้าเนมสเปซ I1, I2, I3…
- จากนั้นหาก D เป็นชื่อที่สมบูรณ์ในรูปแบบ
//namespace:module
ระบบจะค้นหาเฉพาะเนมสเปซที่ระบุสำหรับชื่อโมดูลที่ระบุ - ไม่เช่นนั้น Soong จะค้นหาโมดูลชื่อ D ที่ประกาศในเนมสเปซ N ก่อน
- หากไม่มีโมดูลดังกล่าว Soong จะค้นหาโมดูลชื่อ D ใน เนมสเปซ I1, I2, I3…
- Soong จะค้นหาในเนมสเปซรูท
Conditional
Soong ไม่รองรับเงื่อนไขในไฟล์ Android.bp
แต่ความซับซ้อนในกฎการสร้างที่ต้องใช้เงื่อนไขจะได้รับการจัดการใน Go
ซึ่งสามารถใช้ฟีเจอร์ภาษาในระดับสูงและติดตามการอ้างอิงโดยนัย
ที่เกิดจากเงื่อนไขได้ ระบบจะแปลงเงื่อนไขส่วนใหญ่เป็นพร็อพเพอร์ตี้แผนที่ โดยจะเลือกค่าใดค่าหนึ่งในแผนที่และต่อท้าย
พร็อพเพอร์ตี้ระดับบนสุด
เช่น หากต้องการรองรับไฟล์เฉพาะสถาปัตยกรรม ให้ทำดังนี้
cc_library {
...
srcs: ["generic.cpp"],
arch: {
arm: {
srcs: ["arm.cpp"],
},
x86: {
srcs: ["x86.cpp"],
},
},
}
Formatter
Soong มีโปรแกรมจัดรูปแบบมาตรฐานสำหรับไฟล์ Blueprint ซึ่งคล้ายกับ gofmt หากต้องการจัดรูปแบบไฟล์
Android.bp
ทั้งหมดในไดเรกทอรีปัจจุบันแบบเรียกซ้ำ ให้เรียกใช้คำสั่งต่อไปนี้
bpfmt -w .
รูปแบบ Canonical มีการเยื้อง 4 ช่องว่าง บรรทัดใหม่หลังทุกองค์ประกอบ ของรายการที่มีหลายองค์ประกอบ และคอมมาต่อท้ายในรายการและแผนที่