Make est l'outil le plus couramment utilisé pour automatiser la production d'un fichier à partir de règles. L'exemple typique est la compilation d'un logiciel à partir de ses sources. Mais Make a des inconvénients de taille, dont :
- La syntaxe sujette aux erreurs ;
- Les appels récursifs à make posent problème ;
- Le manque de modularité ;
- L'absence d'atomicité de l'application des règles.
Daniel J. Bernstein, l'auteur de
qmail et
djbdns, a proposé une alternative à Make qu'il a appelée
redo, mais celle-ci se présente sous forme de notes et non pas de code.
Avery Pennarun a trouvé ses notes et en a écrit une version en Python sous
licence LGPL.
Redo fonctionne avec des scripts shell avec l'extension
.do et chacun de ces fichiers décrit une règle. Par exemple, le fichier
default.o.do qui servirait à générer des fichiers
.o à partir des sources
.c correspondantes s'écrirait de cette façon :
redo-ifchange $1.c
gcc -MD -MF $3.deps.tmp -c -o $3 $1.c
DEPS=$(sed -e "s/^$3://" -e 's/\\//g' <$3.deps.tmp)
rm -f $3.deps.tmp
redo-ifchange $DEPS
Note :
$1 est le nom du fichier cible sans l'extension et
$3 le nom du fichier temporaire qui deviendra le fichier cible (
$3 sera renommé à la fin de la règle, évitant ainsi de laisser un fichier cible corrompu si quelque chose devait mal se passer).
redo-ifchange est une commande servant à déclarer une dépendance.