Формат файла Android.bp

По своей конструкции файлы 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 .

Канонический формат включает отступы в четыре пробела, новые строки после каждого элемента многоэлементного списка и завершающую запятую в списках и картах.