Те же правила, разные предпосылки - PullRequest
0 голосов
/ 27 ноября 2018

В моем проекте есть два типа файлов, оба созданы с использованием одних и тех же команд, но с предварительными условиями:

%.blvp: lab_bd.act %.ext
%.slvp: lab_syn.act %.ext

%.blvp %.slvp:
    $(eval x := $(basename $@))
    act2lvp $< $x
    lvp -sDEv $x.ext $x.prs && touch $@

Единственное отличие состоит в том, что .blvp файлы используют lab_bd.act и .slvp используйте lab_syn.act.Какой бы файл это ни был, он должен быть первым аргументом для act2lvp.

Однако все вышеперечисленные предпосылки не переносятся в правило (т. Е. Оценивается act2lvp $x; очевидно, $^пусто.

$ make xyz.slvp
act2lvp  xyz
Usage: /usr/local/cad/bin/act2lvp  <actfile> <processname>
makefile:17: recipe for target 'xyz.slvp' failed
make: *** [xyz.slvp] Error 1

Как получить пререквизиты сверху? Альтернативно, вы могли бы предложить альтернативный подход к этому обстоятельству?

1 Ответ

0 голосов
/ 28 ноября 2018

Правила паттернов не сочетаются таким образом, но вы можете получить тот же эффект с специфичной для паттерна переменной :

%.blvp: ACT=lab_bd.act
%.slvp: ACT=lab_syn.act

%.blvp %.slvp : %.ext
    $(eval x := $(basename $@))
     act2lvp $(ACT) $x
     lvp -sDEv $x.ext $x.prs && touch $@

PS , которую вы можетеизбавьте себя от проблем с автоматической переменной $*:

%.blvp %.slvp : %.ext
     act2lvp $(ACT) $*
     lvp -sDEv $*.ext $*.prs && touch $@

РЕДАКТИРОВАТЬ: Я упустил задачу восстановления файлов * .act.Мы можем добавить $(ACT) в качестве предварительного условия, если используем Вторичное расширение :

.SECONDEXPANSION:
%.blvp %.slvp : %.ext $$(ACT)
     act2lvp $(ACT) $*
     lvp -sDEv $*.ext $*.prs && touch $@
...