Reputation: 93
MaxMind GeoIP was working on Mojave, called from Perl.
I tried to upgrade my macOS installation from Perl 5.26 to 5.30.
Used MacPorts to install and activate 5.30, and then
used CPAN to install Perl modules.
Several ports got errors trying to install. I had to force them.
Tried it out and it failed because a Perl module was down-rev.
[thvv lib]$ ipcity
Could not find a suitable MaxMind::DB::Reader implementation: List::Util version 1.56 required--this is only version 1.5 at /opt/local/lib/perl5/site_perl/5.30/List/AllUtils.pm line 8.
In CPAN I tried to install List::Util. It says version 1.56 is already installed.
cpan[4]> i List::Util
Module id = List::Util
CPAN_USERID PEVANS (Paul Evans <[email protected]>)
CPAN_VERSION 1.56
CPAN_FILE P/PE/PEVANS/Scalar-List-Utils-1.56.tar.gz
MANPAGE List::Util - A selection of general-utility list subroutines
INST_FILE /opt/local/lib/perl5/site_perl/5.30/darwin-thread-multi-2level/List/Util.pm
INST_VERSION 1.56
my environment all points to Perl version 5.30
perl --version
This is perl 5, version 30, subversion 3 (v5.30.3) built for darwin-thread-multi-2level
env | grep 5.30
PERL5LIB=/Users/thvv/bin:/opt/local/lib/perl5/5.30
PERL_MB_OPT=--install_base "/opt/local/lib/perl5/5.30"
PERL_LOCAL_LIB_ROOT=/opt/local/lib/perl5/5.30
PERL_MM_OPT=INSTALL_BASE=/opt/local/lib/perl5/5.30
How can I get List::AllUtils to find the version of List::Util that is installed?
(Friday 23 July 2021) Added info as requested:
[thvv lib]$ head -1 ~/bin/ipcity
#!/usr/local/bin/perl -I/usr/home/thvv/bin
-- (tried it without the -I clause and got the same output)
[thvv bin]$ perl -MList::Util=999 -e1
List::Util version 999 required--this is only version 1.5 at /opt/local/lib/perl5/5.30/Exporter/Heavy.pm line 125.
BEGIN failed--compilation aborted.
--- looking in my file system for the module
[thvv bin]$ ls -l /opt/local/lib/perl5/5.30//darwin-thread-multi-2level/List/
total 16
-r--r--r--+ 1 root admin 21126 Jul 1 06:52 Util.pm
drwxr-xr-x+ 3 root admin 96 Jul 18 12:05 Util/
[thvv bin]$ ls -l /opt/local/lib/perl5/5.30//darwin-thread-multi-2level/List/Util
total 0
-r--r--r--+ 1 root admin 1018 Jul 1 06:52 XS.pm
--- I also invoked cpan and did a 'force install List::Util'
Running install for module 'List::Util'
Fetching with LWP:
http://www.cpan.org/authors/id/P/PE/PEVANS/CHECKSUMS
Checksum for /var/root/.cpan/sources/authors/id/P/PE/PEVANS/Scalar-List-Utils-1.56.tar.gz ok
Scanning cache /var/root/.cpan/build for sizes
............................................................................DONE
Configuring P/PE/PEVANS/Scalar-List-Utils-1.56.tar.gz with Makefile.PL
Checking if your kit is complete...
Looks good
Generating a Unix-style Makefile
Writing Makefile for List::Util
Writing MYMETA.yml and MYMETA.json
PEVANS/Scalar-List-Utils-1.56.tar.gz
/opt/local/bin/perl5.30 Makefile.PL -- OK
Running make for P/PE/PEVANS/Scalar-List-Utils-1.56.tar.gz
cp lib/Sub/Util.pm blib/lib/Sub/Util.pm
cp lib/List/Util.pm blib/lib/List/Util.pm
cp lib/List/Util/XS.pm blib/lib/List/Util/XS.pm
cp lib/Scalar/Util.pm blib/lib/Scalar/Util.pm
Running Mkbootstrap for Util ()
chmod 644 "Util.bs"
"/opt/local/bin/perl5.30" -MExtUtils::Command::MM -e 'cp_nonempty' -- Util.bs blib/arch/auto/List/Util/Util.bs 644
"/opt/local/bin/perl5.30" "/opt/local/lib/perl5/5.30/ExtUtils/xsubpp" -typemap '/opt/local/lib/perl5/5.30/ExtUtils/typemap' ListUtil.xs > ListUtil.xsc
mv ListUtil.xsc ListUtil.c
/usr/bin/cc -c -fno-common -DPERL_DARWIN -pipe -Os -fno-strict-aliasing -fstack-protector-strong -I/opt/local/include -DPERL_USE_SAFE_PUTENV -Wno-error=implicit-function-declaration -O3 -DVERSION=\"1.56\" -DXS_VERSION=\"1.56\" "-I/opt/local/lib/perl5/5.30/darwin-thread-multi-2level/CORE" -DPERL_EXT -DUSE_PPPORT_H ListUtil.c
rm -f blib/arch/auto/List/Util/Util.bundle
/usr/bin/cc -bundle -undefined dynamic_lookup -L/opt/local/lib -Wl,-headerpad_max_install_names -fstack-protector-strong ListUtil.o -o blib/arch/auto/List/Util/Util.bundle \
\
chmod 755 blib/arch/auto/List/Util/Util.bundle
Manifying 4 pod documents
PEVANS/Scalar-List-Utils-1.56.tar.gz
/usr/bin/make -- OK
Running make test for PEVANS/Scalar-List-Utils-1.56.tar.gz
"/opt/local/bin/perl5.30" -MExtUtils::Command::MM -e 'cp_nonempty' -- Util.bs blib/arch/auto/List/Util/Util.bs 644
PERL_DL_NONLAZY=1 "/opt/local/bin/perl5.30" "-MExtUtils::Command::MM" "-MTest::Harness" "-e" "undef *Test::Harness::Switches; test_harness(0, 'blib/lib', 'blib/arch')" t/*.t
t/00version.t ......... ok
t/any-all.t ........... ok
t/blessed.t ........... ok
t/dualvar.t ........... ok
t/exotic_names.t ...... ok
t/first.t ............. ok
t/getmagic-once.t ..... ok
t/head-tail.t ......... ok
t/isvstring.t ......... ok
t/lln.t ............... ok
t/max.t ............... ok
t/maxstr.t ............ ok
t/mesh.t .............. ok
t/min.t ............... ok
t/minstr.t ............ ok
t/openhan.t ........... ok
t/pair.t .............. ok
t/product.t ........... ok
t/prototype.t ......... ok
t/readonly.t .......... ok
t/reduce.t ............ ok
t/reductions.t ........ ok
t/refaddr.t ........... ok
t/reftype.t ........... ok
t/rt-96343.t .......... ok
t/sample.t ............ ok
t/scalarutil-proto.t .. ok
t/shuffle.t ........... ok
t/stack-corruption.t .. ok
t/subname.t ........... ok
t/sum.t ............... ok
t/sum0.t .............. ok
t/tainted.t ........... ok
t/uniq.t .............. ok
t/uniqnum.t ........... ok
t/weak.t .............. ok
t/zip.t ............... ok
All tests successful.
Files=37, Tests=2144, 4 wallclock secs ( 0.24 usr 0.10 sys + 2.88 cusr 0.42 csys = 3.64 CPU)
Result: PASS
Lockfile removed.
PEVANS/Scalar-List-Utils-1.56.tar.gz
/usr/bin/make test -- OK
Running make install for PEVANS/Scalar-List-Utils-1.56.tar.gz
"/opt/local/bin/perl5.30" -MExtUtils::Command::MM -e 'cp_nonempty' -- Util.bs blib/arch/auto/List/Util/Util.bs 644
Manifying 4 pod documents
Files found in blib/arch: installing files in blib/lib into architecture dependent library tree
Appending installation info to /opt/local/lib/perl5/5.30/darwin-thread-multi-2level/perllocal.pod
PEVANS/Scalar-List-Utils-1.56.tar.gz
/usr/bin/make install -- OK
(23 July 2021, more)
[thvv bin]$ which perl
/opt/local/bin/perl
[thvv bin]$ ls -l /opt/local/bin/perl
lrwxr-xr-x 1 root wheel 8 Jul 21 12:28 /opt/local/bin/perl@ -> perl5.30
[thvv bin]$ file `which perl`
/opt/local/bin/perl: Mach-O 64-bit executable x86_64
(12:59 EDT 23 July 2021) tried looking at /opt/local/lib/perl5/5.30//darwin-thread-multi-2level/List/Util/XS.pm this seems to be where the 1.5 comes from.
force installed it, no change
package List::Util::XS;
use strict;
use warnings;
use List::Util;
our $VERSION = "1.50"; # FIXUP
$VERSION = eval $VERSION; # FIXUP
1;
[snipped pod]
I tried editing /opt/local/lib/perl5/site_perl/5.30/List/AllUtils.pm to change 1.50 to 1.56. restarted the machine for luck. still fails at List/AllUtils.pm line 8, saying the current version is 1.50.
(24 Jul 2021 08:13 EDT) as requested by @ikegami
[thvv@Uly2 ~]$ echo 'o conf' | cpan | grep 'make\|mbuild'; set | grep ^PERL
make [/usr/bin/make]
make_arg []
make_install_arg []
make_install_make_command [sudo /usr/bin/make]
makepl_arg []
mbuild_arg []
mbuild_install_arg []
mbuild_install_build_command [sudo ./Build]
mbuildpl_arg []
PERL5LIB=/Users/thvv/bin:/opt/local/lib/perl5/5.30
PERL_LOCAL_LIB_ROOT=/opt/local/lib/perl5/5.30
PERL_MB_OPT='--install_base "/opt/local/lib/perl5/5.30"'
PERL_MM_OPT=INSTALL_BASE=/opt/local/lib/perl5/5.30
ok, I deleted Perl 5.30, installed 5.34, reloaded my Perl Modules. It still fails.
Could not find a suitable MaxMind::DB::Reader implementation: List::Util version 1.56 required--this is only version 1.55 at /opt/local/lib/perl5/site_perl/5.34/List/AllUtils.pm line 8.
BEGIN failed--compilation aborted at /opt/local/lib/perl5/site_perl/5.34/List/AllUtils.pm line 8.
The "use" line that failed in List::AllUtils looked for List::Util version 1.56. The .pm file for List::Util is in /opt/local/lib/perl5/site_perl/5.34/darwin-thread-multi-2level/List/Util.pm and calls XSLoader::load('List::Util', $XS_VERSION) with version 1.56. That in turn tries to invoke /opt/local/lib/perl5/site_perl/5.34/darwin-thread-multi-2level/auto/List/Util/Util.bundle which is a Mac binary file. It appears that XSLoader has not loaded the binary version of List::Util.
Aha. I see that /opt/local/lib/perl5/5.34 and /opt/local/lib/perl5/site_perl/5.34 are different directories with different contents. The files I loaded with CPAN went into site_perl/5.34. But List::Util is in 5.34. Only one program had substantive code changes between the two directories.
So, on the Mac, should I change /opt/local/lib/perl5/site_perl/5.34/ to be a symlink to /opt/local/lib/perl5/5.34/ ?
Upvotes: 3
Views: 1187
Reputation: 385496
ipcity
uses /usr/local/bin/perl
, which is a symlink to /opt/local/bin/perl
. This is the first perl
found in the path. Should we check the shebang of cpan
, we'd find the same perl
referenced (as evidenced by the output of the installation attempt). It's possible you have more than one installation of Perl, but there's one only involved here. Therefore, te issue isn't one of installing List::Util for the wrong perl
.
Loading List::Util loads version reveals a version 1.5 was loaded. Yet version 1.56 was installed. This means the module was installed in a non-standard location, but perl
wasn't told to look at that location.
Your environment informs module installers ExtUtils::MakeMaker and Module::Build to install modules under /opt/local/lib/perl5/5.30
. Specifically, it informs the installers to install the .pm file in /opt/local/lib/perl5/5.30/lib/perl5
(or the corresponding arch dir), but perl
is not told to look in this directory; it is told to look in /opt/local/lib/perl5/5.30
. This is wrong, and the crux of the problem.
Fix PERL5LIB
.
That said, it doesn't make sense to set PERL_MB_OPT
and PERL_MM_OPT
when using a perl
in /opt
. The default installation paths of your perl
you should already be sensible. You can see what they are using
perl -V:'.*inst.*'
Finally, if PERL_MB_OPT
and PERL_MM_OPT
aren't set, it doesn't make sense to set PERL5LIB
or PERL_LOCAL_LIB_ROOT
either.
I suspect you should unset all four of those variables.
Upvotes: 2