Building a compiler with Crosstool-ng

What is crosstool-ng : http://www.crosstool-ng.org/

Step 1 – Preparation

Download and compile it :

$  git clone git://crosstool-ng.org/crosstool-ng
$  cd crosstool-ng
$  ./configure --enable-local 
$  make

Step 2 – Configuration

Configure your target (ex: arm architecture) :

$ ./ct-ng arm-unknown-linux-gnueabi

If you are not sure about the target you need, you can check the existing ones :

$ ./ct-ng list-samples
....
[L..] armeb-unknown-linux-gnueabi
....
[L..] x86_64-unknown-linux-gnu
[L..] x86_64-unknown-linux-uclibc
[L.X] x86_64-w64-mingw32
[L..] xtensa-unknown-linux-uclibc
 L (Local) : sample was found in current directory
 G (Global) : sample was installed with crosstool-NG
 X (EXPERIMENTAL): sample may use EXPERIMENTAL features
 B (BROKEN) : sample is currently broken

Step 3 – Generation

Generate the compiler :

$ ./ct-ng build

Usage

Once the compilation is done,

$ export PATH=crosstool-ng/.build/arm-unknown-linux-gnueabi/buildtools/bin/:$PATH
$ export CCPREFIX := arm-unknown-linux-gnueabi-
$ export AS := $(CCPREFIX)as
$ export LD := $(CCPREFIX)ld
$ export CC := $(CCPREFIX)gcc
$ export AR := $(CCPREFIX)ar

You can also repeat the build operation on different target to generate all you need:

$ ./ct-ng arm-unknown-linux-gnueabi 
$ ./ct-ng build
$ export PATH=crosstool-ng/.build/arm-unknown-linux-gnueabi/buildtools/bin/:$PATH

Possible errors

[ERROR] g++-4.6.real: internal compiler error: Killed (program cc1plus)

This happended to me on a board with not enough memory. You can temporarily add more swap :

dd if=/dev/zero of=swap.img bs=1024k count=1000
mkswap swap.img
swapon swap.img

Sources

https://briolidz.wordpress.com/2012/02/07/building-embedded-arm-systems-with-crosstool-ng/

[F15] Ajouter un raccourci personnalisé sous gnome 3

Comme vous le savez, gnome3 est assez .. épuré … en terme de paramétrage rapide. Et pour cause, le mot d’ordre semble avoir été de privilégier l’usage au paramétrage (ce qui ma foi est plutôt une bonne chose).

Du coup, voilà une manière propre d’ajouter un raccourci personnalisé dans la liste des applications favorites.

Pour cela il faut ajouter un nouveau fichier .desktop dans le dossier share/applications, cependant contrairement à ce que certains conseillent, je suis totalement opposé à l’écriture dans le dossier /usr/share/aplications, et pour cause, chaque utilisateur dispose de son propre dossier : ~/.local/share/applications (à créer s’il n’existe pas encore).

Par exemple, pour ajouter un lien vers eclipse avec les arguments qui vont bien :

mkdir -p ~/.local/share/applications
cp /usr/share/applications/eclipse.desktop ~/.local/share/applications

Puis modifier le fichier eclipse.desktop comme bon vous semble :

[Desktop Entry]
Type=Application
Name=Eclipse superstack
Comment=Eclipse Integrated Development Environment
Icon=eclipse
Exec=eclipse -vmargs -Xms1024m -Xmx4196m
Terminal=false
Categories=Development;IDE;Java;

Ensuite il suffit de réactualiser la liste des applications, pour cela on redémarre gnome3 :
[alt] + [F2], tapez « r » puis [enter]

Et voilà votre nouveau raccourci « eclipse superstack » est ajouté à la liste des applications disponibles.

Gnome3 : quelques astuces

Je viens de me mettre à gnome3, j’en bave un peu pour retrouver mes marques.

Du coup je vais poster ici ce qui m’a vraiment bloqué pour l’instant :

