2013-06-25 4 views
0

Во-первых, заголовок очень общий, потому что есть всего несколько способов, как это возможно решить. Тем не менее, я ищу чистый и аккуратный способ.Makefile: расширения зависимостей

Ситуация:
У меня есть два одинаковых объектные файлы foo.o и foo-pi.o, последний из которых является позиционно-независимым (скомпилирован с -fPIC). Оба значения зависят от foo.h и bar.h.

Проблема:
Как, без дублирования кода, объявить зависимость всех foo*.o к bar.h?

решения до сих пор:
$(shell bash -c 'echo -ne foo{-pi,}.o'): bar.h
$(addsuffix .o, $(addprefix fo, o-pi o)): bar.h
foo.o foo-pi.o: bar.h

Первое решение не является переносимым на системах, которые не поддерживают bash, то второе грязное решение, так как я не мог понять, как используйте пустые строки в addprefix. Третье решение включает дублирование упоминания foo, которого я хочу избежать.

+2

Вместо использования переименования для различения кода PIC и non-PIC рассмотрите возможность размещения двух типов объектов в разных подкаталогах (например, obj/'и' obj.PIC/') и оставляя имена одинаковыми. Это может сделать многое из того, что вы пытаетесь сделать проще ... – twalberg

+0

Правда, но спецификация этого не позволяет. – Danyel

ответ

1

Во-первых, вам не нужно использовать echo -en, потому что функция оболочки всегда удаляет конечную новую строку, как обратные ссылки в оболочке. Тем не менее, даже если вам нужно опустить завершающие символы новой строки, вы можете использовать программу printf вместо echo: printf гораздо более портативен и надежен, чем прохождение опций до echo, которые различны во всем мире.

Во-вторых, вы можете использовать функцию foreach, а не общую добавку adduffix/addprefix. Проблема, с которой вы сталкиваетесь, заключается в том, что вы пытаетесь превратить одно слово в два слова, и эти функции (а также более общие, такие как patsubst) просто не делают этого. Попробуйте: $(foreach F,foo,$F $F-pi.o): dep.h

В-третьих, я лично просто напишу это, так как это меньше усилий и более легко читается.