J'obtiens des résultats inattendus en appelant un fichier Make d'un autre. J'ai deux makefiles, l'un appelé /path/to/project/makefile
et un appelé /path/to/project/gtest-1.4.0/make/Makefile
. J'essaie d'avoir le premier appel le dernier. Dans/chemin/vers/projet/makefile, j'ai
dev: $(OBJ_FILES)
$(CPPC) $(LIBS) $(FLAGS_DEV) $(OBJ_FILES) -o $(BIN_DIR)/$(PROJECT)
$(MAKE) -f ./gtest-1.4.0/make/Makefile
clean:
rm -f ./*~ ./gmon.out ./core $(SRC_DIR)/*~ $(OBJ_DIR)/*.o
rm -f ../svn-commit.tmp~
rm -f $(BIN_DIR)/$(PROJECT)
make -f gtest-1.4.0/make/Makefile clean
Et en /path/to/project/gtest-1.4.0/make/Makefile
J'ai
all: $(TESTS)
clean:
rm -f $(TESTS) gtest.a gtest_main.a *.o
Émettant ce qui suit:
cd /path/to/project
make
Les sorties:
make -f ./gtest-1.4.0/make/Makefile
make[1]: Entering directory `/path/to/project'
make[1]: Nothing to be done for `all'.
make[1]: Leaving directory `/path/to/project'
Cependant, lorsque j'émets ces commandes:
cd /path/to/project
make clean
Je vois:
make -f gtest-1.4.0/make/Makefile clean
make[1]: Entering directory `/path/to/project'
rm -f gtest.a gtest_main.a *.o
make[1]: Leaving directory `/path/to/project'
Je ne comprends pas: dans les deux cas, /path/to/project/makefile
me dit qu'il entre dans le répertoire de travail actuel. Dans le premier cas, il ne pense pas avoir du travail à faire (quand il le faut) et dans le second cas, il est capable de trouver la directive appropriée (lorsque la sortie me dit qu'il cherche dans le mauvais répertoire), mais il essaie exécuter la commande rm
dans /path/to/project
, au lieu de /path/to/makefile/gtest-1.4.0/make/
.
Me manque-t-il quelque chose de fondamental pour appeler des makefiles les uns aux autres? Ai-je commis une erreur conceptuelle flagrante ou un piège commun? Comment puis-je changer efficacement de répertoire et appeler un deuxième fichier makefile depuis le premier? Ma compréhension était que simplement appeler make -f <name>
serait suffisant.
C'est make/gmake 3,81 dans bash.
Je ne sais pas trop ce que vous demandez, mais utiliser l'option de ligne de commande -f
Spécifie simplement un fichier - il n'indique pas à make de modifier les répertoires. Si vous voulez faire le travail dans un autre répertoire, vous devez cd
dans le répertoire:
clean:
cd gtest-1.4.0 && $(MAKE) clean
Notez que chaque ligne de Makefile
s'exécute dans un shell séparé. Il n'est donc pas nécessaire de modifier le répertoire.
À la place du -f
de make
vous pouvez utiliser le -C <path>
option. Ceci change d'abord le chemin '<path>
', puis appelle make
ici.
Exemple:
clean:
rm -f ./*~ ./gmon.out ./core $(SRC_DIR)/*~ $(OBJ_DIR)/*.o
rm -f ../svn-commit.tmp~
rm -f $(BIN_DIR)/$(PROJECT)
$(MAKE) -C gtest-1.4.0/make clean
http://www.gnu.org/software/make/manual/make.html#Recursion
subsystem:
cd subdir && $(MAKE)
ou, de manière équivalente, ceci:
subsystem:
$(MAKE) -C subdir
Il semble clair que $(TESTS)
est vide et que votre makefile 1.4.0 est effectivement
all:
clean:
rm -f gtest.a gtest_main.a *.o
En effet, tout n’a rien à voir. et clean fait exactement ce qu'il dit rm -f gtest.a ...