1

我有一个用于 Perl 模块安装的 Makefile,我正在尝试让脚本的安装正常工作。它是由 Makefile.PL 生成的,但模块的作者告诉我,如果我弄清楚 Makefile 应该是什么样子,那么他可以修复 Makefile.PL。无论如何,我正在 Windows 7 上为作者测试它,但它出了问题。问题出在如下所示的目标中:

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文件名的一部分,这会导致错误,因为它不存在。

4

2 回答 2

1

解决方案是放弃 Makefile.PLpackage MY中的覆盖并使用

File::ShareDir::InstallFile::Share

https://metacpan.org/module/ExtUtils::MakeMaker#PL_FILES

于 2013-08-05T10:06:44.683 回答
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
于 2013-08-05T13:04:15.737 回答