Точка с запятой makefile интерпретируется как аргумент команды

У меня есть Makefile для установки модуля Perl, и я пытаюсь заставить установку скрипта работать правильно. Он был сгенерирован Makefile.PL, но автор модуля говорит мне, что, если я выясню, как должен выглядеть Makefile, он сможет исправить Makefile.PL. Во всяком случае, я тестирую это для автора на Windows 7, и это идет haywire. Проблема в целях, которые выглядят следующим образом:

pure_perl_install :: all
$(NOECHO) $(PERLRUN) -pi.bak -e "s+^use FindBin;.*++" $(INST_SCRIPT)/dtdto ; \
    $(PERLRUN) -pi.bak -e "s+^my \$$share =[^;]*+my \$$share = qq{$(INSTALLSHAREDIR)}+" $(INST_SCRIPT)/dtdto ; \
    $(CHMOD) $(PERM_RWX) $(INST_SCRIPT)/dtdto

дела dmake pure_perl_install дает следующее:

C:\strawberry\perl\bin\perl.exe -MExtUtils::Command -e cp -- bin/dtdto blib\script\dtdto
pl2bat.bat blib\script\dtdto
Can't open ;: No such file or directory, <> line 297.
Can't open -pi.bak: No such file or directory, <> line 348.
Can't open -e: No such file or directory, <> line 348.
Can't open s+^my \$share =[^;]*+my \$share = qqC:\strawberry\perl\site/share+: Invalid argument, <> line 348.
Can't open ;: No such file or directory, <> line 645.
Can't do inplace edit on C:\strawberry\perl\bin\perl.exe: File exists, <> line 645.
Can't open -MExtUtils::Command: Invalid argument, <> line 645.
Can't open -e: No such file or directory, <> line 645.
Can't open chmod: No such file or directory, <> line 645.
Can't open --: No such file or directory, <> line 645.
Can't open 755: No such file or directory, <> line 645.
Access is denied.
dmake:  Error code 129, while making 'pure_perl_install'

Я думаю, что проблема заключается в первой ошибке. Точки с запятой должны использоваться в Makefile для обозначения конца одной команды. Однако точка с запятой вместо этого интерпретируется как просто еще один аргумент команды, и все строки превращаются в одну длинную команду. Затем он перезаписывает perl.exe (после создания резервной копии, слава богу!), Затем пытается запустить perl.exe, что теперь невозможно, и появляется сообщение о том, что perl.exe даже не настоящая программа. Это полная катастрофа.

Мой вопрос: как я могу отредактировать эту цель, чтобы точка с запятой интерпретировалась как конец команды в dmake, а не отправлялась как другой аргумент командной строки?

Кстати, удаление пробела до точки с запятой, как часть dtdto имя файла, которое вызывает ошибку, потому что он не существует.

2 ответа

Решение

Решение состоит в том, чтобы бросить package MY переопределяет в Makefile.PL и использует

File::ShareDir::Install и File:: Share

или https://metacpan.org/module/ExtUtils::MakeMaker

Вероятно, вы можете избежать ";" полностью используя несколько строк в правиле makefile:

pure_perl_install :: all
    $(NOECHO) $(PERLRUN) -pi.bak -e "s+^use FindBin;.*++" $(INST_SCRIPT)/dtdto
    $(NOECHO) $(PERLRUN) -pi.bak -e "s+^my \$$share =[^;]*+my \$$share = qq{$(INSTALLSHAREDIR)}+" $(INST_SCRIPT)/dtdto
    $(NOECHO) $(CHMOD) $(PERM_RWX) $(INST_SCRIPT)/dtdto
Другие вопросы по тегам