make
est une commande Linux qui permet en gros de lancer d'autres commandes. Impressionant, hein.
Ce que fait make
, c'est qu'il va lire les instructions qu'il trouvera dans un Makefile
, pour compiler une cible, tout en gérant les dépendances de cette dernière.
Dit comme ça, ça fait tout de suite un peu compliqué et technique, mais ça l'est pas tant que ça.
Par exemple, si on prend le cas d'une série de livres. Une série de livre, c'est quoi, c'est une compilation de plusieurs livres (et donc qui a besoin de ces livres pour être créée). Un livre, c'est quoi, c'est une compilation de parties. Une partie c'est quoi, c'est une compilation de chapitres.
Si maintenant on imagine une arborescence de ce type:
serie/
|- livre-1/
| |- partie-1/
| | |- chapitre-1.txt
| | |- chapitre-2.txt
| | \- ...
| |- partie-2/
| | |- chapitre-1.txt
| | |- chapitre-2.txt
| | \- ...
| \- ...
|- livre-2/
|- ...
\- livre-n/
On pourrait choisir de "compiler" notre série de livres à la main, en concaténant d'abord ensemble tous les chapitres de chaque partie du premier livre, puis de concaténer toutes ces parties pour former les chapitres du premier livre, puis faire ca avec tous les autres livres, puis concaténer tooous les livres ensemble pour constituer la série. On ferait donc un truc de ce genre:
# On "compile" chaque partie du livre 1
cat "./livre-1/partie-1/chapitre-*.txt" > "./livre-1/partie-1.txt"
cat "./livre-1/partie-2/chapitre-*.txt" > "./livre-1/partie-1.txt"
# ...
# On compile le livre 1
cat "./livre-1/partie-*.txt" > "./livre-1.txt"
# On fait la même chose avec les autres livres
# ...
# Pour ensuite compiler notre série de libres
cat "./livre-*.txt" > "./serie.txt"
Autrement dit, c'est long. Et si maintenant on change un mot dans le 5ème chapitre de la 2ème partie du livre 3, on est bon pour refaire tout ça pour recompiler la série.
Et c'est la que make
intervient: on lui indique des tâches (genre livre-1.txt
) qui dépendent d'autres tâches (genre livre-1/partie-1.txt
jusqu'à livre-1/partie-3.txt
) qui elle même dépendent d'autres tâches (genre livre-1/partie-X/chapitre-1.txt
à livre-1/partie-X/chapitre-12.txt
). Ces tâches sont juste une suite de commande à exécuter.
La où make
est malin, c'est que si jamais on a pas modifié un chapitre de la première partie du livre 1, il va pas s'amuser à recompiler toutes les autres parties du livre pour recompiler ce dernier, s'il la déjà fait auparavant. Il va en fait comparer les dates de dernière modification de la "cible" (= une tâche) avec celle de ces dépendances. La dans le cas des livres, c'est pas très important, parce que c'est que des cat
sur des petits fichiers, mais quand ça sera sur du code C à compiler, ça aura son importance, si on veut pas attendre 1/2h à chaque fois qu'on veut modifier deux pauvres lignes.
En gros, la syntaxe d'un Makefile
, ça ressemble à ça, et ça pour chaque tâche
tache: dependance1 dependance2 depandance3
commande1
commande2
...
Sachant que le nom de la tâche peut désigner un nom de fichier (= "voici les commandes pour générer tel fichier"), ou être arbitraire (du genre la tache clean
pourra par exemple supprimer tous les fichiers compilés).
Pour revenir à l'exemple du livre, on aurait un truc dans le genre:
livre-1/partie-1.txt: livre-1/partie-1/chapitre-1.txt livre-1/partie-1/chapitre-2.txt livre-1/partie-1/chapitre-3.txt
cat livre-1/partie-1/chapitre-*.txt > livre-1/partie-1.txt
livre-1/partie-2.txt: livre-1/partie-2/chapitre-1.txt livre-1/partie-2/chapitre-2.txt livre-1/partie-2/chapitre-3.txt
cat livre-1/partie-2/chapitre-*.txt > livre-1/partie-2.txt
livre-1/partie-3.txt: livre-1/partie-3/chapitre-1.txt livre-1/partie-3/chapitre-2.txt livre-1/partie-3/chapitre-3.txt
cat livre-1/partie-3/chapitre-*.txt > livre-1/partie-3.txt
livre-1.txt: livre-1/partie-1.txt livre-1/partie-2.txt livre-1/partie-3.txt
cat livre-1/partie-*.txt > livre-1.txt
Plus qu'à taper make livre-1.txt
, et tout se compile tout seul !
Bien sûr, y'a des fonctionnalités plus avancées de make
qui évitent d'écrire une tâche pour chaque fichier, mais c'est pas l'objet du projet, donc je vais pas me lancer la dedans ^^
Du coup, bah, l'idée du projet c'est de recréer un genre de make
simplifié, qui va donc lire et interpréter un makefile
et exécuter les tâches, en gérant les dépendances. Le détail de ce qu'il faut faire, c'est dans le TP, j'pense que de la, vous avez assez d'indications pour essayer de vous lancer c:
Good luck, have fun !, comme on dit