<!DOCTYPE html>
<html>
<head>
<title></title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<header>
<h1></h1>
<nav>
<ul>
<li><a href="/output/README.html">Accueil</a></li>
<li><a href="/output/unix/README.html">UNIX</a></li>
<li><a href="/output/bases/README.html">Bases</a></li>
<li><a href="/output/commandes/README.html">Commandes</a></li>
<li><a href="/output/shell/README.html">Shell</a></li>
<li><a href="/output/sed/README.html">Sed</a></li>
<li><a href="/output/make/README.html">Make</a></li>
</ul>
</nav>
</header>
<div class="content">
<h1 id="travaux-pratiques---make---unix">Travaux pratiques - Make - UNIX</h1>
<p>Créer un fichier <code>Makefile</code> contenant une règle bonjour, qui affiche sur la sortie standard <code>Bonjour, comment ca va?</code></p>
<p><details> <summary>Voir la solution</summary></p>
<pre class="make"><code>bonjour:
@echo "Bonjour, comment ca va?"</code></pre>
<blockquote>
<p>L'utilisation du <code>@</code> devant <code>echo</code> rend la commande "silencieuse", elle n'apparaît pas sur la sortie standard.</p>
</blockquote>
<p></details></p>
<hr />
<p>Ajouter une règle <code>bye</code> qui affiche <code>A bientot!</code>.</p>
<p><details> <summary>Voir la solution</summary></p>
<pre class="make"><code>bye:
@echo "A bientot!"</code></pre>
<p></details></p>
<hr />
<p>Créer une règle qui crée un fichier <code>modif.txt</code> dont le contenu vient du fichier <a href="../UnixShell_cours2018/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 <code>ILIB</code> par <code>DILIB</code>.</p>
<p><details> <summary>Voir la solution</summary></p>
<pre class="make"><code>modif.txt: original.txt
sed -e 's/ILIB/DILIB/g' < original.txt > modif.txt</code></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>
<p></details></p>
<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="../UnixShell_cours2018/table.txt"><code>table.txt</code></a>, en utilisant la table fournie pour modifier le fichier original.</p>
<p><details> <summary>Voir la solution</summary></p>
<pre class="make"><code>modif2.txt: original.txt table.txt
sed -f table.txt < original.txt > modif2.txt</code></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>
<p></details></p>
<hr />
<p>Ajouter une ligne à <code>table.txt</code> pour remplacer <code>CNRS</code> par <code>Centre National de la Recherche Scientifique</code>.<br />
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>
<p><details> <summary>Voir la solution</summary></p>
<pre class="make"><code>compte.txt: modif2.txt
wc -l < modif2.txt > compte.txt</code></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>).<br />
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 <code>table.txt</code>, cette règle sera exécutée.</p>
<p></details></p>
<hr />
<p>Créer une règle <code>clean</code> qui supprime les fichiers dont le nom se termine par <code>~</code>.</p>
<p><details> <summary>Voir la solution</summary></p>
<pre class="make"><code>clean:
rm -f *~</code></pre>
<blockquote>
<p>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 <code>make</code> (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>
</blockquote>
<p></details></p>
<hr />
<p>Créer une règle <code>all</code> qui dépende de <code>bonjour</code>, <code>compte.txt</code>, <code>clean</code>, et <code>bye</code>, mais qui ne contient aucune commande (on peut quand même y mettre un <code>echo -- Make all: exécuté --</code>).</p>
<p>Remarques :</p>
<ul>
<li>L'exécution d'une règle ne donne pas forcément lieu à l'exécution de sa commande.<br />
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>
<p><details> <summary>Voir la solution</summary></p>
<pre class="make"><code>all: bonjour compte.txt clean bye
@echo --- Make all: exécuté ---</code></pre>
<blockquote>
<p>On peut généraliser le <code>@echo --- Make <règle> exécuté ---</code> à toutes les règles, cela permet de mieux se rendre compte de ce que le <code>make</code> a effectué.</p>
</blockquote>
<p></details></p>
<hr />
<p>Pour ceux qui ne l'ont pas fait : modifier le fichier <code>original.txt</code>, et relancer la règle <code>all</code>.</p>
<p><a href="./README.html">Précédent</a></p>
</div>
<footer>
<p>© CNRS 2023</p>
</footer>
</body>
</html>