J'obtiens des résultats inattendus en appelant un makefile à partir d'un autre. J'ai deux makefiles, un appelé /path/to/project/makefile
et un appelé /path/to/project/gtest-1.4.0/make/Makefile
. J'essaye de faire appeler le premier le second. 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 dans /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
cela me dit qu'il entre dans le répertoire de travail actuel. Dans le premier cas, il ne pense pas avoir de travail à faire (quand c'est le cas) 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 pour exécuter la rm
commande au /path/to/project
lieu de /path/to/makefile/gtest-1.4.0/make/
.
Est-ce que je manque quelque chose de fondamental pour appeler des makefiles les uns des autres? Ai-je commis une grave erreur conceptuelle ou ai-je rencontré un piège courant? Comment modifier efficacement les répertoires et appeler un deuxième makefile depuis le premier? Je croyais comprendre que simplement appeler make -f <name>
suffirait.
C'est make / gmake 3.81 dans bash.
make -f gtest-1.4.0/make/Makefile clean
vous dire$(MAKE) -C gtest-1.4.0/make clean
. Pourquoi n'avez-vous pas défini de fausses cibles?