Z założenia pliki Android.bp
są proste. Nie zawierają instrukcji warunkowych ani instrukcji przepływu sterującego; cała złożoność jest obsługiwana przez logikę kompilacji napisaną w Go. Jeśli to możliwe, składnia i semantyka plików Android.bp
są podobne do plików Bazel BUILD .
Moduły
Moduł w pliku Android.bp
zaczyna się od typu modułu , po którym następuje zestaw właściwości w name: "value",
format:
cc_binary {
name: "gzip",
srcs: ["src/test/minigzip.c"],
shared_libs: ["libz"],
stl: "none",
}
Każdy moduł musi mieć właściwość name
, a wartość musi być unikatowa we wszystkich plikach Android.bp
, z wyjątkiem wartości właściwości name
w przestrzeniach nazw i gotowych modułach, które mogą się powtarzać.
Właściwość srcs
określa pliki źródłowe użyte do zbudowania modułu w postaci listy ciągów znaków. Możesz odwoływać się do danych wyjściowych innych modułów tworzących pliki źródłowe, takich jak genrule
lub filegroup
, używając składni odniesienia do modułu ":<module-name>"
.
Aby zapoznać się z listą prawidłowych typów modułów i ich właściwości, zobacz Dokumentacja modułów Soong .
Typy
Zmienne i właściwości są silnie typowane, ze zmiennymi dynamicznie opartymi na pierwszym przypisaniu, a właściwości ustawiane statycznie przez typ modułu. Obsługiwane typy to:
- Wartości logiczne (
true
lubfalse
) - Liczby całkowite (
int
) - Ciągi znaków (
"string"
) - Listy ciągów (
["string1", "string2"]
) - Mapy (
{key1: "value1", key2: ["value2"]}
)
Mapy mogą zawierać wartości dowolnego typu, w tym mapy zagnieżdżone. Listy i mapy mogą zawierać przecinki po ostatniej wartości.
Globy
Właściwości pobierające listę plików, takie jak srcs
, mogą również przyjmować wzorce globalne. Wzorce globów mogą zawierać normalne symbole wieloznaczne UNIX *
, na przykład *.java
. Wzorce glob mogą również zawierać pojedynczy symbol wieloznaczny **
jako element ścieżki, który pasuje do zera lub większej liczby elementów ścieżki. Na przykład java/**/*.java
dopasowuje wzorce java/Main.java
i java/com/android/Main.java
.
Zmienne
Plik Android.bp
może zawierać przypisania zmiennych najwyższego poziomu:
gzip_srcs = ["src/test/minigzip.c"],
cc_binary {
name: "gzip",
srcs: gzip_srcs,
shared_libs: ["libz"],
stl: "none",
}
Zmienne są ograniczone do pozostałej części pliku, w którym są zadeklarowane, a także do wszelkich podrzędnych plików Blueprint. Zmienne są niezmienne z jednym wyjątkiem: można do nich dołączyć przypisanie +=
, ale tylko przed odwołaniem do nich.
Uwagi
Pliki Android.bp
mogą zawierać wielowierszowe /* */
komentarze w stylu C i jednowierszowe //
w stylu C++.
Operatorzy
Ciągi, listy ciągów i mapy można dołączać za pomocą operatora +. Liczby całkowite można podsumować za pomocą operatora +
. Dołączenie mapy powoduje utworzenie unii kluczy na obu mapach, poprzez dodanie wartości dowolnych kluczy obecnych na obu mapach.
Warunki
Soong nie obsługuje warunków warunkowych w plikach Android.bp
. Zamiast tego złożoność reguł kompilacji, która wymagałaby warunków warunkowych, jest obsługiwana w Go, gdzie można używać funkcji języka wysokiego poziomu i można śledzić niejawne zależności wprowadzone przez warunki. Większość warunków warunkowych jest konwertowana na właściwość mapy, gdzie wybierana jest jedna z wartości na mapie i dołączana do właściwości najwyższego poziomu.
Na przykład, aby obsługiwać pliki specyficzne dla architektury:
cc_library {
...
srcs: ["generic.cpp"],
arch: {
arm: {
srcs: ["arm.cpp"],
},
x86: {
srcs: ["x86.cpp"],
},
},
}
Formater
Soong zawiera kanoniczny formater plików Blueprint, podobny do gofmt . Aby rekurencyjnie sformatować wszystkie pliki Android.bp
w bieżącym katalogu, uruchom:
bpfmt -w .
Format kanoniczny obejmuje wcięcia z czterema spacjami, nowe linie po każdym elemencie listy wieloelementowej oraz końcowy przecinek na listach i mapach.