makefile, .d и .o файлов в отдельные директории
От: Vzhyk  
Дата: 17.11.05 10:20
Оценка:
Всем здравствуйте.

Есть необходимость при сборке проекта складывать .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
Re: makefile, .d и .o файлов в отдельные директории
От: vnp  
Дата: 17.11.05 21:30
Оценка:
Здравствуйте, 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 (как и всякая другая) вычислится до обработки целей, и директория будет создана вовремя.
Re[2]: makefile, .d и .o файлов в отдельные директории
От: Vzhyk  
Дата: 17.11.05 21:56
Оценка:
Здравствуйте, vnp, Вы писали:

vnp>Здравствуйте, Vzhyk, Вы писали:


vnp>Простой ответ — не знаю. У меня есть подозрение, что make кеширует пути, и при обработке include $(DEPSS) приходит к выводу, что debug путей не существует.


vnp>Как чистенько победить проблему — тоже не знаю. Грязный хак — заменить


<skip>
vnp>и убрать все упоминания о make-modedir. Переменная HACK (как и всякая другая) вычислится до обработки целей, и директория будет создана вовремя.

Спасибо. Обязательно попробую. Сейчас из дома пишу.
А вообще возможно существуют уже готовые решения, делающие подобное?
Основная сложность, что при запуске маке нужные директории могут и не существовать, т.е. их нужно создавать. Если средствами make подобное сделать нельзя, что ж — это тоже решение.
Но хочу быть достаточно сильно уверен, что это невозможно средствами маке. Больше всего смущает, что порт make для MSYS, отрабатывает так, как и предполагалось.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.