ExtUtils :: MakeMaker PERL_MM_OPT在空白处理上拆分

时间:2010-07-14 17:52:17

标签: perl

ExtUtils :: MakeMaker在空格上拆分PERL_MM_OPT,这意味着以下内容将不起作用。

export PERL_MM_OPT='LIBS="-L/usr/sfw/lib -lssl -lcrypto" INC=/usr/sfw/include'

是否有针对此的已知解决方法,或者我是否必须避免在此方案中使用PERL_MM_OPT?

- 更新 -

mobrule提出了使用制表符而不是空格的优秀建议。 mobrule是关于它只在空间分裂的权利。但是,该解决方案不起作用,因为它看起来像标签被转换为环境变量中的空格。

> cat tmp.sh 
export PERL_MM_OPT='LIBS="-L/usr/sfw/lib        -lssl   -lcrypto" INC=-I/usr/sfw/include'
echo $PERL_MM_OPT | perl -pe 's/\t/[t]/g' | perl -pe 's/ /[s]/g'

> head -1 tmp.sh | perl -pe 's/\t/[t]/g' | perl -pe 's/ /[s]/g'
export[s]PERL_MM_OPT='LIBS="-L/usr/sfw/lib[t]-lssl[t]-lcrypto"[s]INC=-I/usr/sfw/include'

> bash tmp.sh 
LIBS="-L/usr/sfw/lib[s]-lssl[s]-lcrypto"[s]INC=-I/usr/sfw/include

- 更新2 -

因此,标签建议有效(我被回声的行为误导,并得出错误的结论,为什么它失败了),但它没有解决问题。

现在问题是ExtUtils / Liblist / Kid.pm不期待领先的双引号(单引号也会出现相同的结果。)

Unrecognized argument in LIBS ignored: '"-L/usr/sfw/lib

所以,似乎这个问题的解决方案(如果存在的话)不能依赖于引号。

1 个答案:

答案 0 :(得分:1)

实际上,MakeMaker.pm在空格上分割,但不在所有空格上分割。你能用标签吗?

export PERL_MM_OPT='LIBS="-L/usr/sfw/libTab-lsslTab-lcrypto" INC=/usr/sfw/include


我认为您使用选项卡设置环境变量的方式是正确的 - 这是将选项卡转换为空格的echo命令:

$ VAR='abc^Idef'
$ echo $VAR | od -c
0000000   a   b   c       d   e   f  \n
0000010

看起来它不起作用。但是等等:

$ export VAR
$ perl -e 'print $ENV{VAR}' | od -c
0000000   a   b   c  \t   d   e   f
0000007

根据ExtUtils::MakeMaker中的参数如何传递到子流程(通过$ENV{PERL_MM_OPT}system,{{1}等等):

exec

系统调用1将起作用,因为当open |调用具有一个具有任何元字符的arg时,它会将命令传递给shell。 shell将正确解析参数。

系统调用2失败,因为多个arg system("gcc helloworld.c -lssl\t-lcrypto\t-L/usr/sfw/lib") ### 1 ### system("gcc", "helloworld.c", "-lssl\t-lcrypto\t-L/usr/sfw/lib") ### 2 ### 总是绕过shell而system一直在寻找名称不大system的库。如果gcc正在使用此调用样式来运行编译器,则此解决方法将无法完成任务。