makefile
Cible
Recherche…
Utiliser .PHONY pour des cibles autres que des fichiers
Utilisez .PHONY
pour spécifier les cibles qui ne sont pas des fichiers, par exemple, clean
ou mrproper
.
Bon exemple
.PHONY: clean
clean:
rm *.o temp
Mauvais exemple
clean:
rm *.o temp
Dans le bon exemple make
sait que clean
est pas un fichier, par conséquent , il ne cherchera pas si elle est ou non à jour et exécutera la recette.
Dans le mauvais exemple, make
cherchera un fichier nommé clean
. Si elle n'existe pas ou n'est pas à jour, elle exécutera la recette, mais si elle existe et est à jour, la recette ne sera pas exécutée.
Utiliser .PHONY pour les invocations récursives de la commande 'make'
L'utilisation récursive de make signifie l'utilisation de make en tant que commande dans un makefile. Cette technique est utile lorsqu'un grand projet contient des sous-répertoires, chacun ayant ses fichiers de configuration respectifs. L'exemple suivant aidera à comprendre l'avantage d'utiliser .PHONY avec make récursif.
/main
|_ Makefile
|_ /foo
|_ Makefile
|_ ... // other files
|_ /bar
|_ Makefile
|_ ... // other files
|_ /koo
|_ Makefile
|_ ... // other files
Pour exécuter le makefile du sous-répertoire depuis le makefile de main, le makefile principal comporterait une boucle comme indiqué ci-dessous (il existe d'autres moyens pour y parvenir, mais cela est hors du sujet du sujet actuel)
SUBDIRS = foo bar koo
subdirs:
for dir in $(SUBDIRS); do \
$(MAKE) -C $$dir; \
done
Cependant, cette méthode présente des pièges.
- Toute erreur détectée dans une sous-marque est ignorée par cette règle. Elle continuera donc à générer le reste des répertoires, même en cas d'échec.
- La capacité de make à exécuter une exécution parallèle de plusieurs cibles de build n'est pas utilisée car une seule règle est utilisée.
En déclarant les sous-répertoires en tant que cibles .PHONY (vous devez le faire car le sous-répertoire existe toujours, sinon il ne sera pas construit), ces problèmes peuvent être résolus.
SUBDIRS = foo bar koo
.PHONY: subdirs $(SUBDIRS)
subdirs: $(SUBDIRS)
$(SUBDIRS):
$(MAKE) -C $@