Hi, Last week I asked for help building Convert::ASN1 on Perl 5.8.7, which was failing as follows:
$ sh def DKA100:[SOURCES.CONVERT-ASN1-0_19] $ perl makefile.pl Can't locate object method "new" via package "Module::Install::base" (perhaps you forgot to load "Module::Install::base"?) at inc/Module/Install.pm - /Users/gbarr/Library/Perl/Module/Install.pm line 269. %SYSTEM-F-ABORT, abort $ I received one response which led me to write directly to the author of that module (Graham Barr). He in turn suggested that: >My modules do use MakeMaker, it is just that Module::Install >provides a wrapper over it which makes writing the MakeFile.PL >a lot easier. > >It is suspect to me that your error is reporting ::base (lower case) >but the package and file are actually uppercase. > >This maybe something to do with find_extensions in inc/Module/Install.pm >but I am unfamiliar with VMS > >Graham. So I added some tracewrites to his Install.PM module which produced the following: $ perl makefile.pl In load_extensions() ... In find_extensions() ... find_extensions found file inc/Module/Install find_extensions found file inc/Module/Install/base.pm find_extensions self->{path}file is Module/Install/base.pm find_extensions package is Module::Install::base find_extensions found file inc/Module/Install/can.pm find_extensions self->{path}file is Module/Install/can.pm find_extensions package is Module::Install::can find_extensions found file inc/Module/Install/fetch.pm find_extensions self->{path}file is Module/Install/fetch.pm find_extensions package is Module::Install::fetch find_extensions found file inc/Module/Install/include.pm find_extensions self->{path}file is Module/Install/include.pm find_extensions package is Module::Install::include find_extensions found file inc/Module/Install/makefile.pm find_extensions self->{path}file is Module/Install/makefile.pm find_extensions package is Module::Install::makefile find_extensions found file inc/Module/Install/metadata.pm find_extensions self->{path}file is Module/Install/metadata.pm find_extensions package is Module::Install::metadata find_extensions found file inc/Module/Install/win32.pm find_extensions self->{path}file is Module/Install/win32.pm find_extensions package is Module::Install::win32 load_extensions: loading package Module::Install::base from file Module/Install/base.pm load_extensions: require Module/Install/base.pm worked Can't locate object method "new" via package "Module::Install::base" (perhaps you forgot to load "Module::Install::base"?) at inc/Module/Install.pm - /Users/gbarr/Library/Perl/Module/Install.pm line 271. %SYSTEM-F-ABORT, abort You'll notice the tracewrites and error message all refer to "Module/Install/base.pm" and "Module::Install::base", i.e. the 'base' is lowercase. Graham's comments about upper/lower case issues got me thinking and so I had a look at BASE.PM wherein I found this at the top of the file: package Module::Install::Base; I edited this to read package Module::Install::base; i.e. so that the capitalisation matches my tracewrites and the error message. The next build made more progress: . . . load_extensions: loading package Module::Install::base from file Module/Install/base.pm load_extensions: require Module/Install/base.pm worked load_extensions: loading package Module::Install::can from file Module/Install/can.pm load_extensions: require Module/Install/can.pm worked Can't locate object method "new" via package "Module::Install::can" (perhaps you forgot to load "Module::Install::can"?) at inc/Module/Install.pm - /Users/gbarr/Library/Perl/Module/Install.pm line 271. %SYSTEM-F-ABORT, abort So now it's failing on 'can.pm' which of course has this at the top: package Module::Install::Can; These modules are loaded using this code from Install.PM: sub load_extensions { my ($self, $path, $top_obj) = @_; print "In load_extensions() ...\n"; unshift @INC, $self->{prefix} unless grep { $_ eq $self->{prefix} } @INC; local @INC = ($path, @INC); foreach my $rv ($self->find_extensions($path)) { my ($file, $pkg) = @{$rv}; next if $self->{pathnames}{$pkg}; print "\n load_extensions: loading package $pkg from file $file\n"; eval { require $file; 1 } or (warn($@), next); print " load_extensions: require $file worked\n"; $self->{pathnames}{$pkg} = delete $INC{$file}; push @{$self->{extensions}}, $pkg->new( _top => $top_obj ); } print "Load extensions() finished\n"; } sub find_extensions { my ($self, $path) = @_; my @found; print "In find_extensions() ...\n"; File::Find::find(sub { my $file = $File::Find::name; print "\n find_extensions found file $file\n"; return unless $file =~ m!^\Q$path\E/(.+)\.pm\Z!is; return if $1 eq $self->{dispatch}; $file = "$self->{path}/$1.pm"; print " find_extensions self->{path}file is $file\n"; my $pkg = "$self->{name}::$1"; $pkg =~ s!/!::!g; print " find_extensions package is $pkg\n"; push @found, [$file, $pkg]; }, $path) if -d $path; @found; } (The print statements are my tracewrites.) Where exactly is the problem here? It looks like Install.PM is assuming the case of the filenames returned by File::Find is going to match the package names declared in those files, but is that improper behaviour? Thanks, Jeremy Begg +---------------------------------------------------------+ | VSM Software Services Pty. Ltd. | | http://www.vsm.com.au/ | | "OpenVMS Systems Management & Programming" | |---------------------------------------------------------| | P.O.Box 402, Walkerville, | E-Mail: [EMAIL PROTECTED] | | South Australia 5081 | Phone: +61 8 8221 5188 | |---------------------------| Mobile: 0414 422 947 | | A.C.N. 068 409 156 | FAX: +61 8 8221 7199 | +---------------------------------------------------------+