Формат файла 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 , используя синтаксис ссылки на модуль ":" .

Список допустимых типов модулей и их свойств см. в Справочнике модулей 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 и однострочные комментарии // в стиле C++.

Операторы

Строки, списки строк и карты можно добавлять с помощью оператора +. Целые числа можно суммировать с помощью оператора + . Добавление карты создает объединение ключей в обеих картах, добавляя значения любых ключей, которые присутствуют в обеих картах.

Условные предложения

Soong не поддерживает условные операторы в файлах Android.bp . Вместо этого сложность правил сборки, требующих условных операторов, обрабатывается в Go, где можно использовать высокоуровневые языковые возможности и отслеживать неявные зависимости, введенные условными операторами. Большинство условных операторов преобразуются в свойство карты, где одно из значений в карте выбирается и добавляется к свойствам верхнего уровня.

Например, для поддержки файлов, специфичных для архитектуры:

cc_library {
    ...
    srcs: ["generic.cpp"],
    arch: {
        arm: {
            srcs: ["arm.cpp"],
        },
        x86: {
            srcs: ["x86.cpp"],
        },
    },
}

Форматировщик

Soong включает канонический форматтер для файлов Blueprint, похожий на gofmt . Чтобы рекурсивно переформатировать все файлы Android.bp в текущем каталоге, выполните:

bpfmt -w .

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