Otrzymuję nieoczekiwane wyniki podczas wywoływania jednego pliku makefile z innego. Mam dwa pliki makefile, jeden o nazwie /path/to/project/makefile
i jeden o nazwie /path/to/project/gtest-1.4.0/make/Makefile
. Staram się, aby ten pierwszy zadzwonił do drugiego. W / path / to / project / makefile mam
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
I /path/to/project/gtest-1.4.0/make/Makefile
mam
all: $(TESTS)
clean:
rm -f $(TESTS) gtest.a gtest_main.a *.o
Wydanie następujących dokumentów:
cd /path/to/project
make
Wyjścia:
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'
Jednak gdy wydaję te polecenia:
cd /path/to/project
make clean
Widzę:
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'
Nie rozumiem: w obu przypadkach /path/to/project/makefile
mówi mi, że przechodzi do bieżącego katalogu roboczego. W pierwszym przypadku uważa, że nie ma pracy do wykonania (kiedy ma), aw drugim przypadku jest w stanie znaleźć odpowiednią dyrektywę (gdy wynik mówi, że szuka w złym katalogu), ale próbuje aby uruchomić rm
polecenie /path/to/project
, zamiast /path/to/makefile/gtest-1.4.0/make/
.
Czy brakuje mi czegoś podstawowego do wywoływania makefile od siebie? Czy popełniłem rażący błąd koncepcyjny lub napotkałem powszechną pułapkę? Jak skutecznie zmieniać katalogi i wywoływać drugi plik makefile z pierwszego? Zrozumiałem, że wystarczy zadzwonić make -f <name>
.
To jest make / gmake 3.81 w bash.
make -f gtest-1.4.0/make/Makefile clean
ciebie lepiej powiedz$(MAKE) -C gtest-1.4.0/make clean
. Dlaczego nie zdefiniowałeś fałszywych celów?Odpowiedzi:
Nie jestem zbyt jasny, o co pytasz, ale użycie
-f
opcji wiersza poleceń po prostu określa plik - nie mówi make do zmiany katalogów. Jeśli chcesz wykonać pracę w innym katalogu, musisz przejśćcd
do katalogu:Zwróć uwagę, że każdy wiersz
Makefile
działa w oddzielnej powłoce, więc nie ma potrzeby zmiany katalogu z powrotem.źródło
cd
przechodzić do katalogugtest-1.4.0
, należy skorzystać z-C
opcjimake
.&&
między poleceniem cd i make. W przeciwnym razie, jeśli płyta nie powiedzie się, nadal będzie działaćmake clean
... w niewłaściwym katalogu !! Powinieneś także zawsze używać TYLKO$(MAKE)
, nigdy nie używaj gomake
, gdy powtarzasz. Coś w stylu:cd gtest-1.4.0 && $(MAKE) clean
-C
nie ma w specyfikacji-C
jest w specyfikacji: gnu.org/software/make/manual/make.html#RecursionZamiast
-f
zmake
was może chcieć użyć-C <path>
opcji. To najpierw zmienia ścieżkę '<path>
', a następnie wywołujemake
ją.Przykład:
źródło
cd
powodują, że terminal wpada w nieskończoną pętlę.http://www.gnu.org/software/make/manual/make.html#Recursion
lub, równoważnie, to:
źródło
Wydaje się jasne, że
$(TESTS)
jest pusty, więc plik makefile 1.4.0 działa skutecznieRzeczywiście, wszystko nie ma nic wspólnego. a clean robi dokładnie to, co mówi
rm -f gtest.a ...
źródło
wildcard
i apatsubst
, jednak zwracają one puste z głównego pliku makefile, ponieważ katalog nie jest skutecznie zmieniany. Dobre oko.