Gnu Make où comment se simplifier la vie avec les commandes longues et fastidieuses

Posted by

Par Hindy Soliman, le 3 juillet 2002.

    Dans cette courte documentation nous n’utiliserons que Gnu make. Petit rappel sur d’autres Unix il se peut que les implantations de la commande make soit en fait celle de BSD. Et la sémantique change quelque peu entre ces deux implantations.

    Vous avez du remarquer que dans 90% des cas pour compiler un logiciel sous Linux nous utilisons les commandes : configure, make puis make install. Ce qu’il est important de prendre en compte c’est qu’on peut utiliser la commande make sans pour autant compiler des programmes sources. Par exemple lors de la génération des tables NIS on utilise la commande make pour créer celles-ci.

    Avant toute chose je vous conseille de jeter un coup d’oeil aux commandes info make et man make qui sont très bien documentées.

    Que se passe-t-il quand vous lancez la commande make ? La commande make recherche un fichier (dans cet ordre) GNUMakefile, makefile et enfin Makefile. De manière générale on utilisera le fichier nommé Makefile pour décrire nos règles.

    Donc finalement ce court article va vous apprendre comment construire ce fameux fichier Makefile.

    Au lieu de parler étudions un premier exemple, le célèbr /e hello world (c’est le premier programme qu’on apprend dans tout nouveau langage). Ouvrez votre éditeur de texte préféré (emacs…) et créez le fichier Makefile suivant :

,—-
| all:
| echo toto
`—-

    Explication nous avons la cible all qui n’a aucune dépendance (après les « : » on voit du blanc). Ensuite il est très important qu’avant la commande echo vous utilisiez la touche Tabulation.

    Testons notre fichier Makefile, pour cela nous allons taper make et voir ce qu’il se passe dans notre terminal.

,—-
| (hindy:~/tmp) make
| echo toto
| toto
| (hindy:~/tmp)
`—-

    Et là on est tout content car on voit toto apparaître sur notre terminal. Si on y regarde de plus près on se rend compte aussi que notre commande apparait aussi dans le déroulement. C’est pas forcément très esthétique donc on peut réécrire notre fichier Makefile pour lui demande de ne pas afficher la commande exécutée, seulement le résultat de cette commande. Le fichier Makefile ressemblera à ceci :

,—-
| (hindy:~/tmp) cat Makefile
| all:
| @echo toto
| (hindy:~/tmp)
`—-

    Et effectivement quand on tape la commande make, on voit seulement toto qui apparaît.

    Étudions un autre exemple, dans ce cas ci nous avons deux fichiers nommés fichier1 et fichier2 que nous voulons envoyer vers un troisième fichier nommé final. On peut bien entendu utiliser la commande cat (c’est d’ailleurs ce que nous utiliserons mais de manière plus fine). Nous allons voir les dépendances qu’on peut lier à la commande make.

Soit le fichier Makefile suivant :
,—-
| (hindy:~/tmp) cat Makefile
| all: fichier1 fichier2
| cat fichier1 fichier2 > final | (hindy:~/tmp)
`—-

    Nous avons la cible all et très important ce qui se trouve après les « : » correspond aux fichiers dépendants. En clair si vous utilisez la
cible all et que les fichiers précisés n’existent pas dans le répertoire alors la commande make refusera de s’exécuter. On le voit
make nous permet d’éviter des erreurs si les fichiers n’existent pas.

Revenons à notre cible all, on aurait tout aussi bien pu lancer la
commande make all qui aurait cherchée la cible all et exécuter les commandes contenues dans celle-ci.

    Il peut bien entendu y avoir plusieurs cibles dans un même fichier Makefile, on peut imaginer une règle pour refaire notre fichier nommé
final, et une règle pour détruire le fichier final. On écrirait le
fichier Makefile suivant :

,—-
| (hindy:~/tmp) cat Makefile
| all: fichier1 fichier2
| cat fichier1 fichier2 > final
| clean: final
| rm -f final
| (hindy:~/tmp)
`—-

    Maintenant il nous suffit de lancer la commande make (qui prend la cible la plus haute dans le fichier Makefile) pour créer le fichier
final, si nous tapons make clean cela aura pour effet de détruire le fichier final.

    Et pour finir voici quelques liens sympathiques.

http://www.linuxfocus.org/Francais/May2001/article181.shtml

http://echo-linux.alienor.fr/articles/imake/imake

Leave a Reply

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *