Я понимаю, что "явное" шаблонное правило будет иметь приоритет над его неявным аналогом, когда его предпосылки могут быть выполнены.
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)