รูปแบบไฟล์ Android.bp

ไฟล์ 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…

  1. จากนั้นหาก D เป็นชื่อที่สมบูรณ์ในรูปแบบ //namespace:module ระบบจะค้นหาเฉพาะเนมสเปซที่ระบุสำหรับชื่อโมดูลที่ระบุ
  2. ไม่เช่นนั้น Soong จะค้นหาโมดูลชื่อ D ที่ประกาศในเนมสเปซ N ก่อน
  3. หากไม่มีโมดูลดังกล่าว Soong จะค้นหาโมดูลชื่อ D ใน เนมสเปซ I1, I2, I3…
  4. 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 ช่องว่าง บรรทัดใหม่หลังทุกองค์ประกอบ ของรายการที่มีหลายองค์ประกอบ และคอมมาต่อท้ายในรายการและแผนที่