Как шаблон замены Makefile может создать более одного вывода на вход? - PullRequest
0 голосов
/ 01 октября 2018

В нашей кодовой базе у нас есть генератор кода, который берет foo.xyz и производит два исходных файла foo-in.c и foo-out.c.

. В приложении Makefile я хотел бы перечислить источники как:

SOURCES=main.c gadget.c foo.xyz

Тогда соответствующая переменная OBJECTS должна расшириться до:

OBJECTS=main.o gadget.o foo-in.o foo-out.o

, но я не могу найти, возможно ли сделать это расширение вообще с использованием GNU Make.Общий шаблон замены $(SOURCES:.c=.o) заменяет один исходный файл одним объектным файлом.

Как написать шаблон замены, который будет создавать несколько выходных файлов на один входной файл?

1 Ответ

0 голосов
/ 01 октября 2018

Что ж, при написании вопроса я нашел подходящее решение.

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 шаблоны.Тогда список объектов может быть создан традиционным способом.Дополнительным преимуществом этого метода будет то, что создание правила, которое генерирует все файлы исходного кода, является тривиальным.

...