Por diseño, los archivos Android.bp
son simples. No tienen condicionales ni
declaraciones de flujo de control; toda su complejidad se procesa a través de 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 las de los
archivos BUILD de Bazel.
Módulos
Un módulo en un archivo de Android.bp
comienza con un tipo de módulo seguido por un conjunto de propiedades en formato name: "value",
:
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 por los valores de propiedad name
en los espacios de nombres y los módulos compilados previamente, que pueden repetirlo.
La propiedad srcs
especifica los archivos de origen usados para compilar el módulo como una lista de cadenas. Puedes hacer referencia a la salida de otros módulos que producen archivos de origen, como genrule
o filegroup
, mediante la sintaxis de referencia del módulo ":<module-name>"
.
Si deseas obtener una lista de los tipos de módulos válidos y sus propiedades, consulta la referencia de los módulos de Soong.
Tipos
Las variables y las propiedades tienen tipado fuerte; las variables se basan de forma dinámica en la primera asignación, y las propiedades se definen estáticamente por el tipo de módulo. Los tipos admitidos son los siguientes:
- Booleanos (
true
ofalse
) - Enteros (
int
) - Cadenas (
"string"
) - Listas de cadenas (
["string1", "string2"]
) - Mapas (
{key1: "value1", key2: ["value2"]}
)
Los mapas pueden contener valores de cualquier tipo, incluidos los mapas anidados. Las listas y los mapas pueden tener comas finales después del último valor.
Globs
Las propiedades que toman una lista de archivos, como srcs
, también pueden tomar patrones glob. Los patrones glob pueden contener el comodín *
de UNIX normal, por ejemplo, *.java
. Los patrones glob también pueden contener un solo comodín **
como un elemento de ruta de acceso, que coincide con cero o más elementos de este tipo. 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",
}
El alcance de las variables se define en función del resto del archivo donde están declaradas, además de los archivos de Blueprint secundarios. Las variables son inmutables, con una excepción: se les puede agregar un sufijo con una asignación +=
, pero solo antes de que tengan una referencia.
Comentarios
Los archivos Android.bp
pueden tener comentarios /* */
de varias líneas de estilo C y comentarios //
de una sola línea de estilo C++.
Operadores
Puedes usar el operador "+" para agregar sufijos a cadenas, listas de cadenas y mapas.
Se pueden agregar números enteros con el operador +
. Agregar un mapa genera la unión de claves en ambos mapas, y se agregan los valores de cualquier clave que esté presente en ambos mapas.
Condicionales
Soong no admite condicionales en los archivos Android.bp
. En cambio, la complejidad en las reglas de compilación que requeriría el uso de condicionales se administra en Go, que permite usar funciones de lenguaje de alto nivel y hacer un seguimiento de las dependencias implícitas con condicionales antepuestos. La mayoría de los condicionales se convierte en una propiedad de mapa, donde uno de los valores en el mapa se selecciona y se agrega a las propiedades de nivel superior.
Por ejemplo, para admitir archivos específicos de arquitectura:
cc_library {
...
srcs: ["generic.cpp"],
arch: {
arm: {
srcs: ["arm.cpp"],
},
x86: {
srcs: ["x86.cpp"],
},
},
}
Formateador
Soong incluye un formateador canónico para los archivos Blueprint, similar a gofmt. Para volver a formatear de manera recurrente todos los archivos Android.bp
en el directorio actual, ejecuta:
bpfmt -w .
El formato canónico incluye sangrías de cuatro espacios, líneas nuevas después de cada elemento de una lista de varios elementos y una coma final en las listas y los mapas.