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


Reply via email to