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.

97
demandé sur kenorb 2010-02-05 12:20:33

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.

88
répondu kenorb 2014-11-10 19:36:57

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
95
répondu Tader 2012-05-02 14:38:55

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

 subsystem:
         cd subdir && $(MAKE)

Ou, de manière équivalente, ceci :

 subsystem:
         $(MAKE) -C subdir
24
répondu Aadishri 2013-08-02 10:51:55

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

1
répondu John Knoeller 2010-02-05 10:17:32