Afficher la date de l’horloge : gsettings set org.gnome.shell.clock show-date true
Afficher les numéros de semaine dans le calendrier : gsettings set org.gnome.shell.calendar show-weekdate true
Ajouter les boutons minimize et maximize des fenêtres : gconftool-2 –set /desktop/gnome/shell/windows/button_layout –type string « :minimize,maximize,close »

Utiliser la touche [Del] pour supprimer dans nautilus :

1) Activer le mode de modification des raccourcis : gsettings set org.gnome.desktop.interface can-change-accels true

2) Puis aller dans Fichier > edition > Mettre à la poubelle (sans cliquer) et faire [Del] [Del] , le raccourci est modifié.

3) Désactiver le mode : gsettings set org.gnome.desktop.interface can-change-accels false

et dans le même genre : https://bodman.wordpress.com/2011/08/01/ajouter-un-rac…se-sous-gnome3/

Voilà, c’est tout pour l’instant.

Sources : http://www.khattam.info/howto-add-minimize-maximizerestore-buttons-in-gnome-3-2011-05-26.html, http://www.khattam.info/howto-enable-delete-key-in-nautilus-3-fedora-15-2011-06-01.html

Valgrind with C++ on fedora 14

Si vous aussi, vous aviez une erreur lors de l’utilisation de valgrind avec fedora 14 en C++, réjouissez vous, la solution existe (et elle est  bien simple).

en root :
>yum reinstall libstdc++ libstdc++-devel gcc-c++ gcc
>ldconfig

Cela dit, j’ai observé un problème assez gênant, je dois refaire la manip après chaque reboot de la machine….

Ayant lu en diagonale le lien suivant, je n’ai pas encore obtenu solution finale, mais c’est déjà bien.

source: https://bugzilla.redhat.com/show_bug.cgi?id=650149

Faire ses propres RPMs sous Fedora

Bonjour à tous,
Cela fait bien longtemps que je voulais faire ce ticket. A chaque fois que j’ai une manipulation à faire sur un RPM c’est la même rengaine, c’est une action rare et du coup je dois bien passer deux heures à chercher pour faire une action qui devrait prendre 3 minutes.

Les RPM, et le packaging en général sont des sujets très intéressants, très documentés aussi. Je citerais mes sources en fin d’article.

Étape 1 – Préparation logiciel

Alors voici un certains nombre d’applications à installer pour être bien préparé :

(En root)
yum groupinstall "Fedora Packager"
yum install rpmdevtools
yum groupinstall "Development Tools"
yum install kernel-devel kernel-headers kmodtool fedpkg (pour les amoureux du noyau et des modules)

Etape 2 – Utilisateur builder

Bon je l’appel builder (je sors ça d’un tutos) mais prenez le nom que vous voulez.

(En root)
useradd builder
passwd builder
su - builder
rpmdev-setuptree

echo "%vendor                    VOTRE_NOM" >>    $HOME/.rpmmacros
echo "%packager             Fedora user" >>    $HOME/.rpmmacros
echo "%dist                       .f14" >>    $HOME/.rpmmacros

(Pensez bien sur à remplacer VOTRE_NOM et f14 pour les valeurs de votre choix)

Etape 2bis (facultative) – Préparation des signatures GPG

A la suite de l’étape 2, faites :

gpg --gen-key
echo "%_signature             gpg" >>    $HOME/.rpmmacros
echo "%_gpg_name              VOTRE_NOM" >>    $HOME/.rpmmacros
echo "%_gpg_path              /home/builder/.gnupg" >>    $HOME/.rpmmacros
gpg --export --armor >RPM-GPG-KEY-VOTRE_NOM

Etape 3 – Construction d’un RPM

Alors ici, plusieurs possibilités, voici donc une liste de quelques opérations courantes :

  • Construction d’un paquet déjà existant sur un dépôt distant
  • Construction d’un paquet à partir d’un src.rpm
  • Construction d’un paquet à partir du fichier SPEC

Construction d’un paquet déjà existant sur un dépôt distant

