Как вызвать Makefile из другого Makefile?



я получаю некоторые неожиданные результаты, вызывая один makefile из другого. У меня есть два makefiles, один называется /path/to/project/makefile и /path/to/project/gtest-1.4.0/make/Makefile. Я пытаюсь сделать так, чтобы первое называлось вторым. В /path / to / project/makefile, у меня есть



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


и /path/to/project/gtest-1.4.0/make/Makefile Я



all: $(TESTS)

clean:
rm -f $(TESTS) gtest.a gtest_main.a *.o


выдача следующее:



cd /path/to/project
make


выходы:



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'


однако, когда я выполните следующие команды:



cd /path/to/project
make clean


I смотрите:



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'


я не понимаю: в обоих случаях /path/to/project/makefile говорит мне, что он входит в текущий рабочий каталог. В первом случае он не думает, что у него есть работа (когда она есть), а во втором случае он может найти соответствующую директиву (когда вывод говорит мне, что он ищет в неправильном каталоге), но он пытается запустить на /path/to/project, вместо /path/to/makefile/gtest-1.4.0/make/.



я упускаю что-то фундаментальное для вызова makefiles друг от друга? Допустил ли я вопиющую концептуальную ошибку или попал в общую ловушку? Как эффективно изменить каталоги и вызвать второй makefile из первого? Я так понял, что просто звоню make -f <name> будет достаточно.



это make / gmake 3.81 в bash.

1409   4  

4 ответов:

Я действительно не слишком ясно, что вы просите, но с помощью -f параметр командной строки просто указывает файл - он не говорит сделать, чтобы изменить каталоги. Если вы хотите сделать работу в другом каталоге, нужно cd каталог:

clean:
    cd gtest-1.4.0 && $(MAKE) clean

обратите внимание, что каждая строка Makefile работает в отдельной оболочке, поэтому нет необходимости менять каталог обратно.

вместо -f of make вы можете использовать . Это сначала изменяет путь'<path>', а потом звонит make там.

пример:

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

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

 subsystem:
         cd subdir && $(MAKE)

или, что то же самое, это:

 subsystem:
         $(MAKE) -C subdir

очевидно, что $(TESTS) пуст, так что ваш 1.4.0 makefile эффективно

all: 

clean:
  rm -f  gtest.a gtest_main.a *.o

действительно, все это не имеет никакого отношения. и чистый делает именно то, что он говорит rm -f gtest.a ...

Comments

    Ничего не найдено.