Как заменить текст в make-файле так, чтобы он работал с make AND dmake? - PullRequest
2 голосов
/ 26 сентября 2011

У меня есть этот make-файл:

ALL = ../lib/Mo.pm \
      ../lib/Mo/builder.pm \
      ../lib/Mo/default.pm \
      ../lib/Mo/has.pm \

all: $(ALL)

$(ALL): Mo.pm compress.pl Makefile
    perl compress.pl $(@:../lib/%=%) > $@

То, что он должен сделать, это что-то вроде этого:

$ make -n
perl compress.pl Mo.pm > ../lib/Mo.pm
perl compress.pl Mo/builder.pm > ../lib/Mo/builder.pm
perl compress.pl Mo/default.pm > ../lib/Mo/default.pm
perl compress.pl Mo/has.pm > ../lib/Mo/has.pm

Однако с dmake в Windows это происходит:

d:\mo-pm\src>dmake -n
perl compress.pl ..\lib\Mo.pm > ..\lib\Mo.pm
perl compress.pl ..\lib\Mo\builder.pm > ..\lib\Mo\builder.pm
perl compress.pl ..\lib\Mo\default.pm > ..\lib\Mo\default.pm
perl compress.pl ..\lib\Mo\has.pm > ..\lib\Mo\has.pm

Я пробовал различные комбинации s /// и subst, чтобы заставить его работать в dmake, и обнаружил, что он хочет, чтобы путь имел \ s, что означает двойную замену против обоих вариантов пути ( ../lib/ и .. \ lib) могут работать, но я не могу понять, как заставить это работать для обоих вариантов make.

Какие-нибудь идеи или другие способы сделать это?

1 Ответ

3 голосов
/ 29 сентября 2011

Дело не только в том, что символы разделителя 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...