Всем здравствуйте.
Есть необходимость при сборке проекта складывать .d, .o файлы в директории отличные от текущей (например debug), подобно MSVC.
Я сделал маленький пример. См. вложение.
Он прекрасно собирается make (GNU Make version 3.79.1, Built for i686-pc-msys) под Windows и не хочет собираться make (GNU Make version 3.79.1, Built for i386-redhat-linux-gnu) под Linux (redhat 7.2).
Собирать через a2/makefile с ключом MODE=debug.
Подскажите, какие я сделал ошибки в makefile'ах, что во вложении?
Ошибки при обработке makefile следующие:
...
File `liba2a.a' does not exist.
Considering target file `debug/a2a.o'.
File `debug/a2a.o' does not exist.
Looking for an implicit rule for `debug/a2a.o'.
Trying pattern rule with stem `a2a'.
Rejecting impossible implicit prerequisite `debug/../a2a.cpp'.
...
Must remake target `debug/a2a.o'.
make[1]: *** No rule to make target `debug/a2a.o', needed by `liba2a.a'. Stop.
make[1]: Leaving directory `/home/user7/Eclipse/a2/a2a'
Главное, что непонятно это Rejecting impossible implicit prerequisite `debug/../a2a.cpp'.. Почему?
Файл то реально по этому пути и находиться.
Причем эта ошибка, только при первом запуске make MODE=debug. Хотя все нужные директории debug создает. При втором запуске, когда эти директории уже существуют. Все работает.
И еще если убрать
-include $(DEPSS), то тоже все работает.
Не знаю, как работают тут вложения, так что вот еще и ссылка на вложение
http://www.rsdn.ru:80/File/48240/a.zip
Здравствуйте, Vzhyk, Вы писали:
V>Всем здравствуйте.
V>Rejecting impossible implicit prerequisite `debug/../a2a.cpp'.
V>Главное, что непонятно это Rejecting impossible implicit prerequisite `debug/../a2a.cpp'.. Почему?
V>Файл то реально по этому пути и находиться.
V>Причем эта ошибка, только при первом запуске make MODE=debug. Хотя все нужные директории debug создает. При втором запуске, когда эти директории уже существуют. Все работает.
V>И еще если убрать
V>-include $(DEPSS), то тоже все работает.
Простой ответ — не знаю. У меня есть подозрение, что make кеширует пути, и при обработке include $(DEPSS) приходит к выводу, что debug путей не существует.
Как чистенько победить проблему — тоже не знаю. Грязный хак — заменить
make-modedir:
ifneq ($(MODE), )
-mkdir -p $(MODE) $(addsuffix $(MODE), $(dir $(OBJS)))
endif
на
ifneq ($(MODE), )
HACK := $(shell mkdir -p $(MODE) $(addsuffix $(MODE), $(dir $(OBJS))))
endif
и убрать все упоминания о make-modedir. Переменная HACK (как и всякая другая) вычислится до обработки целей, и директория будет создана вовремя.