original in nl Wilbert Berendsen
nl to en Philip de Groot
en to fr Iznogood
Wilbert Berendsen est un professeur de musique et un utilisateur de Linux enthousiaste. Autrefois, il programmait beaucoup en assembleur pour le Z80. Aujourd''hui, il utilise Linux pour tout son travail. Simplement pour le plaisir, il �crit des articles d'introduction et maintient un petit site web sur http://www.xs4all.nl/~wbsoft/. Viva open source!
A peu pr�s toutes les personnes qui utilisent Linux ont un jour fait appel au programme make. Il fait ce qu'on attend de lui lors de la construction d'un programme ou du noyau � partir du code source, lors de l'installation d'un paquetage, ainsi de suite. 'Make' est un outil important pour le d�veloppement logiciel. Il poss�de, n�anmoins, beaucoup d'autres capacit�s!
Dans ce document, nous verrons que make peut �tre tr�s puissant pour le travail de tous les jours, tel qu'�crire des articles, des livres ou cr�er un joli site web. Pendant cette introduction, plusieurs autres 'trucs' d'Unix seront abord�s. A la fin de l'histoire, quelques trucs suppl�mentaires seront pr�sent�s sur l'utilisation de make. Remarque : nous parlons de Linux mais en principe, il est possible d'utiliser make sur tout syst�me d'exploitation.
Nous avons besoin d'un syst�me simple pour s�parer l'apparence du contenu. Une solution puissante est : lire le contenu � partir d'une base de donn�es, � chaque fois que la page est demand�e. Par exemple, PHP et Microsoft Active Server Pages fonctionnent de cette mani�re. Nous n'avons n�anmoins que la possibilit� de stocker du HTML (HyperText Markup Language). De plus, le contenu ne doit pas changer trop souvent pour maintenir la base de donn�es de mani�re efficace.
Un site web sera construit en utilisant des commandes simples, .
Par exemple, Piet met l'en-t�te du site dans header.html et le contenu du pied de page dans footer.html. header.html peut ressembler � ceci :
<html><!-- l'en-t�te --> <head> <title>Productions Piet et Jan</title> </head> <body bgcolor="white"> <table border="0" width="100%"><tr> <td bgcolor="#c040ff" valign="top"> Ceci est notre site<br> Quelques bricoles �crites ici.<br> Nous sommes tr�s interactifs<br> donc c'est notre num�ro de t�l�phone :<br> <b>0123-456789</b> </td><td valign="top"> <!-- Mettre le contenu ici -->Et ici footer.html:
<!-- le pied de page --> </td></tr></table> </body></html>Par exemple, les commandes Unix pour fabriquer la page finale � partir de l'index.html de Jans sont :
cat header.html /home/jan/Docs/website/index.html echo -n '<hr>Derni�re modification: ' date '+%A %e %B' cat footer.htmlR�f�rez-vous aux pages de manuel de ces commandes. Le fichier final, r�sultat des commandes ci-dessus, est "pip�" vers la sortie standard, qui est stock�e dans un fichier :
{ cat header.html /home/jan/Docs/website/index.html echo -n '<hr>derni�re odification: ' date '+%A %e %B' cat footer.html } > /home/piet/public_html/index.htmlCette proc�dure peut �tre r�p�t�e avec l'autre fichier, offer.html. En fait nous cr�ons un petit script qui permet la construction de notre site web.
N�anmoins, ex�cuter manuellement cette commande n'est pas r�alisable. Nous pouvons cr�er un script shell qui est ex�cut� � chaque fois que Jans a mis � jour son index. N�anmoins, si Piet d�cide de changer l'en-t�te ou le pied de page, ce script doit aussi �tre ex�cut�! D'un autre cot�, si Jans n'a rien chang� pendant une journ�e, le script ne doit pas �tre ex�cut�. Nous utilisons Linux, nous voulons donc utiliser une solution �l�gante (comprendre : automatique)!
C'est l� que make intervient.
make d�termine comment un jeu de commandes doit �tre ex�cut�, en fonction de la date du fichier cible et de la date des fichiers source.En d'autres termes : si un des fichiers source, n�cessaire � la cr�ation d'un fichier cible, est plus r�cent que ce fichier cible, un jeu de commandes est ex�cut�. Le but de ces commandes est de mettre � jour le fichier cible.
Le fichier cible est la 'destination' et les fichiers source sont les `conditions pr�alables'. Les commandes sont ex�cut�es si l'une des `conditions pr�alables' est plus r�cente que le fichier cible (ou si la cible n'existe pas). Si toutes les conditions pr�alables sont plus anciennes ou poss�dent la m�me date que la cible, alors les commandes ne sont pas ex�cut�es et la cible est consid�r�e comme �tant � jour.
Dans le r�pertoire de travail courant, un fichier doit �tre cr�� avec le nom Makefile. Ce fichier contient les informations n�cessaires � make pour faire son travail correctement. Une fois que nous avons le Makefile, la seule chose � faire est de taper 'make', et les commandes, n�cessaires pour cr�er un nouveau fichier cible, sont ex�cut�es automatiquement.
Make est appel� avec la commande
make cible1 cible2 ....
cible est optionnel (si cible est omis, la premi�re cible du Makefile est utilis�e). Make cherche toujours un Makefile dans le r�pertoire courant. Il est possible de fournir plus d'une cible.
# Ceci est un exemple de Makefile. # Les commentaires peuvent �tre mis apr�s un di�se (#). cible: conditions pr�alables commande cible: conditions pr�alables commande # etc, etc.Nous d�marrons avec une cible, suivie par deux points (:) et les conditions pr�alables n�cessaires. Dans le cas de plusieurs conditions pr�alables, il est possible de terminer la ligne avec un antislash (\) et de continuer sur la ligne suivante.
Sur la(es) ligne(s) suivante(s), une ou plusieurs commandes sont pr�sent�es. Chaque ligne est consid�r�e comme une commande unique. Si vous voulez utiliser de multiples lignes pour une commande, vous devez mettre des antislashes (\) � la fin des lignes. Make reliera les commandes comme si elles avaient �t� saisies sur une seule ligne. Dans cette situation, nous devons s�parer les commandes par un point virgule (;) de mani�re � �viter les erreurs dans l'ex�cution du shell.
Note: Les commandes doivent �tre indent�es avec une TAB, pas avec 8 espaces!
Make lit le Makefile et d�termine pour chaque cible (en commen�ant par la premi�re) si la commande doit �tre ex�cut�e. Chaque cible, associ�e aux conditions pr�alables et aux r�gles, est pr�sent�e comme une 'r�gle' (rule).
Si make est ex�cut� sans argument, seule la premi�re cible sera ex�cut�e.
# Ce Makefile construit le site web de Piets et Jans, les mangeurs de pommes de terre. all: /home/piet/public_html/index.html /home/piet/public_html/offer.html /home/piet/public_html/index.html: header.html footer.html \ /home/jan/Docs/website/index.html { \ cat header.html /home/jan/Docs/website/index.html ;\ echo -n '<hr>Derni�re modification: ' ;\ date '+%A %e %B' ;\ cat footer.html ;\ } > /home/piet/public_html/index.html /home/piet/public_html/offer.html: header.html footer.html \ /home/jan/Docs/website/offer.html { \ cat header.html /home/jan/Docs/website/index.html ;\ echo -n '<hr>Derni�re modification: ' ;\ date '+%A %e %B' ;\ cat footer.html ;\ } > /home/piet/public_html/offer.html # fin
Maintenant, nous avons trois cibles, 'all' et les fichiers index.html et offer.html du site. La seule fonction de la cible 'all' est d'avoir les deux autres comme conditions pr�alables. Ils sont test�s tous les deux. 'all' en lui-m�me n'�tant pas un nom de fichier, la cible 'all' sera toujours ex�cut�e. (Plus tard, nous pr�senterons une mani�re plus �l�gante de d�finir des cibles qui ne sont pas des fichiers).
Si l'en-t�te et le pied de page sont modifi�s, les deux pages seront mises � jour. Si Jans modifie une de ses pages, seule la page modifi�e sera mise � jour. Ex�cuter la commande 'make' fait le travail!
Bien s�r, le Makefile a un inconv�nient : il n'est pas facile � v�rifier. Heureusement, plusieurs techniques existent pour rendre les choses plus simples!
variable = valueNous nous r�f�rons � une variable avec l'expression $(variable). Si nous incorporons ceci dans un Makefile, il s'am�liore :
# Ce Makefile construit le site web de Piets et Jans, les mangeurs de pomme de terre. # R�pertoire dans lequel le site web est stock� : TARGETDIR = /home/piet/public_html # R�pertoire de Jans : JANSDIR = /home/jan/Docs/website # Les fichiers n�cessaires � la mise en page : LAYOUT = header.html footer.html all: $(TARGETDIR)/index.html $(TARGETDIR)/offer.html $(TARGETDIR)/index.html: $(LAYOUT) $(JANSDIR)/index.html { \ cat header.html $(JANSDIR)/index.html ;\ echo -n '<hr>Derni�re modification: ' ;\ date '+%A %e %B' ;\ cat footer.html ;\ } > $(TARGETDIR)/index.html $(TARGETDIR)/offer.html: $(LAYOUT) $(JANSDIR)/offer.html { \ cat header.html $(JANSDIR)/index.html ;\ echo -n '<hr>Derni�re modification: ' ;\ date '+%A %e %B' ;\ cat footer.html ;\ } > $(TARGETDIR)/offer.html # finC'est une bonne habitude d'utiliser des majuscules pour les variables. Maintenant, il est plus facile de changer le r�pertoire cible, par exemple.
Si vous voulez, il est possible de d�finir une autre m�thode pour chaque document que vous souhaitez ajouter dans la mise en page. Que devons-nous faire si plusieurs documents doivent �tre ajout�s dans la m�me mise en page ? Le Makefile deviendrait tr�s gros, alors que plusieurs redondances existent. Cela peut aussi �tre simplifi�!
Si les R�gles de mod�le sont utilis�es, la syntaxe de la ligne change; un champ de mod�le est ajout� :
Multiples cibles : mod�le : condition pr�alable condition pr�alable ... commandeLe mod�le est une expression qui doit �tre applicable � toutes les cibles. Un caract�re pourcentage (%) est utilis� pour incorporer les parties variables d'un nom de cible.
Un exemple:
/home/bla/target1.html /home/bla/target2.html: /home/bla/% : % commandesSi make lit ceci, la ligne est �tendue sur 2 lignes. Ici, le mod�le d�termine quelle partie du nom de la cible est incorpor�e dans le signe pourcentage.
Le caract�re pourcentage dans le champ des conditions pr�alables repr�sente la partie qui est copi�e par ce signe pourcentage.
Make d�compose ce qui pr�c�de de la mani�re suivante :
/home/bla/target1.html: target1.html commandes /home/bla/target2.html: target2.html commandesLe caract�re pourcentage dans le mod�le `/home/bla/%' obtient par la cible `/home/bla/target1.html' la valeur `target1.html', �tendant ainsi la condition pr�alable `%' � `target1.html'.
Pour notre site web, les r�gles suivantes seront incorpor�es :
$(TARGETDIR)/index.html $(TARGETDIR)/offer.html: $(TARGETDIR)/% : \ $(JANSDIR)/% $(LAYOUT)Maintenant, il nous reste un probl�me : comment utiliser les variables dans les commandes ? Les commandes �taient-elles l�g�rement diff�rentes pour les deux cibles ?
La variable sp�ciale $\ est utilis�e pour indiquer la premi�re condition pr�alable et la variable $@ s'�tend toujours � la cible courante.
En utilisant ces variables, il est possible de g�n�raliser la r�gle compl�te comme suit :
$(TARGETDIR)/index.html $(TARGETDIR)/offer.html: $(TARGETDIR)/% : \ $(JANSDIR)/% $(LAYOUT) { \ cat header.html $< ;\ echo -n '<hr>Derni�re modification: ' ;\ date '+%A %e %B' ;\ cat footer.html ;\ } > $@Voil�! Cette simple ligne fonctionne maintenant pour les deux fichiers !
Pour �tre complet, le Makefile entier est pr�sent� avec quelques optimisations :
# Ce Makefile construit le site web de Piets et Jans, les mangeurs de pomme de terre. # r�pertoire o� le site web est publi� : TARGETDIR = /home/piet/public_html # r�pertoire de Jans : JANSDIR = /home/jan/Docs/website # Fichiers n�cessaires � la mise en page : LAYOUT = header.html footer.html # Voici les pages web : DOCS = $(TARGETDIR)/index.html $(TARGETDIR)/offer.html # Ne changez rien en dessous de cette ligne ;-) # ------------------------------------------------------------- all: $(DOCS) $(DOCS): $(TARGETDIR)/% : $(JANSDIR)/% $(LAYOUT) { \ cat header.html $< ;\ echo -n '<hr>Derni�re modification: ' ;\ date '+%A %e %B' ;\ cat footer.html ;\ } > $@ # finCeci commence � ressembler � ce que cela devrait �tre. Si d'autres documents sont ajout�s, il est facile de les incorporer dans le Makefile, en utilisant la variable DOCS, sans trop avoir de saisies � faire.
A la fin, la personne qui maintient le Makefile devrait facilement comprendre le fonctionnement, sans de poser trop de questions !
TEXTS = index.html offer.html yetanotherfile.html # Ne changez rien en dessous de cette ligne ;-) # ------------------------------------------------------------- DOCS = $(addprefix $(TARGETDIR)/,$(TEXTS)) all: $(DOCS) # etcCe que nous voyons ici est une fonction sp�ciale de make : au lieu d'un nom de variable, il est possible d'utiliser une expression compl�te entre parenth�ses. De cette mani�re, il est possible de modifier des textes de plusieurs fa�ons.
La commande sp�ciale $(addprefix prefix,list) ajoute un pr�fixe � chaque �l�ment de la liste. Dans l'exemple, c'est le contenu de la variable TARGETDIR plus un slash (/).
Les objets list�s sont s�par�s par des espaces. Pour cette raison, ce n'est pas une bonne id�e de traiter des noms de fichiers avec espaces avec la commande make.
Pour conclure : au d�but, nous avons mentionn� que la cible 'all' ne cr�erait pas un fichier avec le nom 'all' (cette ligne ne contient pas de commande) et comme r�sultat, cette cible est toujours ex�cut�e. Mais comment g�rer ce cas, si <accidentellement> un fichier existe avec ce nom, et qu'il est plus r�cent que tous les autres fichiers...?
Il y a une mani�re facile d'indiquer � make qu'une cible particuli�re doit �tre toujours ex�cut�e et que cette cible ne correspond � aucun fichier sur le disque dur. Pour ce faire, la cible est marqu�e comme 'phony' (non r�el). Ceci est fait comme suit :
.PHONY: allMaintenant, le Makefile complet ressemble � ceci :
# Ce Makefile construit le site web de Piets et Jans, les mangeurs de pommes de terre. # R�pertoire o� le site web est publi� : TARGETDIR = /home/piet/public_html # R�pertoire de Jans : JANSDIR = /home/jan/Docs/website # Fichier n�cessaire pour la structure : LAYOUT = header.html footer.html # Voici les noms des pages web : TEXTS = index.html offer.html autrefichier.html # Ne changez rien en dessous de cette ligne ;-) # ------------------------------------------------------ DOCS = $(addprefix $(TARGETDIR)/,$(TEXTS)) .PHONY: all all: $(DOCS) $(DOCS): $(TARGETDIR)/% : $(JANSDIR)/% $(LAYOUT) { \ cat header.html $< ;\ echo -n '<hr>Derni�re modification: ' ;\ date '+%A %e %B' ;\ cat footer.html ;\ } > $@ # finEnregistrez ce fichier et oubliez-le ! A partir de maintenant, il est possible de maintenir vos pages web, peut �tre en utilisant votre crontab et pour s�parer proprement la mise en page du contenu!
Par exemple, la mani�re simpliste par laquelle le document est g�n�r� n'est pas sans risque d'erreurs : si Jans termine ses articles accidentellement par </body></html>, la plupart des navigateurs n'afficheront pas le pied de page cr�� par Piet. Si nous utilisons grep, perl ou tcl, il est possible d'ajouter quelques titres aux documents de Jans d'une mani�re astucieuse dans l'en-t�te du site.
Bien s�r, Jans peut simplement �crire un texte et utiliser la commande sed pour changer toutes les lignes vides (retour chariot) en <P>:
sed -e 's/^\s*$/<p>/g'Jans peut aussi �crire ses textes dans LyX et utiliser un programme comme lyx2html, pour le convertir en HTML. Il existe d'extraordinaires possibilit�s !
Une autre mod�le de construction est aussi envisageable.
Nous n'avons pas pris en consid�ration la fa�on de transf�rer (redimensionner, convertir ou compresser) les images dans le r�pertoire du site. Il est aussi possible d'automatiser ce processus!
Dans cet exemple, Piet doit avoir les droits de lecture dans le r�pertoire du site web de Jans. L'int�r�t dans la s�paration de ces taches est de pouvoir les mettre en pratique dans de grosses organisations. Piet peut m�me se loger � l'autre bout du monde ou monter son r�pertoire personnel par NFS. Les exemples peuvent aussi �tre utilis�s pour le travail effectu� par un utilisateur.
Esp�rons que les principes de fonctionnement du Makefile sont devenus plus clairs et que votre travail quotidien sera facilit� par l'�criture d'un bon Makefile !
En utilisant des cibles 'phony' (.PHONY: cible), il est facile de rassembler des fonctions simples. Un exemple est la configuration du noyau Linux.
Taper make menuconfig d�marre la configuration avec un menu interactif. Taper make xconfig d�marre la configuration avec une interface Tcl/Tk sous X.
Les deux cibles mentionn�es ci-dessus n'ont rien � voir avec la construction r�elle du noyau. Elles fournissent une interface simple aux fonctions n�cessaires (comme configurer le noyau).
Vous devriez cr�er un Makefile avec les cibles PHONY suivantes :
De cette mani�re, il est possible de g�n�rer du HTML � partir d'un fichier texte et d'am�liorer la mise en page du fichier HTML ainsi obtenu. Un exemple :
TEMPLATE = layout1/Template1.txt /home/httpd/sales/sales.html: sales.html $(TEMPLATE) perl Scripts/BuildPage.pl -template $(TEMPLATE) $< > $@-new mv -f $@-new $@ sales.html: sales.txt aptconvert -toc $@ $<Cherchez comment le fichier doit �tre mis � jour si Template1.txt a �t� modifi�.
Si une commande est pr�c�d�e par un '@', elle n'est pas affich�e par la commande make :
cible : prerequisite @cc -o target prerequisiteSi une commande commence par un '-', le processus make ne se terminera pas si cette commande g�n�re une erreur (par exemple, effacer un fichier inexistant) :
.PHONY: clean clean: -rm -r $(tempdir)Si vous voulez voir ce qu'effectue une certaine commande de make, e.g. make install mais que vous ne vouliez pas que la commande soit r�ellement ex�cut�e, utilisez l'option -n au prompt :
wilbert@nutnix:~ > make -n install install -m 755 program /usr/local/bin install -m 644 program.1 /usr/local/man/man1 wilbert@nutnix:~ >
Si vous avez besoin du signe dollar ($) comme partie, par exemple, d'un nom de fichier ou d'une commande shell, utilisez-le doubl� ($$):
# Un Makefile # Ne tentez pas ceci chez vous ! :-) source = menu.txt help.txt target: $(source) for i in $(source) ;\ do \ if [ "$$i" = "menu.txt" ] ;\ then \ doThis $$i ;\ else \ doThat $$i ;\ fi ;\ done > targetMake remplacera, avant d'envoyer des commandes au shell pour ex�cution, ses propres variables et changera le signe double dollar en un seul.
info makeBien s�r, il est possible de lire le Manuel GNU Make avec les navigateurs d'aide GNOME et KDE ou le programme tkinfo.
Liens vers d'autres informations � propos de make:
Amusez-vous bien !