Ci-dessous, les différences entre deux révisions de la page.
| Prochaine révision | Révision précédente | ||
| dev:outils:crosstool [2012/12/31 11:47] – créée root | dev:outils:crosstool [2021/02/01 21:51] (Version actuelle) – modification externe 127.0.0.1 | ||
|---|---|---|---|
| Ligne 3: | Ligne 3: | ||
| Crosstool est un outil libre écrit par Dan Kegel et placé sous licence GPLv2. Il regroupe un ensemble de scripts permettant de construire une chaine de compilation croisée. Plus complexe à prendre en main qu'une chaine fournie sous forme de binaire telle que ELDK, crosstool apporte cependant plus de souplesse en s' | Crosstool est un outil libre écrit par Dan Kegel et placé sous licence GPLv2. Il regroupe un ensemble de scripts permettant de construire une chaine de compilation croisée. Plus complexe à prendre en main qu'une chaine fournie sous forme de binaire telle que ELDK, crosstool apporte cependant plus de souplesse en s' | ||
| - | L' | + | L' |
| ===== Installation de Crosstool ===== | ===== Installation de Crosstool ===== | ||
| - | Croostool est dsiponible sur le site Dan Kegel http://www.kegel.com/ | + | Croostool est dsiponible sur le site Dan Kegel à l' |
| + | <code bash> | ||
| + | yoann@hermes: | ||
| + | yoann@hermes:/ | ||
| + | yoann@hermes:/ | ||
| + | yoann@hermes:/ | ||
| + | yoann@hermes:/ | ||
| + | </ | ||
| + | |||
| + | ===== Structure de l' | ||
| + | |||
| + | Les scripts nécessaires à la génération de la chaine de compilation croisée sont directement présents dans le répertoire de l' | ||
| + | * des fichiers exemples demo-xxx.sh permettant de générer des chaines de compilation types. | ||
| + | * des fichiers *.dat définissant les variables/ | ||
| + | * des fichiers *.config pour les configurations de noyaux vers les cibles compatibles (utilisés par le fichiers .dat). | ||
| + | |||
| + | Le répertoire **dowload** contiendra les paquets téléchargés par crosstool lors de la compilation de la chaine. Le répertoire **patches** contient les patchs applicables (le contenu de ce répertoire pourra être étendu si besoin). | ||
| ===== Configuration ===== | ===== Configuration ===== | ||
| Ligne 18: | Ligne 34: | ||
| * le noyau, | * le noyau, | ||
| * les patchs | * les patchs | ||
| + | |||
| + | |||
| + | ===== Générer une chaine de compilation croisée pour ARM ===== | ||
| + | |||
| + | Un script de démonstration permet de générer une chaine de compilation croisée pour ARM: **demo-arm.sh**. L' | ||
| + | * Des variables de configuration notamment **RESULT_TOP** pour définir le répertoire de destination de la chaine et **GCC_LANGUAGES** pour définir quels languages pourront être compilés via cette chaine. | ||
| + | * Un esemble d' | ||
| + | |||
| + | ==== Modification du script demo-arm.sh ==== | ||
| + | Ici, on crée une copie du fichier de demo que l'on va légèrement modifier. | ||
| + | |||
| + | <code bash> | ||
| + | yoann@hermes:/ | ||
| + | yoann@hermes:/ | ||
| + | </ | ||
| + | |||
| + | Modifier la valeur de la variable **RESULT_TOP** pour générer la chaine de compilation croisée dans un répertoire du home utilisateur. | ||
| + | |||
| + | < | ||
| + | RESULT_TOP=$HOME/ | ||
| + | </ | ||
| + | |||
| + | On profite de la souplesse de Crosstool. On commente la dernière ligne générant une chaine avec gcc 4.1.0 et glibc 2.3.2tls et on introduit une ligne générant plutôt une chaine avec gcc 4.2.2 et glic 2.3.2. | ||
| + | |||
| + | < | ||
| + | #eval `cat arm.dat gcc-4.1.0-glibc-2.3.2-tls.dat` sh all.sh --notest | ||
| + | eval `cat my-arm.dat gcc-4.2.2-glibc-2.3.2.dat` sh all.sh --notest | ||
| + | </ | ||
| + | |||
| + | Le script utilise à présent deux fichiers n' | ||
| + | |||
| + | ==== Création du fichier gcc-4.2.2-glibc-2.3.2.dat ==== | ||
| + | |||
| + | Le fichier de configuration gcc-4.2.2-glibc-2.3.2.dat n' | ||
| + | |||
| + | <code bash> | ||
| + | yoann@hermes:/ | ||
| + | yoann@hermes:/ | ||
| + | </ | ||
| + | |||
| + | Modifier la valeur des variables **GCC_DIR** et **LINUX_DIR**. | ||
| + | |||
| + | < | ||
| + | BINUTILS_DIR=binutils-2.16.1 | ||
| + | GCC_CORE_DIR=gcc-3.3.6 | ||
| + | GCC_DIR=gcc-4.2.2 | ||
| + | GLIBC_DIR=glibc-2.3.2 | ||
| + | LINUX_DIR=linux-2.6.20 | ||
| + | LINUX_SANITIZED_HEADER_DIR=linux-libc-headers-2.6.12.0 | ||
| + | GLIBCTHREADS_FILENAME=glibc-linuxthreads-2.3.2 | ||
| + | GDB_DIR=gdb-6.5 | ||
| + | </ | ||
| + | |||
| + | A présent notre fichier de configuration paramètre une chaine de compilation croisée utilisant gcc en version 4.2.2 et le noyau linux en version 2.6.20. | ||
| + | |||
| + | |||
| + | ==== Création du fichier my-arm.dat ==== | ||
| + | |||
| + | Le script générant notre chaine de compilation s' | ||
| + | |||
| + | <code bash> | ||
| + | yoann@hermes:/ | ||
| + | yoann@hermes:/ | ||
| + | </ | ||
| + | |||
| + | Ici, on s' | ||
| + | |||
| + | < | ||
| + | KERNELCONFIG=`pwd`/ | ||
| + | TARGET=arm-crosstool-test-linux-gnu | ||
| + | TARGET_CFLAGS=" | ||
| + | </ | ||
| + | |||
| + | ==== Lancer la compilation ==== | ||
| + | |||
| + | Lancer la compilation de notre chaine en executant le script **my-demo-arm.sh**. | ||
| + | |||
| + | <code bash> | ||
| + | yoann@hermes:/ | ||
| + | </ | ||
| + | |||
| + | === 1iere tentative === | ||
| + | |||
| + | La premiere tentative est abordée, le message suivant est affiché: | ||
| + | |||
| + | < | ||
| + | No such file `gdb-6.5.tar.bz2' | ||
| + | |||
| + | + test -f / | ||
| + | + abort file gdb-6.5.tar.bz2 not found | ||
| + | + echo file gdb-6.5.tar.bz2 not found | ||
| + | file gdb-6.5.tar.bz2 not found | ||
| + | + exec false | ||
| + | </ | ||
| + | |||
| + | Le fichier gdb-6.5.tar; | ||
| + | |||
| + | <code bash> | ||
| + | yoann@hermes:/ | ||
| + | ... | ||
| + | Current remote directory is / | ||
| + | ncftp / | ||
| + | gdb-6.5a.tar.bz2 | ||
| + | ncftp / | ||
| + | </ | ||
| + | |||
| + | Une archive gdb-6.5a.tar.bz2 existe, on modifie le fichier pour lui donner cette version de GDB. | ||
| + | |||
| + | === 2< | ||
| + | A l' | ||
| + | |||
| + | < | ||
| + | checking for arm-unknown-linux-gnu-gcc... gcc | ||
| + | checking version of gcc... 4.4.3, bad | ||
| + | checking for gnumake... no | ||
| + | checking for gmake... no | ||
| + | checking for make... make | ||
| + | checking version of make... 3.81, ok | ||
| + | configure: error: | ||
| + | *** These critical programs are missing or too old: gcc | ||
| + | *** Check the INSTALL file for required versions. | ||
| + | yoann@hermes:/ | ||
| + | </ | ||
| + | La vérification de la version de gcc échoue. Un patch permet de modifier ce comportement. Il est fournit dans les ressources additionnelles de l' | ||
| + | |||
| + | <code bash> | ||
| + | yoann@hermes:/ | ||
| + | yoann@hermes:/ | ||
| + | yoann@hermes:/ | ||
| + | yoann@hermes:/ | ||
| + | </ | ||
| + | |||
| + | Le contenu du patch est donné ci-dessous | ||
| + | <file glibc-2.3.3-allow-gcc-4.4-configure.patch> | ||
| + | *** glibc-2.3.2/ | ||
| + | --- glibc-2.3.2/ | ||
| + | *************** | ||
| + | *** 2272,2278 **** | ||
| + | ac_prog_version=`$CC -v 2>&1 | sed -n ' | ||
| + | case $ac_prog_version in | ||
| + | '' | ||
| + | ! | ||
| + | | ||
| + | *) ac_prog_version=" | ||
| + | | ||
| + | --- 2272,2278 ---- | ||
| + | ac_prog_version=`$CC -v 2>&1 | sed -n ' | ||
| + | case $ac_prog_version in | ||
| + | '' | ||
| + | ! | ||
| + | | ||
| + | *) ac_prog_version=" | ||
| + | |||
| + | </ | ||
| + | |||
| + | Remarque: Pour que les patch soient appliqués automatiquement par crosstool, ils doivent se trouver sous le répertoire ./patchs de l' | ||
| + | |||
| + | ===== Sources ===== | ||
| + | |||
| + | Linux embarqué, Pierre Ficheux et Eric Bénard. \\ | ||
| + | http:// | ||
| + | |||
| + | |||