Как звонить из Makefile в другой Makefile?
я получаю неожиданные результаты, вызывая один makefile из другого. У меня есть два файла Makefile, один называется /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 в Баш.
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
действительно, все не имеет ничего общего. и clean делает именно то, что он говорит rm -f gtest.a ...