web-dev-qa-db-fra.com

Comment appeler Makefile depuis un autre Makefile?

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.

110
Chris Tonkinson

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.

97
anon

À 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
112
Tader

http://www.gnu.org/software/make/manual/make.html#Recursion

 subsystem:
         cd subdir && $(MAKE)

ou, de manière équivalente, ceci:

 subsystem:
         $(MAKE) -C subdir
31
Aadishri

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 ...

1
John Knoeller