<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <link REL="STYLESHEET" TYPE="text/css" TITLE="Style DILIB" HREF="../../dilib.css"> <title>TRAVAUX PRATIQUES (partie make) - UNIX</title> <style type="text/css"> H2 { text-align: center; } Q { font-style: italic; } TABLE { text-align: center; } .chaine { background-color: #B0E0FF; color: green; } .chaine:before { content: "«"; } .chaine:after { content: "»"; } .attention { font-style: italic; } .remarque, .exemple, .remarque_suite { font-size: small; } .remarque { margin-bottom: 2; } .remarque_suite { margin-bottom: 2; margin-top: 0; } .remarque:before { content: "REMARQUE :"; } .exemple:before { content: "Exemple : "; } .attention:before { content: "ATTENTION :"; } .solution { display: none; } </style> <script type="text/javascript"> /* nom du fichier contenant le corrigé équivalent à celui de ce fichier */ var corrige='makefile.fre.html'; /* Cette fonction est à adapter aux identifiants de la page */ function cacherSolutions() { if(document.getElementById && document.styleSheets) { document.getElementById('bonjour').style.display='none'; document.getElementById('bye').style.display='none'; document.getElementById('modif.txt').style.display='none'; document.getElementById('modif2.txt').style.display='none'; document.getElementById('compte.txt').style.display='none'; document.getElementById('clean').style.display='none'; document.getElementById('all').style.display='none'; document.getElementById('makefile').style.display='none'; } } </script> <script type="text/javascript" src="cacher.js"></script> <link rel="copyright" href="http://www.inist.fr/"><link rel="author" href="http://dilib.inist.fr/membres.html"><link rel="chapter" href="caracteristiques.fre.html" title="UNIX"><link rel="chapter" href="X.fre.html" title="X Window"><link rel="chapter" href="redirPipes.fre.html" title="Rappels"><link rel="chapter" href="newCommandsUser.fre.html" title="Commandes UNIX"><link rel="chapter" href="shellVars.fre.html" title="Shell"><link rel="chapter" href="sed.fre.html" title="Sed"><link rel="chapter" href="make.fre.html" title="Make"><link rel="index" href="http://dilib.inist.fr/dilib/v04Main/IndexSite/Server/FR.resource.index.html"><link rel="top" title="Accueil de DILIB" href="http://dilib.inist.fr/dilib/v04Main/"><link rel="alternate" title="English version" href="tpMake.eng.html"><link rel="up" href="index.fre.html" title="Tutorial UNIX / Shell"> <link rel="section" href="make.fre.html" title="Make"><link rel="section" href="tpMake.fre.html" title="Travaux Pratiques"> <link rel="first" href="caracteristiques.fre.html" title="Caractéristiques d'UNIX"> <link rel="previous" href="make.fre.html" title="Make"> <link rel="last" href="tpMake.fre.html" title="Travaux Pratiques"> </head> <body> <h1>TRAVAUX PRATIQUES</h1> <div id="navcontainer"> <ul id="navlist"> <li><a href="caracteristiques.fre.html">UNIX</a> </li> <li><a href="X.fre.html">X Window</a> </li> <li><a href="redirPipes.fre.html">Rappels</a> </li> <li><a href="newCommandsUser.fre.html">Commandes</a> </li> <li><a href="shellVars.fre.html">Shell</a> </li> <li><a href="sed.fre.html">Sed</a> </li> <li><a>Make</a> <ul id="subnavlist"> <li><a href="make.fre.html">Principes</a></li> <li><a href="tpMake.fre.html" id="subcurrent">TP</a></li> </ul> </li> </ul> </div> <div class="content"> <h2>Make</h2> <p> Créer un fichier <code>makefile</code> contenant une règle <em>bonjour</em>, qui affiche sur la sortie standard <q>Bonjour, comment ca va?</q> </p> <script type="text/javascript"> EcrireBouton('bonjour'); </script> <div class="solution" id="bonjour"> <a href="javascript:Cacher('bonjour');">Cacher la solution</a> <pre>bonjour: @echo "Bonjour, comment ca va?"</pre> <p class="remarque"> L'utilisation du <code>@</code> devant <code>echo</code> rend la commande "silencieuse", elle n'apparaît pas sur la sortie standard. </p> </div> <hr> <p> Ajouter une règle <em>bye</em> qui affiche <q>A bientot!</q>. </p> <script type="text/javascript"> EcrireBouton('bye'); </script> <div class="solution" id="bye"> <a href="javascript:Cacher('bye');">Cacher la solution</a> <pre>bye: @echo "A bientot!"</pre> </div> <hr> <p> Créer une règle qui crée un fichier <code>modif.txt</code> dont le contenu vient du fichier <a href="original.txt"><code>original.txt</code></a> (que vous pouvez enregistrer grâce au bouton de droite) et qui remplace (grâce à <code>sed</code>) les apparitions de <q>ILIB</q> par <q>DILIB</q>. </p> <script type="text/javascript"> EcrireBouton('modif.txt'); </script> <div class="solution" id="modif.txt"> <a href="javascript:Cacher('modif.txt');">Cacher la solution</a> <pre>modif.txt: original.txt sed -e 's/ILIB/DILIB/g' < original.txt > modif.txt</pre> <p> Le fichier <code>modif.txt</code> depend du contenu du fichier <code>original.txt</code>, c'est pourquoi ce dernier apparaît à droite de <code>:</code>. </p> </div> <hr> <p> Créer une règle qui crée un fichier <code>modif2.txt</code> à partir de <code>original.txt</code> et <a href="table.txt"><code>table.txt</code></a>, en utilisant la table fournie pour modifier le fichier original. </p> <script type="text/javascript"> EcrireBouton('modif2.txt'); </script> <div class="solution" id="modif2.txt"> <a href="javascript:Cacher('modif2.txt');">Cacher la solution</a> <pre>modif2.txt: original.txt table.txt sed -f table.txt < original.txt > modif2.txt</pre> <p> Le fichier <code>modif2.txt</code> dépend des contenus des fichiers <code>original.txt</code> et <code>table.txt</code> (si l'un des deux est modifié, la commande <code>sed</code> sera exécutée). </p> </div> <hr> <p> Ajouter une ligne à <code>table.txt</code> pour remplacer <q>CNRS</q> par <q>Centre National de la Recherche Scientifique</q>. Puis relancer <code>make modif2.txt</code> pour vérifier que la commande a bien été exécutée. </p> <hr> <p> Ajouter une règle qui crée un fichier <code>compte.txt</code> contenant le nombre de lignes du fichier <code>modif2.txt</code>. </p> <script type="text/javascript"> EcrireBouton('compte.txt'); </script> <div class="solution" id="compte.txt"> <a href="javascript:Cacher('compte.txt');">Cacher la solution</a> <pre>compte.txt: modif2.txt wc -l < modif2.txt > compte.txt</pre> <p> Le fichier <code>compte.txt</code> dépend du fichier <code>modif2.txt</code> (donc de sa règle, qui dépend de <code>original.txt</code> et de <code>table.txt</code>). Donc si on modifie <code>table.txt</code> et qu'on tape <code>make compte.txt</code>, ou toute autre règle qui dépend directement ou indirectement de table.txt, cette règle sera exécutée. </p> </div> <hr> <p> Créer une règle <em>clean</em> qui supprime les fichiers dont le nom se termine par <code>~</code>. </p> <script type="text/javascript"> EcrireBouton('clean'); </script> <div class="solution" id="clean"> <a href="javascript:Cacher('clean');">Cacher la solution</a> <pre>clean: rm -f *~</pre> <p class="remarque"> Si vous utilisez un lecteur Samba (probable à l'INIST), vous risquez une désynchronisation entre les fichiers enregistrés par le lecteur Samba et la date de lancement de make (il est arrivé que les fichiers aient une à deux minutes d'avance).<br> Pour limiter de tels problèmes, on peut utiliser la commande <code>touch</code>, qui remet un fichier à l'heure courante du shell, mais seulement sur les fichiers qui viennent d'être modifiés/créés! </p> </div> <hr> <p> Créer une règle <em>all</em> qui dépende de <em>bonjour</em>, <em>compte.txt</em>, <em>clean</em>, et <em>bye</em>, mais qui ne contient aucune commande (on peut quand même y mettre un <code>echo -- Make all: exécuté --</code>). </p> <p class="comment">Remarques :</p> <ul> <li> L'exécution d'une règle ne donne pas forcément lieu à l'exécution de sa commande. Dans le cas de la production d'un fichier, quand le fichier cible est plus récent que le(s) fichier(s) dont il dépend, le fichier cible n'est pas recréé (donc, la commande de sa règle n'est pas exécutée). </li> <li> Quand une règle dépend d'une autre règle qui dépend d'un autre fichier, et que ce fichier est modifié (par exemple grâce à la commande <code>touch</code>, qui change la date de modification du fichier qu'elle prend en paramètre), les commandes de chacune de ces règles sont exécutées (voir le comportement de <code>make all</code> après avoir tapé <code>touch original.txt</code>, ou après avoir ajouté du texte à <code>original.txt</code>). </li> </ul> <script type="text/javascript"> EcrireBouton('all'); </script> <div class="solution" id="all"> <a href="javascript:Cacher('all');">Cacher la solution</a> <pre>all: bonjour compte.txt clean bye @echo --- Make all: exécuté ---</pre> <p class="remarque"> On peut généraliser le <code>@echo --- Make <em>règle</em> exécuté ---</code> à toutes les règles, cela permet de mieux se rendre compte de ce que le make a effectué. </p> </div> <hr> <p> Pour ceux qui ne l'ont pas fait : modifier le fichier <code>original.txt</code>, et relancer la règle <em>all</em>. </p> </div> <hr> <address><a href="mailto:philippe.houdry@inist.fr">Philippe.Houdry@inist.fr</a></address> </body> </html>