我有一个用于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
文件名的一部分,这会导致错误,因为它不存在。
答案 0 :(得分:1)
解决方案是在Makefile.PL中删除package MY
覆盖并使用
答案 1 :(得分: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