Secara desain, file Android.bp sangat mudah. File ini tidak berisi pernyataan bersyarat atau alur kontrol; semua kompleksitas ditangani oleh logika build yang ditulis dalam Go.
Modul
Modul dalam file Android.bp dimulai dengan jenis modul yang diikuti oleh kumpulan
properti dalam format name: "value",:
cc_binary {
name: "gzip",
srcs: ["src/test/minigzip.c"],
shared_libs: ["libz"],
stl: "none",
}
Setiap modul harus memiliki properti name, dan nilainya harus unik di semua file Android.bp, kecuali untuk nilai properti name di namespace dan modul bawaan, yang mungkin berulang.
Properti srcs menentukan file sumber yang digunakan untuk membangun modul, sebagai daftar string. Anda dapat mereferensikan output modul lain yang menghasilkan
file sumber, seperti genrule atau filegroup, dengan menggunakan sintaksis referensi modul
":<module-name>".
Untuk mengetahui daftar jenis modul yang valid dan propertinya, lihat Referensi Modul Soong yang dihasilkan dengan menjalankan m soong_docs. Output akan berada di out/soong/docs/soong_build.html.
Jenis
Variabel dan properti memiliki jenis yang kuat, dengan variabel yang ditetapkan secara dinamis berdasarkan tugas pertama, dan properti yang ditetapkan secara statis berdasarkan jenis modul. Jenis yang didukung adalah:
- Boolean (
trueataufalse) - Bilangan bulat (
int) - String (
"string") - Daftar string (
["string1", "string2"]) - Peta (
{key1: "value1", key2: ["value2"]})
Peta dapat berisi nilai dari jenis apa pun, termasuk peta bertingkat. Daftar dan peta dapat memiliki koma di akhir setelah nilai terakhir.
Glob
Properti yang menggunakan daftar file, seperti srcs, juga dapat menggunakan pola glob. Pola glob dapat berisi karakter pengganti UNIX normal *, misalnya
*.java. Pola glob juga dapat berisi satu karakter pengganti ** sebagai elemen jalur, yang cocok dengan nol atau beberapa elemen jalur. Misalnya, java/**/*.java cocok dengan pola java/Main.java dan java/com/android/Main.java.
Variabel
File Android.bp dapat berisi tugas variabel tingkat atas:
gzip_srcs = ["src/test/minigzip.c"],
cc_binary {
name: "gzip",
srcs: gzip_srcs,
shared_libs: ["libz"],
stl: "none",
}
Variabel dicakup ke bagian file yang dideklarasikan, serta file Blueprint turunan. Variabel tidak dapat diubah dengan satu pengecualian: variabel dapat ditambahkan dengan tugas +=, tetapi hanya sebelum direferensikan.
Komentar
File Android.bp dapat berisi komentar multi-baris gaya C /* */ dan komentar satu baris gaya C++ //.
Operator
String, daftar string, dan peta dapat ditambahkan menggunakan operator +.
Bilangan bulat dapat dijumlahkan menggunakan operator +. Menambahkan peta akan menghasilkan gabungan kunci di kedua peta, menambahkan nilai kunci apa pun yang ada di kedua peta.
Modul default
Developer dapat menggunakan modul default untuk mengulang properti yang sama di beberapa modul. Contoh:
cc_defaults {
name: "gzip_defaults",
shared_libs: ["libz"],
stl: "none",
}
cc_binary {
name: "gzip",
defaults: ["gzip_defaults"],
srcs: ["src/test/minigzip.c"],
}
Modul bawaan
Beberapa jenis modul bawaan memungkinkan modul memiliki nama yang sama dengan modul berbasis sumbernya. Misalnya, dapat ada cc_prebuilt_binary bernama foo jika sudah ada cc_binary dengan nama yang sama. Hal ini memberi developer fleksibilitas untuk memilih versi yang akan disertakan dalam produk akhir mereka. Jika konfigurasi build berisi kedua versi, nilai flag prefer dalam definisi modul bawaan akan menentukan versi mana yang diprioritaskan.
Perhatikan bahwa beberapa modul bawaan memiliki nama yang tidak diawali dengan prebuilt, seperti android_app_import.
Modul namespace
Hingga Android sepenuhnya dikonversi dari Make ke Soong, konfigurasi produk Make harus menentukan nilai PRODUCT_SOONG_NAMESPACES. Nilainya harus berupa daftar namespace yang dipisahkan spasi yang diekspor Soong ke Make untuk dibangun oleh perintah m. Setelah konversi Android ke Soong selesai, detail pengaktifan namespace dapat berubah.
Soong memberikan kemampuan bagi modul di direktori yang berbeda untuk menentukan nama yang sama, selama setiap modul dideklarasikan dalam namespace terpisah. Developer dapat mendeklarasikan namespace:
soong_namespace {
imports: ["path/to/otherNamespace1", "path/to/otherNamespace2"],
}
Perhatikan bahwa namespace tidak memiliki properti name; jalur namespace otomatis ditetapkan sebagai namanya.
Setiap modul Soong diberi namespace berdasarkan lokasinya di pohon.
Setiap modul Soong dianggap berada di namespace yang ditentukan oleh soong_namespace yang ditemukan dalam file Android.bp di direktori saat ini atau direktori induk terdekat. Jika tidak ada modul soong_namespace seperti itu yang ditemukan, modul tersebut dianggap berada di namespace root implisit.
Berikut contohnya: Soong mencoba menyelesaikan dependensi D yang dideklarasikan oleh modul M di namespace N yang mengimpor namespace I1, I2, I3…
- Kemudian, jika D adalah nama yang sepenuhnya memenuhi syarat dalam bentuk
//namespace:module, hanya namespace yang ditentukan yang akan ditelusuri untuk nama modul yang ditentukan. - Jika tidak, Soong akan mencari modul bernama D yang dideklarasikan di namespace N.
- Jika modul tersebut tidak ada, Soong akan mencari modul bernama D di namespace I1, I2, I3…
- Soong mencari di namespace root.
Bersyarat
Soong tidak mendukung pernyataan bersyarat dalam file Android.bp. Sebagai gantinya, kompleksitas dalam aturan build yang memerlukan pernyataan bersyarat ditangani di Go, tempat fitur bahasa tingkat tinggi dapat digunakan, dan dependensi implisit yang diperkenalkan oleh pernyataan bersyarat dapat dilacak. Sebagian besar pernyataan bersyarat dikonversi menjadi properti peta, dengan salah satu nilai dalam peta dipilih dan ditambahkan ke properti tingkat atas.
Misalnya, untuk mendukung file khusus arsitektur:
cc_library {
...
srcs: ["generic.cpp"],
arch: {
arm: {
srcs: ["arm.cpp"],
},
x86: {
srcs: ["x86.cpp"],
},
},
}
Pemformat
Soong menyertakan pemformat kanonis untuk file Blueprint, mirip dengan
gofmt. Untuk memformat ulang semua file Android.bp secara rekursif di direktori saat ini, jalankan:
bpfmt -w .
Format kanonis mencakup indentasi empat spasi, baris baru setelah setiap elemen daftar multi-elemen, dan koma di akhir dalam daftar dan peta.