Le Makefile, bûcheron des forêts

lundi 13 décembre 2004.
 
Gugu :

#Compilateur et options de compilation
COMP=gcc
OPTIONS=-O2 -Wall
FUNC=function.o

# Compilation du programme
all:  $(subst .c,, $(wildcard ./*.c))

%.o: %.c
       $(COMP) $(OPTIONS) -c $^

%: %.o $(FUNC)
       $(COMP) $(OPTIONS) -o $@ $^
Pourquoi ca marche pas ?

JF :

remplace par


all:  $(subst .c,.o, $(wildcard ./*.c))

Gugu : Putain.

Ca marche.

Je comprends pas pourquoi, mais ca marche.

Par contre, je veux bien une explication de pourquoi ca marche, parce que vraiment, je ne comprends pas ce que ca change, qu’il ait une règle comme ca...

JF : Rah putain. Bon.

Makefile, mon ami :

Le Makefile fait le boulot d’un bûcheron, et en mieux. Il est capable d’aller voir dans la forêt toutes les conséquences de la coupe d’un arbre sans que tu aies à bouger le petit doigt. Imagine. Avant, tu devais regarder l’arbre en question et aller voir si par hasard il ne tomberait pas sur un autre, qui lui même irait fracasser d’autres arbres. Bref, c’était compliqué. Ensuite, vint l’ère industrielle où l’on voulait abattre un seul arbre et en faire tomber un maximum d’autres. C’était moche. Vint l’air des pingouins : on voulait, à cette époque qui dure encore, abattre un arbre qui irait abattre d’autres arbres bien précis.

Mais comme on bucheronnait par équipes, il fallait dire explicitement :
-  "Roger, coupe moi cette arbre là et puis celui-ci, et celui là la bas qu’est tout tordu et l’autre au bout qu’est pas beau. Et Gérard fera le petit là bas.".
-  "Ouip chef !"
-  "Et jette moi cette cigarette, ca m’énerve !"
-  "Oui chef !" Mais le pire, c’est que le plus souvent, Roger oubliait la moitié de ce qu’on lui disait et il coupait n’importe quoi, genre les petites fougères fragiles qui poussent dans la rosée ou la queue d’un orang-outang qui passait par là.

Bucherons - 24.1 ko
Bucherons

Et puis Roger, on lui fournissait tous les outils en libre et en gratuit. Il avait des tronçonneuses, scieuses, des scies, des tas de versions d’outils pour faire la même chose mais pas pareil (on pouvait même aller modifier le fonctionnement de l’outil soi-même, ou faire du tuning d’outils). Avec la scie, on scie, avec la tronçonneuse on tronçonne. On peut faire l’un comme l’autre, et là aussi, le chef laissait souvent une vague instruction merdique et après on ne savait plus quoi utiliser.

Et un jour, le Makefile est arrivé. On résolut tous les problèmes exposés plus haut. Les dépendances entre les arbres furent clairement exprimées, de sorte qu’on savait à l’avance quel type d’arbre allait faire tomber quel autre type d’arbre. C’était bien pratique. Et puis, pour éviter de dénommer tous les arbres visés par le bûcheron au travail, le Makefile sut tout seul lesquelles choisir (souvent à coup d’extensions). Et raffinement ultime, on précisait, en paramètre dans le Makefile les outils à utiliser suivant le type d’arbre. Souvent, on coupait toujours le même type mais j’ai déjà vu des Makefile qui jonglent avec plusieurs outils à la fois, suivant l’extension de l’arbre.

C’était fort pratique. Bientôt, tout le monde n’utilisait plus que le Makefile pour travailler. Il fallait écrire des règles pour dire précisément, et en cascade, qui dépend de qui. Par exemple, l’abattage des séquoias dépend de l’abattage des jonquilles et des pâquerettes. Et l’abattage des bambous d’Amazonie du sud est ne dépend que de l’abattage des roseaux. Mais c’est là qu’intervient l’instruction spécial "all :" qui permet de dire quels sont les premiers arbres à abattre. En général, on veut abattre les séquoias et les bambous car ce sont eux qui donnent le meilleur bois. Mais voilà : on les voit mal car ils sont cachés dans la forêt par leurs dépendances. Il faut donc ruser : on utilise une instruction spéciale (wildcard) pour récupérer toutes les jonquilles, pâquerettes et roseaux et par une subtile instruction (subst) on transforme cette liste en ce qu’on veut vraiment : les bambous et les séquoias. A ce moment là, c’est parti : le Makefile va couper les séquoias et les bambous sauf qu’il doit le faire en gérant les dépendances ! Il sait que les séquoias ne tombent que lorsqu’on coupe les jonquilles et pâquerettes. Il regarde : jonquilles et pâquerettes, rien à faire de spécial, ca tombe tout seul (compilation des .c). Et donc, il peut alors couper les séquoias (les .o) à grand coup de scie ou de tronçonneuse. Et tu noteras que s’il devait encore couper d’autres arbres, on pourrait faire une règle supplémentaire. Ainsi, l’astuce consiste à écrire en face de "all :" la cible finale de ton entreprise de bucheronnerie.

Exercice : ré-écrire simplement ce qui se passe dans ton Makefile, en s’inspirant de l’exemple précédent.

Gugu :

Ahhhh... Ouais... Maintenant je comprends... En fait, le problème, c’est que je précisais pas l’extension séquoia dans mon Makefile. Et du coup, pour couper des séquoias, il pouvait appliquer de nouveaux la règle qu’il voulait exécuter, et décider que couper des séquoias dépendait de couper des séquoias, et ainsi de suite... En fait, donc, il faut faire super-gaffe aux extensions qu’on définit dans les dépendances... Sinon, ca devient le bordel !

Il n’empêche que c’est super-fort, tout ça ! Et tout ça peut se faire avec des machins libres et modifiables ? Waouh ! En fait, si on y réfléchit bien, le gain de productivité acquis n’incite pas Roger et Gérard à zoner encore plus au bistrot qu’avant ?

un arc-en-ciel Mais dis-moi, j’y pense, tout ca ne porte-t-il pas préjudice à l’écosystème ambiant ? Je veux dire, le bien connu Fennec des tropiques habite sous les racines des bambous d’Amazonie du sud. Est-ce que l’arrivée de l’ère industrielle ne lui porte pas préjudice ? Et qu’en est-il du gracile orang-outang des Carpates ? Et bon, le fait que Roger fume n’attaque-t-il pas les délicat poumons de la truite des montagnes ?

JF :

En aucune manière. La truite des montagnes n’est pas du tout agressée et pour une simple et bonne raison : Roger ne fume pas vraiment plus qu’avant et même plutôt moins parce qu’il occupe désormais ses loisirs à configurer les scies sauteuses de la scierie et à envoyer les modifications qu’il apporte aux haches à double couches de titane renforcé et polymérisé sur le net, pour ses autres amis bûcherons qui travaillent avec des outils libres et gratuits. L’orang-outang des Carpates regarde désormais la chaine MakeMétéo qui fait les prévisions sur cinq jours des prochaines compilations et donc des arbres abattus à coup de Makefile. L’écosystème est donc tout à fait respecté et je dirai même que de "major improvements" et aussi quelques "dramatic decrease of complexity" travaillent pour l’amélioration de la faune et de la flore locales.

Bien entendu, il reste les laissez pour compte de l’innovation du Makefile abatteur de bois. Le Fennec des tropiques perd de manière irréversible son habitat naturel. Il faut dire qu’un Makefile bien formé n’oublie jamais un fichier qui traîne dans un répertoire caché dans un coin obscure d’un disque dur. Non, un bon Makefile sans bug n’oublie aucun bambou, ni même les racines qui vont avec. Au dernières nouvelles, le Fennec serait au téléphone avec Darwin pour tenter de trouver une solution.

La semaine prochaine nous étudierons les problèmes de backdoor dans les Makefile et comment hacker le Makefile de ses amis pour faire pousser des champs de betteraves à la place des arbres coupés de la forêt.

Répondre à cet article

Forum