Мой новый Mac на базе M1 имеет встроенную версию Perl от Apple, v5.28.2. Я использовал homebrew для установки последней версии perl, 5.32.0, и настроил параметр local::lib, чтобы модули cpan устанавливались в ~/perl5. Все это работает по большей части.
Но... Я не могу установить XML:Parser в этой конфигурации homebrew/local-lib. Я думаю, что XML::Parser установлен в базовой конфигурации Apple, но я действительно хочу иметь возможность обновлять Perl и устанавливать модули, поэтому я думаю, что эта конфигурация — правильный способ сделать это. Но МНОЖЕСТВО вещей требует XML::Parser.
Вот мои переменные среды, PATH и т. д.:
PERL5LIB=/Users/jim/perl5/lib/perl5
PERL_LOCAL_LIB_ROOT=/Users/jim/perl5
PERL_MB_OPT=--install_base "/Users/jim/perl5"
PERL_MM_OPT=INSTALL_BASE=/Users/jim/perl5
PATH=/Users/jim/perl5/bin:.:/Users/jim/Documents/scripts:/opt/homebrew/bin:/Developer/usr/bin:/System/Library/Frameworks/Python.framework/Versions/Current/bin:/Users/jim/Library/Python/2.7/bin:/Users/jim/perl5/bin:/Users/jim/go/bin:/Users/jim/.cargo/bin:/usr/local/bin:/bin:/usr/bin:/usr/sbin:/sbin:/usr/X11/bin
% /usr/bin/which -a perl
/opt/homebrew/bin/perl
/usr/bin/perl
% /usr/bin/which -a cpan
/Users/jim/perl5/bin/cpan
/opt/homebrew/bin/cpan
/Users/jim/perl5/bin/cpan
/usr/bin/cpan
Бег cpan install XML::Parser
дает:
Running make test for TODDR/XML-Parser-2.46.tar.gz
"/opt/homebrew/Cellar/perl/5.32.0/bin/perl" -MExtUtils::Command::MM -e 'cp_nonempty' -- Expat.bs ../blib/arch/auto/XML/Parser/Expat/Expat.bs 644
Manifying 1 pod document
PERL_DL_NONLAZY=1 "/opt/homebrew/Cellar/perl/5.32.0/bin/perl" "-MExtUtils::Command::MM" "-MTest::Harness" "-e" "undef *Test::Harness::Switches; test_harness(0, 'blib/lib', 'blib/arch')" t/*.t
t/astress.t ........... 1/27
Can't load '/Users/jim/.cpan/build/XML-Parser-2.46-0/blib/arch/auto
/XML/Parser/Expat/Expat.bundle' for module XML::Parser::Expat:
dlopen(/Users/jim/.cpan/build/XML-Parser-2.46-0/blib/arch/auto
/XML/Parser/Expat/Expat.bundle, 2): Symbol not found: _XML_DefaultCurrent
Referenced from: /Users/jim/.cpan/build/XML-Parser-2.46-0/blib/arch/auto/XML/Parser/Expat/Expat.bundle
Expected in: flat namespace
in /Users/jim/.cpan/build/XML-Parser-2.46-0/blib/arch/auto/XML/Parser/Expat/Expat.bundle at /opt/homebrew/Cellar/perl/5.32.0/lib/perl5/5.32.0/darwin-thread-multi-2level/DynaLoader.pm line 197.
at /Users/jim/.cpan/build/XML-Parser-2.46-0/blib/lib/XML/Parser.pm line 18.
Compilation failed in require at /Users/jim/.cpan/build/XML-Parser-2.46-0/blib/lib/XML/Parser.pm line 18.
BEGIN failed--compilation aborted at /Users/jim/.cpan/build/XML-Parser-2.46-0/blib/lib/XML/Parser.pm line 22.
Compilation failed in require at t/astress.t line 11.
BEGIN failed--compilation aborted at t/astress.t line 11.
t/astress.t ........... Dubious, test returned 2 (wstat 512, 0x200)
Failed 27/27 subtests
(Разрывы строк добавлены к сообщению об ошибке, чтобы сделать его читабельным.)
После этого есть еще несколько неудачных тестов, но я думаю, что это и есть корень проблемы.
Какие-либо предложения?
Еще одно кстати: в исходном вопросе я сказал, что «думаю», что XML::Parser установлен в Perl от Apple. Должен сказать, что я знаю, что он установлен - я ясно вижу его в /System/Library/Perl/Extras/5.18/darwin-thread-multi-2level/XML/Parser.pm
. И простой /usr/bin/perl -e "use XML::Parser"
отлично работает. Как ни странно, этот каталог НЕ является частью моего @INC (который я проверил), и этот XML::Parser находится в каталоге 5.18, а не 5.28. Не уверен, как это работает при установке Apple с этой странной конфигурацией, но просто хотел уточнить этот момент выше. Основной вопрос по-прежнему касается хоумбрю.
Я использую macOS 11.1 Big Sur, использую perlbrew с версией perl 5.30.1. Я попробовал cpanm XML::Parser
и тесты не прошли с той же ошибкой, которую вы описываете: Symbol not found: _XML_DefaultCurrent
. Однако затем я попробовал исправить в Заставить DynaLoader на MacOS проверять наличие библиотеки с помощью dlopen, и здесь XML::Parser
установилось нормально.
Big Sur изменил ситуацию и сломал один из установщиков модулей Perl. В результате этот -lexpat
не используется (и вы, вероятно, получили очень неправильное предупреждение о том, что это «вероятно безвредно»), поэтому XML::Parser::Expat (часть XML::Parser) не связан с библиотека C, в которой он нуждается, поэтому он терпит неудачу.
@ikegami «В результате этот -lexpat не используется», да, похоже, это так. Я скачал XML-Parser-2.46.tar.gz и запустил perl Makefile.PL; make
(используя perl 5.30.1 от perlbrew). Вывод показал, что cc -mmacosx-version-min=10.15 -bundle -undefined dynamic_lookup -L/usr/local/lib -fstack-protector-strong Expat.o -o ../blib/arch/auto/XML/Parser/Expat/Expat.bundle
использовался для создания общего объекта. Если бы я добавил вручную -lexpat
в конец предыдущей команды и выполнил ее, а затем запустил make test
все тесты прошли здесь.
@jmtut Какую версию macOS вы используете?
@HåkonHægland, они сказали, что это M1, значит, это Биг-Сур, верно?
@ikegami «они сказали, что это M1» Хорошо, отлично, тогда у ОП, вероятно, та же проблема, что и у меня. Я попробовал perl Makefile.PL; make
с perl 5.33.5 и могу подтвердить, что эта версия добавляет -lexpat
, так что это объясняет, почему он работает с этой версией. Но я пока не могу найти фактическую фиксацию, реализующую исправление. Я думал, что это будет в PR 18407, но, возможно, это было исправлено ранее.
@HåkonHægland Конечно. Мой предыдущий комментарий был объяснением вашего.
@HåkonHægland Разве вы не создали свой 5.33.5 с помощью git fetch origin pull/18407/head:bigsur3
?
@ikegami Да, я сделал
@HåkonHægland Так что да, это PR 18407
@jimtut Вот в чем проблема. Я не закрываюсь как дубликат, потому что может быть возможно взломать что-то, чтобы вы могли установить свой модуль, но это выше моих возможностей, поскольку у меня нет доступа к Mac. (Не знаю, как вам вообще удалось установить Perl.)
Извините, ребята, я спал, когда приходили все эти замечательные комментарии. Да, я управляю Big Sur. Perl был установлен через Homebrew под 11.0 (без проблем, и он отлично работает как собственный (ARM) исполняемый файл. С тех пор я обновился до 11.1, и это был первый раз, когда я попытался установить XML::Parser. Я попробую ваш предложения сегодня вечером!
Спасибо за все комментарии и помощь - я люблю это сообщество! Я принял ответ Леона, поскольку это был самый простой способ достичь моей цели (и это был единственный фактический ответ), но я ценю всю работу, которую вы, ребята, делаете здесь и поддерживаете работу Perl! :-)
Установка последней бета-версии ExtUtils::MakeMaker (7.57_02) должна решить вашу проблему. Вероятно, скоро он будет выпущен как стабильная версия.
ETA: 7.58 уже выпущен.
Согласно моим тестам на Big Sur (см. комментарий выше), исправление заключалось в добавлении -lexpat
к флагам компоновщика. Какая часть (коммит) этого выпуска вводит (добавляет) флаг компоновщика -lexpat
для Makefile
?
Изменение ExtUtils::Liblist::Kid (8b924f65 и 21a441da)
Спасибо, теперь я вижу, DynaLoader::dl_load_file()
используется для проверки существования библиотеки.
Кстати, я удалил все содержимое локальной библиотеки в одной оболочке, протестировал установку простого модуля CPAN и увидел, как он устанавливается в области доморощенного. Сразу попытался установить XML::Parser и получил ту же ошибку. Итак, я не думаю, что это вообще связано с локальными библиотеками, просто комбинация доморощенного, кода этого модуля и, возможно, других вещей на Mac (что является новым, и в нем установлено только ПО с открытым исходным кодом на базе ARM). , никаких устаревших вещей x86).