Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Prochaine révision
Révision précédente
projets:paquets:compiler_un_programme [Le 06/01/2007, 19:32]
207.253.108.147
— (Version actuelle)
Ligne 1: Ligne 1:
-  Version Dapper 
  
-Rédigé par [[utilisateurs:​youp]] à la deuxième séance de formation organisé le 30 septembre par [[utilisateurs:​Gloubiboulga]] sur le canal IRC #​ubuntu-fr-classroom. Encore merci à lui pour cette initiative 
- 
-Une [[tutoriel:​creer_un_paquet#​foire_aux_questions | Foire Aux Questions]] est disponible. 
- 
-====== Compiler un programme ​ ====== 
- 
-La compilation des sources d'un programme est rarement compliquée. En général quelques commandes suffisent pour compiler et installer un logiciel. Le plus pénible est certainement de trouver et d'​installer toutes les dépendances requises pour la compilation. ​ 
-On va surtout s'​attarder sur les sources utilisant les autotools comme système de compilation,​ et vous proposer quelques astuces pour vous simplifier la vie. 
-Ce petit topo a pour objectif de fournir des outils et des astuces pour trouver les dépendances. 
- 
- 
-==== Pré-requis ==== 
-  * Il faut activer les dépôts source dans votre ''​sources.list''​ (dépôts commençant par deb-src, voir [[:​depots|cette page]] pour de plus amples explications). 
- 
-  * L'​installation du paquet **build-essential** est aussi nécessaire,​ il contient tous les outils de compilation nécessaires (libc6-dev, make...) : 
- 
-  sudo apt-get install build-essential 
- 
-===== Présentation des sources ===== 
-Commençons par regarder un bout de code source en C : 
-http://​gauvain.tuxfamily.org/​school/​2006-09-30/​exemples/​source.c. 
-Les trois lignes commençant par "#​include"​ sont des appels à d'​autres fichiers : 
- * mousepad.h (écrit entre guillemets doubles) est un fichier fourni avec les sources du logiciel ; 
- * gtk/gtk.h et glib.h (écrits entre < et >) sont des fichiers qui doivent être présents sur le système lors de la compilation. ​ 
- 
-Ces fichiers sont de manière générale installés dans /​usr/​include (le nom du dossier n'est pas anodin). Tout ça importe peu quand on compile/​installe,​ mais ça peut cependant être utile de savoir ce que veulent dire ces mots clés, en cas d'un éventuel problème de compilation. 
- 
- 
-==== Les bibliothèques ==== 
-Les fichiers appelés par les programmes en C sont des parties de bibliothèques (traduction de "​library"​). Les bibliothèques sont des ensembles de fonctions (des mini-programmes qui effectuent une tâche précise, par exemple réunir deux mots en un seul, afficher une image, réagir lorsqu'​on clique...) qui n'ont pas besoin d'​être réécrites à chaque fois que quelqu'​un veut développer un logiciel. Par exemple, les bibliothèques GTK et Qt dépendent toutes deux de libpng, qui sert à manipuler des images .png (pour un résultat totalement différent). 
- 
-Chez Ubuntu (comme sur toutes les distributions basées sur debian), les bibliothèques sont dispatchées dans plusieurs paquets (2 au minimum). Prenons l'​exemple de libfltk. Elle est installée dans libfltk1.1 et dans libfltk1.1-dev (libfltk1.1 et libfltk1.1-dev étant les noms des paquets, installables via apt). 
-libfltk1.1 contient les fichiers nécessaires à __l'​exécution__ d'un programme se servant de cette bibliothèque ([[http://​packages.ubuntu.com/​cgi-bin/​search_contents.pl?​searchmode=filelist&​word=libfltk1.1&​version=dapper&​arch=i386|voir ce paquet]]), c'est à dire des fichiers .so.x.y installés dans /​usr/​lib. ​ 
-libfltk1.1-dev contient les fichiers nécessaires à la __compilation__ (les fameux fichiers .h que l'on a évoqué tout à l'​heure ([[http://​packages.ubuntu.com/​cgi-bin/​search_contents.pl?​searchmode=filelist&​word=libfltk1.1-dev&​version=dapper&​arch=i38|voir ce paquet]]). 
- 
-Pour chaque bibliothèque existante dans Ubuntu, il existe un paquet dont le nom finit par -dev, qu'il est nécessaire d'​installer pour compiler les logiciels qui dépendent de cette bibliothèque. 
- 
-  
- 
- 
-===== Exemple pratique : compilation d'​epdfview ===== 
- 
-Ouvrez un terminal, et créez un dossier ~/source : 
-  mkdir ~/sources && cd ~/sources 
- 
-On va compiler epdfview dont on va récupérer les sources dans les dépôts avec : 
-  apt-get source epdfview 
- 
-Vous allez trouver un .orig.tar.gz,​ qui est en fait le .tar.gz d'​origine (disponible sur le site officiel d'​ePDFView),​ dont seul le nom diffère. 
- 
-Un dossier ''​epdfview-<​version>''​ est présent, dans lequel nous allons nous placer avec la commande ​       
-  cd epdfview-<​tab>​ 
- 
-Si ce dossier n'est pas présent, décompressez l'​archive grâce à : 
-  tar zxvf epdfview*.orig.tar.gz && cd epdfview-<​tab>​ 
- 
-Regardons alors ce qu'il y a dans ce dossier avec : 
-  ls 
- 
-Les sources en soit sont incluses dans le dossier src/ . 
-Le dossier po/ contient les traductions et vous avez tout un tas de fichiers qui vont servir à la compilation. Peu importe leur contenu, la plupart sont des scripts de plusieurs milliers de lignes permettant à l'​utilisateur de facilement compiler les sources. 
- 
- 
-Compiler et installer se fait tout simplement en exécutant : 
- 
-- pour configurer : 
-  ./​configure ​ 
-- pour compiler :  
-  make 
-- pour installer (nécessite les droits root) 
-  sudo make install 
- 
- 
-==== Retrouver les bibliothèques manquantes ==== 
- 
-Il y a deux méthodes pour retrouver les bibliothèques manquantes: 
-  * selon les erreurs de '​./​configure'​ 
-  * selon le fichier '​configure.ac'​. 
- 
-===les erreurs de '​./​configure'​ === 
- 
-Si les dépendances ne sont pas installées,​ l'​étape de configuration ('​./​configure'​) n'​ira ​ 
-pas jusqu'​au bout et vous donnera un message d'​erreur indiquant ce qui manque. 
-Cela peut être le cas ici, prenons l'​exemple de la dépendance manquante "​gtk+-2.0"​ 
-On nous indique alors : 
-   No package '​gtk+-2.0'​ found 
- 
-On sait que l'on cherche un paquet -dev puisque seuls les paquets -dev sont aptes à la compilation. Donc on va utiliser la commande: 
-   ​apt-cache search --names-only gtk dev 
- 
-L'​option --names-only permet de faire abstraction des descriptions des paquets pour la recherche. 
- 
-Il y a beaucoup de résultat pour pouvoir choisir le bon paquet. 
-Mais on sait que l'on recherche une dépendance bibliothèque,​ donc on va réduire le nombre de résultats ​ avec : 
-   ​apt-cache search --names-only libgtk dev 
- 
-Enfin, dernier indice, c'est que c'est gtk 2 que l'on recherche, donc : 
-On lance la recherche avec 
-   ​apt-cache search --names-only libgtk2 dev 
- 
-Ce qui nous donne le résultat : 
-''​libgtk2.0-dev - Development files for the GTK+ library''​ 
- 
-Le paquet manquant était : **libgtk2.0-dev** 
-On installe donc ce paquet avec [[:​aptitude]] de préférence,​ pour pouvoir le supprimer facilement ensuite (apt-get ne supprimant pas toutes les dépendances installées par la suite). 
- 
- 
-===le fichier configure.ac=== 
- 
-Pour trouver les dépendances on a utilisé les erreurs de ./​configure,​ mais il y a plus simple et plus rapide. 
- 
-Ouvrez le fichier configure.ac avec un éditeur de texte 
-  gedit configure.ac 
-ou 
-  kate configure.ac 
- 
-vous allez trouver ces lignes (non successives) : 
- PKG_CHECK_MODULES([GLIB],​ [gthread-2.0 >= $GLIB_REQUIRED]) 
- PKG_CHECK_MODULES([GTK2],​ [gtk+-2.0 >= $GTK2_REQUIRED]) 
- PKG_CHECK_MODULES([POPPLER],​ [poppler-glib >= $POPPLER_REQUIRED gdk-2.0 >= $GTK2_REQUIRED pango]) 
-Et on a ici les dépendances requises :) 
- 
-On peut ensuite utiliser la technique de tout à l'​heure pour trouver les paquets correspondants 
- 
-le paquet contenant '​gthread'​ peut être trouvé de 2 façons: 
-  * le fichier configure.ac sous-entend que ce gthread est contenu dans la bibliothèque glib, on recherche donc avec ''​apt-cache''​ ; 
-  * on peut également utiliser '​apt-file'​ dont l'​utilisation est détaillée plus loin. 
- 
-Lors de l'​exécution du ./​configure,​ des "​Checking foo... no" peuvent apparaître. Ce n'est pas grave. Le listage continue; s'il y a un vrai problème, le script s'​arrête avec une erreur. 
- 
-=== Compilation === 
-Une fois toutes les dépendances trouvées et installées grâce à apt ou équivalent (dans notre cas ''​libgtk2.0-dev'',​ ''​libpoppler-glib-dev''​ et ''​libglib2.0-dev''​),​ les sources peuvent être compilées (c'est à dire traduites en language machine) : 
-  make 
- 
-=== Installation === 
-On va installer les fichiers avec : 
-  sudo make install 
- 
-Ca va installer les fichiers nécessaires (l'​exécutable,​ les images, et quelques autre fichiers) dans /usr/local. Cela nécessite donc les droits root. 
- 
-Et voici le résultat: 
-  david@Xarpoon:​~/​sources/​epdfview-0.1.4$ epdfview 
- 
-Vous pouvez tester en lançant ''​epdfview''​ dans votre terminal. 
- 
-=====Quelques commandes, quelques astuces, et quelques explications===== 
- 
-==== Les autotools ==== 
- 
-En fait des autotools créent le fichier ''​configure''​ des sources qui vérifie le système de l'​utilisateur. Le fichier configure est un script exécutable,​ qui est dans votre dossier source il nécessite d'​être exécuté avec ./. 
- 
-''​make''​ est une commande, installée dans /usr/bin. Il suffit donc de taper son nom pour l'​exécuter. 
-''​make''​ utilise le Makefile (qui lui est dans votre dossier source). 
-Les ./configure crée le Makefile à partir d'un Makefile.in (que vous avez dans les sources). Tout ça est créé à partir d'un fichier assez simple qu'​écrit le développeur. 
-Les "​autotools"​ sont un ensemble de scripts qui permettent de pouvoir gérer une procédure de configuration,​ compilation et installation très complexe à partir de quelques fichiers (relativement) simples. 
- 
- 
- 
-==== Quelques commandes ====  
- 
-=== '​make'​ === 
- 
-''​make''​ peut être suivi d'un mot clé comme "​install",​ "​uninstall",​ "​clean",​ "​distclean"​. Ca permet d'​appeler une fonction particulière du Makefile : 
-  * 'make uninstall'​ permet de tout désinstaller ; 
-  * 'make clean' nettoie les sources par exemple (en supprimant tout ce qui a été créé pendant la compilation) ; 
-  * 'make distclean'​ fait la même chose en supprimant en plus les Makefile, le code source reste. Cela redonne les sources comme on les a eues après avoir décompressé l'​archive. 
- 
-=== '​apt-file'​ === 
- 
-[[:​apt#​Apt-file]] est une application qui recherche des fichiers présents à l'​intérieur de paquets, même si ceux-ci ne sont pas installés. C'est donc très pratique pour trouver des dépendances. 
-Pour l'​installer,​ lancez la commande : 
-  sudo apt-get install apt-file 
-On l'​initialise ensuite comme pour apt-get en tapant : 
-  sudo apt-file update 
- 
-Dans notre exemple de tout à l'​heure,​ on voulait trouver dans quel paquet se trouve la bibliothèque libgthread, on tape alors :  
-  apt-file search libgthread 
- 
-Le paquet recherché est donc soit libglib2.0-dev soit libglib1.2-dev. 
- 
-On peut préciser la recherche avec ''​apt-file search libgthread-2.0''​ 
- 
-Il se base sur le sources.list. ​ 
-   The contents packages are fetched from the location(s) specified in /​etc/​apt/​sources.list. 
- 
-==== Les options de configuration ==== 
- 
-Si vous lancez : 
-  ./configure --help 
-Vous verrez tout ce que vous pouvez modifier comme options. Certains programmes ont de nombreuses options de compilation. 
- 
-Par exemple ​ '​./​configure --prefix=/​usr'​ installera les fichiers dans /usr/ au lieu de /usr/local (utilisé par défaut). ​ 
-Lancer `./​configure --help` avant la compilation est toujours une bonne idée (regardez mplayer par exemple, à l'​occasion). 
- 
-=== Un problème courant === 
-Il arrive que les ./configure soient mal faits, et une erreur du type : 
-  gtk/gtk.h: cannot find the file 
-peut survenir lors de la compilation. C'est apt-file qui sera votre plus sûr allié dans un tel cas : 
-  apt-file search gtk/gtk.h 
  • projets/paquets/compiler_un_programme.1168108370.txt.gz
  • Dernière modification: Le 10/05/2007, 15:16
  • (modification externe)