2013-08-05 5 views
1

У меня есть 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, что вызывает ошибку, поскольку она не существует.

+1

Вы должны начать с удаления '$ (NoEcho)' (которые, предположительно, расширяющийся к '@'), так что вы и мы можем увидеть, что все, что расширяется. –

ответ

0

Вероятно, вы можете избежать ";" полностью с помощью нескольких строк в правиле 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