Il est multiple.
Tout d'abord, make
est disponible en standard sur la plupart, pour ne pas dire la totalité, des UNIX.
C'est d'ailleurs l'outil de base du système de ports
de FreeBSD.
Un fichier Makefile
est donc facilement portable d'un UNIX à un autre.
De plus, il n'est pas nécéssaire d'installer des bibliothèques ou des langages externes au système d'exploitation pour l'utiliser, au contraire d'un capistrano ou d'un ant.
Ensuite, make
est un outil très puissant, puisqu'il est capable de faire appel aussi bien à des commandes shell
qu'à des scripts en PHP ou en tout autre langage.
Il est donc virtuellement possible d'effectuer n'importe quelle tâche avec un Makefile
bien conçu.
En résumé, make
est donc un outil, rapide à mettre en oeuvre, très puissant, portable, et universel sous UNIX.
Seul bémol, il existe différente version de make
, avec notament le make GNU
et pmake
, utilisé par FreeBSD, évidement incompatible entre elle.
Il est donc important de bien choisir la version que l'on veut utiliser, en fonction des plate-formes de destination de l'application.
Par ailleurs, make GNU
est également disponible sous FreeBSD sous le nom de gmake
via /usr/ports/devel/gmake
.
Je vais maintenant vous présenter le fonctionnement de base de pmake
.
Cependant, le principe de fonctionnement du make GNU
est en tout point identique.
Par défaut, make
, lorsqu'il est appelé sans argument, utilise le fichier Makefile
situé dans le répertoire courant.
Evidement, si ce fichier n'existe pas, make
s'arrête sur une jolie erreur.
Un fichier Makefile
ressemble à cela :
CWD != pwd
ECHO != which echo
GREP != which grep
SED != which sed
FIND != which find
.SILENT:
check-depends:
extensions=`${PHP} -i | ${GREP} extension_dir | ${SED} 's/^.*=>\s*\([^\s=]*\)/\1/'`; \
for extension in `${GREP} -rhoE "dl\([^)]+\)" --include \*.php --exclude .svn ${CWD} | ${SED} -e "s/dl('\([^.]*.so\)')/\1/" | ${SORT} -u`; do \
${ECHO} -n "Checking PHP extension $$extension: "; \
if [ `${LS} $$extensions | ${GREP} -E ^$$extension` ]; then ${ECHO} "ok"; fi \
done;
check-syntax: .SILENT
${FIND} ${CWD} -type f -name \*.php -exec ${PHP} -l -d display_errors=off {} 1 > /dev/null \;;
check: check-syntax check-depends
.MAIN: check
Les premières lignes définissent un certain nombre de variable, !=
permettant d'indiquer à pmake
que leur contenu doit être le résultat de la commande qui suit.
Ainsi, la variable CWD
contiendra le chemin vers le répertoire courant, et SED
le chemin d'accès à l'utilitaire du même nom.
Il est à noter que la définition de ces variables n'a rien d'obligatoire, mais elle permet d'avoir un Makefile
plus portable, plus facilement maintenable, et indépendant de l'environnement d'éxécution de make
.
.SILENT
est ce qu'on appelle une cible
, dans le jargon de make
, tout comme d'ailleurs check-depends
, check-syntax
, check
et .MAIN
.
.MAIN
permet de définir la cible principale, à savoir dans notre cas check
.
Cela signifie qu'un appel à make
sans autre argument déclenchera l'éxécution de la cible check
.
Une cible
est défini par un nom, suivit de :
, suivit éventuellement d'aucune ou plusieurs autres cibles, nommées dans ce cas dépendance
.
Ainsi, la cible
check
a pour dépendance
check-syntax
et check-depends
, ce qui veut dire que les cibles check-syntax
et check-depends
seront éxécutées lors d'un appel à la cible check
.
Il peut venir à la suite de la définition de la cible
et de ses dépendances
du code shell
.
Dans le cas de check-syntax
, le code suivant doit être éxécuté :
${FIND} ${CWD} -type f -name \*.php -exec ${PHP} -l -d display_errors=off {} 1 > /dev/null \;;
De cette manière, un appel à check-syntax
déclenchera l'éxécution de ce code et lancera la vérification syntaxique de tout les fichiers se terminant par .php
dans le répertoire courant :
# make check-syntax
PHP Parse error: syntax error, unexpected T_STRING, expecting T_FUNCTION in /path/to/current/directory/file.php on line 5
*** Error code 255
Stop in /path/to/current/directory.
De même, un appel à check-depends
lance la recherche de tout les appels à la fonction dl()
et permet de vérifier que la version de PHP installée sur la machine sur laquelle est éxécutée make
dispose de toutes les extensions PHP nécéssaires au fonctionnement de l'application.
Il y a encore bien d'autres utilisations possibles de make
dans le cadre de projets utilisant PHP, et j'espère avec ces quelques exemples vous avoir donné envie d'en découvir un petit peu plus sur cet outil peu populaire mais extrémement puissant.
Si vous désirez un exemple un peu plus complet, je vous invite à regarder le Makefile
de wmiirc.php, et pour de plus amples informations sur la syntaxe et le fonctionnement de make
, je vous invite à consulter la documentation.
[PS] le titre de ce billet est une référence à ma période d'étudiant, ou nous passions notre temps avec mes camarades de promotions à appeler nos Makefile
des Makefly, en réference à Marty McFly de Retour vers le futur... ne me demandez pas pourquoi, je n'en sais absolument rien, mais quelqu'en soit la raison, nous trouvions cela hilarant...
2 réactions
1 De Mère Teresa - 17/02/2009, 10:24
Très intéressant comme technique, je dois dire cela me donne des idées
2 De Hakna - 01/03/2010, 18:40
Rien à dire ! Très belle utilisation du make ! Je garde l'idée... C'est vrai qu'a l'école on m'a dit "make, c'est pour faciliter la compilation modulaire" mais c'est en réalité un exécuteur de script. J'adore =-) merci pour l'idée