2014-11-21 2 views
2

У меня есть Makefile, подобный следующему:Makefile с несколькими зависимостями для одного файла

SRCS = a.c b.cpp 
OBJS = objs/a.o objs/b.o 

all: $(OBJS) 

objs/%.o: %.c 
    gcc -c $< -o [email protected] 

objs/%.o: %.cpp 
    gcc -c $< -o [email protected] 

Это, кажется, работает. Но я не понимаю, почему. Почему он не пытается сгенерировать a.cpp и b.c?

как я его прочитал: a.cpp является обязательным условием для objs/a.o, и он должен попытаться сгенерировать его. И потому что он не находит для него подходящего правила - он должен потерпеть неудачу

Где я ошибаюсь?

P.S - Я исполняю свой Makefile, используя -r -R, чтобы избежать встроенных правил

ответ

3

Make не объединяет списки необходимых правил шаблонов.

Когда Make ищет способ построить objs/a.o, он обнаруживает, что первое правило шаблона соответствует цели, и существует предварительное условие (a.c). Второе правило шаблона совпадает с целевым, но предварительное условие (a.cpp) не существует и не может быть создано, поэтому Make использует первое правило. Аналогично, Make выбирает второе правило над первым, когда ищет способ построить objs/b.o.

+0

Можете ли вы направить меня туда, где это указано? Я искал его в GNU make и не мог найти его – user972014

+1

@ user972014: В руководстве есть разделы по [правилам шаблонов] (http://www.gnu.org/software/make/manual/make.html#Pattern- Правила) и [как они соответствуют] (http://www.gnu.org/software/make/manual/make.html#Pattern-Match). Я не знаю ссылки, в которой явно указано, что списки предварительных условий не объединены, но это подразумевается в этих разделах. – Beta

+0

Здесь. Я нашел это: «Правило шаблона может использоваться для построения данного файла только в том случае, если существует целевой шаблон, который соответствует имени файла, и все предпосылки в этом правиле либо существуют, либо могут быть созданы» – user972014

2

Сделать бы попытаться произвести a.cpp и b.c если эти файлы зависит от чего-то другого. Однако это не так, эти два файла являются листьями в дереве зависимостей, поэтому у Make нет причин пытаться их сгенерировать.

Смежные вопросы