Я думаю, что есть что-то вроде элементарного, которого я пропускаю в gnu make (я использую 3.81, если это имеет значение) сопоставление статического шаблона (что, видимо, кто-то еще сделал, и где я работаю, потому что это был обнаружен, поскольку я пытался исправить правило, которое было прокомментировано). Я попытался упростить свой пример до конца (надеюсь, я не «пропустил что-то существенное в настоящем примере»).Ошибка сопоставления шаблона статического шаблона Makefile
Так это, кажется, работает, как и следовало ожидать
JUNK:=foo bar
BINS:=$(patsubst %,bin/%,$(JUNK))
all : $(BINS)
.PHONY : all
# This works
$(BINS) : bin/% : %
mkdir -p bin && cp $< [email protected]
Но это (который ближе к тому, что я нашел в реальном Makefile) не
JUNK:=foo bar
BINS:=$(patsubst %,bin/%,$(JUNK))
all : $(BINS)
.PHONY : all
# This doesn't work
$(JUNK) : bin/% : %
mkdir -p bin && cp $< [email protected]
# This doesn't work either
#bin/$(JUNK) : bin/% : %
# mkdir -p bin && cp $< [email protected]
Основываясь на моем понимании что должно происходить в обоих случаях, я ожидал, что оба Makefiles будут вести себя точно так же; Однако, только первый один ведет себя, как я ожидал (т.е. должным образом копирует файлы в мусорное ведро) и второй дает следующие выходные данные
Makefile:12: target `foo' doesn't match the target pattern
Makefile:12: target `bar' doesn't match the target pattern
make: *** No rule to make target `bin/foo', needed by `all'. Stop.
Что более запутанным есть почти идентичные другие правила статической модели в марке файл, который я изучал, которые работали.
Поэтому я, очевидно, знаю, как «обойти» проблему, если это необходимо, но я хотел бы понять, почему вторая (и часть с комментариями во втором блоке кода) также не делает то, что я ожидаю от них к.
Заранее благодарим за любую помощь/понимание.