Jak wywołać Makefile z innego Makefile?
Otrzymuję nieoczekiwane wyniki wywołując jeden plik makefile od drugiego. 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ę, żeby 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 w /path/to/project/gtest-1.4.0/make/Makefile
mam
all: $(TESTS)
clean:
rm -f $(TESTS) gtest.a gtest_main.a *.o
Wydanie:
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
jest mówi mi, że wchodzi do bieżącego katalogu roboczego. W pierwszym przypadku nie wydaje mu się, aby miał do wykonania pracę (kiedy to robi), a w drugim przypadku jest w stanie znaleźć odpowiednią dyrektywę (gdy wyjście mówi mi, że szuka w niewłaściwym katalogu), ale próbuje uruchomić polecenie rm
w /path/to/project
, zamiast /path/to/makefile/gtest-1.4.0/make/
.
Czy brakuje mi czegoś fundamentalnego w wywoływaniu plików Makefile od siebie? Czy popełniłem rażący błąd pojęciowy, czy wpadłem w Powszechną pułapkę? Jak skutecznie zmieniać katalogi i wywoływać drugi makefile z poziomu pierwszego? Rozumiem, że wystarczy samo wywołanie make -f <name>
.
To jest make / gmake 3.81 w bash.
4 answers
Nie jestem zbyt jasny o co prosisz, ale użycie opcji linii poleceń -f
po prostu określa plik - nie mówi make o zmianie katalogów. Jeśli chcesz wykonać pracę w innym katalogu, musisz cd
do katalogu:
clean:
cd gtest-1.4.0 && $(MAKE) clean
Zauważ, że każda linia Makefile
działa w oddzielnej powłoce, więc nie ma potrzeby zmiany katalogu z powrotem.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-10 19:36:57
Zamiast -f
z make
możesz użyć opcji -C <path>
. To najpierw zmienia ścieżkę " <path>
", a następnie wywołuje make
tam.
Przykład:
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
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-05-02 14:38:55
Http://www.gnu.org/software/make/manual/make.html#Recursion
subsystem:
cd subdir && $(MAKE)
Lub, równoważnie, to:
subsystem:
$(MAKE) -C subdir
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-02 10:51:55
Wydaje się jasne, że {[1] } jest pusty, więc Twój plik makefile 1.4.0 jest efektywny
all:
clean:
rm -f gtest.a gtest_main.a *.o
W rzeczy samej, wszystko nie ma nic wspólnego. a clean robi dokładnie to, co mówi rm -f gtest.a ...
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-05 10:17:32