Toolchain Buildroot pour Raspberry Pi

Publié par cpb
Oct 12 2012

Toolchain Buildroot pour Raspberry PiEn réponse à un commentaire de Ugo concernant l’article sur Xenomai pour Raspberry Pi, voici les étapes pour créer rapidement la toolchain avec Buildroot.

Télécharger la dernière version de Buildroot :

[~]$ wget http://buildroot.uclibc.org/downloads/buildroot-2012.08.tar.bz2
--2012-10-12 23:07:18--  http://buildroot.uclibc.org/downloads/buildroot-2012.08.tar.bz2
Résolution de buildroot.uclibc.org (buildroot.uclibc.org)... 140.211.167.224
Connexion vers buildroot.uclibc.org (buildroot.uclibc.org)|140.211.167.224|:80... connecté.
requête HTTP transmise, en attente de la réponse... 200 OK
Longueur: 2399313 (2,3M) [application/x-bzip2]
Sauvegarde en : «buildroot-2012.08.tar.bz2»
100%[======================================>] 2 399 313   51,4K/s   ds 45s      
2012-10-12 23:08:03 (52,3 KB/s) - «buildroot-2012.08.tar.bz2» sauvegardé [2399313/2399313]
[~]$

Décompresser les sources et y ajouter un fichier de configuration

[~]$ tar xjf buildroot-2012.08.tar.bz2 
[~]$ cd buildroot-2012.08/
[buildroot-2012.08]$ wget https://www.blaess.fr/christophe/files/article-2012-10-12/config-buildroot
--2012-10-12 23:11:31--  https://www.blaess.fr/christophe/files/article-2012-10-12/config-buildroot
Résolution de www.blaess.fr (www.blaess.fr)... 217.16.3.18
Connexion vers www.blaess.fr (www.blaess.fr)|217.16.3.18|:80... connecté.
requête HTTP transmise, en attente de la réponse... 200 OK
Longueur: 22752 (22K) [text/plain]
Sauvegarde en : «config-buildroot»
100%[======================================>] 22 752      --.-K/s   ds 0,1s    
2012-10-12 23:11:31 (205 KB/s) - «config-buildroot» sauvegardé [22752/22752]
[buildroot-2012.08]$ mv config-buildroot .config
[buildroot-2012.08]$

Lancer la compilation avec les droits root car la toolchain va s’installer dans /usr/local/.

[buildroot-2012.08]$ sudo make
/usr/bin/make -j4  HOSTCC="/usr/bin/gcc" HOSTCXX="/usr/bin/g++" silentoldconfig
make[1]: entrant dans le répertoire « /home/cpb/buildroot-2012.08 »
[...]
  echo "VERSION_ID=2012.08"; 
  echo "PRETTY_NAME="Buildroot 2012.08"" 
) >  /home/cpb/buildroot-2012.08/output/target/etc/os-release
[buildroot-2012.08]$

Vérifier le fonctionnement du compilateur.

[buildroot-2012.08]$ /usr/local/cross-rpi/usr/bin/arm-linux-gcc -v
Utilisation des specs internes.
COLLECT_GCC=/usr/local/cross-rpi/usr/bin/arm-linux-gcc
COLLECT_LTO_WRAPPER=/usr/local/cross-rpi/usr/libexec/gcc/arm-unknown-linux-uclibcgnueabi/4.5.4/lto-wrapper
Target: arm-unknown-linux-uclibcgnueabi
Configuré avec: /home/cpb/buildroot-2012.08/output/toolchain/gcc-4.5.4/configure --prefix=/usr/local/cross-rpi/usr --build=i686-pc-linux-gnu --host=i686-pc-linux-gnu --target=arm-unknown-linux-uclibcgnueabi --enable-languages=c,c++ --with-sysroot=/usr/local/cross-rpi/usr/arm-unknown-linux-uclibcgnueabi/sysroot --with-build-time-tools=/usr/local/cross-rpi/usr/arm-unknown-linux-uclibcgnueabi/bin --disable-__cxa_atexit --enable-target-optspace --disable-libgomp --with-gnu-ld --disable-libssp --disable-multilib --enable-tls --enable-shared --with-gmp=/usr/local/cross-rpi/usr --with-mpfr=/usr/local/cross-rpi/usr --with-mpc=/usr/local/cross-rpi/usr --enable-threads --disable-decimal-float --with-float=soft --with-abi=aapcs-linux --with-arch=armv6zk --with-tune=arm1176jzf-s --with-pkgversion='Buildroot 2012.08' --with-bugurl=http://bugs.buildroot.net/
Modèle de thread: posix
gcc version 4.5.4 (Buildroot 2012.08) 
[buildroot-2012.08]$

 C’est tout !

