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?Réponses:
Je ne suis pas vraiment trop clair sur ce que vous demandez, mais l'utilisation de l'
-f
option de ligne de commande spécifie simplement un fichier - cela ne dit pas à make de changer de répertoire. Si vous souhaitez effectuer le travail dans un autre répertoire, vous devez accédercd
au répertoire: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 source
cd
'entrer manuellement dans legtest-1.4.0
répertoire, vous devez utiliser l'-C
optionmake
.&&
entre la commande cd et make. Sinon, si le cd échoue, il fonctionnera toujoursmake clean
... dans le mauvais répertoire !! Aussi, vous devez toujours utiliser UNIQUEMENT$(MAKE)
, jamais le mot numake
, lors de la récurrence. Donc quelque chose comme:cd gtest-1.4.0 && $(MAKE) clean
-C
n'est pas dans les spécifications-C
est dans la spécification: gnu.org/software/make/manual/make.html#RecursionAu lieu de
-f
demake
vous voudrez peut - être utiliser l'-C <path>
option. Cela change d'abord le chemin d'accès '<path>
', puismake
y appelle .Exemple:
la source
cd
font entrer le terminal dans une boucle infinie.http://www.gnu.org/software/make/manual/make.html#Recursion
ou, de manière équivalente, ceci:
la source
Il semble clair que
$(TESTS)
c'est vide donc votre makefile 1.4.0 est effectivementEn effet, tout n'a rien à voir. et clean fait exactement ce qu'il dit
rm -f gtest.a ...
la source
wildcard
et apatsubst
, cependant ceux-ci retournent vides du makefile principal, car le répertoire n'est pas effectivement changé. Bon oeil.