Gentargets est l'infrastructure pour les packages avec des systèmes de construction spécifiques, c'est à dire tous les packages dont le système de construction n'est pas l'un des standards, comme 'autotools' ou 'CMake'. Cela inclut généralement les packages dont la construction système est basé sur des Makefiles écrits à la main ou des scripts shell.
01: ############################################################# 02: # 03: # libfoo 04: # 05: ############################################################# 06: LIBFOO_VERSION = 1.0 07: LIBFOO_SOURCE = libfoo-$(LIBFOO_VERSION).tar.gz 08: LIBFOO_SITE = http://www.foosoftware.org/download 09: LIBFOO_INSTALL_STAGING = YES 10: LIBFOO_DEPENDENCIES = host-libaaa libbbb 11: 12: define LIBFOO_BUILD_CMDS 13: $(MAKE) CC=$(TARGET_CC) LD=$(TARGET_LD) -C $(@D) all 14: endef 15: 16: define LIBFOO_INSTALL_STAGING_CMDS 17: $(INSTALL) -D -m 0755 $(@D)/libfoo.a $(STAGING_DIR)/usr/lib/libfoo.a 18: $(INSTALL) -D -m 0644 $(@D)/foo.h $(STAGING_DIR)/usr/include/foo.h 19: $(INSTALL) -D -m 0755 $(@D)/libfoo.so* $(STAGING_DIR)/usr/lib 20: endef 21: 22: define LIBFOO_INSTALL_TARGET_CMDS 23: $(INSTALL) -D -m 0755 $(@D)/libfoo.so* $(TARGET_DIR)/usr/lib 24: $(INSTALL) -d -m 0755 $(TARGET_DIR)/etc/foo.d 25: endef 26: 27: $(eval $(generic-package))
Le Makefile commence aux lignes 6 à 8 avec les informations de métadonnées suivantes:
Toutes les variables doivent commencer par le même préfixe, LIBFOO_ dans ce cas. Ce préfixe est toujours le nom du package en majuscule.
À la ligne 9, on spécifie que le paquet veut installer quelque chose à l'espace de staging. Ceci est souvent nécessaire pour les bibliothèques, car elles doivent installer les fichiers d'en-tête et d'autres fichiers de développement dans l'espace de staging.
Cela garantira que les commandes répertoriées dans la variable LIBFOO_INSTALL_STAGING_CMDS sera exécutée.
À la ligne 10, on spécifie la liste des dépendances sur lesquelles repose ce paquet. Ces dépendances sont répertoriées en termes de noms de packages en minuscules, qui peuvent être des packages pour la cible (sans le préfixe host-) ou des packages pour l'hôte (avec le préfixe host-)).
Buildroot s'assurera que tous ces packages sont compilés et installés 'avant' que le paquet actuel ne commence sa configuration.
Le reste du Makefile définit ce qui doit être fait aux différents étapes de la configuration, de la compilation et de l'installation du package:
Toutes ces étapes reposent sur la variable $(@D), qui contient le répertoire où le code source du package a été extrait.
Enfin, à la ligne 27, on appelle les GENTARGETS qui génère, en fonction des variables définies précédemment, tous les Code Makefile nécessaire pour faire fonctionner le paquet.
Il existe deux variantes de la cible générique. La macro generic-package est utilisé pour les packages à compiler de manière croisée pour la cible. la macro host-generic-package est utilisée pour les packages hôtes, compilés nativement pour l'hôte.
Il est possible d'appeler les deux en un seul fichier .mk : une fois pour créer les règles pour générer un package cible et une fois pour créer les règles permettant de générer un package hôte :
$(eval $(generic-package)) $(eval $(host-generic-package)):
Cela peut être utile si la compilation du package cible nécessite certains outils à installer sur l'hôte. Si le nom du paquet est libfoo, alors le nom du paquet pour la cible est aussi libfoo, alors que le nom du paquet pour l'hôte est host-libfoo. Ces noms doivent être utilisés dans les variables DEPENDANCES d'autres packages, si elles dépendent de libfoo ou host-libfoo.
L'appel à la macro generic-package doit être à la fin du fichier .mk, après toutes les définitions de variables.
Pour le package cible, le generic-package utilise les variables définies par le fichier .mk et préfixé par le nom du package en majuscule : LIBFOO_. Pour le package hôte, il utilise le HOST_LIBFOO_. Pour 'certaines' variables, si la variable préfixée HOST_LIBFOO_ ne le fait pas, l'infrastructure du package utilise la variable correspondante préfixés par LIBFOO_. Ceci est fait pour les variables susceptibles d'avoir la même valeur pour les packages cible et hôte.
La liste des variables pouvant être défini dans un fichier .mk pour donner des métadonnées l'information est (en supposant que le nom du paquet est libfoo) :
http://$(BR2_SOURCEFORGE_MIRROR).dl.sourceforge.net/sourceforge/packagename
. Par exemple : LIBFOO\_SITE=http://www.libfoosoftware.org/libfoo
, LIBFOO\_SITE=http://svn.xiph.org/trunk/Tremor/
via le référentiel Subversion sur HTTP, un “doit” spécifier LIBFOO_SITE_METHOD=svn. Pour les méthodes svn et git, Buildroot clone le référentiel qui est ensuite tarballé et stocké dans le cache de téléchargement. Les prochaines builds ne devront pas cloner à nouveau, mais utilisera l'archive directement. Lorsque HOST_LIBFOO_SITE_METHOD n'est pas spécifié, il prend par défaut la valeur de LIBFOO_SITE_METHOD.
installé avant le démarrage de la configuration du package actuel. De la même manière, HOST_LIBFOO_DEPENDENCIES répertorie la dépendance pour le package hôte actuel.
La méthode recommandée pour définir ces variables consiste à utiliser les éléments est la syntaxe suivante:
LIBFOO_VERSION = 2.32
Variables qui définissent ce qui doit être fait au moment différentes étapes du processus de construction.
fichiers de développement dans le système de fichiers cible
est sélectionnée.La meilleure façon de définir ces variables est :
define LIBFOO_CONFIGURE_CMDS action 1 action 2 action 3 endef
Dans les définitions d'action, on peut utiliser les variables suivantes :
La dernière caractéristique de l'infrastructure générique est la possibilité d'ajouter des hookss. Ceux-ci définissent d'autres actions à effectuer après les étapes existantes. La plupart des crochets ne sont pas vraiment utiles pour les packages génériques, puisque le fichier .mk a déjà un contrôle total sur les actions effectuées à chaque étape de la construction du colis. Les crochets sont plus utiles pour les paquets utilisant l'infrastructure autotools décrite ci-dessous.
L'exception est LIBFOO_POST_PATCH_HOOKS. Patcher package n'est pas définissable par l'utilisateur, donc LIBFOO_POST_PATCH_HOOKS sera utile pour les packages génériques.
Les points d'accroche suivants sont disponibles :
Ces variables sont des “listes” de noms de variables contenant des actions à effectué à ce point d'accroche. Cela permet à plusieurs hooks d'être enregistré à un point d'accroche donné. Voici un exemple:
define LIBFOO_POST_PATCH_FIXUP action1 action2 endef LIBFOO_POST_PATCH_HOOKS += LIBFOO_POST_PATCH_FIXUP