%/events2: $$(patsubst %,$$(@D)/%.ppd,$(PARTS))
Это не шаблонное правило, которое будет соответствовать вашей структуре образца.Из документов :
%
в качестве предпосылки правила шаблона выступает тот же стебель, которому соответствует %
в цели.Чтобы применить правило шаблона, его целевой шаблон должен соответствовать рассматриваемому имени файла, а все его предпосылки (после замены шаблона) должны содержать имена файлов, которые существуют или могут быть созданы.Эти файлы становятся необходимыми для цели.
Однако в вашей цели %
будет соответствовать data1
.Но на самом деле не существует %
для сопоставления на обязательной стороне, поскольку присутствующие часто являются patsubst
функцией, а каталог (основа) называется $(@D)
.
Я пытался написать такоеПравило, подобное этому, используя функцию foreach
:
%/events2: $(foreach part,$(PARTS), %/$(part).ppd)
/bin/ls -l $^
Если вы хотите придерживаться patsubst
, это также должно работать:
%/events2: $(patsubst %,\%/%.ppd,$(PARTS))
/bin/ls -l $^
Не то, чтобы использовалось %
для имени каталога, совпадающего с целевым, и оно экранируется с помощью \
, чтобы сделать его невредимым через patsubst
.
В любом случае, с GNU make все получилось:
$ make data1/events2
/bin/ls -l data1/a.ppd data1/b.ppd data1/c.ppd
-rw-r--r-- 1 ondrej users 0 Feb 4 22:00 data1/a.ppd
-rw-r--r-- 1 ondrej users 0 Feb 4 22:00 data1/b.ppd
-rw-r--r-- 1 ondrej users 0 Feb 4 22:00 data1/c.ppd