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 10/05/2007, 15:16]
Ner0lph Amélioration de la mise en page.
— (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 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 : <​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 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**. 
-[[:​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. 
- 
----- 
- 
-uj 
  • projets/paquets/compiler_un_programme.1178802968.txt.gz
  • Dernière modification: Le 10/05/2007, 16:23
  • (modification externe)