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