Faites votre travail avec make!

ArticleCategory: []

Software Development

AuthorImage:[Here comes a small picture of you]

[Wilbert Berendsen]

TranslationInfo:[Info concerning writer(s) and translator(s)]

original in nl Wilbert Berendsen

nl to en Philip de Groot

en to fr Iznogood

AboutTheAuthor:[a short biography about the author]

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!

Abstract:[a small summary/description of this article]

Cet article montre le fonctionnement de make et comment il peut �tre utilis� pour d'autres choses que le d�veloppement logiciel.

ArticleIllustration:[illustration]

[Illustration]

ArticleBody:[The real article: put the text and html-codes here]

Introduction

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.

Exemple: construire un site web

Nous voulons cr�er un site web qui sera maintenu par plusieurs personnes. Jans s'occupe de deux pages et en assure la maintenance. Piet g�re la mise en page.

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.html
R�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.html
Cette 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.

Premi�re rencontre avec make

Le manuel-info de GNU make est un document fantastique. N�anmoins, d�s le d�part, il met l'accent sur un environnement de programmation. Pour cette raison, j'essaie de pr�senter les fonctions de make au sens g�n�ral :
    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.

Syntaxe du Makefile

Le Makefile peut �tre cr�e avec un �diteur et ressemble � :
# 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.

Un Makefile pour notre exemple

Pour notre exemple, le Makefile doit ressembler � ceci :
# 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!

Am�liorer le Makefile

Variables

Gr�ce aux variables, un Makefile peut �tre beaucoup simplifi�. Les variables sont d�finies comme suit :
variable = value
Nous 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

# fin
C'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�!

R�gles de mod�le

Les `R�gles de mod�le' permettent d'utiliser le m�me jeu de commandes sur tous les types de cibles diff�rents.

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 ...
	commande
Le 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/% : %
	commandes
Si 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
	commandes
Le 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 ?

Variables automatiques

Heureusement, make d�finit quelques variables pour lui-m�me. Quelques unes de ces variables sont appel�es automatiques. Elles contiennent, pendant l'ex�cution de la commande (ou mieux : juste avant d'ex�cuter ces commandes), la valeur de la cible et/ou de la condition pr�alable.

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                           ;\
        } > $@

# fin
Ceci 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 !

Les derni�res petites optimisations

Nous pr�f�rerions mentionner les documents dans DOCS, sans inclure le r�pertoire entier. Cela peut �tre fait avec ce qui suit (nous rempla�ons DOCS au d�but du makefile par TEXTS):
TEXTS = index.html  offer.html  yetanotherfile.html

# Ne changez rien en dessous de cette ligne ;-)
# -------------------------------------------------------------
DOCS =  $(addprefix $(TARGETDIR)/,$(TEXTS))

all: $(DOCS)

# etc
Ce 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: all
Maintenant, 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                           ;\
        } > $@

# fin
Enregistrez 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!

Remarque finale

Bien s�r, il est possible de modifier cet exemple pour d'autres situations.

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 !

Trucs

Plus d'informations

Plus d'informations sur le fonctionnement de make et sur toutes les autres possibilit�s peuvent �tre trouv�es dans le `Manuel GNU Make '. Vous pouvez lire ce manuel sur votre syst�me Linux avec la commande suivante :
info make
Bien 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 !