17 Réponses

  1. Lancer le build Buildroot avec sudo est vraiment une *très* mauvaise idée. Si on veut vraiment que /usr/local/cross-rpi soit le répertoire de destination de la toolchain, alors il est recommandé de donner les droits d’écriture à l’utilisateur dans ce répertoire, lancer le build, quitte à retirer les droits d’écriture par la suite.

    À noter également que si il s’agit de construire une toolchain « pure » (gcc + binutils + gdb + bibliothèque standard C), alors Crosstool-NG est également un outil intéressant, notamment parce que les toolchains générées sont relogeables (i.e, elles peuvent être installées n’importe où, indépendamment de leur répertoire d’installation d’origine). Ce devrait également être un jour le cas pour les toolchains Buildroot, mais pas encore.

    • cpb dit :

      Il est vrai que le sudo make peut être dangereux, notamment dans un contexte multi-utilisateurs. Habituellement je préfère installer – ou faire installer par les participants à mes sessions de formation – les toolchains dans le répertoire personnel de l’utilisateur (~/cross-arm-linux/usr/bin...). Il s’agissait ici simplement d’une manip’ rapide sur un poste de développement mon-utilisateur pour pouvoir compléter l’article sur Xenomai et Rapsberry Pi.

      J’utilise les chaînes fournies par Croosstool-NG (voir cet article) surtout lorsque j’ai besoin d’une bibliothèque GlibC pour préparer une plate-forme complète avec des applications un peu lourdes. Pour les cibles où se trouvent seulement busybox, dropbear et quelques exécutables personnels, je me contente généralement de la uClibc générée avec buildroot. En outre je trouve que la préparation de toolchain native à embarquer sur la cible (comme dans cet article) est plus simple dans ce second cas.

  2. Ugo RENNER dit :

    Merci beaucoup !

  3. Thomas Etcheverria dit :

    Bonjour, je viens d’utiliser cette méthode pour mon rasberry pi et j’avais un soucis :
    error: ‘__LOCALE_DATA_WCctype_II_LEN’ undeclared unction)
    et plusieures autre erreurs de ce type.
    D’après http://stackoverflow.com/questions/11963280/extra-locale-locale-mmap-h46-error-locale-data-wcctype-ii-len-undeclared un petit modification du fichier toolchain/uClibc/uClibc-0.9.33.config nous sauve.

    Je ne sais pas si c’est important, mais je pensais que ça pouvait être utile pour d’autres.
    En tout cas merci 😉

    • Jacques Helbert dit :

      Bonjour ;

      Après avoir rencontré un premier échec, j’ai effectué les modifications indiquées sur la page accessible par le lien http://stackoverflow.com/questions/11963280/extra-locale-locale-mmap-h46-error-locale-data-wcctype-ii-len-undeclared.
      Hélas, rien n’ y fait j’obtiens toujours ceci :

      GEN extra/locale/locale_collate.h
      ignoring C locale
      Warning: adding UNDEFINED entry for zh_TW
      Warning: adding UNDEFINED entry for zh_SG
      Warning: adding UNDEFINED entry for zh_HK
      Warning: adding UNDEFINED entry for zh_CN
      Warning: adding UNDEFINED entry for yi_US
      Warning: adding UNDEFINED entry for wa_BE
      Warning: adding UNDEFINED entry for vi_VN
      Warning: adding UNDEFINED entry for uz_UZ
      Warning: adding UNDEFINED entry for ur_PK
      Warning: adding UNDEFINED entry for uk_UA
      Warning: adding UNDEFINED entry for tt_RU
      Warning: adding UNDEFINED entry for tl_PH
      Warning: adding UNDEFINED entry for ti_ET
      Warning: adding UNDEFINED entry for ti_ER
      Warning: adding UNDEFINED entry for tg_TJ
      Warning: adding UNDEFINED entry for te_IN
      Warning: adding UNDEFINED entry for ta_IN
      Warning: adding UNDEFINED entry for sv_SE
      Warning: adding UNDEFINED entry for sr_YU
      Warning: adding UNDEFINED entry for sq_AL
      Warning: adding UNDEFINED entry for se_NO
      Warning: adding UNDEFINED entry for ru_UA
      Warning: adding UNDEFINED entry for ru_RU
      Warning: adding UNDEFINED entry for ro_RO
      Warning: adding UNDEFINED entry for pt_PT
      Warning: adding UNDEFINED entry for pt_BR
      Warning: adding UNDEFINED entry for oc_FR
      Warning: adding UNDEFINED entry for nn_NO
      Warning: adding UNDEFINED entry for nl_NL
      Warning: adding UNDEFINED entry for nl_BE
      Warning: adding UNDEFINED entry for mt_MT
      Warning: adding UNDEFINED entry for ms_MY
      Warning: adding UNDEFINED entry for mr_IN
      Warning: adding UNDEFINED entry for mk_MK
      Warning: adding UNDEFINED entry for mi_NZ
      Warning: adding UNDEFINED entry for kw_GB
      Warning: adding UNDEFINED entry for ka_GE
      Warning: adding UNDEFINED entry for iw_IL
      Warning: adding UNDEFINED entry for it_IT
      Warning: adding UNDEFINED entry for it_CH
      Warning: adding UNDEFINED entry for id_ID
      Warning: adding UNDEFINED entry for hy_AM
      Warning: adding UNDEFINED entry for hu_HU
      Warning: adding UNDEFINED entry for hi_IN
      Warning: adding UNDEFINED entry for he_IL
      Warning: adding UNDEFINED entry for gv_GB
      Warning: adding UNDEFINED entry for gd_GB
      Warning: adding UNDEFINED entry for ga_IE
      Warning: adding UNDEFINED entry for fr_LU
      Warning: adding UNDEFINED entry for fr_FR
      Warning: adding UNDEFINED entry for fr_CH
      Warning: adding UNDEFINED entry for fr_BE
      Warning: adding UNDEFINED entry for fa_IR
      Warning: adding UNDEFINED entry for eu_ES
      Warning: adding UNDEFINED entry for eo_EO
      Warning: adding UNDEFINED entry for en_ZW
      Warning: adding UNDEFINED entry for en_ZA
      Warning: adding UNDEFINED entry for en_US
      Warning: adding UNDEFINED entry for en_SG
      Warning: adding UNDEFINED entry for en_PH
      Warning: adding UNDEFINED entry for en_NZ
      Warning: adding UNDEFINED entry for en_IN
      Warning: adding UNDEFINED entry for en_IE
      Warning: adding UNDEFINED entry for en_HK
      Warning: adding UNDEFINED entry for en_GB
      Warning: adding UNDEFINED entry for en_DK
      Warning: adding UNDEFINED entry for en_BW
      Warning: adding UNDEFINED entry for en_AU
      Warning: adding UNDEFINED entry for el_GR
      Warning: adding UNDEFINED entry for de_LU
      Warning: adding UNDEFINED entry for de_DE
      Warning: adding UNDEFINED entry for de_CH
      Warning: adding UNDEFINED entry for de_BE
      Warning: adding UNDEFINED entry for de_AT
      Warning: adding UNDEFINED entry for cy_GB
      Warning: adding UNDEFINED entry for bs_BA
      Warning: adding UNDEFINED entry for br_FR
      Warning: adding UNDEFINED entry for bn_IN
      Warning: adding UNDEFINED entry for bn_BD
      Warning: adding UNDEFINED entry for bg_BG
      Warning: adding UNDEFINED entry for be_BY
      Warning: adding UNDEFINED entry for az_AZ
      Warning: adding UNDEFINED entry for ar_YE
      Warning: adding UNDEFINED entry for ar_TN
      Warning: adding UNDEFINED entry for ar_SY
      Warning: adding UNDEFINED entry for ar_SD
      Warning: adding UNDEFINED entry for ar_QA
      Warning: adding UNDEFINED entry for ar_OM
      Warning: adding UNDEFINED entry for ar_MA
      Warning: adding UNDEFINED entry for ar_LY
      Warning: adding UNDEFINED entry for ar_LB
      Warning: adding UNDEFINED entry for ar_KW
      Warning: adding UNDEFINED entry for ar_JO
      Warning: adding UNDEFINED entry for ar_IQ
      Warning: adding UNDEFINED entry for ar_IN
      Warning: adding UNDEFINED entry for ar_EG
      Warning: adding UNDEFINED entry for ar_DZ
      Warning: adding UNDEFINED entry for ar_BH
      Warning: adding UNDEFINED entry for ar_AE
      Warning: adding UNDEFINED entry for am_ET
      Warning: adding UNDEFINED entry for af_ZA
      GEN extra/locale/lt_defines.h
      HOSTCC extra/locale/gen_wctype
      extra/locale/gen_wctype.c:684:2: warning: #warning fix the upper bound on the upper/lower tables… save 200 bytes or so
      GEN extra/locale/wctables.h
      make[1]: *** [extra/locale/wctables.h] Erreur 1
      make[1]: quittant le répertoire « /home/jacques/bin/RasberryPi/buildroot-2012.05/output/toolchain/uClibc-0.9.33.2 »
      make: *** [/home/jacques/bin/RasberryPi/buildroot-2012.05/output/toolchain/uClibc-0.9.33.2/.configured] Erreur 2

      Merci pour l’aide

      Jacques

  4. Karol dit :

    lorsque j’essaie de compiler au bout de 15 minutes de compilation… j’obtient les erreurs suivantes:

    >checking for library containing tgetent… no
    >configure: error: no termcap library found
    >make[2]: *** [configure-gdb] Erreur 1
    >make[2]: quittant le répertoire « /home/secret/raspberry/buildroot-2012.08/output/toolchain/gdbhost-7.4.1 »
    >make[1]: *** [all] Erreur 2
    >make[1]: quittant le répertoire « /home/secret/raspberry/buildroot-2012.08/output/toolchain/gdbhost-7.4.1 »
    >make: *** [/home/secret/raspberry/buildroot-2012.08/output/toolchain/gdbhost-7.4.1/gdb/gdb] Erreur 2

    est ce que vous pouriez m’aclairer? je suis sous ubuntu 12.10

    • cpb dit :

      Je crois que la bibliothèque termcap est incluse dans ncurses.
      Il faudrait donc essayer :

      # sudo apt-get install libncurses5-dev
  5. Karol dit :

    j’avais justement essayer un:
    # sudo apt-get install termcap

    mais je recu en retour que cette bibliotheque n’existe pas.
    Merci de cette réaction si rapide, je vais réesayer cette (trop) longue compilation.

  6. Jean-Marc Z dit :

    J’ai essayé de compiler la toolchain, mais je reste bloqué avec des erreurs dans la libpthread :

    CC libpthread/nptl/unwind.oS
    libpthread/nptl/unwind.c:123:1: warning: redeclaration of ‘__pthread_unwind’ with different visibility (old visibility preserved)
    libpthread/nptl/pthreadP.h:250:1: note: previous declaration of ‘__pthread_unwind’ was here
    CC libpthread/nptl/vars.oS
    AR cr libpthread/nptl/libpthread_so.a
    STRIP -X –strip-debug -R .note -R .comment libpthread/nptl/libpthread_so.a
    CC libpthread/nptl/pthread_atfork.oS
    AR cr lib/libpthread_nonshared.a
    STRIP -x -R .note -R .comment lib/libpthread_nonshared.a
    LD libpthread-0.9.33.2.so
    ./libpthread/nptl/sysdeps/pthread/pt-crti.o: In function `_init’:
    (.init+0x4): undefined reference to `__pthread_initialize_minimal_internal’
    libpthread/nptl/libpthread_so.a(sem_timedwait.oS): In function `sem_timedwait’:
    (.text+0xd8): undefined reference to `__pthread_cleanup_push’
    libpthread/nptl/libpthread_so.a(sem_timedwait.oS): In function `sem_timedwait’:
    (.text+0x144): undefined reference to `__pthread_enable_asynccancel’
    libpthread/nptl/libpthread_so.a(sem_timedwait.oS): In function `sem_timedwait’:
    (.text+0x16c): undefined reference to `__pthread_disable_asynccancel’
    libpthread/nptl/libpthread_so.a(sem_timedwait.oS): In function `sem_timedwait’:
    (.text+0x1e4): undefined reference to `__pthread_cleanup_pop’
    libpthread/nptl/libpthread_so.a(pthread_cond_timedwait.oS): In function `pthread_cond_timedwait’:
    (.text+0x8c): undefined reference to `__pthread_mutex_unlock_usercnt’
    libpthread/nptl/libpthread_so.a(sem_unlink.oS): In function `sem_unlink’:
    (.text+0x100): undefined reference to `__where_is_shmfs’
    libpthread/nptl/libpthread_so.a(sem_unlink.oS): In function `sem_unlink’:
    (.text+0x104): undefined reference to `__namedsem_once’
    libpthread/nptl/libpthread_so.a(sem_unlink.oS): In function `sem_unlink’:
    (.text+0x108): undefined reference to `mountpoint’
    /usr/local/cross-rpi/usr/lib/gcc/arm-unknown-linux-uclibcgnueabi/4.5.4/../../../../arm-unknown-linux-uclibcgnueabi/bin/ld: lib/libpthread-0.9.33.2.so: hidden symbol `__where_is_shmfs’ isn’t defined
    /usr/local/cross-rpi/usr/lib/gcc/arm-unknown-linux-uclibcgnueabi/4.5.4/../../../../arm-unknown-linux-uclibcgnueabi/bin/ld: final link failed: Bad value

    Je travaille sur une Ubuntu 12.04 avec un kernel 3.2.0-43.

    Avez vous une idée du problème rencontré ?

    • cpb dit :

      Bonsoir,

      Apparemment il y a peut-être un problème avec la version de GCC.
      Je viens de lancer la compilation sur une Ubuntu 12.04 / Linux 3.2.0-44 pour voir si j’ai la même erreur.

    • cpb dit :

      Je viens de refaire la compilation sur mon poste sans erreur.
      Voici ma configuration :

      $ lsb_release  -d
      Description:	Ubuntu 12.04.2 LTS
      $ uname -a
      Linux PC-cpb 3.2.0-44-generic-pae #69-Ubuntu SMP Thu May 16 18:50:07 UTC 2013 i686 i686 i386 GNU/Linux
      $ gcc --version
      gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3
      Copyright © 2011 Free Software Foundation, Inc.
      Ce logiciel est libre; voir les sources pour les conditions de copie.  Il n'y a PAS
      GARANTIE; ni implicite pour le MARCHANDAGE ou pour un BUT PARTICULIER.
      $ 

      J’ai utilisé la version de Buildroot 2012.05.

      Enfin, le fichier de configuration que j’ai utilisé pour Buildroot est le suivant :
      .config

      Pouvez-vous réessayer avec cette version de Buildroot et le fichier de configuration (peut-être faut-il éditer les chemins).

  7. Jean-Marc Z dit :

    Bonjour,

    Ma configuration est identique à la votre :
    zede@droopy:~$ lsb_release -d
    Description: Ubuntu 12.04.2 LTS
    zede@droopy:~$ uname -a
    Linux droopy 3.2.0-43-generic #68-Ubuntu SMP Wed May 15 03:33:33 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux
    zede@droopy:~$ gcc –version
    gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3
    Copyright © 2011 Free Software Foundation, Inc.
    Ce logiciel est libre; voir les sources pour les conditions de copie. Il n’y a PAS
    GARANTIE; ni implicite pour le MARCHANDAGE ou pour un BUT PARTICULIER.
    zede@droopy:~$

    les commandes lancées :
    tar xjf buildroot-2012.05.tar.bz2
    cd buildroot-2012.05/
    cp ../config.cpb .config #j’ai repris votre fichier de config sans rien modifier.
    sudo make

    L’erreur est la même.

    Il faut que je regarde plus en détail les infos données lors de la compil pour voir si je peux y trouver une information.

    En regardant rapidement, je viens de voir ces lignes :
    This is not dpkg install-info anymore, but GNU install-info
    See the man page for ginstall-info for command line arguments
    et sur le net, une information entre deux fichiers : /usr/bin/install-info et /usr/sbin/install-info.

    Je regarde tout ça ce soir.

    • Jean-Marc Z dit :

      Bonsoir,

      Étrange, J’ai réussi à compiler la toolchain en changeant le code de répertoire. Dans mes précédents essais, le répertoire était monté par nfs (disque sur un NAS). Dans le log de la compilation, j’avais des avertissements : « make[1]: AVERTISSEMENT: fichier « libtool » a une date de modification 0,37 dans le futur ». J’ai donc décidé de compiler la toolchain sur un disque local et ô miracle, la compilation arrive à son terme avec succès.

      Je suis un peu surpris par les conséquences du montage par nfs. Pensez vous que mes soucis viennent effectivement de là ?

      En tous cas, bravo pour vos articles et merci pour votre réponse aussi rapide.

      • cpb dit :

        Bonsoir,

        J’ai un ami qui a eu le même genre de symptômes sur un disque USB. Nous en avions conclu qu’il s’agissait d’un problème lié aux droits ou au montage sans autorisation d’exécution.

        En fait le décalage d’horloge entre le client et le serveur NFS explique que make renonce à compiler un fichier alors qu’il aurait dû le faire (il n’y aurait pas une différence d’architecture ou de format 32bits/64bits entre serveur et client par exemple ?).

        Cordialement.

  8. Delta dit :

    Salut,
    Merci bcp pour ce site très intétrssant !!

    En compilant la toolchain j’obtiens l message:

    ./stdio.h:477:1: error: ‘gets’ undeclared here (not in a function)
    _GL_WARN_ON_USE (gets, « gets is a security hole – use fgets instead »);
    ^
    In file included from freading.h:18:0,
    from freading.c:20:
    ./stdio.h:477:1: error: ‘gets’ undeclared here (not in a function)
    _GL_WARN_ON_USE (gets, « gets is a security hole – use fgets instead »);
    ^
    In file included from clean-temp.h:22:0,
    from clean-temp.c:23:
    ./stdio.h:477:1: error: ‘gets’ undeclared here (not in a function)
    _GL_WARN_ON_USE (gets, « gets is a security hole – use fgets instead »);
    ^
    make[4]: *** [freading.o] Error 1
    make[4]: *** Waiting for unfinished jobs….
    make[4]: *** [freadahead.o] Error 1
    mv -f .deps/dup-safer-flag.Tpo .deps/dup-safer-flag.Po
    make[4]: *** [clean-temp.o] Error 1
    make[4]: Leaving directory `/home/DELTA/RPI/buildroot/output/build/host-m4-1.4.16/lib’
    make[3]: *** [all] Error 2
    make[3]: Leaving directory `/home/DELTA/RPI/buildroot/output/build/host-m4-1.4.16/lib’
    make[2]: *** [all-recursive] Error 1
    make[2]: Leaving directory `/home/DELTA/RPI/buildroot/output/build/host-m4-1.4.16′
    make[1]: *** [all] Error 2
    make[1]: Leaving directory `/home/DELTA/RPI/buildroot/output/build/host-m4-1.4.16′
    make: *** [/home/DELTA/RPI/buildroot/output/build/host-m4-1.4.16/.stamp_built] Error 2

    Merci pour votre aide.

URL de trackback pour cette page