C’est le cas le plus simple et le plus courant. Par exemple, mettons qu’il y ait une erreur de dépendance entre deux paquets suite à la mise à jour de l’un sans recompilation de l’autre, la solution est de compiler à nouveau le paquet défectueux.

Parfois cette erreur n’est corrigée sur les serveurs que plusieurs jours après. Un solution serait alors de les devancer sans pour autant avoir à compiler à la main le dernier tar.gz qui traine.

Pour cela, rien de plus simple,  il suffit de récupérer le fichier src.rpm sur le dépôt distant directement avec yum :

(En builder)
cd ~/rpmbuild/SRPMS
yumdownloader --source mpd

Désormais le fichier src.rpm se trouve dans le dossier courant (~/rpmbuild/SRPMS) lisez la suite pour préparer le rpm.

Construction d’un paquet à partir d’un src.rpm

Une fois le fichier src.rpm copié dans le dossier rpmbuild/SRPMS de l’utilisateur builder :

(En builder)
rpmbuild --rebuild mpd-0.15.11-1.fc14.src.rpm

Et voila, le dossier rpmbuild/RPMS/x86_64 (ou i586, selon l’architecture de la machine local) contient le rpm désiré.

Si vous souhaitez préciser l’architecture ciblée, faite ainsi :

rpmbuild --rebuild mpd-0.15.11-1.fc14.src.rpm --target i586,x86_64

Si vous souhaitez pouvoir modifier ce paquet (ajouter un patch ou je ne sais quoi, lisez la suite).

Construction d’un paquet à partir du fichier SPEC

La préparation de paquet à partir d’un fichier SPEC est très fréquente aussi. Qu’il s’agisse d’une nouvelle application (donc absente des dépôts distants) ou bien d’une mise à jour. C’est le moyen de modifier des paquets déjà existants.

Pour ce faire, vos sources (le tar.gz ainsi que les patchs)  doivent être présentes dans le dossier ~/rpmbuild/SOURCES et votre fichier spec dans le dossier rpmbuild/SPECS.

Si vous disposez d’un src.rpm, utilisez la commande suivante :

(En builder)
rpm -ivh mpd-0.15.11-1.fc14.src.rpm

Si vous ne disposez que d’un fichier SPEC, il existe une commande qui, si les liens du spec sont corrects, vous permettra de rapatrier tous  les fichiers nécessaires.

(En builder)
cd ~/rpmbuild/SOURCES
spectool -g ../mpd.spec

Ensuite la construction se fait ainsi :

(En builder)
cd ~/rpmbuild/SPECS
rpmbuild -ba mpd.spec

A la fin de ces étapes, vous disposez enfin de rpm valides dans le dossier ~/rpmbuild/RPMS.

Pour les installer, une solution simple s’offre à vous :

(En root)
rpm -ivh  /home/builder/rpmbuild/RPMS/i386/mpd-0.15.11-1.fc14.i386.rpm

Mais une deuxième solution existe, le dépôt local.

REMARQUE : La compilation d’un RPM nécessite les dépendances de ce dernier. Pour les installer facilement :

yum-builddep less-394-1.fc4.src.rpm -y

 

Création d’un dépôt local pour yum

Préparation

Pour construire son propre dépôt il faut commencer par ranger les rpms dans un dossier commun. Ici j’utiliserais /DATA/depot/14.

On respectera l’arbo (RPM et SRPMS) déjà utilisée pour le dossier rpmbuild de l’utilisateur builder.

[FACULTATIF] Signer les paquets (avec builder)  rpmsign –addsign paquet.rpm [FACULTATIF]

Pour générer le dépôt, rien de plus simple :

(utilisateur gérant le dossier /DATA/depot/14)
cd /DATA/depot/14
createrepo .

Un dossier repodata est créé, tout s’est bien passé.

Définition du dépôt local dans yum

La définition du dépôt local se fait dans le dossier /etc/yum.repos.d/

Ajoutez-y un fichier local.repo contant les lignes suivantes :

