Différences
Ci-dessous, les différences entre deux révisions de la page.
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 15/05/2007, 08:09] 89.173.135.197 Ajouté une 3ieme méthode pour retrouver les bibliothèques manquantes (apt-get build-dep) |
— (Version actuelle) | ||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
- | {{tag>Dapper école formation cours compilation}} | ||
- | ---- | ||
- | |||
- | ^ Séance ^ Date ^ Cours dispensé par ^ Lieu ^ Rédacteur ^ | ||
- | | 2 | 30/09/2006 | [[utilisateurs:Gloubiboulga]] | canal IRC #ubuntu-fr-classroom | [[utilisateurs:youp]] | | ||
- | |||
- | ====== 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'[[:tutoriel:comment_installer_un_paquet|installation du paquet]] « **build-essential** » est aussi nécessaire, il contient tous les outils de compilation nécessaires (libc6-dev, make, etc.). | ||
- | |||
- | ===== Présentation des sources ===== | ||
- | |||
- | Commençons par regarder un [[http://gauvain.tuxfamily.org/school/2006-09-30/exemples/source.c|bout de code source en 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 ou 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]]). | ||
- | La bibliothèque « 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 ». | ||
- | La bibliothèque « 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 soi 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 : <code>./configure</code> | ||
- | - pour compiler : <code>make</code> | ||
- | - pour installer (nécessite les droits d'administration) : <code>sudo make install</code> | ||
- | |||
- | |||
- | |||
- | ==== Retrouver les bibliothèques manquantes ==== | ||
- | |||
- | Il y a trois méthodes pour retrouver les bibliothèques manquantes : | ||
- | * selon les dépendances dur paquet ; | ||
- | * selon les erreurs de « ./configure » ; | ||
- | * selon le fichier « configure.ac ». | ||
- | ===Les dépendances du paquet === | ||
- | |||
- | Tout paquet Debian/Ubuntu qui se respecte liste toutes les dépendances qui lui sont nécessaires tant à l'exécution comme à la compilation. La manière la plus simple de télécharger les dépendances est d'utiliser apt-get avec l'option build-dep, ainsi la la commande : | ||
- | |||
- | sudo apt-get build-dep epdfview | ||
- | |||
- | Va s'occuper de télécharger toutes les dépendances nécessaires à la compilation du projet. Bien sure cette technique ne fonctionne que si le paquet existe déjà . | ||
- | |||
- | ===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**. | ||
- | [[:tutoriel:comment_installer_un_paquet|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). FIXME | ||
- | |||
- | |||
- | ===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. | ||
- | |||
- | [[:tutoriel:comment_editer_un_fichier|Ouvrez le fichier]] « configure.ac » avec un éditeur de texte. | ||
- | Vous allez trouver ces lignes (non successives) : | ||
- | <file> | ||
- | 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]) | ||
- | </file> | ||
- | 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 apparaitre. 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 langage machine) : | ||
- | |||
- | make | ||
- | |||
- | === Installation === | ||
- | |||
- | On va installer les fichiers avec : | ||
- | |||
- | sudo make install | ||
- | |||
- | Ça va installer les fichiers nécessaires (l'exécutable, les images, et quelques autre fichiers) dans « /usr/local ». Cela nécessite donc les droits d'administration. | ||
- | |||
- | 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 ». Ça 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 | ||
- | |||
- | |||
- | ===== Ressources ===== | ||
- | |||
- | * Une [[tutoriel:creer_un_paquet#foire_aux_questions|foire aux questions]] est disponible. | ||
- | |||
- | ---- |