Я отримую кілька несподіваних результатів, викликаючи один makefile з іншого. У мене є два makefiles, один закликаний /path/to/project/makefile
та один закликаний /path/to/project/gtest-1.4.0/make/Makefile
. Я намагаюся, щоб перший називав останній. У / шлях / до / проект / 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/
.
Невже я пропускаю щось принципове для виклику файлів один від одного? Чи зробив я грізну концептуальну помилку чи потрапив у загальну грішну проблему? Як я можу ефективно змінювати каталоги та викликати другий makefile зсередини першого? Моє розуміння полягало в тому, що просто подзвонити make -f <name>
буде достатньо.
Це make / gmake 3.81 у баш.
make -f gtest-1.4.0/make/Makefile clean
тебе краще скажи$(MAKE) -C gtest-1.4.0/make clean
. Чому ви не визначили хибних цілей?