По своей конструкции файлы Android.bp
просты. Они не содержат условных обозначений или операторов потока управления; вся сложность решается логикой сборки, написанной на Go. Когда это возможно, синтаксис и семантика файлов Android.bp
аналогичны файлам Bazel BUILD .
Модули
Модуль в файле 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"]}
)
Карты могут содержать значения любого типа, включая вложенные карты. Списки и карты могут иметь запятые после последнего значения.
Глобы
Свойства, которые принимают список файлов, например srcs
, также могут использовать шаблоны glob. Шаблоны Glob могут содержать обычный подстановочный знак UNIX *
, например *.java
. Шаблоны Glob также могут содержать один подстановочный знак **
в качестве элемента пути, который соответствует нулю или более элементам пути. Например, 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++.
Операторы
Строки, списки строк и карты можно добавлять с помощью оператора +. Целые числа можно суммировать с помощью оператора +
. Добавление карты приводит к объединению ключей в обеих картах, добавляя значения всех ключей, присутствующих в обеих картах.
Условные предложения
Сунг не поддерживает условные выражения в файлах Android.bp
. Вместо этого сложность правил сборки, которые требуют условных операторов, обрабатывается в Go, где можно использовать функции языка высокого уровня и отслеживать неявные зависимости, вносимые условными выражениями. Большинство условных выражений преобразуются в свойство карты, где одно из значений на карте выбирается и добавляется к свойствам верхнего уровня.
Например, для поддержки файлов, зависящих от архитектуры:
cc_library {
...
srcs: ["generic.cpp"],
arch: {
arm: {
srcs: ["arm.cpp"],
},
x86: {
srcs: ["x86.cpp"],
},
},
}
форматтер
Soong включает в себя канонический форматтер для файлов Blueprint, аналогичный gofmt . Чтобы рекурсивно переформатировать все файлы Android.bp
в текущем каталоге, выполните:
bpfmt -w .
Канонический формат включает отступы в четыре пробела, новые строки после каждого элемента многоэлементного списка и завершающую запятую в списках и картах.