Дело не только в том, что символы разделителя dir различны для обеих версий, более того, синтаксис dmake, похоже, специально разработан для несовместимости с GNU make.Единственная часть синтаксиса, которая на самом деле совместима, это подстановка шаблонов, так что вот какой путь:
all: $(ALL)
$(ALL) : Makefile compress.pl
../lib/%.pm : %.pm
perl compress.pl $< > $@
dmake фактически заменяет здесь символы / для разделителя каталогов.Вместо этого я протестировал этот Makefile с помощью echo, и он пишет в правильный каталог.
Объяснение: Шаблонные правила определяют правила для конкретного файла, который должен быть повторно создан при его совпадении.найдено регулярное выражение (часть ../lib/%.pm
) и условие для аналогичного имени (%.pm
).% В предварительном условии заменяется соответствующей частью% в цели.Требуется дополнительное правило с Makefile и compress.pl, потому что dmake не любит дополнительные предварительные условия в шаблонном правиле.Как обычно, $<
и $@
являются специальными переменными make для исходного и целевого файла.
Таким образом, основное отличие состоит в том, что ваше первоначальное правило гласило: «файлы, названные в этом списке, могут быть созданы с помощью следующегоrule), в то время как шаблонное правило говорит «любой файл, похожий на ../lib/%.pm, может быть сделан из соответствующего файла в текущем каталоге», а затем выдает a list of pm files to make. </p>
<p>Pattern rules are actually quite powerful, useful to know. Unfortunately, some makes don't know them, only the older <a href="http://www.gnu.org/software/make/manual/make.html#Suffix-Rules" rel="nofollow">suffix rules</a>.</p>
<p>Further details of what's going on can be obtained by running</p>
<pre>make -rdn