Buildroot est une suite de scripts au format Makefile permettant de générer de manière automatisée un système embarqué. Celui-ci prend en charge la compilation du bootloader, du noyau, des commandes de base grâce à busybox ainsi que des applications tierces.
Nous allons voir ici comment ajouter ses propres applications dans ce système en décrivant un cas d'utilisation simple. Pour approfondir le sujet, reportez vous à la documentation complète en anglais de buildroot.
Tout d'abord, les applications sont stockées dans le dossier nommé package. Pour ajouter une application, il faut créer un répertoire
$builroot> mkdir package/helloworld
Ce répertoire devra contenir:
- le fichier helloworld.mk : les règles de construction
- le fichier Config.in : inclusion dans la configuration du buildroot
Nous allons ensuite écrire un fichier Config.in pour notre application. Ce fichier suit les règles des fichiers Kconfig (plus d'info) utilisés par le noyau linux. Éditez le fichier package/helloworld/Config.in :
config BR2_PACKAGE_HELLOWORLD bool "helloworld" help Hello World package says hello world to you see http://helloworld.com for more on this software
Maintenant, il nous faut inclure ce fichier dans le système de configuration buildroot en éditant le fichier package/Config.in et en y ajoutant les lignes en fin de fichier (mais avant la dernière ligne "endmenu") :
menu "Custom packages" source "package/helloworld/Config.in" endmenu
Vous pouvez tester la bonne prise en compte des modifications en tapant :
$buildroot> make menuconfig
Dans la section "Package Selection for the target" puis "Custom packages" votre application "helloworld" sera présente.
La création du fichier helloworld.mk est tout aussi simple. C'est le fichier qui va donner les règles de téléchargement, décompression, configuration, compilation et installation du logiciel.
Les règles génériques de buildroot utilisent le fichier Makefile à la racine du projet pour compiler (make) puis installer (make install) le paquet.
Afin que le paquet soit cross compilé correctement, le Makefile doit utiliser les variable $(CC) et $(LD) en lieu et place des commandes 'gcc' et 'ld'.
La variable $(DESTDIR) contenant le répertoire de destination du paquet installé est utilisée lors du 'make install'.
Un exemple de Makefile serait dans notre cas :
# # sample Makefile for helloworld # SRC=helloworld.c OBJ = helloworld.o CFLAGS = -Wall -Wextra TARGET=helloworld # rules all: $(TARGET) $(TARGET): $(OBJ) $(CC) $^ -o $@ %.o: %.c $(CC) -c $(CFLAGS) $^ -o $@ .PHONY: clean clean: rm -f $(OBJ) install: cp helloworld $(DESTDIR)/bin/helloworld
Le fichier helloworld.mk correspondant sera alors :
# # helloworld # basic building rules # HELLOWORLD_VERSION = 1.1 HELLOWORLD_SOURCE = helloworld-$(HELLOWORLD_VERSION).tar.gz HELLOWORLD_SITE = http://helloworld.com/dl/$(HELLOWORLD_SOURCE) HELLOWORLD_INSTALL_STAGING = YES define HELLOWORLD_BUILD_CMDS $(MAKE) CC="$(TARGET_CC)" LD="$(TARGET_LD)" -C $(@D) all endef define HELLOWORLD_INSTALL_STAGING_CMDS $(MAKE) DESTDIR=$(STAGING_DIR) -C $(@D) install endef define HELLOWORLD_INSTALL_TARGET_CMDS $(INSTALL) -D -m 0755 $(@D)/helloworld \ $(TARGET_DIR)/bin/helloworld endef $(eval $(call GENTARGETS,package,helloworld))
Le STAGING_DIR correspond au dossier contenant toutes les dépendances pouvant être utilisées pour générer les binaires. Le dossier TARGET_DIR correspond au rootfs tel qu'il sera généré. La séparation des deux dossiers permet, dans le cas des librairies par exemple, de ne pas installer les fichiers d'includes (fichier.h) sur le rootfs tout en les gardant disponibles pour compiler d'autres packages dépendant de cette librairie.
Il ne reste alors qu'à copier votre package source helloworld-1.1.tar.gz dans le répertoire dl de buildroot (sinon il sera téléchargé a l'adresse $(HELLOWORLD_SITE)) et taper la commande
$buildroot> make
Vous pourrez alors retrouver votre binaire helloworld installé dans le dossier output/target/bin/ ainsi que dans les images output/images/rootfs.ext2 ou output/images/rootfs.tar.gz selon les options sélectionnées lors du make menuconfig.
Bonjour,
j'aimerais obtenir un buildroot avec une machine java. Jamvm a été abandonné depuis quelques versions...
Comment peut-on la réintégrer ?
Je pensais qu'il suffisait de prendre une buildroot 2010.08, de copier le répertoire java de package vers la version 2012.08 et de modifier mon config.in afin que cette option apparaisse via un make menuconfig.
Voilà, j'ai fait tout cela, activé également classpath, je coche tout et ... rien ne se télécharge dans mon répertoire DL quand je fais un make...
Si quelqu'un a une idée, pour ré-intégrer jamvm ou m'indiquer une autre machine java pour buildroot...
Merci,
Alain