ExtUtils :: MakeMaker PERL_MM_OPT разделен на обходные пути - PullRequest
1 голос
/ 14 июля 2010

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 -

Итак, предложение вкладок сработало (Iбыл введен в заблуждение поведением echo и пришел к неверному выводу о том, почему это не удалось,) но это не решает проблему.

Теперь проблема в том, что ExtUtils / Liblist / Kid.pm isn 't ожидание ведущей двойной кавычки (такой же результат происходит с одинарной кавычкой.)

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

Итак, похоже, что решение этой проблемы (если оно существует) не может зависеть от кавычек.

1 Ответ

1 голос
/ 14 июля 2010

На самом деле, MakeMaker.pm разбивается на пробелы, но не на все пробелы. Не могли бы вы использовать вкладки?

export PERL_MM_OPT='LIBS="-L/usr/sfw/lib<kbd>Tab</kbd>-lssl<kbd>Tab</kbd>-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, exec, open | и т. Д.):

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 ###
Системный вызов

будет работать, потому что когда у вызова system есть один аргумент с метасимволами, он передает команду в оболочку. Оболочка будет правильно анализировать аргументы.

системный вызов 2 завершается ошибкой, потому что multi-arg system всегда обходит оболочку, а gcc застревает, ища библиотеку с маловероятным именем "libssl^I-lcrypto^I-L/usf/sfw/lib.a". Если ExtUtils::MakeMaker использует этот стиль вызова для запуска компилятора, то этот обходной путь не выполнит работу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...