Skip to content

Instantly share code, notes, and snippets.

@sandhose
Last active October 30, 2015 11:29
Show Gist options
  • Save sandhose/15b0b3d5db64e49d76d4 to your computer and use it in GitHub Desktop.
Save sandhose/15b0b3d5db64e49d76d4 to your computer and use it in GitHub Desktop.

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment