Formato file Android.bp

Per impostazione predefinita, i file Android.bp sono semplici. Non contengono condizioni o comandi di controllo del flusso; tutta la complessità è gestita dalla logica di compilazione scritta in Go. Se possibile, la sintassi e la semantica dei file Android.bp sono simili ai file BUILD di Bazel.

Moduli

Un modulo in un file Android.bp inizia con un tipo di modulo followed by a set of properties in name: "value", format:

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

Ogni modulo deve avere una proprietà name e il valore deve essere univoco in tutti i file Android.bp, ad eccezione dei valori della proprietà name nei namespace e nei moduli predefiniti, che possono ripetersi.

La proprietà srcs specifica i file di origine utilizzati per compilare il modulo come elenco di stringhe. Puoi fare riferimento all'output di altri moduli che producono file di origine, come genrule o filegroup, utilizzando la sintassi di riferimento del modulo ":<module-name>".

Per un elenco dei tipi di moduli validi e delle relative proprietà, consulta il riferimento ai moduli Soong.

Tipi

Le variabili e le proprietà sono fortemente tipizzate, con le variabili basate dinamicamente sulla prima assegnazione e le proprietà impostate in modo statico dal tipo di modulo. I tipi supportati sono:

  • Valori booleani (true o false)
  • Numeri interi (int)
  • Stringhe ("string")
  • Elenchi di stringhe (["string1", "string2"])
  • Mappe ({key1: "value1", key2: ["value2"]})

Le mappe possono contenere valori di qualsiasi tipo, incluse mappe nidificate. Gli elenchi e le mappe possono avere virgole finali dopo l'ultimo valore.

Glob

Le proprietà che accettano un elenco di file, come srcs, possono anche accettare pattern di glob. I pattern di glob possono contenere il normale carattere jolly UNIX *, ad esempio *.java. I pattern glob possono anche contenere una singola sostituzione ** come elemento percorso, che corrisponde a zero o più elementi percorso. Ad esempio, java/**/*.java corrisponde sia ai pattern java/Main.java sia java/com/android/Main.java.

Variabili

Un file Android.bp può contenere le seguenti assegnazioni di variabili di primo livello:

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

L'ambito delle variabili è limitato al resto del file in cui sono dichiarate, nonché a eventuali file Blueprint secondari. Le variabili sono immutabili con un'eccezione: possono essere aggiunte con un'assegnazione +=, ma solo prima che vengano richiamate.

Commenti

I file Android.bp possono contenere commenti /* */ su più righe in stile C e commenti // su una riga in stile C++.

Operatori

Le stringhe, gli elenchi di stringhe e le mappe possono essere aggiunte utilizzando l'operatore +. I numeri interi possono essere sommati utilizzando l'operatore +. L'aggiunta di una mappa produce la unione delle chiavi in entrambe le mappe, aggiungendo i valori di eventuali chiavi presenti in entrambe le mappe.

Condizionali

Soong non supporta i condizionali nei file Android.bp. Al contrario, la complessità delle regole di compilazione che richiederebbero condizioni viene gestita in Go, dove è possibile utilizzare funzionalità di linguaggio di alto livello e monitorare le dipendenze implicite introdotte dalle condizioni. La maggior parte delle espressioni condizionali viene convertita in una proprietà mappa, in cui uno dei valori della mappa viene selezionato e aggiunto alle proprietà di primo livello.

Ad esempio, per supportare i file specifici dell'architettura:

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

Formattatore

Soong include un formattatore canonico per i file Blueprint, simile a gofmt. Per riformattare in modo ricorsivo tutti i file Android.bp nella directory corrente, esegui:

bpfmt -w .

Il formato canonico include rientri di quattro spazi, nuove righe dopo ogni elemento di un elenco con più elementi e una virgola finale in elenchi e mappe.