GNUM - проблемы с неявными правилами - PullRequest
0 голосов
/ 04 февраля 2019

Я что-то упускаю из-за неявных правил.Вот Makefile (GNU Make 4.2.1)

heimdall /tmp 1670> cat Makefile

PARTS= a b c

.SECONDEXPANSION:

data/events2: $$(patsubst %,$$(@D)/%.ppd,$(PARTS))
        /bin/ls -l $^

%/events2: $$(patsubst %,$$(@D)/%.ppd,$(PARTS))
        /bin/ls -l $^

Вот подготовленные данные, чтобы проиллюстрировать ситуацию:

heimdall /tmp 1671> ls -1 data data1
data:
a.ppd
b.ppd
c.ppd

data1:
a.ppd
b.ppd
c.ppd

Вот make с использованием явного правила, котороеработает так, как я ожидал.

heimdall /tmp 1672> make data/events2
/bin/ls -l data/a.ppd data/b.ppd data/c.ppd
-rw-rw-r-- 1 bennett None 0 Feb  4 12:19 data/a.ppd
-rw-rw-r-- 1 bennett None 0 Feb  4 12:19 data/b.ppd
-rw-rw-r-- 1 bennett None 0 Feb  4 12:19 data/c.ppd

И, наконец, это:

heimdall /tmp 1673> make data1/events2
make: *** No rule to make target 'data1/events2'.  Stop.

Почему неявное правило не совпадает?Я чувствую, что упустил что-то фундаментальное.

Спасибо.

-E

1 Ответ

0 голосов
/ 05 февраля 2019
%/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
...