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