<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>