Format de fichier Android.bp

De par leur conception, les fichiers Android.bp sont simples. Ils ne contiennent pas de conditions ni d'instructions de flux de contrôle ; toute la complexité est gérée par une logique de construction écrite en Go. Lorsque cela est possible, la syntaxe et la sémantique des fichiers Android.bp sont similaires à celles des fichiers Bazel BUILD .

Modules

Un module dans un fichier Android.bp commence par un type de module suivi d'un ensemble de propriétés dans name: "value", format :

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

Chaque module doit avoir une propriété name et la valeur doit être unique dans tous les fichiers Android.bp , à l'exception des valeurs de propriété name dans les espaces de noms et les modules prédéfinis, qui peuvent se répéter.

La propriété srcs spécifie les fichiers sources utilisés pour construire le module, sous forme de liste de chaînes. Vous pouvez référencer la sortie d'autres modules qui produisent des fichiers source, comme genrule ou filegroup , en utilisant la syntaxe de référence de module ":<module-name>" .

Pour une liste des types de modules valides et de leurs propriétés, consultez la référence des modules Soong .

Les types

Les variables et les propriétés sont fortement typées, avec des variables basées dynamiquement sur la première affectation et des propriétés définies statiquement par le type de module. Les types pris en charge sont :

  • Booléens ( true ou false )
  • Entiers ( int )
  • Chaînes ( "string" )
  • Listes de chaînes ( ["string1", "string2"] )
  • Cartes ( {key1: "value1", key2: ["value2"]} )

Les cartes peuvent contenir des valeurs de tout type, y compris des cartes imbriquées. Les listes et les cartes peuvent comporter des virgules après la dernière valeur.

Globes

Les propriétés qui acceptent une liste de fichiers, telles que srcs , peuvent également accepter des modèles globaux. Les modèles Glob peuvent contenir le caractère générique UNIX normal * , par exemple *.java . Les modèles Glob peuvent également contenir un seul caractère générique ** comme élément de chemin, qui correspond à zéro ou plusieurs éléments de chemin. Par exemple, java/**/*.java correspond aux modèles java/Main.java et java/com/android/Main.java .

Variables

Un fichier Android.bp peut contenir des affectations de variables de niveau supérieur :

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

Les variables sont étendues au reste du fichier dans lequel elles sont déclarées, ainsi qu'à tous les fichiers Blueprint enfants. Les variables sont immuables à une exception près : elles peuvent être ajoutées avec une affectation += , mais seulement avant d'être référencées.

commentaires

Les fichiers Android.bp peuvent contenir des commentaires /* */ multilignes de style C et // sur une seule ligne de style C++.

Les opérateurs

Les chaînes, les listes de chaînes et les cartes peuvent être ajoutées à l'aide de l'opérateur +. Les entiers peuvent être résumés à l’aide de l’opérateur + . L’ajout d’une carte produit l’union des clés dans les deux cartes, en ajoutant les valeurs de toutes les clés présentes dans les deux cartes.

Conditions

Soong ne prend pas en charge les conditions dans les fichiers Android.bp . Au lieu de cela, la complexité des règles de construction qui nécessiteraient des conditions est gérée dans Go, où les fonctionnalités du langage de haut niveau peuvent être utilisées et où les dépendances implicites introduites par les conditions peuvent être suivies. La plupart des conditions sont converties en propriété de carte, où l'une des valeurs de la carte est sélectionnée et ajoutée aux propriétés de niveau supérieur.

Par exemple, pour prendre en charge les fichiers spécifiques à l'architecture :

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

Formateur

Soong inclut un formateur canonique pour les fichiers Blueprint, similaire à gofmt . Pour reformater de manière récursive tous les fichiers Android.bp du répertoire actuel, exécutez :

bpfmt -w .

Le format canonique comprend des retraits de quatre espaces, de nouvelles lignes après chaque élément d'une liste multi-éléments et une virgule de fin dans les listes et les cartes.