[localrepo]
name=Fedora Core $releasever - My Local Repo
baseurl=file:///DATA/14
enabled=1
gpgcheck=0

mettez gpgcheck=1 si vos paquet sont signez, mais pensez alors à installer la clef GPG :

(En root)
rpm --import ~builder/RPM-GPG-KEY-VOTRENOM

A chaque modification du dépôt, pensez à refaire la commande createrepo. De même, pour vous assurer que ces nouveaux paquets soient pris en compte par yum, pensez a faire un yum clean metadata.

Voilà, c’est tout pour aujourd’hui.

Sources :

http://doc.fedora-fr.org/wiki/RPM_:_environnement_de_construction (mon ticket est très inspiré de cette page)

http://www.g-loaded.eu/2005/12/11/local-yum-repository/ (Partie dépôt local)

Fichier codé Macintosh BinHex

Une brève toujours utile, j’ai récemment eu un souci avec un fichier provenant d’un utilisateur Mac.

Le type de fichier fichier codé Macintosh BinHex (application/mac-binhex40) n'est pas pris en charge

Dans la source du mail j’ai même trouvé un beau « (This file must be converted with BinHex 4.0) »

Pour corriger le problème, il faut utiliser uudeview (disponible sous fedora avec un petit yum install uudeview):

[toky@localhost ~]$ uudeview fichier.pdf
Loaded from fichier.pdf: '' (fichier.pdf): fichier.pdf part 1 begin end Binhex
Found 'fichier.pdf' State 16 Binhex Parts begin 1 end OK
 -rw-r--r-- fichier.pdf is OK   [d] (?=help) d
Opened file fichier.pdf
BinHex file: data/resource fork sizes 2523514/0.
 File successfully written to /home/toky/fichier.pdf
1 file decoded from 1 input file, 0 failed

Vous trouverez alors dans votre dossier personnel le fichier décodé.

VMWare Server 2.0 on Fedora 10

Quelques notes à l’attention des futurs usagers :

  • Ne pas utiliser le rpm, préférer le tgz.
<u><b>Il s'agit d'une rustine à ne pas faire sur une machine en production.</b></u><br /><br />

[F10] Petite astuce avec les RPM

Lorsque l’on récupère un RPM exotique souvent on cherche à l’installer comme ça :

[root@localhost toky]# rpm -ivh *.rpm
erreur: Dépendances requises:
libgdk-1.2.so.0 est nécessaire pour coriolis-crlcore-1.0.20080221-1.i386
libgtk-1.2.so.0 est nécessaire pour coriolis-crlcore-1.0.20080221-1.i386
libgdk-1.2.so.0 est nécessaire pour coriolis-cyclop-1.0.20080221-1.i386
libgtk-1.2.so.0 est nécessaire pour coriolis-cyclop-1.0.20080221-1.i386
libgdk-1.2.so.0 est nécessaire pour coriolis-isobar-1.1.20080221-1.i386
libgtk-1.2.so.0 est nécessaire pour coriolis-isobar-1.1.20080221-1.i386
libgdk-1.2.so.0 est nécessaire pour coriolis-mistral-1.1.20080221-1.i386
libgtk-1.2.so.0 est nécessaire pour coriolis-mistral-1.1.20080221-1.i386
libgdk-1.2.so.0 est nécessaire pour coriolis-nimbus-1.1.20080221-1.i386
libgtk-1.2.so.0 est nécessaire pour coriolis-nimbus-1.1.20080221-1.i386

Et là on passe un certain temps à installer les dépendances lorsqu’il y en a beaucoup.

Mais il y a mieux !!

[root@localhost toky]# yum localinstall *.rpm
***********
***********
***********
–> Résolution des dépendances terminée
***********
***********
Le paquetage coriolis-nimbus-debuginfo-1.1.20080221-1.i386.rpm n’est pas signé

Presque bon …

[root@localhost toky]# yum –nogpgcheck localinstall *.rpm

Tada !!