Linux Embedded

Le blog des technologies libres et embarquées

Ajouter un package dans Buildroot en 5 minutes

buildrootBuildroot 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.

7 commentaires sur “ Ajouter un package dans Buildroot en 5 minutes ”

  1. Mouflet
    le 25 novembre 2012 à 18 h 12 min

    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

    • Jérémy Rosen
      le 15 janvier 2013 à 17 h 14 min

      hmm, entre 2010 et 2012 je crois que l’API de gestion des paquetages de buildroot a pas mal évolué. Il y a probablement plus de travail que ça…

      normalement cette méthode est la bonne (mais les gens de buildroot ne dropent généralement pas les paquetages sans une bonne raison, donc enquète un peu) mais vu la différence 2010 => 2012 peut-être vaut-il mieux repartir à zéro…

  2. charfeddine
    le 18 février 2013 à 11 h 53 min

    salut à tous, y a t’il quelqu’un peux m’aidé de compiler l’application ekiga pour mini2440

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *