2017-10-02 4 views
0

Considérez ce qui suit MakefilePourquoi appeler un makefile avec l'option -f casse les règles d'appel des sous-marques?

prereqrule: 
     @echo "Executing prereqrule" 

submakerule: 
     @echo "Executing submakerule" 

check: prereqrule 
     [email protected]$(MAKE) submakerule 

Je lance la règle de contrôle d'un autre répertoire. La première approche fonctionne la seconde ne fonctionne pas.

$ make -C MakefileQuestion check 
Executing prereqrule 
Executing submakerule 

Le submakerule ne peut pas être trouvé avec -f

$ make -f MakefileQuestion/Makefile check 
Executing prereqrule 
make[1]: *** No rule to make target `submakerule'. Stop. 
make: *** [check] Error 2 

Quelle est la raison pour laquelle la version -f ne trouve pas le submakerule dans la sous-faire appel donné naissance?


Je connais un moyen de "réparer" cela. En utilisant un paramètre $THIS_FILE.

THIS_FILE := $(lastword $(MAKEFILE_LIST)) 
workingcheck: prereqrule 
     [email protected]$(MAKE) -f $(THIS_FILE) submakerule 

Works pour les deux approches

$ make -C MakefileQuestion workingcheck 
Executing prereqrule 
Executing submakerule 
$ make -f MakefileQuestion/Makefile workingcheck 
Executing prereqrule 
Executing submakerule 

Je suis surtout intéressés pourquoi l'approche -f ne fonctionne pas. Quelle est la différence dans la mise en œuvre de make pour les deux cas d'utilisation (-C et -f) de telle sorte que le second a besoin du -f $THIS_FILE passé à la sous-déclaration?

Répondre

0

La variable MAKE est le nom du fichier avec lequel make a été appelé. Il ne contient aucun autre paramètre, tel que -f ou -t. Si c'était le cas, vous ne seriez pas capable d'exécuter d'autres commandes make récursives si ce n'est que vous avez exécuté en premier lieu, ce qui n'a aucun sens.

-C fonctionne parce qu'il indique à votre shell de changer de répertoire en premier. Cela permet d'exécuter make s sans fournir explicitement le répertoire.

+0

Comment ce comportement est lié à la variable $ (MAKE). Selon sa [doc] (https://www.gnu.org/software/make/manual/html_node/MAKE-Variable.html) il prend des valeurs comme '/ bin/make', dans mon cas c'est'/Applications/Xcode.app/Contents/Développeur/usr/bin/make' –

+0

Aussi je ne demande pas pourquoi ai-je besoin de passer '-f $ (THIS_FILE)' explicitement. Je ne comprends pas pourquoi c'est nécessaire en premier lieu. –

0

Je pense que je comprends ce qui se passe maintenant. J'avais une confusion plus fondamentale à propos de make.

La règle suivante

check: prereqrule 
     [email protected]$(MAKE) submakerule 

provoque une

/Applications/Xcode.app/Contents/Developer/usr/bin/make submakerule

exécution de pwd.

Étant donné que le répertoire d'exécution ne contenait aucun fichier Makefile, faites imprimer cette erreur.

Similaire à celui-ci.

~/DirWithoutMakefile$ make check 
make: *** No rule to make target `check'. Stop. 

Le passage d'un -f $(THIS_FILE) utilise le droit makefile au lieu de ne pas trouver de makefile pwd.