Я получаю неожиданные результаты, вызывая один make-файл из другого. У меня есть два 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.
make -f gtest-1.4.0/make/Makefile clean
тебя лучше сказать$(MAKE) -C gtest-1.4.0/make clean
. Почему вы не определили фальшивые цели?Ответы:
Я не совсем понимаю, о чем вы спрашиваете, но при использовании параметра
-f
командной строки просто указывается файл - он не сообщает программе make изменить каталоги. Если вы хотите выполнить работу в другом каталоге, вам необходимоcd
перейти в каталог:Обратите внимание, что каждая строка
Makefile
выполняется в отдельной оболочке, поэтому нет необходимости менять каталог обратно.источник
cd
переходить вgtest-1.4.0
каталог, вы должны использовать-C
опциюmake
.&&
команду cd и make. В противном случае, если компакт-диск выйдет из строя, он все равно будет работатьmake clean
... в неправильном каталоге !! Также вы всегда должны использовать ТОЛЬКО$(MAKE)
, а не голое словоmake
, при рекурсии. Так что-то вроде:cd gtest-1.4.0 && $(MAKE) clean
-C
отсутствует в спецификации-C
находится в спецификации: gnu.org/software/make/manual/make.html#RecursionВместо того , чтобы
-f
изmake
вас , возможно , захотите использовать-C <path>
опцию. Это сначала меняет путь на путь '<path>
', а затем вызываетmake
там.Пример:
источник
cd
вызывают зацикливание терминала.http://www.gnu.org/software/make/manual/make.html#Recursion
или, что то же самое:
источник
Кажется очевидным, что
$(TESTS)
он пуст, поэтому ваш make-файл 1.4.0 эффективноДействительно, все не при чем. и clean делает именно то, что говорит
rm -f gtest.a ...
источник
wildcard
и apatsubst
, однако они возвращаются пустыми из основного make-файла, потому что каталог не изменяется эффективно. Хороший глаз.