|
(3509 mots dans ce texte ) -
lu : 1140 Fois

Note : Nous parlerons ici de compilation. La diversité
des langage de programmation ne nous permet pas toutefois d'aborder le sujet
de manière exhaustive, loin s'en faut. Nous allons donc nous contenter
d'étudier la compilation de programmes en C ou C++, langage utilisé le plus
fréquemment puisque Linux et la majeure partie des applications GNU sont
elle-même écrits en C ou en C++.
La différence entre le C et le C++? Le C est l'ancêtre du C++, c'est un langage procédural tandis que le C++ est orienté objet. Le C++ inclue toutefois quasiment toues les fonctions du C, ce que l'on peut faire avec le C, on peut le faire avec le C++, un programme C est également un programme C++.
Pour la petite histoire (et bien comprendre l'humour particulier des developpeurs) ++ est une opérande du langage C, l'incrémentation, elle signifie "ajouter 1 à la variable" et se rencontre surtout dans les boucles pour utiliser des compteurs, la boucle tourne jusqu'à ce que la variable incrémentée atteigne une certaine limite. Pour en mettre plein la vue dans les soirées mondaines, vous pouvez dire "le C++ est le C incrémenté en boucle infinie" avec un petit sourire en coin... Succès garanti.
Introduction
Ce tutoriel se veut une initiation à la compilation des utilitaires conformes aux spécifications GNU et écris en langage C. Pour aller plus loin dans ce vaste domaine, il vous faudra apprendre le langage de programmation C.
Pourquoi compiler un programme? Il peut y avoir plusieur raisons dont la
moindre n'est pas le fun. Mais il peut y avoir des raisons plus sérieuses.
Vous pouvez désirer profiter de la dernière version d'un programme qui inclu
certaines fonctionnalité et n'est pas encore disponible sur votre
distribution. Peut-être la version officielle du programme n'est pas à votre
goût voire instable (c'est assez rare quand même). Utilisation de GTK plutôt
que QT (gnome au lieu de KDE, pour faire simple) ou bien les mainteneurs ont
délibérément choisi de retirer certaines fonctionnalité et d'en activer
d'autres (les raisons sont généralement justifiées mais la meilleure façon
d'en avoir le coeur net est d'essayer.
Bref, vous aurez surement envie tôt ou tard, de vous lancer dans la
compilation d'un programme. Encore faut-il savoir ce que vous allez devoir
faire.
Comme nous l'avons déjà souligné plusieurs fois auparavant, sous GNU/Linux, la limite est mince et vite franchie entre la simple administration du système et la programmation du système. L'ouverture du code source en est responsable ainsi que l'enthousiasme des programmeurs et leur propention à partager leur connaissances. Bref, avec des opérations telle que la compilation, chose qui n'est courante que sous unix, nous franchissons cette mince frontière et nous risquons à faire quelques pas timides dans ce pays magique.
Quand on commence à s'interesser à GNU/Linux, on se heurte souvent à des commentaires du genre "linux, c'est un système pour les pros" "c'est super dificile parcequ'il faut connaître la programmation et tout", etc. Vous savez maintenant la vérité : aucune connaissance préalable n'est strictement nécessaire avant de déployer un système GNU mais vous pouvez ensuite utiliser toute l'energie que vous avez jusque là gachée en tentant de comprendre un système obscur à apprendre à maîtriser rééllement un système qui le permet. GNU n'est pas un système réservé aux pro mais fera de vous un pro...
-1-Les outils pour compiler
Par défaut, GNU/Linux contient déjà tout ce qu'il vous sera necessaire
pour faire de la compilation à un niveau correct, savoir divers langages de
programmation, les compilateurs adaptés, des outils d'analyse, etc. Plus
tard, vous aurez peut-être envie de pousser plus loin et il vous sera alors peut-être
nécessaire de vous construire tout un environnement dédié à la
programmation mais pour l'instant, vous avez tous les outils en main.
Créer un groupe ou un utilisateur dédié
Ça peut être une très bonne idée de créer un utilisateur pour faire tous ses essais de compilation. Pourquoi? Je parie que votre répertoire home contient déjà pas mal de répertoires et de fichiers, et si vous n'êtes pas plus ordonnés que moi, il y a un peu le même bordel que dans votre chambre (après tout c'est chez vous...). Bon, c'est pas l'idéal pour travailler. Chez vous, vous ne pouvez pas vous construire un pièce aussi facilement que votre gnou peut vous fabriquer un bureau alors votre bureau est peut-être dans votre chambre mais si vous le pouviez, hein?
Nul besoin d'avoir des droits particuliers pour compiler un programme.
Seule l'installation, c'est-à-dire la copie des fichiers créés par la
compilation dans les répertoires adéquat du système nécessite les droits
d'écriture sur ces répertoire, autrement dit, les droit root. Il convient de
ne pas compiler en root, même si vous êtes sûrs de l'intégrité de l'archive,
pour le principe : il ne faut se connecter en root que lorsque cela est
rigoureusement nécessaire pour les raison de sécurité déjà expliquées maintes
fois.
Une base de connaissances
si vous avez bien suivi les autres tutos, et que vous pratiquez régulièrement la ligne de commande, vous connaissez déjà un peu le langage de script bash et êtes familliarisés avec la ligne de commande. En commençant à compiler, vous allez passer une autre étape.
Étudiez atentivement les fichiers extraits de l'archive décompressée qui contient les sources du programme, observez la syntaxe des scripts, demandez à man, file, whereis, whatis, etc, de vous eclairer dès que vous avez un soucis.
Se créer un répertoire dédié
Le répertoire de home de l'utilisateur créé, si vous l'avez fait, est
parfait pour cette tâche. Vous devriez tout de même y ajouter desrépertoires qui sépareront les tarball et les archives décompressées des fichiers anexes de l'utilisateur. Le répertoire personnel contient en effet un grand nombre de fichiers cachés, des fichiers de configuration de différents programmes. un petit ls -la?
Compiler des programmes de developpement
Il est souvent necessaire de recompiler des librairies avec les options de develloppement activées ou s'ils sont disponibles sous forme de paquets, ils contiennent l'extension -devel- ou -dev-, c'est généralement le cas sous debian où il faut en plus activer les dépots unstable dans la majorité des cas.
Parfois, vous devrez même utiliser les codes en cours de develloppement, via CVS ou SVN.
Les paquets devel et les programmes en cours de develloppement ne sont normalement nécessaire que pour la compilation des programmes mais non pour leur utilisation, sauf si le programme que vous voulez compiler est lui-même en cours de develloppement.
Si vous arrivez à ce stade, il vous sera necessaire de faire une installation dédiée à la programmation afin de séparer proprement les paquets stables et ceux que vous utilisez en devel, ainsi que pour tester le fonctionnement de vos programmes dans un environement normal.
Vous allez devoir vous interesser aux programmes qui permettent le develloppement collaboratif avec contrôle de versions. RCS, CVS et SVN. Tout ceci sort cependant du cadre de ce tutoriel - qui se veut une introduction - et rentre dans la catégorie develloppement. Tâchez dans un premier temps de vous attaquer plutôt à des programmes relativement "simples", ils présentent déjà pas mal de difficultés.
-2-Procédure simplifiée : compiler en trois temps
Vous récupérez une belle archive toute fraîche sur le net. Cette archive
se finit par l'extension .tar.gz ou .tar.bz2. Elle est copiée dans votre
répertoire dédié à la compilation. Maintenant, quoi faire pour avoir un
programme en cinq sec? Si et seulement si le logiciel n'a besoin d'aucune
dépendance autre que ce que vous avez déjà sur votre système (c'est le cas
des programmes les plus élémentaires, ne comptez pas que ce soit aussi facile
avec des trucs complexes, modulaires et interfacés à mort), cela se fait en
quatre lignes de code. Magic, non? Même pas besoin de cliquer!
La méthode qui suit n'est donnée qu'à titre d'exemple. Vous pouvez vous y
essayer mais je vous déconseille de valider la dernière étape, l'installation
en root. Il y a une méthode bien plus propre quoique plus complexe. Si
malgrès ça, vous désirez quand même aller jusqu'au bout, at your own
risk...
-2-1-Décompresser l'archive
Oui, le programme source que vous avez téléchargé est une archive
compressée, pour prendre moins de place sur le serveur et moins de temps à
télécharger. Il est même compressé plusieurs fois, une fois en tar et une
seconde fois en gzip ou en bzip mais une seule ligne de code va vous le
décompresser illico dans le répertoire courant:
tar xjvf [nom de l'archive] : pour les archive .tar.bz2
tar xzvf[nom de l'archive] : pour les archives en .tar.gz
Le nom du programme est tar, l'argument x lui indique qu'il faut
décompresser une archive tar, j pour .bz2, z pour .gz, v pour verbose (ça permet
de suivre le travail du programme et de pas resté devant une ligne vide le
temps de l'opération à se demander si il y a un problème), le f pour dire
qu'on va lui donner le nom du fichier à décompresser, pas de panique, ça
arrive...
Quand tar a fini son taf, vous aurez un beau répertoire tout neuf avec
tout ce qu'il faut dedans. Il faut maintenant entrer dans ce répertoire, avec
la classique commande :
cd [nom du nouveau répertoire]
Vous êtes prêt? Partez!
-2-2-Configurer les sources
Il y a normalement un script configure ou configure.sh dans l'archive bien
que certains programmes n'en aient pas besoin. Vérifiez qu'il est là. Si il
n'est pas présent, passez à l'étape suivante. si il est là, éxécutez-le:
sh configure
Le script bosse un peu et si il n'y a pas d'erreur, vous pouvez maintenant
compiler le programme. Si par contre il y a une érreur, c'est sûrement un
problème de dépendance et là, il va falloir se lancer dans la "procédure
propre". Allez directement à la case suivante.
-2-3-Compiler
make
Que dire de plus? man make, peut-être...
-2-4-Installer
Installer de cette manière n'est pas très recommandé. Il est préférable de transformer vos binaire en paquet natif pour différentes raisons liées à la maintenance du système.
Étape à effectuer en root:
make install
Make install va copier les fichiers dans les répertoires appropriés.
-2-5-Desinstaller
Normalement, vous pouvez effectuer l'opération inverse en lançant :
make uninstall
Malheureusement, ce n'est pas toujours le cas. C'est pourquoi la méthode
la plus propre est la fabrication d'un package, qui sera plus facile à
desinstaller, pour installer une version plus à jour, par exemple. Il faut
donc toujours garder telles quelles les sources des paquets que vous avez
compilés.
-3-Procédure propre
-3-0-De la théorie? encore!
Hé oui, encore de la théorie.
Comment ça marche?
On l'a déjà vu, un programme n'est jamais un seul et gros fichier où le programmeur aura fouré tout son code. Il y a plein de fichiers, de répertoires et chacun de ces fichier est lié aux autres. Modules, librairies de fonction, dépendances et là encore au sein d'un même programme
Outre le soucis de clareté, il y a aussi le fait que lorsqu'on lance un programme, des emplacements mémoires lui sont réservés, à chaque fois qu'un programme active une de ses fonctions, les variables dont elle a besoin sont initialisées en RAM et si chaque programme devait être intégralmeent chargé avec ses variables, la mémoire vive serait rapidement saturée même avec les enormes capacités mnésiques dont nous jouisssons actuellement.
Regardez dans un tarball, les fichiers source portent l'extension .c ou .cc, chacun de ces fichiers doit être compilé en tenant compte du système sur lequel le programme doit tourner. Il est certain que si l'on devait se tapper cette étape manuellement, ce tuto serait beaucoup plus long (en fait, il vaudrait mieux se tourner vers un manuel de programmation). Toutes ces étapes sont gérées par deux fichiers, le script configure, qui inspecte votre système et les makefiles qui dirigent la compilation.
Le script configure réécrit le makefile celon vos besoins après queoi vous pourrez lancer la compilation proprement dite.
C'est le programme make qui va gérer ceci, lancer le compilateur quand il faut en suivant le makefile. De cette manière, notre tâche est considérablement allégée. C'est pourquoi, vous n'utiliserez jamais directement le compilateur gcc lorsque vous compilerez des programmes en tarball.
-3-0-1-Le compilateur
Le compilateur GNU a pour nom gcc, il gère le code C et C++, on l'appelle de la façon suivante pour compiler un fichier donné :
gcc -o [fichier de sortie] [fichier source]
Vous vous demandez surement pourquoi on n'appelle pas gcc pour compiler un programme au lieu de la commande make. En fait c'est le programme make qui va invoquer le compilateur au moment adéquat.
-3-0-2-makefiles
Les programmes en C sont modulaires par nature, c'est à dire que les programmeurs ne se contentent pas de créer leur code dans un seul gros fichier mais découpent leur travail dans plusieurs fichiers répartis dans des répertoires. Ceci est essentiel pour qu'on puisse s'y retrouver. Gardez aussi présent à l'esprit qu'il n'y a que rarement un seul programmeur pour un même programme. Chacun va travailler sur des petits bouts de code et non sur l'ensemble.
Vous pouvez donc faire le parallèle entre cette méthode de travail et la façon dont est régi le système GNU lui-même, au moyen des librairies et des dépendances. En fait, le langage C a été créé spécifiquement dans le but de developper le système unix en 1972 et sa popularité auprès des programmeur a vite été si grande qu'il a été nécessaire de le standardiser en 1983. Aujourd'hui, on utilise ce standart ANSI, à quelques exceptions près (je vous laisse deviner lesquelles).
La compilation des programmes en C doit donc se faire pour chaque fichier source l'un après l'autre, dans un certain ordre, selon les jeux de dépendances, et suivant les variables de votre environnement. C'est le rôle de make et des makefile de contrôler ce processus. Dans un tarball, ouvrez un makefile. Vous y trouverez tout un tas d'instructions. D'abord des déclarations de variables puis du code pour make.
make cherche et trouve le makefile (ou retourne une erreur) puis déclare ses variables pour enfin compiler le code.
-3-1-Lire les readme et les install.txt
J'ajouterais aussi, toute documentation founie par les programmeurs et les
maintenaurs du logiciel que vous désirez compiler sur leurs sites web. Le
maximum d'information sera utile. En même temps que vous compilez, notez ce
que vous faites dans un fichier texte, ça vous aidera surement à vous y
retrouver plus tard, ça vous donnera des éléments pour acquérir une
méthodologie personnelle et, pourquoi pas? rédiger un tuto sur le
logiciel.
Dans l'archive décompressée, il y a un fichier README et quelque par un
fichier install peut-être même un script install.sh dont vous pourrez vous
inspirer.
Le script install.sh contient toutes les commandes pour configurer et compiler les sources puis les installer. Il doit se lancer en root pour le make install final, je ne vous conseille donc pas de l'utiliser directement mais de le lire afin de voire comment les mainteneurs conseillent de compiler.
-3-2-Chercher les dépendances
Dans les fichiers readme et install, vous trouverez sans doute une liste
de dépendances. Vérifiez leur présence dans votre système. Si ces dépendances
contiennent l'abréviation dev ou devel, elles ne sont peut-être pas présentes sous
cette forme. Ce sont les versions de developpement des logiciels, qui sont
compilées avec la configuration dev utile aux developpeurs et pour la
compilation de certains paquets.
Soyez attentif aux numéros de version. Les dépendances sont parfois notées "version X.X ou plus récente", parfois réclament une version précise. Vous pouvez en général installer le paquet d'une version plus ancienne d'un programme sans avoir à desinstaller la plus récente, pour les librairies, c'est toujours le cas puisque c'est très fréquent.
Avec les programmes, l'installation d'un paquet désinstalle normalement les paquets plus anciens, pas les plus récents mais cela peut cependant être le cas.
Le problème que vous pourrez rencontrer avec les librairies est l'ecrasement du lien pointant vers la version la plus récente de la librairie, qui pointera alors vers la version que vous venez d'installer (cela peut être gênant pour les programmes qui se servent de ce lien pour trouver la librairie).
Pour contourner ces désagréments, vous pouvez, au lieu d'installer simplement le paquet, vous contenter de copier le contenu du paquet dans les répertoires apropriés. Les liens sont en effet créés dynamiquement par le script d'install du paquet.
Cherchez les dépendances, d'abord en paquets natif et sinon sous forme de sources que vous devrez compiler. Les librairies ne posent généralement pas de problème à la compilation.
-3-2-1-Vérifier la présence des dépendances
Vous le pouvez à l'aide de votre gestionnaire de paquet. Comme celui-ci
diffère suivant les distributions, nous ne pouvons pas rentrer ici dans les
détails. Citons cependant kpackage, le logiciel de KDE, très pratique
d'autant plus qu'il ne nécessite pas les droits de root sauf pour agir sur
les paquets mais pour vérifier leur présence, sans y toucher, votre
utilisateur peut tout à fait le lancer sans risque.
-3-3-2-Installer les dépendances
Vous pouvez alors soit installer les dépendances manquantes avec votre
gestionnaire de paquet, soit les compiler vous-même à la main. Pour cela,
trouvez l'archive des sources sur internet puis recommencez à l'étape
-3-1-
Comme vous vous en doutez, cela peut être long et contraignant, les
dépendances nécessitant parfois elles-même des dépendances, etc.
-3-3-Configurer les sources
-3-3-1-Les options de configuration
Si votre archive contient un fichier configure ou configure.sh, vous devrez l'utilisez pour configurer les sources et le makefile. Pour passer vos propre parmètres au script, lancez la commande suivante afin de savoir les element que vous pouvez customiser :
sh configure --help
Le help de configure vous donne normalement les arguments qui sont utilisés par defaut si vous lancez configure sans argument.
-3-3-2-Les répertoires de déstination
L'argument --prefix= permet de choisir les répertoires de
destination des binaires et des librairies pendant l'étape de configuration.
par exemple :
sh configure --prefix=/usr/local/
Normalement, la configuration par défaut installera le programme dans ce
répertoire mais il vaut mieux le vérifier et s'interoger si ce n'est pas le
cas.
Rajouter des fonctions au programme.
Les arguemnts sont les suivants selon les cas
--with-[fonction à ajouter]
--enable-[truc]
Des erreurs au sh configure
Certaines fonction du programme ne peuvent peut-être pas être activée pour diverses causes, certaines dépendances ne sont peut-être pas satisfaite, la sortie du script vous retournera les erreurs adéquat. Vous pourrez alors soit rechercher les dependances en question, soit désactiver les option de configuration en question en relançant le script configure avec certaines de ces option :
--without-something
--disable-something
Reportez-vous à configure --help pour savoir lequel employer suivant l'erreur obtenue.
-3-3-3-Les path pour les librairies
Il se peut que l'erreur retournée par configure concerne une librairie qui est présente dans votre système mais pas à l'endroit atendu. Vous pouvez alors créer des liens dans ce répertoire qui pointeront vers les librairies en question ou indiquer au script configure où il doit les chercher :
Pour créer un lien :
links [cible=l'endroit où est la lib/nom de la lib-version] [destination=l'endroit où la lib est attendue/nom-version]
Cela peut être utile car il est fort probable que d'autres programmes attendront la librairie à cet endroit également. Toutefois, on peut se contenter de passer le path exact de la librairie au script configure :
--with-[librairie]=[path]
make
Une fois les sources configurées (ou si le programme n'a pas besoin de configurer les sources : si il n'y a pas de script configure), vous pouvez lancer la commande make. Certaines erreur peuvent encore être retournées, notemment des dépendances (hé ouui, encooore) qui ont échappées à configure, comme l'absence d'un compilateur par exemple mais en général, les erreurs apparaissent à l'étape de configuration.
-3-4-Fabriquer et installer un paquet
Les règles de création d'un paquet diffèrent d'une distribution à l'autre,
celles-ci fournissent des outils pour le faire facilement. checkinstall en
est un. Vous devriez installer le paquet officiel et stable de checkinstall de votre
distribution.
-4-4-1-La variable $DESTDIR
Vous povez lancer la commande make install avec la variable $DESTDIR, sans
vous loger en root. Commencez par créer un rértoire de destination et
déclarez-le de la façon suivante:
make install DESTDIR=/repertoire/de/destination/
Que fait cette commande? Elle vous permet de copier tous les fichiers
issus de la compilation dans le répertoire défini et non dans le système,
c'est pourquoi vous n'avez pas besoin des droits de root. Dans ce répertoire,
seront créés les sous-répertoire necessaires pour que les fichiers soient à
leur place exactement comme s'il s'agissait du système. Vous y trouverez par
exemple, un répertoire /usr, dans lequel, vous trouverez un sous répertoire
local qui lui-même contiendra un répertoire doc, un répertoire au nom de
votre programme, un repertoire bin et dans ces répertoires, tous les fichiers
qui devraient être copiés si vous aviez lancé un simple make install en
root.
Cette commande est la première étape pour créer un paquet. Pour prendre
l'exemple que je connais le mieux, sous slackware, vous allez ensuite dans le
répertoire de destination et lancez la commande makepkg qui se chargera de
créer les fichiers supplémentaires nécessaires à la création d'un paquet
valide. C'est à dire un répertoire install, qui contiendra un fichier
slack-desk puis le compressera au format des paquets slackware, c'est-à-dire
en .tgz
Bien sûr, une opération aussi simple, si elle est suffisante pour créer un
paquet fonctionnel n'est cependant pas suffisante pour créer un paquet valide
dont vous pourrez faire profiter la communauté. Et ceci pour toutes les
distributions.
Après avoir créé votre paquet, vous pouvez l'installer et le desinstaller
facilement.
-4-4-2-checkinstall
Ce programme est un petit bijoux, si vous prennez celui qui est dédié à
votre distribution. Après l'étape de configuration puis celle de compilation
(sh configure && make), employez simplement la commande checkinstall,
répondez aux questions et il vous générera un paquet tout chaud prêt à être
installé. Encore une fois, ceci ne suffit pas à créer un paquet valide dont
vous pourrez faire profiter les autres mais est très suffisant pour vous-même
en attendant que le programme sur lequel vous avez jeté votre dévolu soit
supporté ou fiable.
En suite de quoi, il vous suffira d'installer le package avec votre gestionnaire de paquet habituel. vous pouvez aussi configurer checkinstall pour qu'il installe automatiquement le paquet après l'avoir créé. Reportez-vous au manuel pour cela.
conclusion
La compilation de programme peut parraitre soit ardue soit étonnament facile suivant le nombre de messages d'erreur que vous rencontrerez. Normalement, plus le programme est petit, moins grande est la difficulté. Certain programmes demandent beaucoup d'effort, surtout lorsque ceux-ci sont prévus pour plusieurs plateformes unix, GNU, BSD, etc.
Quoi qu'il en soit, si vous en prennez l'habitude, vous ne pourrez bientôt plus concevoir l'administration du système autrement.
Retour à la sous-rubrique :
Autres publications de la sous-rubrique :
|