Что ж, при написании вопроса я нашел подходящее решение.
SOURCES=main.c gadget.c foo.xyz
OBJECTS=$(patsubst %.c,%.o,$(filter %.c,$(SOURCES))) \
$(patsubst %.xyz,%-in.o,$(filter %.xyz,$(SOURCES))) \
$(patsubst %.xyz,%-out.o,$(filter %.xyz,$(SOURCES)))
app: $(OBJECTS)
$(LD) -o $@ $(LDFLAGS) $(OBJECTS)
%-in.c %-out.c: %.xyz
# Very special codegen rule
touch $(patsubst %.xyz,%-in.c,$<)
touch $(patsubst %.xyz,%-out.c,$<)
При преобразовании из $(SOURCES)
в $(OBJECTS)
используйте два отдельных patsubst
вызова для фильтрации файлов .xyz
.Таким образом, файлы %-in.o
и %-out.o
попадают в список объектов.
Другим решением может быть создание списка промежуточных источников с использованием того же трюка, но с заменой xyz
на соответствующий -in.c
и -out.c
шаблоны.Тогда список объектов может быть создан традиционным способом.Дополнительным преимуществом этого метода будет то, что создание правила, которое генерирует все файлы исходного кода, является тривиальным.