116 votes

Comment appeler un Makefile à partir d'un autre Makefile ?

J'obtiens des résultats inattendus en appelant un makefile à partir d'un autre. J'ai deux makefiles, l'un appelé /path/to/project/makefile et l'un d'entre eux a appelé /path/to/project/gtest-1.4.0/make/Makefile . J'essaie de faire en sorte que le premier appelle le second. Dans /path/to/project/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

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, lorsque je lance 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 pense qu'il n'a pas de travail à faire (alors qu'il en a) et dans le second cas, il est capable de trouver la directive appropriée (alors que la sortie me dit qu'il cherche dans le mauvais répertoire) et pourtant il essaie d'exécuter la commande rm dans la commande /path/to/project au lieu de /path/to/makefile/gtest-1.4.0/make/ .

Ai-je raté quelque chose de fondamental dans le fait d'appeler les makefiles les uns des autres ? Ai-je commis une erreur conceptuelle flagrante ou suis-je tombé sur un écueil courant ? Comment changer efficacement de répertoire et appeler un second makefile à partir du premier ? J'ai cru comprendre que le simple fait d'appeler make -f <name> suffirait.

Il s'agit de make/gmake 3.81 en bash.

149voto

Je ne comprends pas très bien ce que vous demandez, mais en utilisant la fonction -f ne fait que spécifier un fichier - elle ne demande 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 de répertoire.

120voto

Tader Points 4553

Au lieu de la -f de make vous pourriez vouloir utiliser l'option -C <path> option. Ceci change d'abord le chemin d'accès en ' <path> ', puis appelle 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

37voto

Aad Points 134

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

 subsystem:
         cd subdir && $(MAKE)

ou, de manière équivalente, ceci :

 subsystem:
         $(MAKE) -C subdir

1voto

John Knoeller Points 20754

Il semble évident que $(TESTS) est vide, de sorte que votre fichier 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 ...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X