У меня есть Makefile с несколькими правилами этой формы
protolist.c: $(PROTOCOLS) Makefile src/genmodtable.sh
$(SHELL) $(srcdir)/src/genmodtable.sh \
$@ $(filter-out %Makefile %genmodtable.sh, $^)
Как видно из названия, protolist.c
содержит список всех "протоколов", определенных файлами .c
в $(PROTOCOLS)
. Содержимое этого файла формально зависит от всего в $(PROTOCOLS)
, Makefile и скрипте генератора, но очень редко для файла фактически изменяется при редактировании одного из этих .c
файлов. Следовательно, genmodtable.sh
кодируется так, чтобы не изменять метку времени protolist.c
, если он не собирается вносить какие-либо изменения в его содержимое. Это заставляет Make пропустить перестроение protolist.o
и его зависимостей, когда это действительно не нужно.
Это все отлично работает; проблема заключается в том, что, поскольку protolist.c
теперь, кажется, устарел по отношению к его зависимостям, Make считает, что он должен пытаться регенерировать protolist.c
при каждом запуске. Это не проблема производительности - скрипт очень быстрый - но это сбивает с толку поведение. Я смутно припоминаю идиому, включающую файлы временных меток, которые можно использовать, чтобы помешать Make сделать это, но я не смог ни восстановить ее, ни найти где-либо описанным. Кто-нибудь знает, что это?
(Также, если кто-нибудь может подсказать, как избавиться от этой глупой конструкции $(filter-out ...)
, это было бы полезно, так как это единственный GNUmakeism в этом Makefile.)