Я использую gcc -MM для создания предварительных требований правил зависимостей для компиляции исходных файлов в объектные файлы. Я хочу указать каталог для хранения объектных файлов и исполняемого файла в значении некоторой переменной BIN_DIR = bin / release /. Есть два случая:
ДЕЛО 1
%.d: *.h *.cc Makefile
@$(CXX) -MM $(CXXFLAGS) *.cc > $@.$$$$; \
sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; $(RM) -rf $@.$$$$
Хотя я был незнаком с sed, я узнал, что цель утилиты sed - переводить (например):
main.o: main.cc defs.h
в:
main.o main.d: main.cc defs.h
У меня вопрос, как изменить его на: bin / release / main.o bin / release / main.d: main.cc defs.h
Если бы кто-то мог объяснить здесь использование sed, мы были бы очень признательны!
СЛУЧАЙ 2
Makefile.depend: *.h *.cc Makefile
$(CXX) -MM $(CXXFLAGS) *.cc > Makefile.depend
В файле Makefile.depend вы увидите, что каждое правило похоже на этот пример:
main.o: main.cc defs.h
Как поменять на:
bin / release / main.o: main.cc defs.h
Спасибо и привет!
ЗАМЕТКА:
Не знаю, почему я не могу сейчас комментировать. Итак, я разместил свое обновление здесь:
VPATH - это указать каталог с исходным кодом. Но тогда вам нужно запустить make -f path2Makefile с того места, где вы хотите разместить объектные файлы. Здесь я хотел бы иметь возможность запускать make -f path2 Makefile из любого места. Поэтому предпочтительнее указывать каталог для объектных файлов.
К бета-версии:
Спасибо за вашу помощь! Извините, что не могу прокомментировать ваш ответ. Проблема с вашим методом во втором случае заключается в том, что после команды некоторые правила с несколькими строками будут получать префикс в каждой отдельной строке. например
main.o: main.cc defs.h \
src / misc.h
становится:
$ (BIN_DIR) main.o: main.cc defs.h \
$ (BIN_DIR) src / misc.h