En 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 !
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.
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.
Merci beaucoup !
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 😉
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
Bonjour,
J ai rencontré le même problème que j ai résolu en choisissant la version 0.9.32 de uClib plutôt que la dernière 0.9.33.
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
Je crois que la bibliothèque
termcap
est incluse dansncurses
.Il faudrait donc essayer :
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.
il manquais effectivement la libncures5-dev ,la compilation c’est tres bien dérouler merci.
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é ?
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.
Je viens de refaire la compilation sur mon poste sans erreur.
Voici ma configuration :
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).
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.
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.
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.
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.