Principe
Make
est un logiciel qui sert à transformer un ou plusieurs fichiers en un fichier final. Pour ce faire, il va se servir d’un fichier makefile
qui indique le fichier final souhaité, les fichiers sources initiaux et l’ensemble des étapes nécessaire à la production du fichier final.
Make
est installé par défaut sur la plupart des distributions Linux. Sur Mac, il faut installer les outils dévellopeurs. En revanche son installation est complexe sur Windows.
Premier pas
Soit le dossier contenant les fichiers :
-
principal.tex
-
principal.bib
Je souhaite obtenir le fichier principal.pdf
en exécutant successivement :
-
xelatex principal.tex
-
biber principal
-
xelatex principal.tex
. -
xelatex principal.tex
pour avoir un sommaire correspondant à la mise en page finale.
Je vais écrire les lignes suivantes dans un fichier makefile
[1].
La première ligne indique que le fichier principal.pdf
« dépend » de principal.tex
et de principal.bib
. Les lignes suivantes, qui doivent commencer par des tabulations, indique les commandes à exécuter pour produire le fichier. J’ai créé ainsi une règle de fabrication, nommée principal.pdf
.
Lorsque dans mon terminal je tape (en étant situé dans le répertoire en question) : make principal.pdf
, je vois les différentes compilation se succéder. À la fin je peux ouvrir mon fichier principal.pdf
.
Si je retape make principal.pdf
, j’obtiens :
En effet, makefile voit que les fichiers principal.tex et principal.bib ont été modifiés plus anciennement que le fichier principal.pdf. Il en conclut que le fichier principal.pdf est à jour.
En revanche, si je m’amuse à modifier l’un de ces fichier, taper make principal.pdf
me recommencerait le processus de compilation.
Généralisons
Supposons qu’à côté de mes deux fichiers, j’ai également les fichiers annexe.bib
et annexe.tex
et qu’à partir de cela, je souhaite obtenir un fichier annexe.pdf
.
Je pourrais m’amuser à créer une règle pour annexe.pdf. Mais je pourrais très bien fabriquer un règle générique pour les fichiers .pdf
Dans la description de la règle, le %.pdf
signifie « n’importe quel fichier finissant par .pdf
». Pour la suite %
signifie « la partie variante du nom du fichier », autrement dit « ce qui se trouve avant le .pdf
».
Dans le contenu de la règle, le $*
signifie « la partie variante du nom du fichier de destination ».
Autrement dit, j’ai produit ici l’équivalent de
Mais cela pourrait s’étendre à fichier titi.pdf
dépendant de titi.tex
et titi.bib
.
Évidemment mes fichiers cibles peuvent aussi dépendre de fichiers situés dans d’autres dossiers. Chez moi, par exemple, ce sont les fichiers situés dans les dossiers contenu
et inclure
. On peut indiquer la dépendance aux dossiers en indiquant la dépendance aux fichiers qu’ils contiennent.
Une règle par défaut
Pour le moment, je suis obligé, si je veux produire les fichiers principal.pdf
et annexe.pdf
, de faire successivement make principal.pdf
et make annexe.pdf
.
On pourrait vouloir produire ces deux fichiers d’un coup. Pour ce faire je vais créer une règle spéciale nommée all
, que je vais placer en tout premier. Comme cette règle doit produire ces deux fichiers, je vais lui indique qu’elle nécessite les fichiers principal.pdf
et annexe.pdf
. Le programme make
ira chercher les règles correspondante à la production de ces fichiers.
Ma règle s’écrit dont simplement :
Seulement voilà : imaginons que pour une raison quelconque, j’ai un fichier all
dans mon dossier. Dans ce cas make
je risque d’avoir des conflits. Pour éviter cela, je vais indiquer une règle spéciale : .PHONY
. Cette règle indique simplement que les fichiers dont elle « dépend » n’existent pas, mais qu’il s’agit en réalité de nom de règle.
J’écris donc :
Si je tape make all
, le programme va bien me produire mes deux fichiers principal.pdf
et annexe.pdf
.
Si je met cette règle en premier, elle sera exécutée si aucune règle n’est appelée, en frappant simplement make
.
Nettoyage
La compilation produit tout le temps des fichiers annexes. Il peut être utile d’avoir une règle pour les supprimer automatiquement. La plupart du temps cette règle est appelée clean
. Comme c’est une règle spéciale, il faut que je l’ajoute à la règle .PHONY
Voici un exemple de règle clean
La commande rm
est une commande terminal qui efface les fichiers listés. L’option -f
permet de ne pas avoir de message d’erreur si on demande l’effacement de fichiers qui n’existent pas. Ici nous demandons l’effacement des fichiers se finissant [2] par .aux
, .bcf
, .log
, .xml
, .toc
, .bbl
, .blg
, ainsi que les fichiers .aux
se situant dans des dossiers.
Affichage de message finaux
Reprenons notre règle %.tex
. On aimerait avoir un message, à la toute fin des compilations, nous indiquant s’il y a des références bibliographiques inconnues.
Pour ce faire nous allons lire dans le fichier .log
final, pour rechercher les ligne contenant Citation xxx undefined
. Nous allons pour cela utiliser un programme, généralement livré en standard sous MacOs X et Linux, appelé grep
. Ce programme permet de rechercher dans des fichiers du texte, en utilisant des outils de joker, qu’on appelle « expression régulière ».
Allons y, cela nous donne
Ligne 7, nous affichons, grâce à la commande Terminal toto
le message « Citations indéfinies : ». Le @
sert à indiquer à make
de ne pas afficher cette ligne [3].
Ligne 8, nous exécutons la commande grep
. L’option -i
permet de ne pas tenir compte de la casse. Nous recherchons dans le fichier .log
tout les lignes contenant Citation
suivi d’une série de n’importe quel caractère [4] suivi de undefined
et nous les affichons. À défaut, nous affichons « Aucune ».
Évidemment on pourrait étendre cela aux tests des étiquettes de référence croisés : pour vérifier par exemple les étiquettes en double, ou celles inexistantes.
Cela donnerait
Le fichier makefile
final
Au final, tout cela donne
Vos commentaires
# Le 27 décembre 2011 à 20:12, par ibliss En réponse à : Introduction à
make
avec (Xe)LaTeXUn grand merci pour le tuto. Exactement ce qu’il faut pour les handicapés du cerveau comme moi.
# Le 3 janvier 2012 à 02:04, par Maïeul En réponse à : Introduction à
make
avec (Xe)LaTeXIl n’y a pas de quoi.
Je viens de corriger une erreur : il faut supprimer le paragraphe
et le remplacer par
# Le 10 janvier 2012 à 22:40, par Damien En réponse à : Introduction à
make
avec (Xe)LaTeXPour les handicapés du cerveau paresseux, il y a
latexmk
, dispo dans TeXlive, et qui gère tout ça sans avoir besoin d’écrire un makefile :p# Le 10 janvier 2012 à 22:53, par Maïeul En réponse à : Introduction à
make
avec (Xe)LaTeXoui sans doute, mais la doc de latexmk est en anglais, tandis que le tuto sur lequel je m’étais basé était en français ;-)
Je connaissais pas, faudrait que je creuse, et que je vois ce qu’il en est. Par exemple je vois que cela peut fonctionner avec Biber et pas BibTex. Par contre apparement faut faire des réglages pour avoir XeLaTeX et pas LaTeX. De même à voir aussi pour les indexs.
En tout cas c’est assez intéréssant et à creuser.
# Le 10 janvier 2012 à 23:11, par Damien En réponse à : Introduction à
make
avec (Xe)LaTeXUne occasion de faire un article en français sur le sujet :) Personnellement je recommande chaudement, c’est vrai qu’il faut parcourir la doc pour voir comment changer de compilateur, mais c’est pas sorcier. Comme point de départ tu peux piquer mon fichier de config (en anglais aussi). Par exemple pour mon essai de biblatex j’ai simplement fait
\usepackage[backend=biber]{biblatex}
et ça a été détecté tout seul sans rien faire d’autre.Pour revenir à make, quitte à écrire les scripts de compilation à la main, je le ferais avec un outil plus récent (genre Rake) qui est tout de même moins abscons que make…
# Le 10 janvier 2012 à 23:17, par Maïeul En réponse à : Introduction à
make
avec (Xe)LaTeXyep, je regarderais cela.
Pour le coup Biber il le détecte automatiquement car c’est mentionné dans le fichier
bbl
.Je ne connaissais pas Rake. C’est intéressant aussi. A voir donc. Mais effectivement cela doit considérablement simplifié certaines choses.
Ceci dit j’aime bien mon système qui m’analyse automatiquement les
log
pour voir s’il y a des problèmes dans la biblio. A creuser donc.# Le 13 janvier 2012 à 01:24, par Maïeul En réponse à : Introduction à
make
avec (Xe)LaTeXAllez, hop, j’ai appris latexmk et fait un premier tutoriel : Introduction à
Latexmk
pour faciliter les compilations