Я получаю некоторые неожиданные результаты, называя один 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 в ударе.
Я не совсем понимаю, о чем вы спрашиваете, но с помощью параметра командной строки -f
просто указывается файл - он не сообщает программе make изменить каталоги. Если вы хотите выполнить работу в другом каталоге, вам необходимо cd
в каталог:
clean:
cd gtest-1.4.0 && $(MAKE) clean
Обратите внимание, что каждая строка в Makefile
выполняется в отдельной оболочке, поэтому нет нужно сменить каталог обратно.
Кажется очевидным, что $(TESTS)
пуст, так что ваш 1.4.0 makefile фактически
all:
clean:
rm -f gtest.a gtest_main.a *.o
Действительно, все не имеет ничего общего. и чистый делает в точности то, что он говорит rm -f gtest.a ...