Ich erhalte einige unerwartete Ergebnisse, wenn ich ein Makefile von einem anderen aufrufe. Ich habe zwei Makefiles, eines mit dem Namen /path/to/project/makefile
und eines mit dem Namen /path/to/project/gtest-1.4.0/make/Makefile
. Ich versuche, den ersteren den letzteren anrufen zu lassen. In / path / to / project / makefile habe ich
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
Und in /path/to/project/gtest-1.4.0/make/Makefile
habe ich
all: $(TESTS)
clean:
rm -f $(TESTS) gtest.a gtest_main.a *.o
Folgendes ausgeben:
cd /path/to/project
make
Ausgänge:
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'
Wenn ich jedoch folgende Befehle erteile:
cd /path/to/project
make clean
Aha:
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'
Ich verstehe nicht: In beiden Fällen /path/to/project/makefile
wird mir mitgeteilt, dass das aktuelle Arbeitsverzeichnis eingegeben wird. Im ersten Fall glaubt es nicht, dass es Arbeit zu erledigen hat (wenn dies der Fall ist), und im zweiten Fall kann es die entsprechende Direktive finden (wenn die Ausgabe mir sagt, dass es im falschen Verzeichnis sucht), versucht es jedoch um den rm
Befehl /path/to/project
anstelle von auszuführen /path/to/makefile/gtest-1.4.0/make/
.
Vermisse ich etwas Grundlegendes, um Makefiles voneinander abzurufen? Habe ich einen ungeheuren konzeptionellen Fehler gemacht oder bin ich auf eine häufige Falle gestoßen? Wie ändere ich effektiv Verzeichnisse und rufe ein zweites Makefile aus dem ersten heraus auf? Mein Verständnis war, dass make -f <name>
es ausreichen würde , einfach anzurufen .
Dies ist make / gmake 3.81 in bash.
make -f gtest-1.4.0/make/Makefile clean
du es besser sagst$(MAKE) -C gtest-1.4.0/make clean
. Warum haben Sie keine falschen Ziele definiert?