don't output env vars that are already set
[p5sagit/local-lib.git] / lib / local / lib.pm
1 use strict;
2 use warnings;
3
4 package local::lib;
5
6 use 5.006;
7
8 use File::Spec ();
9 use Config;
10
11 our $VERSION = '1.008026'; # 1.8.26
12 $VERSION = eval $VERSION;
13
14 sub import {
15   my ($class, @args) = @_;
16
17   my @steps;
18   my %opts;
19
20   while (@args) {
21     my $arg = shift @args;
22     # check for lethal dash first to stop processing before causing problems
23     # the fancy dash is U+2212 or \xE2\x88\x92
24     if ($arg =~ /\xE2\x88\x92/ or $arg =~ /−/) {
25       die <<'DEATH';
26 WHOA THERE! It looks like you've got some fancy dashes in your commandline!
27 These are *not* the traditional -- dashes that software recognizes. You
28 probably got these by copy-pasting from the perldoc for this module as
29 rendered by a UTF8-capable formatter. This most typically happens on an OS X
30 terminal, but can happen elsewhere too. Please try again after replacing the
31 dashes with normal minus signs.
32 DEATH
33     }
34     elsif ($arg eq '--self-contained') {
35       die "FATAL: The local::lib --self-contained flag has never worked reliably and the original author, Mark Stosberg, was unable or unwilling to maintain it. As such, this flag has been removed from the local::lib codebase in order to prevent misunderstandings and potentially broken builds. The local::lib authors recommend that you look at the lib::core::only module shipped with this distribution in order to create a more robust environment that is equivalent to what --self-contained provided (although quite possibly not what you originally thought it provided due to the poor quality of the documentation, for which we apologise).\n";
36     }
37     elsif( $arg =~ /^--deactivate(?:=(.*))?$/ ) {
38       my $path = defined $1 ? $1 : shift @args;
39       push @steps, ['deactivate', $path];
40     }
41     elsif ( $arg eq '--deactivate-all' ) {
42       push @steps, ['deactivate_all'];
43     }
44     elsif ( $arg =~ /^--shelltype(?:=(.*))?$/ ) {
45       my $shell = defined $1 ? $1 : shift @args;
46       $opts{shelltype} = $shell;
47     }
48     elsif ( $arg =~ /^--/ ) {
49       die "Unknown import argument: $arg";
50     }
51     else {
52       push @steps, ['activate', $arg];
53     }
54   }
55   if (!@steps) {
56     push @steps, ['activate', undef];
57   }
58
59   my $self = $class->new(%opts);
60
61   for (@steps) {
62     my ($method, @args) = @$_;
63     $self = $self->$method(@args);
64   }
65
66   if ($0 eq '-') {
67     $self->print_environment_vars_for;
68     exit 0;
69   }
70   else {
71     $self->setup_local_lib_for;
72   }
73 }
74
75 sub new {
76   my $class = shift;
77   bless {@_}, $class;
78 }
79
80 sub clone {
81   my $self = shift;
82   bless {%$self, @_}, ref $self;
83 }
84
85 sub inc { $_[0]->{inc}     ||= \@INC }
86 sub libs { $_[0]->{libs}   ||= [ \'PERL5LIB' ] }
87 sub bins { $_[0]->{bins}   ||= [ \'PATH' ] }
88 sub roots { $_[0]->{roots} ||= [ \'PERL_LOCAL_LIB_ROOT' ] }
89 sub extra { $_[0]->{extra} ||= {} }
90 sub shelltype { $_[0]->{shelltype} ||= $_[0]->guess_shelltype }
91
92 my $_archname = $Config{archname};
93 my $_version  = $Config{version};
94 my @_inc_version_list = reverse split / /, $Config{inc_version_list};
95 my $_path_sep = $Config{path_sep};
96
97 sub _as_list {
98   my $list = shift;
99   grep length, map {
100     !(ref $_ && ref $_ eq 'SCALAR') ? $_ : (
101       defined $ENV{$$_} ? split(/\Q$_path_sep/, $ENV{$$_})
102                         : ()
103     )
104   } ref $list ? @$list : $list;
105 }
106 sub _remove_from {
107   my ($list, @remove) = @_;
108   my %remove = map { $_ => 1 } @remove;
109   grep !$remove{$_}, _as_list($list);
110 }
111
112 my @_lib_subdirs = (
113   [$_version, $_archname],
114   [$_version],
115   [$_archname],
116   (@_inc_version_list ? \@_inc_version_list : ()),
117   [],
118 );
119
120 sub install_base_bin_path {
121   my ($class, $path) = @_;
122   return File::Spec->catdir($path, 'bin');
123 }
124 sub install_base_perl_path {
125   my ($class, $path) = @_;
126   return File::Spec->catdir($path, 'lib', 'perl5');
127 }
128 sub install_base_arch_path {
129   my ($class, $path) = @_;
130   File::Spec->catdir($class->install_base_perl_path($path), $_archname);
131 }
132
133 sub lib_paths_for {
134   my ($class, $path) = @_;
135   my $base = $class->install_base_perl_path($path);
136   return map { File::Spec->catdir($base, @$_) } @_lib_subdirs;
137 }
138
139 sub _mm_escape_path {
140   my $path = shift;
141   $path =~ s/\\/\\\\\\\\/g;
142   if ($path =~ s/ /\\ /g) {
143     $path = qq{"\\"$path\\""};
144   }
145   return $path;
146 }
147
148 sub _mb_escape_path {
149   my $path = shift;
150   $path =~ s/\\/\\\\/g;
151   return qq{"$path"};
152 }
153
154 sub installer_options_for {
155   my ($class, $path) = @_;
156   return {
157     PERL_MM_OPT => defined $path ? "INSTALL_BASE="._mm_escape_path($path) : undef,
158     PERL_MB_OPT => defined $path ? "--install_base "._mb_escape_path($path) : undef,
159   };
160 }
161
162 sub active_paths {
163   my ($self) = @_;
164   $self = ref $self ? $self : $self->new;
165
166   return grep {
167     # screen out entries that aren't actually reflected in @INC
168     my $active_ll = $self->install_base_perl_path($_);
169     grep { $_ eq $active_ll } @{$self->inc};
170   } _as_list($self->roots);
171 }
172
173
174 sub deactivate {
175   my ($self, $path) = @_;
176   $self = $self->new unless ref $self;
177   $path = $self->resolve_path($path);
178
179   my @active_lls = $self->active_paths;
180
181   if (!grep { $_ eq $path } @active_lls) {
182     warn "Tried to deactivate inactive local::lib '$path'\n";
183     return;
184   }
185
186   my %args = (
187     bins  => [ _remove_from($self->bins,  $self->install_base_bin_path($path)) ],
188     libs  => [ _remove_from($self->libs,  $self->install_base_perl_path($path)) ],
189     inc   => [ _remove_from($self->inc,   $self->lib_paths_for($path)) ],
190     roots => [ _remove_from($self->roots, $path) ],
191   );
192
193   $args{extra} = $self->installer_options_for($args{roots}[0]);
194
195   $self->clone(%args);
196 }
197
198 sub deactivate_all {
199   my ($self) = @_;
200   $self = $self->new unless ref $self;
201
202   my @active_lls = $self->active_paths;
203
204   my %args = (
205     bins => [ _remove_from($self->bins,
206       map $self->install_base_bin_path($_), @active_lls) ],
207     libs => [ _remove_from($self->libs,
208       map $self->install_base_perl_path($_), @active_lls) ],
209     inc => [ _remove_from($self->inc,
210       map $self->lib_paths_for($_), @active_lls) ],
211     roots => [ _remove_from($self->roots, @active_lls) ],
212   );
213
214   $args{extra} = $self->installer_options_for(undef);
215
216   $self->clone(%args);
217 }
218
219 sub activate {
220   my ($self, $path) = @_;
221   $self = $self->new unless ref $self;
222   $path = $self->resolve_path($path);
223   $self->ensure_dir_structure_for($path);
224
225   my @active_lls = $self->active_paths;
226
227   if (grep { $_ eq $path } @active_lls) {
228     $self = $self->deactivate($path);
229   }
230
231   my %args = (
232     bins  => [ $self->install_base_bin_path($path), @{$self->bins} ],
233     libs  => [ $self->install_base_perl_path($path), @{$self->libs} ],
234     inc   => [ $self->lib_paths_for($path), @{$self->inc} ],
235     roots => [ $path, @{$self->roots} ],
236   );
237
238   $args{extra} = $self->installer_options_for($path);
239
240   $self->clone(%args);
241 }
242
243 sub _legacy {
244   my ($self, $path) = @_;
245   $self = $self->new unless ref $self;
246   if (defined $path) {
247     $self = $self->activate($path);
248   }
249   $self;
250 }
251
252 sub build_environment_vars_for {
253   my ($self) = _legacy(@_);
254   (
255     PATH                => join($_path_sep, _as_list($self->bins)),
256     PERL5LIB            => join($_path_sep, _as_list($self->libs)),
257     PERL_LOCAL_LIB_ROOT => join($_path_sep, _as_list($self->roots)),
258     %{$self->extra},
259   );
260 }
261
262 sub setup_local_lib_for {
263   my ($self) = _legacy(@_);
264   $self->setup_env_hash_for;
265   @INC = @{$self->inc};
266 }
267
268 sub setup_env_hash_for {
269   my $self = shift;
270   my %env = $self->build_environment_vars_for(@_);
271   for my $key (keys %env) {
272     if (defined $env{$key}) {
273       $ENV{$key} = $env{$key};
274     }
275     else {
276       delete $ENV{$key};
277     }
278   }
279 }
280
281 sub print_environment_vars_for {
282   my $self = shift;
283   print $self->environment_vars_string_for(@_);
284 }
285
286 sub environment_vars_string_for {
287   my $self = _legacy(@_);
288
289   my $build_method = 'build_' . $self->shelltype . '_env_declaration';
290
291   my @envs = (
292     PATH                => $self->bins,
293     PERL5LIB            => $self->libs,
294     PERL_LOCAL_LIB_ROOT => $self->roots,
295     %{$self->extra},
296   );
297   my $out = '';
298   while (@envs) {
299     my ($name, $value) = (shift(@envs), shift(@envs));
300     if (
301         ref $value
302         && @$value == 1
303         && ref $value->[0]
304         && ref $value->[0] eq 'SCALAR'
305         && ${$value->[0]} eq $name) {
306       next;
307     }
308     if (!ref $value
309         && $value eq $ENV{$name}) {
310       next;
311     }
312     $out .= $self->$build_method($name, $value);
313   }
314   return $out;
315 }
316
317 sub build_bourne_env_declaration {
318   my ($class, $name, $args) = @_;
319   my $value = $class->_interpolate($args);
320   $value =~ s/"/\\"/g
321     if defined $value;
322   return defined($value) ? qq{export ${name}="${value}"\n} : qq{unset ${name}\n};
323 }
324 sub build_csh_env_declaration {
325   my ($class, $name, $args) = @_;
326   my ($value, @vars) = $class->_interpolate($args);
327   @vars = grep { $_ ne $name || defined $value } @vars;
328   $value =~ s/"/"\\""/g
329     if defined $value;
330   join '',
331     (map qq{if ! \$?$_ setenv $_ "";\n}, @vars),
332     (defined($value)
333       ? qq{setenv $name "$value";\n}
334       : qq{unsetenv $name;\n});
335 }
336 sub build_cmd_env_declaration {
337   my ($class, $name, $args) = @_;
338   my $value = $class->_interpolate($args, '%', '%');
339   $value =~ s/"/\\"/g
340     if defined $value;
341   return qq{set $name=} . (defined($value) ? qq{"$value"} : '') . "\n";
342 }
343 sub build_powershell_env_declaration {
344   my ($class, $name, $args) = @_;
345   my $value = $class->_interpolate($args, '$env:');
346   if (defined $value) {
347     $value =~ s/"/\\"/g;
348     return qq{\$env:$name = "$value"\n};
349   }
350   return "Remove-Item Env:\\$name\n";
351 }
352
353
354 sub _interpolate {
355   my ($class, $args, $start, $end) = @_;
356   return
357     unless defined $args;
358   return $args
359     unless ref $args;
360   return
361     unless @$args;
362   $start = '$' unless defined $start;
363   $end = '' unless defined $end;
364   my @vars;
365   my $string = join($Config{path_sep}, map {
366     (ref $_ && ref $_ eq 'SCALAR') ? do { push @vars, $$_; $start.$$_.$end }
367       : $_
368   } @$args);
369   return wantarray ? ($string, @vars) : $string;
370 }
371
372 sub pipeline;
373
374 sub pipeline {
375   my @methods = @_;
376   my $last = pop(@methods);
377   if (@methods) {
378     \sub {
379       my ($obj, @args) = @_;
380       $obj->${pipeline @methods}(
381         $obj->$last(@args)
382       );
383     };
384   } else {
385     \sub {
386       shift->$last(@_);
387     };
388   }
389 }
390
391 =begin testing
392
393 #:: test pipeline
394
395 package local::lib;
396
397 { package Foo; sub foo { -$_[1] } sub bar { $_[1]+2 } sub baz { $_[1]+3 } }
398 my $foo = bless({}, 'Foo');
399 Test::More::ok($foo->${pipeline qw(foo bar baz)}(10) == -15);
400
401 =end testing
402
403 =cut
404
405 sub resolve_path {
406   my ($class, $path) = @_;
407
408   $path = $class->${pipeline qw(
409     resolve_relative_path
410     resolve_home_path
411     resolve_empty_path
412   )}($path);
413
414   $path = Win32::GetShortPathName($path)
415     if $^O eq 'MSWin32';
416
417   $path;
418 }
419
420 sub resolve_empty_path {
421   my ($class, $path) = @_;
422   if (defined $path) {
423     $path;
424   } else {
425     '~/perl5';
426   }
427 }
428
429 =begin testing
430
431 #:: test classmethod setup
432
433 my $c = 'local::lib';
434
435 =end testing
436
437 =begin testing
438
439 #:: test classmethod
440
441 is($c->resolve_empty_path, '~/perl5');
442 is($c->resolve_empty_path('foo'), 'foo');
443
444 =end testing
445
446 =cut
447
448 sub resolve_home_path {
449   my ($class, $path) = @_;
450   return $path unless ($path =~ /^~/);
451   my ($user) = ($path =~ /^~([^\/]+)/); # can assume ^~ so undef for 'us'
452   my $homedir = do {
453     if (!defined $user && defined $ENV{HOME}) {
454       $ENV{HOME}
455     }
456     else {
457       require File::Glob;
458       File::Glob::bsd_glob("~$user", File::Glob::GLOB_TILDE());
459     }
460   };
461   unless (defined $homedir) {
462     require Carp;
463     Carp::croak(
464       "Couldn't resolve homedir for "
465       .(defined $user ? $user : 'current user')
466     );
467   }
468   $path =~ s/^~[^\/]*/$homedir/;
469   $path;
470 }
471
472 sub resolve_relative_path {
473   my ($class, $path) = @_;
474   $path = File::Spec->rel2abs($path);
475 }
476
477 =begin testing
478
479 #:: test classmethod
480
481 local *File::Spec::rel2abs = sub { shift; 'FOO'.shift; };
482 is($c->resolve_relative_path('bar'),'FOObar');
483
484 =end testing
485
486 =cut
487
488 sub ensure_dir_structure_for {
489   my ($class, $path) = @_;
490   unless (-d $path) {
491     warn "Attempting to create directory ${path}\n";
492   }
493   require File::Basename;
494   my @dirs;
495   while(!-d $path) {
496     push @dirs, $path;
497     $path = File::Basename::dirname($path);
498   }
499   mkdir $_ for reverse @dirs;
500   return;
501 }
502
503 =begin testing
504
505 #:: test classmethod
506
507 File::Path::rmtree('t/var/splat');
508
509 $c->ensure_dir_structure_for('t/var/splat');
510
511 ok(-d 't/var/splat');
512
513 =end testing
514
515 =cut
516
517 sub guess_shelltype {
518   my $shellbin = 'sh';
519   if(defined $ENV{'SHELL'}) {
520       my @shell_bin_path_parts = File::Spec->splitpath($ENV{'SHELL'});
521       $shellbin = $shell_bin_path_parts[-1];
522   }
523   my $shelltype = do {
524       local $_ = $shellbin;
525       if(/csh/) {
526           'csh'
527       } else {
528           'bourne'
529       }
530   };
531
532   # Both Win32 and Cygwin have $ENV{COMSPEC} set.
533   if (defined $ENV{'COMSPEC'} && $^O ne 'cygwin') {
534       my @shell_bin_path_parts = File::Spec->splitpath($ENV{'COMSPEC'});
535       $shellbin = $shell_bin_path_parts[-1];
536          $shelltype = do {
537                  local $_ = $shellbin;
538                  if(/command\.com/) {
539                          'cmd'
540                  } elsif(/cmd\.exe/) {
541                          'cmd'
542                  } elsif(/4nt\.exe/) {
543                          'cmd'
544                  } else {
545                          $shelltype
546                  }
547          };
548   }
549   return $shelltype;
550 }
551
552 1;
553 __END__
554
555 =encoding utf8
556
557 =head1 NAME
558
559 local::lib - create and use a local lib/ for perl modules with PERL5LIB
560
561 =head1 SYNOPSIS
562
563 In code -
564
565   use local::lib; # sets up a local lib at ~/perl5
566
567   use local::lib '~/foo'; # same, but ~/foo
568
569   # Or...
570   use FindBin;
571   use local::lib "$FindBin::Bin/../support";  # app-local support library
572
573 From the shell -
574
575   # Install LWP and its missing dependencies to the '~/perl5' directory
576   perl -MCPAN -Mlocal::lib -e 'CPAN::install(LWP)'
577
578   # Just print out useful shell commands
579   $ perl -Mlocal::lib
580   export PERL_MB_OPT='--install_base /home/username/perl5'
581   export PERL_MM_OPT='INSTALL_BASE=/home/username/perl5'
582   export PERL5LIB="/home/username/perl5/lib/perl5"
583   export PATH="/home/username/perl5/bin:$PATH"
584
585 =head2 The bootstrapping technique
586
587 A typical way to install local::lib is using what is known as the
588 "bootstrapping" technique.  You would do this if your system administrator
589 hasn't already installed local::lib.  In this case, you'll need to install
590 local::lib in your home directory.
591
592 Even if you do have administrative privileges, you will still want to set up your
593 environment variables, as discussed in step 4. Without this, you would still
594 install the modules into the system CPAN installation and also your Perl scripts
595 will not use the lib/ path you bootstrapped with local::lib.
596
597 By default local::lib installs itself and the CPAN modules into ~/perl5.
598
599 Windows users must also see L</Differences when using this module under Win32>.
600
601 1. Download and unpack the local::lib tarball from CPAN (search for "Download"
602 on the CPAN page about local::lib).  Do this as an ordinary user, not as root
603 or administrator.  Unpack the file in your home directory or in any other
604 convenient location.
605
606 2. Run this:
607
608   perl Makefile.PL --bootstrap
609
610 If the system asks you whether it should automatically configure as much
611 as possible, you would typically answer yes.
612
613 In order to install local::lib into a directory other than the default, you need
614 to specify the name of the directory when you call bootstrap, as follows:
615
616   perl Makefile.PL --bootstrap=~/foo
617
618 3. Run this: (local::lib assumes you have make installed on your system)
619
620   make test && make install
621
622 4. Now we need to setup the appropriate environment variables, so that Perl
623 starts using our newly generated lib/ directory. If you are using bash or
624 any other Bourne shells, you can add this to your shell startup script this
625 way:
626
627   echo 'eval $(perl -I$HOME/perl5/lib/perl5 -Mlocal::lib)' >>~/.bashrc
628
629 If you are using C shell, you can do this as follows:
630
631   /bin/csh
632   echo $SHELL
633   /bin/csh
634   perl -I$HOME/perl5/lib/perl5 -Mlocal::lib >> ~/.cshrc
635
636 If you passed to bootstrap a directory other than default, you also need to
637 give that as import parameter to the call of the local::lib module like this
638 way:
639
640   echo 'eval $(perl -I$HOME/foo/lib/perl5 -Mlocal::lib=$HOME/foo)' >>~/.bashrc
641
642 After writing your shell configuration file, be sure to re-read it to get the
643 changed settings into your current shell's environment. Bourne shells use
644 C<. ~/.bashrc> for this, whereas C shells use C<source ~/.cshrc>.
645
646 If you're on a slower machine, or are operating under draconian disk space
647 limitations, you can disable the automatic generation of manpages from POD when
648 installing modules by using the C<--no-manpages> argument when bootstrapping:
649
650   perl Makefile.PL --bootstrap --no-manpages
651
652 To avoid doing several bootstrap for several Perl module environments on the
653 same account, for example if you use it for several different deployed
654 applications independently, you can use one bootstrapped local::lib
655 installation to install modules in different directories directly this way:
656
657   cd ~/mydir1
658   perl -Mlocal::lib=./
659   eval $(perl -Mlocal::lib=./)  ### To set the environment for this shell alone
660   printenv                      ### You will see that ~/mydir1 is in the PERL5LIB
661   perl -MCPAN -e install ...    ### whatever modules you want
662   cd ../mydir2
663   ... REPEAT ...
664
665 If you are working with several C<local::lib> environments, you may want to
666 remove some of them from the current environment without disturbing the others.
667 You can deactivate one environment like this (using bourne sh):
668
669   eval $(perl -Mlocal::lib=--deactivate,~/path)
670
671 which will generate and run the commands needed to remove C<~/path> from your
672 various search paths. Whichever environment was B<activated most recently> will
673 remain the target for module installations. That is, if you activate
674 C<~/path_A> and then you activate C<~/path_B>, new modules you install will go
675 in C<~/path_B>. If you deactivate C<~/path_B> then modules will be installed
676 into C<~/pathA> -- but if you deactivate C<~/path_A> then they will still be
677 installed in C<~/pathB> because pathB was activated later.
678
679 You can also ask C<local::lib> to clean itself completely out of the current
680 shell's environment with the C<--deactivate-all> option.
681 For multiple environments for multiple apps you may need to include a modified
682 version of the C<< use FindBin >> instructions in the "In code" sample above.
683 If you did something like the above, you have a set of Perl modules at C<<
684 ~/mydir1/lib >>. If you have a script at C<< ~/mydir1/scripts/myscript.pl >>,
685 you need to tell it where to find the modules you installed for it at C<<
686 ~/mydir1/lib >>.
687
688 In C<< ~/mydir1/scripts/myscript.pl >>:
689
690   use strict;
691   use warnings;
692   use local::lib "$FindBin::Bin/..";  ### points to ~/mydir1 and local::lib finds lib
693   use lib "$FindBin::Bin/../lib";     ### points to ~/mydir1/lib
694
695 Put this before any BEGIN { ... } blocks that require the modules you installed.
696
697 =head2 Differences when using this module under Win32
698
699 To set up the proper environment variables for your current session of
700 C<CMD.exe>, you can use this:
701
702   C:\>perl -Mlocal::lib
703   set PERL_MB_OPT=--install_base C:\DOCUME~1\ADMINI~1\perl5
704   set PERL_MM_OPT=INSTALL_BASE=C:\DOCUME~1\ADMINI~1\perl5
705   set PERL5LIB=C:\DOCUME~1\ADMINI~1\perl5\lib\perl5
706   set PATH=C:\DOCUME~1\ADMINI~1\perl5\bin;%PATH%
707
708   ### To set the environment for this shell alone
709   C:\>perl -Mlocal::lib > %TEMP%\tmp.bat && %TEMP%\tmp.bat && del %TEMP%\tmp.bat
710   ### instead of $(perl -Mlocal::lib=./)
711
712 If you want the environment entries to persist, you'll need to add then to the
713 Control Panel's System applet yourself or use L<App::local::lib::Win32Helper>.
714
715 The "~" is translated to the user's profile directory (the directory named for
716 the user under "Documents and Settings" (Windows XP or earlier) or "Users"
717 (Windows Vista or later)) unless $ENV{HOME} exists. After that, the home
718 directory is translated to a short name (which means the directory must exist)
719 and the subdirectories are created.
720
721 =head1 RATIONALE
722
723 The version of a Perl package on your machine is not always the version you
724 need.  Obviously, the best thing to do would be to update to the version you
725 need.  However, you might be in a situation where you're prevented from doing
726 this.  Perhaps you don't have system administrator privileges; or perhaps you
727 are using a package management system such as Debian, and nobody has yet gotten
728 around to packaging up the version you need.
729
730 local::lib solves this problem by allowing you to create your own directory of
731 Perl packages downloaded from CPAN (in a multi-user system, this would typically
732 be within your own home directory).  The existing system Perl installation is
733 not affected; you simply invoke Perl with special options so that Perl uses the
734 packages in your own local package directory rather than the system packages.
735 local::lib arranges things so that your locally installed version of the Perl
736 packages takes precedence over the system installation.
737
738 If you are using a package management system (such as Debian), you don't need to
739 worry about Debian and CPAN stepping on each other's toes.  Your local version
740 of the packages will be written to an entirely separate directory from those
741 installed by Debian.
742
743 =head1 DESCRIPTION
744
745 This module provides a quick, convenient way of bootstrapping a user-local Perl
746 module library located within the user's home directory. It also constructs and
747 prints out for the user the list of environment variables using the syntax
748 appropriate for the user's current shell (as specified by the C<SHELL>
749 environment variable), suitable for directly adding to one's shell
750 configuration file.
751
752 More generally, local::lib allows for the bootstrapping and usage of a
753 directory containing Perl modules outside of Perl's C<@INC>. This makes it
754 easier to ship an application with an app-specific copy of a Perl module, or
755 collection of modules. Useful in cases like when an upstream maintainer hasn't
756 applied a patch to a module of theirs that you need for your application.
757
758 On import, local::lib sets the following environment variables to appropriate
759 values:
760
761 =over 4
762
763 =item PERL_MB_OPT
764
765 =item PERL_MM_OPT
766
767 =item PERL5LIB
768
769 =item PATH
770
771 =back
772
773 When possible, these will be appended to instead of overwritten entirely.
774
775 These values are then available for reference by any code after import.
776
777 =head1 CREATING A SELF-CONTAINED SET OF MODULES
778
779 See L<lib::core::only> for one way to do this - but note that
780 there are a number of caveats, and the best approach is always to perform a
781 build against a clean perl (i.e. site and vendor as close to empty as possible).
782
783 =head1 OPTIONS
784
785 Options are values that can be passed to the C<local::lib> import besides the
786 directory to use. They are specified as C<use local::lib '--option'[, path];>
787 or C<perl -Mlocal::lib=--option[,path]>.
788
789 =head2 --deactivate
790
791 Remove the chosen path (or the default path) from the module search paths if it
792 was added by C<local::lib>, instead of adding it.
793
794 =head2 --deactivate-all
795
796 Remove all directories that were added to search paths by C<local::lib> from the
797 search paths.
798
799 =head1 METHODS
800
801 =head2 ensure_dir_structure_for
802
803 =over 4
804
805 =item Arguments: $path
806
807 =item Return value: None
808
809 =back
810
811 Attempts to create the given path, and all required parent directories. Throws
812 an exception on failure.
813
814 =head2 print_environment_vars_for
815
816 =over 4
817
818 =item Arguments: $path
819
820 =item Return value: None
821
822 =back
823
824 Prints to standard output the variables listed above, properly set to use the
825 given path as the base directory.
826
827 =head2 build_environment_vars_for
828
829 =over 4
830
831 =item Arguments: $path, $interpolate
832
833 =item Return value: %environment_vars
834
835 =back
836
837 Returns a hash with the variables listed above, properly set to use the
838 given path as the base directory.
839
840 =head2 setup_env_hash_for
841
842 =over 4
843
844 =item Arguments: $path
845
846 =item Return value: None
847
848 =back
849
850 Constructs the C<%ENV> keys for the given path, by calling
851 L</build_environment_vars_for>.
852
853 =head2 active_paths
854
855 =over 4
856
857 =item Arguments: None
858
859 =item Return value: @paths
860
861 =back
862
863 Returns a list of active C<local::lib> paths, according to the
864 C<PERL_LOCAL_LIB_ROOT> environment variable and verified against
865 what is really in C<@INC>.
866
867 =head2 install_base_perl_path
868
869 =over 4
870
871 =item Arguments: $path
872
873 =item Return value: $install_base_perl_path
874
875 =back
876
877 Returns a path describing where to install the Perl modules for this local
878 library installation. Appends the directories C<lib> and C<perl5> to the given
879 path.
880
881 =head2 install_base_bin_path
882
883 =over 4
884
885 =item Arguments: $path
886
887 =item Return value: $install_base_bin_path
888
889 =back
890
891 Returns a path describing where to install the executable programs for this
892 local library installation. Appends the directory C<bin> to the given path.
893
894 =head2 resolve_empty_path
895
896 =over 4
897
898 =item Arguments: $path
899
900 =item Return value: $base_path
901
902 =back
903
904 Builds and returns the base path into which to set up the local module
905 installation. Defaults to C<~/perl5>.
906
907 =head2 resolve_home_path
908
909 =over 4
910
911 =item Arguments: $path
912
913 =item Return value: $home_path
914
915 =back
916
917 Attempts to find the user's home directory. If installed, uses C<File::HomeDir>
918 for this purpose. If no definite answer is available, throws an exception.
919
920 =head2 resolve_relative_path
921
922 =over 4
923
924 =item Arguments: $path
925
926 =item Return value: $absolute_path
927
928 =back
929
930 Translates the given path into an absolute path.
931
932 =head2 resolve_path
933
934 =over 4
935
936 =item Arguments: $path
937
938 =item Return value: $absolute_path
939
940 =back
941
942 Calls the following in a pipeline, passing the result from the previous to the
943 next, in an attempt to find where to configure the environment for a local
944 library installation: L</resolve_empty_path>, L</resolve_home_path>,
945 L</resolve_relative_path>. Passes the given path argument to
946 L</resolve_empty_path> which then returns a result that is passed to
947 L</resolve_home_path>, which then has its result passed to
948 L</resolve_relative_path>. The result of this final call is returned from
949 L</resolve_path>.
950
951 =head1 A WARNING ABOUT UNINST=1
952
953 Be careful about using local::lib in combination with "make install UNINST=1".
954 The idea of this feature is that will uninstall an old version of a module
955 before installing a new one. However it lacks a safety check that the old
956 version and the new version will go in the same directory. Used in combination
957 with local::lib, you can potentially delete a globally accessible version of a
958 module while installing the new version in a local place. Only combine "make
959 install UNINST=1" and local::lib if you understand these possible consequences.
960
961 =head1 LIMITATIONS
962
963 =over 4
964
965 =item * Directory names with spaces in them are not well supported by the perl
966 toolchain and the programs it uses.  Pure-perl distributions should support
967 spaces, but problems are more likely with dists that require compilation. A
968 workaround you can do is moving your local::lib to a directory with spaces
969 B<after> you installed all modules inside your local::lib bootstrap. But be
970 aware that you can't update or install CPAN modules after the move.
971
972 =item * Rather basic shell detection. Right now anything with csh in its name is
973 assumed to be a C shell or something compatible, and everything else is assumed
974 to be Bourne, except on Win32 systems. If the C<SHELL> environment variable is
975 not set, a Bourne-compatible shell is assumed.
976
977 =item * Kills any existing PERL_MM_OPT or PERL_MB_OPT.
978
979 =item * Should probably auto-fixup CPAN config if not already done.
980
981 =back
982
983 Patches very much welcome for any of the above.
984
985 =over 4
986
987 =item * On Win32 systems, does not have a way to write the created environment
988 variables to the registry, so that they can persist through a reboot.
989
990 =back
991
992 =head1 TROUBLESHOOTING
993
994 If you've configured local::lib to install CPAN modules somewhere in to your
995 home directory, and at some point later you try to install a module with C<cpan
996 -i Foo::Bar>, but it fails with an error like: C<Warning: You do not have
997 permissions to install into /usr/lib64/perl5/site_perl/5.8.8/x86_64-linux at
998 /usr/lib64/perl5/5.8.8/Foo/Bar.pm> and buried within the install log is an
999 error saying C<'INSTALL_BASE' is not a known MakeMaker parameter name>, then
1000 you've somehow lost your updated ExtUtils::MakeMaker module.
1001
1002 To remedy this situation, rerun the bootstrapping procedure documented above.
1003
1004 Then, run C<rm -r ~/.cpan/build/Foo-Bar*>
1005
1006 Finally, re-run C<cpan -i Foo::Bar> and it should install without problems.
1007
1008 =head1 ENVIRONMENT
1009
1010 =over 4
1011
1012 =item SHELL
1013
1014 =item COMSPEC
1015
1016 local::lib looks at the user's C<SHELL> environment variable when printing out
1017 commands to add to the shell configuration file.
1018
1019 On Win32 systems, C<COMSPEC> is also examined.
1020
1021 =back
1022
1023 =head1 SEE ALSO
1024
1025 =over 4
1026
1027 =item * L<Perl Advent article, 2011|http://perladvent.org/2011/2011-12-01.html>
1028
1029 =back
1030
1031 =head1 SUPPORT
1032
1033 IRC:
1034
1035     Join #local-lib on irc.perl.org.
1036
1037 =head1 AUTHOR
1038
1039 Matt S Trout <mst@shadowcat.co.uk> http://www.shadowcat.co.uk/
1040
1041 auto_install fixes kindly sponsored by http://www.takkle.com/
1042
1043 =head1 CONTRIBUTORS
1044
1045 Patches to correctly output commands for csh style shells, as well as some
1046 documentation additions, contributed by Christopher Nehren <apeiron@cpan.org>.
1047
1048 Doc patches for a custom local::lib directory, more cleanups in the english
1049 documentation and a L<german documentation|POD2::DE::local::lib> contributed by
1050 Torsten Raudssus <torsten@raudssus.de>.
1051
1052 Hans Dieter Pearcey <hdp@cpan.org> sent in some additional tests for ensuring
1053 things will install properly, submitted a fix for the bug causing problems with
1054 writing Makefiles during bootstrapping, contributed an example program, and
1055 submitted yet another fix to ensure that local::lib can install and bootstrap
1056 properly. Many, many thanks!
1057
1058 pattern of Freenode IRC contributed the beginnings of the Troubleshooting
1059 section. Many thanks!
1060
1061 Patch to add Win32 support contributed by Curtis Jewell <csjewell@cpan.org>.
1062
1063 Warnings for missing PATH/PERL5LIB (as when not running interactively) silenced
1064 by a patch from Marco Emilio Poleggi.
1065
1066 Mark Stosberg <mark@summersault.com> provided the code for the now deleted
1067 '--self-contained' option.
1068
1069 Documentation patches to make win32 usage clearer by
1070 David Mertens <dcmertens.perl@gmail.com> (run4flat).
1071
1072 Brazilian L<portuguese translation|POD2::PT_BR::local::lib> and minor doc
1073 patches contributed by Breno G. de Oliveira <garu@cpan.org>.
1074
1075 Improvements to stacking multiple local::lib dirs and removing them from the
1076 environment later on contributed by Andrew Rodland <arodland@cpan.org>.
1077
1078 Patch for Carp version mismatch contributed by Hakim Cassimally
1079 <osfameron@cpan.org>.
1080
1081 =head1 COPYRIGHT
1082
1083 Copyright (c) 2007 - 2010 the local::lib L</AUTHOR> and L</CONTRIBUTORS> as
1084 listed above.
1085
1086 =head1 LICENSE
1087
1088 This is free software; you can redistribute it and/or modify it under
1089 the same terms as the Perl 5 programming language system itself.
1090
1091 =cut