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.

Author: kenorb, 2010-02-05

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.

 88
Author: kenorb,
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
 95
Author: Tader,
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
 24
Author: Aadishri,
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 ...
 1
Author: John Knoeller,
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