Formato de arquivo Android.bp

Por padrão, os arquivos Android.bp são simples. Eles não contêm condicionais nem instruções de fluxo de controle. Toda a complexidade é processada pela lógica de criação gravada em Go. Quando possível, a sintaxe e a semântica dos arquivos Android.bp são semelhantes aos arquivos Bazel BUILD (link em inglês).

Módulos

Um módulo em um arquivo Android.bp começa com um tipo de módulo seguido por um conjunto de propriedades no formato name: "value",:

cc_binary {
    name: "gzip",
    srcs: ["src/test/minigzip.c"],
    shared_libs: ["libz"],
    stl: "none",
}

Cada módulo precisa ter uma propriedade name, e o valor precisa ser exclusivo em todos os arquivos Android.bp, com exceção dos valores de name em namespaces e módulos pré-criados, que podem ser repetidos.

A propriedade srcs especifica os arquivos de origem usados para criar o módulo, como uma lista de strings. Você pode referenciar a saída de outros módulos que produzem arquivos de origem, como genrule ou filegroup, usando a sintaxe de referência ":<module-name>" do módulo.

Para ver uma lista de tipos de módulo válidos e as propriedades deles, consulte a Referência dos módulos Soong.

Tipos

Variáveis e propriedades são fortemente categorizadas, com variáveis baseadas dinamicamente na primeira atribuição e propriedades definidas estaticamente pelo tipo de módulo. Os tipos compatíveis são estes:

  • Boleanos (true ou false)
  • Números inteiros (int)
  • Strings ("string")
  • Listas de strings (["string1", "string2"])
  • Mapas ({key1: "value1", key2: ["value2"]})

Os mapas podem conter valores de qualquer tipo, incluindo mapas aninhados. Listas e mapas podem ter vírgulas à direita do último valor.

Globs

As propriedades que levam uma lista de arquivos, como srcs, também podem ter padrões glob. Os padrões glob podem conter o caractere curinga normal * do UNIX, por exemplo, *.java. Os padrões glob também podem conter um único caractere curinga ** como elemento de caminho, que corresponde a zero ou mais elementos de caminho. Por exemplo, java/**/*.java corresponde aos padrões java/Main.java e java/com/android/Main.java.

Variáveis

Um arquivo Android.bp pode conter atribuições de variáveis de nível superior:

gzip_srcs = ["src/test/minigzip.c"],
cc_binary {
    name: "gzip",
    srcs: gzip_srcs,
    shared_libs: ["libz"],
    stl: "none",
}

As variáveis são definidas para o restante do arquivo em que são declaradas, assim como para quaisquer arquivos Blueprint filhos. As variáveis são imutáveis, com uma exceção: elas podem ser anexadas com uma designação +=, mas somente antes de serem referenciadas.

Comentários

Os arquivos Android.bp podem conter comentários /* */ multilinha no estilo C e de uma única linha // no estilo C++.

Operadores

Strings, listas de strings e mapas podem ser anexados usando o operador +. Os números inteiros podem ser somados usando o operador +. Anexar um mapa gera a união de chaves nos dois mapas, anexando os valores de todas as chaves presentes neles.

Condicionais

O Soong não é compatível com condicionais em arquivos Android.bp. Em vez disso, a complexidade nas regras de criação que exigiriam condicionais é processada no Go, onde os recursos de linguagem de alto nível podem ser usados, e as dependências implícitas introduzidas pelos condicionais podem ser rastreadas. A maioria das condicionais é convertida em uma propriedade de mapa, em que um dos valores no mapa é selecionado e anexado às propriedades de nível superior.

Por exemplo, para compatibilidade com arquivos específicos da arquitetura:

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

Formatador

O Soong inclui um formatador canônico para arquivos Blueprint, semelhante ao gofmt (link em inglês). Para reformatar recursivamente todos os arquivos Android.bp no diretório atual, execute:

bpfmt -w .

O formato canônico inclui recuos de quatro espaços, novas linhas após cada elemento de lista de vários elementos e uma vírgula final em listas e mapas.