Как вызвать Makefile из другого Makefile?
Я получаю неожиданные результаты, вызывая один makefile из другого. У меня есть два make файла, один из которых называется /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
Я вижу:
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
сообщает мне, что он входит в текущий рабочий каталог. В первом случае он не считает, что он должен работать (когда он это делает), а во втором случае он может найти соответствующую директиву (когда вывод говорит мне, что он смотрит в неправильный каталог), но он пытается для запуска команды rm
в /path/to/project
вместо /path/to/makefile/gtest-1.4.0/make/
.
Мне не хватает чего-то фундаментального для вызова make файлов друг от друга? Я сделал вопиющую концептуальную ошибку или попал в общую ловушку? Как эффективно изменять каталоги и вызывать второй make файл из первого? Я понял, что просто вызвать make -f <name>
будет достаточно.
Это make/gmake 3.81 в bash.
Ответы
Ответ 1
Я не совсем понимаю, что вы просите, но с помощью параметра командной строки -f
просто указывается файл - он не говорит make об изменении каталогов. Если вы хотите выполнить работу в другом каталоге, вам нужно cd
в каталог:
clean:
cd gtest-1.4.0 && $(MAKE) clean
Обратите внимание, что каждая строка в Makefile
выполняется в отдельной оболочке, поэтому нет необходимости менять каталог обратно.
Ответ 2
Вместо -f
of make
вы можете использовать опцию -C <path>
. Это сначала изменяет на путь "<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
Ответ 3
http://www.gnu.org/software/make/manual/make.html#Recursion
subsystem:
cd subdir && $(MAKE)
или, что эквивалентно, это:
subsystem:
$(MAKE) -C subdir
Ответ 4
Кажется очевидным, что $(TESTS)
пуст, поэтому ваш makefile 1.4.0 эффективно
all:
clean:
rm -f gtest.a gtest_main.a *.o
В самом деле, все не имеет ничего общего. и чистый делает именно то, что он говорит rm -f gtest.a ...