Comment appeler Makefile à partir d'un autre Makefile?
Je reçois des résultats inattendus appelant un makefile 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'essaie que le premier appelle 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
Délivrant ce qui suit:
cd /path/to/project
make
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, quand j'émet 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
est en me disant qu'il entre dans le répertoire de travail actuel. Dans le premier cas, il ne pense pas avoir du travail à faire (quand c'est le cas) et dans le second cas, il est capable de trouver la directive appropriée (quand la sortie me dit qu'elle regarde dans le mauvais répertoire) mais il essaie d'exécuter la commande rm
dans /path/to/project
, au lieu de /path/to/makefile/gtest-1.4.0/make/
.
Est-ce que je manque quelque chose de fondamental pour appeler les makefiles les uns des autres? Ai-je fait une erreur conceptuelle flagrante, ou frappé un piège commun? Comment puis-je changer efficacement les répertoires et appeler un second makefile à partir du premier? Ma compréhension était que simplement appeler make -f <name>
serait suffisant.
C'est faire/gmake 3.81 dans bash.
4 réponses
Je ne suis pas vraiment trop clair ce que vous demandez, mais en utilisant l'option de ligne de commande -f
spécifie simplement un fichier - il ne dit pas à make de changer de répertoire. 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 changer le répertoire.
Au Lieu de -f
de make
vous pouvez utiliser le -C <path>
option. Cela change d'abord le chemin ' <path>
', puis calles make
là.
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, donc votre 1.4.0 makefile est effectivement
all:
clean:
rm -f gtest.a gtest_main.a *.o
En effet, tout n'a rien à voir. propre et fait exactement ce qu'il dit rm -f gtest.a ...