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.

  1. 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.
  2. 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 $@


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow