Newer
Older
cours-unix-shell / UnixShell_cours2018 / tpMake.fre.html
<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&eacute; &eacute;quivalent &agrave; celui de
         ce fichier */
      var corrige='makefile.fre.html';
      
/* Cette fonction est &agrave; 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&eacute;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&eacute;er un fichier <code>makefile</code> contenant une r&egrave;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&icirc;t pas sur la sortie
	standard.
      </p>
    </div>
    <hr>
    <p>
      Ajouter une r&egrave;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&eacute;er une r&egrave;gle qui cr&eacute;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&acirc;ce au bouton de droite) et qui
      remplace (gr&acirc;ce &agrave; <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' &lt; original.txt &gt; 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&icirc;t
	&agrave; droite de <code>:</code>.
      </p>
    </div>
    <hr>
    <p>
      Cr&eacute;er une r&egrave;gle qui cr&eacute;e un fichier <code>modif2.txt</code> &agrave;
      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 &lt; original.txt &gt; modif2.txt</pre>
      <p>
	Le fichier <code>modif2.txt</code> d&eacute;pend des contenus des
	fichiers <code>original.txt</code> et <code>table.txt</code>
	(si l'un des deux est modifi&eacute;, la commande <code>sed</code>
	sera ex&eacute;cut&eacute;e).
      </p>
    </div>
    <hr>
    <p>
      Ajouter une ligne &agrave; <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&eacute;rifier que la commande a bien &eacute;t&eacute; ex&eacute;cut&eacute;e.
    </p>
    <hr>
    <p>
      Ajouter une r&egrave;gle qui cr&eacute;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 &lt; modif2.txt &gt; compte.txt</pre>
      <p>
	Le fichier <code>compte.txt</code> d&eacute;pend du fichier
	<code>modif2.txt</code> (donc de sa r&egrave;gle, qui d&eacute;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&egrave;gle qui d&eacute;pend
	directement ou indirectement de table.txt, cette r&egrave;gle 
	sera ex&eacute;cut&eacute;e.
      </p>
    </div>
    <hr>
    <p>
      Cr&eacute;er une r&egrave;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 &agrave; l'INIST), vous
	risquez une d&eacute;synchronisation entre les fichiers enregistr&eacute;s
	par le lecteur Samba et la date de lancement de make (il est
	arriv&eacute; que les fichiers aient une &agrave; deux minutes
	d'avance).<br> Pour limiter de tels probl&egrave;mes, on peut
	utiliser la commande <code>touch</code>, qui remet un fichier
	&agrave; l'heure courante du shell, mais seulement sur les fichiers
	qui viennent d'&ecirc;tre modifi&eacute;s/cr&eacute;&eacute;s!
      </p>
    </div>
    <hr>
    <p>
      Cr&eacute;er une r&egrave;gle <em>all</em> qui d&eacute;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&ecirc;me y mettre un
      <code>echo -- Make all: ex&eacute;cut&eacute; --</code>).
    </p>
    <p class="comment">Remarques&nbsp;:</p>
    <ul>
      <li>
	L'ex&eacute;cution d'une r&egrave;gle ne donne pas forc&eacute;ment lieu &agrave;
	l'ex&eacute;cution de sa commande. Dans le cas de la production d'un
	fichier, quand le fichier cible est plus r&eacute;cent que le(s)
	fichier(s) dont il d&eacute;pend, le fichier cible n'est pas recr&eacute;&eacute;
	(donc, la commande de sa r&egrave;gle n'est pas ex&eacute;cut&eacute;e).
      </li>
      <li>
	Quand une r&egrave;gle d&eacute;pend d'une autre r&egrave;gle qui d&eacute;pend d'un autre
	fichier, et que ce fichier est modifi&eacute; (par exemple gr&acirc;ce &agrave; la
	commande <code>touch</code>, qui change la date de
	modification du fichier qu'elle prend en param&egrave;tre), les
	commandes de chacune de ces r&egrave;gles sont ex&eacute;cut&eacute;es (voir le
	comportement de <code>make all</code> apr&egrave;s avoir tap&eacute;
	<code>touch original.txt</code>, ou apr&egrave;s avoir ajout&eacute; du
	texte &agrave; <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&eacute;cut&eacute; ---</pre>
      <p class="remarque">
	On peut g&eacute;n&eacute;raliser le <code>@echo --- Make <em>r&egrave;gle</em>
	ex&eacute;cut&eacute; ---</code> &agrave; toutes les r&egrave;gles, cela permet de mieux
	se rendre compte de ce que le make a effectu&eacute;.
      </p>
    </div>
    <hr>
    <p>
      Pour ceux qui ne l'ont pas fait&nbsp;: modifier le fichier
      <code>original.txt</code>, et relancer la r&egrave;gle <em>all</em>.
    </p>
    </div>
    <hr>
    <address><a href="mailto:philippe.houdry@inist.fr">Philippe.Houdry@inist.fr</a></address>
  </body>
</html>