У меня есть Makefile для установки модуля Perl, и я пытаюсь правильно установить установку скрипта. Он был сгенерирован Makefile.PL, но автор модуля сообщает мне, что если я выясню, как должен выглядеть Makefile, он может исправить Makefile.PL. Во всяком случае, я тестирую его для автора на Windows 7, и он идет с haywire. Проблема в том, что цели выглядят следующим образом:makefile semicolon интерпретируется как аргумент команды
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
Doing 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
, что вызывает ошибку, поскольку она не существует.
Вы должны начать с удаления '$ (NoEcho)' (которые, предположительно, расширяющийся к '@'), так что вы и мы можем увидеть, что все, что расширяется. –