Formato de archivo Android.bp

Por diseño, los archivos Android.bp son simples. No contienen condicionales ni declaraciones de flujo de control; toda la complejidad es manejada por la lógica de compilación escrita en Go. Cuando es posible, la sintaxis y la semántica de los archivos Android.bp son similares a los archivos Bazel BUILD .

Módulos

Un módulo en un archivo Android.bp comienza con un tipo de módulo seguido de un conjunto de propiedades en name: "value", formato:

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

Cada módulo debe tener una propiedad name y el valor debe ser único en todos los archivos Android.bp , excepto los valores de propiedad name en espacios de nombres y módulos prediseñados, que pueden repetirse.

La propiedad srcs especifica los archivos fuente utilizados para construir el módulo, como una lista de cadenas. Puede hacer referencia a la salida de otros módulos que producen archivos fuente, como genrule o filegroup , utilizando la sintaxis de referencia del módulo ":<module-name>" .

Para obtener una lista de tipos de módulos válidos y sus propiedades, consulte la Referencia de módulos de Soong .

Tipos

Las variables y propiedades están fuertemente tipadas, con variables basadas dinámicamente en la primera asignación y propiedades establecidas estáticamente por el tipo de módulo. Los tipos soportados son:

  • Booleanos ( true o false )
  • Números enteros ( int )
  • Cadenas ( "string" )
  • Listas de cadenas ( ["string1", "string2"] )
  • Mapas ( {key1: "value1", key2: ["value2"]}

Los mapas pueden contener valores de cualquier tipo, incluidos mapas anidados. Las listas y los mapas pueden tener comas al final del último valor.

globos

Las propiedades que toman una lista de archivos, como srcs , también pueden tomar patrones globales. Los patrones globales pueden contener el comodín * normal de UNIX, por ejemplo *.java . Los patrones globales también pueden contener un único comodín ** como elemento de ruta, que coincide con cero o más elementos de ruta. Por ejemplo, java/**/*.java coincide con los patrones java/Main.java y java/com/android/Main.java .

variables

Un archivo Android.bp puede contener asignaciones de variables de nivel superior:

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

Las variables tienen como alcance el resto del archivo en el que se declaran, así como cualquier archivo Blueprint secundario. Las variables son inmutables con una excepción: se les puede agregar una asignación += , pero solo antes de que se haga referencia a ellas.

Comentarios

Los archivos Android.bp pueden contener comentarios /* */ multilínea de estilo C y // de una sola línea de estilo C++.

Operadores

Se pueden agregar cadenas, listas de cadenas y mapas utilizando el operador +. Los números enteros se pueden resumir usando el operador + . Agregar un mapa produce la unión de claves en ambos mapas, agregando los valores de cualquier clave que esté presente en ambos mapas.

Condicionales

Soong no admite condicionales en archivos Android.bp . En cambio, la complejidad de las reglas de construcción que requerirían condicionales se maneja en Go, donde se pueden usar características de lenguaje de alto nivel y se pueden rastrear las dependencias implícitas introducidas por los condicionales. La mayoría de los condicionales se convierten en una propiedad de mapa, donde uno de los valores del mapa se selecciona y se agrega a las propiedades de nivel superior.

Por ejemplo, para admitir archivos específicos de la arquitectura:

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

Formateador

Soong incluye un formateador canónico para archivos Blueprint, similar a gofmt . Para reformatear recursivamente todos los archivos Android.bp en el directorio actual, ejecute:

bpfmt -w .

El formato canónico incluye sangrías de cuatro espacios, nuevas líneas después de cada elemento de una lista de varios elementos y una coma final en listas y mapas.