makefile分号解释为命令参数

时间:2013-08-05 07:25:05

标签: perl makefile dmake

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

2 个答案:

答案 0 :(得分:1)

答案 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