1 / 19

Make

Exécutable. Make. Gestion des dépendances Construction a minima. Compilation simple. Un fichier c, un fichier h. Production d’un fichier préprocessé , puis objet, puis édition de liens pour l’exécutable. La plupart de ces « passes » sont regroupées aujourd’hui en une seule commande.

sarila
Download Presentation

Make

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Exécutable Make Gestion des dépendances Construction a minima

  2. Compilation simple • Un fichier c, un fichier h. • Production d’un fichier préprocessé, • puis objet, • puis édition de liens pour l’exécutable. • La plupart de ces « passes » sont regroupées aujourd’hui en une seule commande. Fichier .h Fichier .c préprocessé .h Fichier .o Fichier exécutable #include Fichier .c Bibliothèques

  3. Plusieurs fichiers c • Dans la réalité il y a plusieurs fichiers sources • Les inclusions sont partagées • Arbre acyclique de dépendances • L’analyse des dépendances est possible Fichier1 .c Fichier1 .o #include Fichier exécutable Fichier .h Fichier2 .o #include Fichier2 .c

  4. L’analyse des dépendances • permet de minimiser le travail de reconstruction • Sur la base des dates de création/modification Fichier1 .c Fichier1 .o Fichier exécutable Fichier .h Fichier2 .o Fichier2 .c

  5. Les commandes • Compilation fichier1.o: cc -c fichier1.c • A besoin de fichier1.c et fichier.h, produit fichier1.o • Compilation fichier2.o: cc -c fichier2.c • A besoin de fichier2.c et fichier.h, produit fichier2.o • Édition de liens : cc fichier1.o fichier2.o • A besoin de fichier1.o et de fichier2.o, produitl’exécutable Fichier1 .c cc -c fichier1.c Fichier1 .o Fichier exécutable Fichier .h Fichier2 .o cc fichier1.o fichier2.o Fichier2 .c cc -c fichier2.c

  6. Graphe des dépendances • Exemple • On peut donc construire un graphe de dépendances • À chaque cible, on associera la commande qui créera l’objet pointé à partir des objets sources. exec data.o io.o dépend de io.h et de io.c La commande nécessaire est: cc –c io.c –o io.o main.o io.o data.c data.h main.c io.h io.c

  7. Reconstruction a minima • Si un fichier est modifié, on suit le chemin qui propage cette modification jusqu’au nœud final • Cela nous donne les commandes à exécuter, et un ordre d’exécution cohérent. exec cc –cio.c–oio.o cc –c main.c–o main.o ccmain.odata.oio.o–oexec (en bleu: pas été modifié) data.o main.o io.o data.c data.h main.c io.h io.c modifié

  8. Construction du makefile (1) • L’ordre d’écriture n’a pas d’importance • (sauf la première ligne considérée par défaut comme but à atteindre) • L’exécution est dirigée par les changements de date exec: data.omain.oio.o cc data.omain.oio.o –o exec data.o: data.cdata.h cc –c data.c main.o: data.hio.hmain.c cc –c main.c io.o: io.hio.c cc –c io.c exec data.o main.o io.o data.c data.h main.c io.h io.c

  9. Construction du makefile (2) • Chaque groupe de deux lignes représente donc la construction d’une cible du graphe. • Exemple d’activation exec: data.omain.oio.o cc data.omain.oio.o –o exec data.o: data.cdata.h cc –c data.c main.o: data.hio.hmain.c cc –c main.c io.o: io.hio.c cc –c io.c exec data.o main.o io.o data.c data.h main.c io.h io.c

  10. Rien n’empêche d’avoir un arbre à plusieurs têtes • Cela fera plusieurs cibles possible (voir invocation de make) • On peut les calculer toutes avec une cible bidon bidon Execdebug Execnodebug data.o main.o io.o data.c data.h main.c io.h io.c

  11. Syntaxe d’un groupe de commande • La tabulation vient bien de la touche TAB, c’est un caractère unique (ne pas remplacer par des blancs) • La commande du shell peut mentionner d’autres fichiers que ceux de la liste de dépendance • Par exemple, gccfichier.c alors que les dépendances sont fichier.h et fichier.c: le premier étant inclus par le second n’est pas mentionné dans la commande shell • En général il y a une seule cible (s’il s’agit de compilation) mais pas forcément (si la commande shell produit plusieurs fichiers réutilisés ensuite, exemple: yacc) cible1 cible2 cible3…: dépendance1 dépendance2 dépendance3 … (tabulation) commande du shell

  12. Appel de make • makeseul: cherche un fichier makefile ou Makefile dans le répertoire courant, l’exécute et considère la première ligne comme le but à atteindre. • make cible: cherche un fichier makefile ou Makefile dans le répertoire courant, l’exécute et considère cible comme le but à atteindre. • makefichier.c : règle prédéfinie; exécute la commande cc fichier.c –o fichier • Options variées (changer le nom du makefile, définir des macros, etc. Voir doc)

  13. Divers • Le signe # introduit un commentaire • La commande peut être omise (cf cibles bidon) • Si un des fichiers de dépendances n’existe pas: erreur • Si la commande shell ne produit pas le fichier listé comme cible: pas forcément un problème (voir cibles bidon) • Une cible peut apparaître plusieurs fois dans différents groupes: elle sera considérée comme dépendante des différentes lignes de dépendances. • On peut changer la commande selon que tel ou tel fichier a changé cible :: source1commande1 cible :: source2commande2

  14. Macros OBJECTS = data.omain.oio.o project1: $(OBJECTS) cc $(OBJECTS) -o project1 data.o: data.cdata.h cc -c data.c main.o: data.hio.hmain.c cc -c main.c io.o: io.hio.c cc -c io.c • Même utilisation qu’en C • Peuventêtre “écrasées” à l’appel de make • make 'OBJECTS=data.onewio.omain.o' project1 • Certainessontprédéfinies • CC : le compilateur C présentsur la machine • …et autres (voir doc)

  15. Ciblesbidon (phony targets) • Les cibles ne sont pas forcément des noms de fichiers • Ici la cible tout n’est pas un nom de fichier, elle ne fait qu’obliger la reconstruction de ses deux dépendances. Pas de commande associée. En la mettant en tête ce sera la cible par défaut. • Ces cibles ont le même statut que les autres, mais disparaissent entre deux invocations de make, donc pas de « date de création», reconstruction à chaque fois. tout: avec_dbg.exe sans_dbg.exe avec_dbg.exe: dépendances gcc –g … sans_dbg.exe: dépendances gcc …

  16. Attention (1) • Tout est basé sur les dates, pas sur le fait que le fichier est modifié. Si l’atome de temps de la machine est trop grand, surprises variées. Si les dépendances sont sur d’autres machines mal réglées, idem. • La commande shell « touch fichier» met la date courante sur le fichier cité (le rend modifié au sens de make) et crée le fichier s’il n’existe pas. Permet de forcer la recompilation.

  17. Attention (2) • Modifier le makefile ne suffit pas à relancer les compilations • Une bonne pratique est de rendre le makefile dépendant de lui-même: en rajoutant « makefile » dans la liste de toutes les dépendances. • Certains programmes pervers (lex, yacc) produisent le fichier cible même s’il y a eu une erreur: make continuera sans désemparer et l’erreur apparaîtra ailleurs que là où elle a eu lieu. Relancer make n’arrangera rien: la cible existe et est à jour. Utiliser touch.

  18. Attention (3) • make n’est absolument pas lié à la compilation de fichiers: • La commande shell peut être de la gestion de fichiers (copies, destructions, envoi de courrier…) • Elle peut être multiple: commande1; commande2 • Il est courant d’enchaîner dans le makefile la compilation avec l’exécution systématique de tests de non-régression (autrement dit le programme construit est lancé à son tour sur une batterie de tests.) • Un makefile peut en appeler un autre • Mais make a des règles par défaut pour certaines extensions (extension .c => cc fichier.c –o fichier)

  19. Usages Noms de cibles classiques: all (en première position) install clean (détruit les fichiers intermédiaires) etc… Les distributions viennent souvent avec un Makefile (utilisant les cibles supra). En le recopiant en makefile, on peut éditer ce dernier pour le particulariser sans toucher à la distribution (makefile a la priorité sur Makefile).

More Related