On Fri, 10 Jun 2011, Sherm Pendley wrote:
> But the question is, should it be done for PERL5LIB? That affects
> *all* Perls, and if you've included the path to modules compiled for
> (say) 5.12, but you're running 5.10, those modules won't work.
Ah, yes, sorry, lost track of the real topic of the thread.
I think a better way to modify your @INC is on a per-installation
basis. For Apple's Perl you have the AppendToPath and PrependToPath
mechanism, e.g.
$ cat /Library/Perl/5.10.0/AppendToPath
/System/Library/Perl/Extras/5.10.0
There is no PrependToPath file by default, but you can create one
yourself, and all directories listed in there will be put at the
front of @INC, just as if you put them into PERL5LIB.
If you build your own Perl, then you may want to ./Configure it
with -Dusesitecustomize. That way you can modify @INC in a
perl/site/lib/sitecustomize.pl file at runtime.
ActivePerl uses this mechanism to add a per-user install directory
to @INC:
$ cat /usr/local/ActivePerl-5.14/site/lib/sitecustomize.pl
# ~/Library/ActivePerl-5.14 is the default location for PPM install
# So make sure we look for modules there
if (my $home = (getpwuid($<))[7]) {
my $lib = "$home/Library/ActivePerl-5.14/lib";
unless (grep { $_ eq $lib } @INC) {
# Insert $lib just ahead of 'site/lib' so that overrides
# via $ENV{PERL5LIB} or 'perl -I...' still works
(my $site = __FILE__) =~ s,/sitecustomize\.pl\z,,;
my $i = $#INC;
$i-- while $i > 0 && $INC[$i] ne $site;
splice(@INC, $i, 0, $lib);
}
}
This sitecustomize.pl script is a little more complicated because
it inserts the directory behind the ones specified with PERL5LIB
and -I, but before the builtin ones:
$ PERL5LIB=~/mylib perl -E 'say for @INC'
/Users/jan/mylib
/Users/jan/Library/ActivePerl-5.14/lib
/usr/local/ActivePerl-5.14/site/lib
/usr/local/ActivePerl-5.14/lib
.
So again, you can customize your @INC setup for each Perl installation
independently without resorting to global environment variables, which
will just get in the way at the wrong time...
Cheers,
-Jan