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