Скажем, у меня есть список исходных файлов, и каждый из них должен быть скомпилирован в отдельные двоичные файлы:
SRCS = abcd.c efgh.c ijkl.c
И я хочу, чтобы выходные файлы находились в отдельных подкаталогах на основе таких имен файлов:
- построить/abcd/abcd
- сборка/efgh/efgh
- построить/ijkl/ijkl
Я думаю, что правило статического шаблона - это путь. Псевдо-правило make может выглядеть примерно так:
$(TARGETS): build/%/%: %.c
# stuff ...
Я начал с составления списка подкаталогов на основе имен файлов:
DIRS = $(SRCS:%.c=build/%)
Итак, теперь у нас есть DIRS = build/abcd build/efgh build/ijkl. Я подумал, что теперь могу составить список целей примерно так:
BLDS = $(DIRS:%=%/$(basename %))
Но, конечно, это не работает, поскольку подстановочный знак нельзя использовать несколько раз в шаблоне. Поэтому я сейчас застрял на BLDS = build/abcd/% build/efgh/% build/ijkl/%.
Очевидно, я совершенно неправильно об этом говорю. Как бы вы это сделали?
На данный момент я пишу каждое правило явно, что начинает становиться немного утомительным:
compile = # command to do stuff
BD = build
all: $(BD)/abcd/abcd $(BD)/efgh/efgh $(BD)/ijkl/ijkl
$(BD)/abcd/abcd: abcd.c
$(call compile)
$(BD)/efgh/efgh: efgh.c
$(call compile)
$(BD)/ijkl/ijkl: ijkl.c
$(call compile)
clean:
rm -rf build/*
.PHONY: all