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?
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' –
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. –