Re:
[GNU Make] использует хэш-таблицу для сравнения строк пути к файлу, поэтому, если строки отличаются, хотя они и обозначают один и тот же файл, их все равно нельзя сопоставить с помощью vpath.
Make делает примерно то, что нужно. Чтобы определить, являются ли два объекта одинаковыми, необходимо полагаться на уникальные идентификаторы в файловой системе (например, номера инодов), которые зависят от ОС и файловой системы.
Почему вы используете два разных пути для ссылки на одну и ту же цель или предпосылку? Возможно, то, что вы делаете в своем Makefile, хуже, чем Make, полагающееся на равенство строк для сравнения путей.
Кроме того, вы можете что-то не так понять. Директива vpath
и переменная VPATH
связаны с поиском необходимых файлов.
Вы редко, если вообще когда-либо, хотите искать объектные файлы в качестве предварительных условий (хотя, конечно, они являются предварительными условиями для создания исполняемого файла или библиотеки).
Это связано с тем, что нельзя предполагать, что объектные файлы существуют, и вы не ищете то, что может не существовать. Когда вы делаете чистую сборку, объектных файлов там нет. Ваш Makefile должен знать их точные имена. Это предпосылки, которые могут варьироваться. Например, вы знаете, что хотите собрать foo.o
(который может уже существовать из предыдущей сборки, а может и не существовать). Что вам не обязательно знать, так это исходный файл, из которого построен foo.o
. Это libfoo/foo.c
или utils/foo.c
? Это проблема, которую решает vpath
: он будет искать эти места и найдет foo.c
, аналогично тому, как PATH
помогает вашей оболочке найти программу foo
в /bin
или /usr/bin
и т. д.
VPATH/vpath
являются чем-то вроде хака для написания быстрых и грязных make-файлов для небольших проектов, которые не масштабируются до большой конфигурации. Нет смысла пытаться их улучшить.
27.04.2012