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