Обеспечение наличия предпосылки для правила шаблона - PullRequest
2 голосов
/ 02 февраля 2012

Я понимаю, что "явное" шаблонное правило будет иметь приоритет над его неявным аналогом, когда его предпосылки могут быть выполнены.

all: src/foo.o

src/%.o: makefile my_haeder.h src/%.c
    echo Do something with those source files

Если есть опечатка для "my_header.h", неявное правилодля% .o будет иметь приоритет.Не только мой рецепт не будет выполнен, но прикосновение к предпосылкам не сработает.На самом деле это второй момент, который меня интересует.

Документация make предлагает проверку с использованием статических шаблонных правил:

SET_OF_FILES=src/foo.o

all: src/foo.o

$(SET_OF_FILES): src/%.o: makefile my_haeder.h src/%.c
    echo Do something with those source files

В результате:

gmake: *** No rule to make target `src/my_haeder.h', needed by `src/foo.o'.  Stop.

Хотя это и более широкое правило, это решение хорошо, если мне не нужно добавлять правило, для которого ствол может перекрываться:

SET_OF_FILES=src/foo.o src/subsrc/bar.o

all: src/foo.o

$(SET_OF_FILES): src/%.o: makefile my_header.h src/%.c
    echo Do something with those source files

$(SET_OF_FILES): src/subsrc/%.o: makefile my_header.h src/subsrc/%.c
    echo Do something with those other source files

Что приводит к:

makefile:8: target `src/foo.o' doesn't match the target pattern
makefile:9: warning: overriding commands for target `src/foo.o'
makefile:6: warning: ignoring old commands for target `src/foo.o'
makefile:9: warning: overriding commands for target `src/subsrc/bar.o'
makefile:6: warning: ignoring old commands for target `src/subsrc/bar.o'

Первое сообщение здесь, потому что я не беспокоил $ (фильтр) в SET_OF_FILES.Я не знаю, как решить следующие предупреждения, которые для любого рецензента означали бы «что-то не так».

Есть ли другой (более изящный) способ проверить, что предпосылки действительно выполнимы, чтобы избежатьсбросить явное шаблонное правило?

(используя GNU Make 3.79.1 win32)

1 Ответ

0 голосов
/ 13 июля 2017

Добавьте отдельное правило для проверки ваших предпосылок

all: prereqs src/foo.o

prereqs: Makefile my_header.h

src/%.o: src/%.c Makefile my_header.h
    echo Do something with those source files

src/subsrc/%.o: src/subsrc/%.c Makefile my_header.h
    echo Do something with those other source files

, которое даст вам:

make 
make: *** No rule to make target 'my_header.h', needed by 'prereqs'.  Stop
...