don't try to remove arch dirs from environment, they aren't added anymore
[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 ),
93b577b5 433 PERL_MB_OPT => "--install_base " . _mb_escape_path($path),
434 PERL_MM_OPT => "INSTALL_BASE=" . _mm_escape_path($path),
1bf7d892 435 PERL5LIB =>
436 _env_list_value(
437 { interpolate => $interpolate, exists => 0, empty => '' },
1bf7d892 438 $class->install_base_perl_path($path),
439 \'PERL5LIB',
440 ),
441 PATH => _env_list_value(
442 { interpolate => $interpolate, exists => 0, empty => '' },
c50d554b 443 $class->install_base_bin_path($path),
1bf7d892 444 \'PATH',
445 ),
b5cc15f7 446 )
447}
448
93b577b5 449sub _mm_escape_path {
450 my $path = shift;
451 $path =~ s/\\/\\\\\\\\/g;
452 if ($path =~ s/ /\\ /g) {
453 $path = qq{"\\"$path\\""};
454 }
455 return $path;
456}
457
458sub _mb_escape_path {
459 my $path = shift;
460 $path =~ s/\\/\\\\/g;
461 return qq{"$path"};
462}
463
29500601 464sub active_paths {
465 my ($class) = @_;
466
467 return () unless defined $ENV{PERL_LOCAL_LIB_ROOT};
24351831 468
469 return grep {
470 # screen out entries that aren't actually reflected in @INC
471 my $active_ll = $class->install_base_perl_path($_);
472 grep { $_ eq $active_ll } @INC
473 }
474 grep { $_ ne '' }
475 split /\Q$Config{path_sep}\E/, $ENV{PERL_LOCAL_LIB_ROOT};
29500601 476}
477
4c718913 478sub build_deactivate_environment_vars_for {
479 my ($class, $path, $interpolate) = @_;
480
29500601 481 my @active_lls = $class->active_paths;
4c718913 482
483 if (!grep { $_ eq $path } @active_lls) {
484 warn "Tried to deactivate inactive local::lib '$path'\n";
485 return ();
486 }
487
1bf7d892 488 my $perl_path = $class->install_base_perl_path($path);
1bf7d892 489 my $bin_path = $class->install_base_bin_path($path);
490
4c718913 491
492 my %env = (
1bf7d892 493 PERL_LOCAL_LIB_ROOT => _env_list_value(
494 {
495 exists => 0,
496 },
497 grep { $_ ne $path } @active_lls
4c718913 498 ),
1bf7d892 499 PERL5LIB => _env_list_value(
500 {
501 exists => 0,
502 filter => sub {
2164a41e 503 $_ ne $perl_path
1bf7d892 504 },
505 },
506 \'PERL5LIB',
4c718913 507 ),
1bf7d892 508 PATH => _env_list_value(
509 {
510 exists => 0,
511 filter => sub { $_ ne $bin_path },
512 },
513 \'PATH',
4c718913 514 ),
515 );
516
517 # If removing ourselves from the "top of the stack", set install paths to
518 # correspond with the new top of stack.
a27f7456 519 if ($active_lls[0] eq $path) {
520 my $new_top = $active_lls[1];
93b577b5 521 $env{PERL_MB_OPT} = defined($new_top) ? "--install_base "._mb_escape_path($new_top) : undef;
522 $env{PERL_MM_OPT} = defined($new_top) ? "INSTALL_BASE="._mm_escape_path($new_top) : undef;
4c718913 523 }
524
525 return %env;
526}
527
15f79556 528sub build_deact_all_environment_vars_for {
529 my ($class, $path, $interpolate) = @_;
530
29500601 531 my @active_lls = $class->active_paths;
15f79556 532
1bf7d892 533 my %perl_paths = map { (
534 $class->install_base_perl_path($_) => 1,
1bf7d892 535 ) } @active_lls;
536 my %bin_paths = map { (
537 $class->install_base_bin_path($_) => 1,
538 ) } @active_lls;
15f79556 539
540 my %env = (
541 PERL_LOCAL_LIB_ROOT => undef,
542 PERL_MM_OPT => undef,
543 PERL_MB_OPT => undef,
1bf7d892 544 PERL5LIB => _env_list_value(
545 {
546 exists => 0,
547 filter => sub {
548 ! scalar grep { exists $perl_paths{$_} } $_[0]
549 },
550 },
551 \'PERL5LIB'
552 ),
553 PATH => _env_list_value(
554 {
555 exists => 0,
556 filter => sub {
557 ! scalar grep { exists $bin_paths{$_} } $_[0]
558 },
559 },
560 \'PATH'
15f79556 561 ),
15f79556 562 );
563
564 return %env;
565}
566
0d6470a5 5671;
568__END__
275c9dae 569
898f36cf 570=encoding utf8
571
b5cc15f7 572=head1 NAME
573
574local::lib - create and use a local lib/ for perl modules with PERL5LIB
575
576=head1 SYNOPSIS
577
578In code -
579
580 use local::lib; # sets up a local lib at ~/perl5
581
582 use local::lib '~/foo'; # same, but ~/foo
583
1bc71e56 584 # Or...
585 use FindBin;
586 use local::lib "$FindBin::Bin/../support"; # app-local support library
587
b5cc15f7 588From the shell -
589
359329d3 590 # Install LWP and its missing dependencies to the '~/perl5' directory
591 perl -MCPAN -Mlocal::lib -e 'CPAN::install(LWP)'
0fb70b9a 592
0fb70b9a 593 # Just print out useful shell commands
b5cc15f7 594 $ perl -Mlocal::lib
e322149f 595 export PERL_MB_OPT='--install_base /home/username/perl5'
c4e3c83b 596 export PERL_MM_OPT='INSTALL_BASE=/home/username/perl5'
0d6470a5 597 export PERL5LIB="/home/username/perl5/lib/perl5"
c4e3c83b 598 export PATH="/home/username/perl5/bin:$PATH"
b5cc15f7 599
322b0a0d 600=head2 The bootstrapping technique
bc30e1d5 601
730f5dda 602A typical way to install local::lib is using what is known as the
603"bootstrapping" technique. You would do this if your system administrator
604hasn't already installed local::lib. In this case, you'll need to install
8522f4d5 605local::lib in your home directory.
898f36cf 606
0ad9f83d 607Even if you do have administrative privileges, you will still want to set up your
898f36cf 608environment variables, as discussed in step 4. Without this, you would still
609install the modules into the system CPAN installation and also your Perl scripts
610will not use the lib/ path you bootstrapped with local::lib.
611
04f8efde 612By default local::lib installs itself and the CPAN modules into ~/perl5.
613
898f36cf 614Windows users must also see L</Differences when using this module under Win32>.
715c31a0 615
730f5dda 6161. Download and unpack the local::lib tarball from CPAN (search for "Download"
617on the CPAN page about local::lib). Do this as an ordinary user, not as root
618or administrator. Unpack the file in your home directory or in any other
619convenient location.
715c31a0 620
730f5dda 6212. Run this:
715c31a0 622
730f5dda 623 perl Makefile.PL --bootstrap
715c31a0 624
730f5dda 625If the system asks you whether it should automatically configure as much
626as possible, you would typically answer yes.
627
04f8efde 628In order to install local::lib into a directory other than the default, you need
629to specify the name of the directory when you call bootstrap, as follows:
898f36cf 630
631 perl Makefile.PL --bootstrap=~/foo
632
6333. Run this: (local::lib assumes you have make installed on your system)
730f5dda 634
635 make test && make install
636
8522f4d5 6374. Now we need to setup the appropriate environment variables, so that Perl
898f36cf 638starts using our newly generated lib/ directory. If you are using bash or
639any other Bourne shells, you can add this to your shell startup script this
640way:
730f5dda 641
642 echo 'eval $(perl -I$HOME/perl5/lib/perl5 -Mlocal::lib)' >>~/.bashrc
643
644If you are using C shell, you can do this as follows:
645
646 /bin/csh
647 echo $SHELL
618272fe 648 /bin/csh
730f5dda 649 perl -I$HOME/perl5/lib/perl5 -Mlocal::lib >> ~/.cshrc
dc8ddd06 650
0d6470a5 651If you passed to bootstrap a directory other than default, you also need to
652give that as import parameter to the call of the local::lib module like this
653way:
8b1e8e69 654
730f5dda 655 echo 'eval $(perl -I$HOME/foo/lib/perl5 -Mlocal::lib=$HOME/foo)' >>~/.bashrc
618272fe 656
aab64481 657After writing your shell configuration file, be sure to re-read it to get the
8522f4d5 658changed settings into your current shell's environment. Bourne shells use
898f36cf 659C<. ~/.bashrc> for this, whereas C shells use C<source ~/.cshrc>.
aab64481 660
b9c94c15 661If you're on a slower machine, or are operating under draconian disk space
662limitations, you can disable the automatic generation of manpages from POD when
663installing modules by using the C<--no-manpages> argument when bootstrapping:
664
730f5dda 665 perl Makefile.PL --bootstrap --no-manpages
b9c94c15 666
8522f4d5 667To avoid doing several bootstrap for several Perl module environments on the
668same account, for example if you use it for several different deployed
669applications independently, you can use one bootstrapped local::lib
898f36cf 670installation to install modules in different directories directly this way:
977a9ca3 671
730f5dda 672 cd ~/mydir1
673 perl -Mlocal::lib=./
674 eval $(perl -Mlocal::lib=./) ### To set the environment for this shell alone
898f36cf 675 printenv ### You will see that ~/mydir1 is in the PERL5LIB
730f5dda 676 perl -MCPAN -e install ... ### whatever modules you want
677 cd ../mydir2
678 ... REPEAT ...
679
480534a8 680If you are working with several C<local::lib> environments, you may want to
681remove some of them from the current environment without disturbing the others.
682You can deactivate one environment like this (using bourne sh):
683
684 eval $(perl -Mlocal::lib=--deactivate,~/path)
685
686which will generate and run the commands needed to remove C<~/path> from your
687various search paths. Whichever environment was B<activated most recently> will
688remain the target for module installations. That is, if you activate
689C<~/path_A> and then you activate C<~/path_B>, new modules you install will go
690in C<~/path_B>. If you deactivate C<~/path_B> then modules will be installed
691into C<~/pathA> -- but if you deactivate C<~/path_A> then they will still be
692installed in C<~/pathB> because pathB was activated later.
693
694You can also ask C<local::lib> to clean itself completely out of the current
695shell's environment with the C<--deactivate-all> option.
730f5dda 696For multiple environments for multiple apps you may need to include a modified
697version of the C<< use FindBin >> instructions in the "In code" sample above.
698If you did something like the above, you have a set of Perl modules at C<<
699~/mydir1/lib >>. If you have a script at C<< ~/mydir1/scripts/myscript.pl >>,
700you need to tell it where to find the modules you installed for it at C<<
701~/mydir1/lib >>.
977a9ca3 702
703In C<< ~/mydir1/scripts/myscript.pl >>:
704
730f5dda 705 use strict;
706 use warnings;
707 use local::lib "$FindBin::Bin/.."; ### points to ~/mydir1 and local::lib finds lib
708 use lib "$FindBin::Bin/../lib"; ### points to ~/mydir1/lib
977a9ca3 709
710Put this before any BEGIN { ... } blocks that require the modules you installed.
711
53699c99 712=head2 Differences when using this module under Win32
713
76f30678 714To set up the proper environment variables for your current session of
715C<CMD.exe>, you can use this:
716
730f5dda 717 C:\>perl -Mlocal::lib
e322149f 718 set PERL_MB_OPT=--install_base C:\DOCUME~1\ADMINI~1\perl5
730f5dda 719 set PERL_MM_OPT=INSTALL_BASE=C:\DOCUME~1\ADMINI~1\perl5
0d6470a5 720 set PERL5LIB=C:\DOCUME~1\ADMINI~1\perl5\lib\perl5
730f5dda 721 set PATH=C:\DOCUME~1\ADMINI~1\perl5\bin;%PATH%
8522f4d5 722
898f36cf 723 ### To set the environment for this shell alone
d4ccf2ea 724 C:\>perl -Mlocal::lib > %TEMP%\tmp.bat && %TEMP%\tmp.bat && del %TEMP%\tmp.bat
730f5dda 725 ### instead of $(perl -Mlocal::lib=./)
53699c99 726
727If you want the environment entries to persist, you'll need to add then to the
76f30678 728Control Panel's System applet yourself or use L<App::local::lib::Win32Helper>.
53699c99 729
730The "~" is translated to the user's profile directory (the directory named for
731the user under "Documents and Settings" (Windows XP or earlier) or "Users"
9bc0788f 732(Windows Vista or later)) unless $ENV{HOME} exists. After that, the home
53699c99 733directory is translated to a short name (which means the directory must exist)
734and the subdirectories are created.
735
730f5dda 736=head1 RATIONALE
737
738The version of a Perl package on your machine is not always the version you
739need. Obviously, the best thing to do would be to update to the version you
740need. However, you might be in a situation where you're prevented from doing
741this. Perhaps you don't have system administrator privileges; or perhaps you
742are using a package management system such as Debian, and nobody has yet gotten
743around to packaging up the version you need.
744
745local::lib solves this problem by allowing you to create your own directory of
746Perl packages downloaded from CPAN (in a multi-user system, this would typically
747be within your own home directory). The existing system Perl installation is
748not affected; you simply invoke Perl with special options so that Perl uses the
749packages in your own local package directory rather than the system packages.
750local::lib arranges things so that your locally installed version of the Perl
751packages takes precedence over the system installation.
752
753If you are using a package management system (such as Debian), you don't need to
754worry about Debian and CPAN stepping on each other's toes. Your local version
755of the packages will be written to an entirely separate directory from those
8522f4d5 756installed by Debian.
730f5dda 757
618272fe 758=head1 DESCRIPTION
759
760This module provides a quick, convenient way of bootstrapping a user-local Perl
761module library located within the user's home directory. It also constructs and
762prints out for the user the list of environment variables using the syntax
763appropriate for the user's current shell (as specified by the C<SHELL>
730f5dda 764environment variable), suitable for directly adding to one's shell
765configuration file.
766
767More generally, local::lib allows for the bootstrapping and usage of a
768directory containing Perl modules outside of Perl's C<@INC>. This makes it
769easier to ship an application with an app-specific copy of a Perl module, or
770collection of modules. Useful in cases like when an upstream maintainer hasn't
771applied a patch to a module of theirs that you need for your application.
1bc71e56 772
773On import, local::lib sets the following environment variables to appropriate
774values:
775
776=over 4
777
e322149f 778=item PERL_MB_OPT
1bc71e56 779
780=item PERL_MM_OPT
781
782=item PERL5LIB
783
784=item PATH
785
1bc71e56 786=back
787
0d6470a5 788When possible, these will be appended to instead of overwritten entirely.
789
1bc71e56 790These values are then available for reference by any code after import.
791
b0c48f8e 792=head1 CREATING A SELF-CONTAINED SET OF MODULES
793
a949ebcd 794See L<lib::core::only> for one way to do this - but note that
d8b1a404 795there are a number of caveats, and the best approach is always to perform a
796build against a clean perl (i.e. site and vendor as close to empty as possible).
b0c48f8e 797
480534a8 798=head1 OPTIONS
799
800Options are values that can be passed to the C<local::lib> import besides the
801directory to use. They are specified as C<use local::lib '--option'[, path];>
802or C<perl -Mlocal::lib=--option[,path]>.
803
804=head2 --deactivate
805
806Remove the chosen path (or the default path) from the module search paths if it
807was added by C<local::lib>, instead of adding it.
808
809=head2 --deactivate-all
810
811Remove all directories that were added to search paths by C<local::lib> from the
812search paths.
813
480e6e85 814=head1 METHODS
815
a949ebcd 816=head2 ensure_dir_structure_for
480e6e85 817
818=over 4
819
a949ebcd 820=item Arguments: $path
821
822=item Return value: None
480e6e85 823
824=back
825
826Attempts to create the given path, and all required parent directories. Throws
827an exception on failure.
828
829=head2 print_environment_vars_for
830
831=over 4
832
a949ebcd 833=item Arguments: $path
834
835=item Return value: None
480e6e85 836
837=back
838
839Prints to standard output the variables listed above, properly set to use the
840given path as the base directory.
841
a949ebcd 842=head2 build_environment_vars_for
843
844=over 4
845
846=item Arguments: $path, $interpolate
847
9f9da00a 848=item Return value: %environment_vars
a949ebcd 849
850=back
851
291b5a3a 852Returns a hash with the variables listed above, properly set to use the
853given path as the base directory.
854
480e6e85 855=head2 setup_env_hash_for
856
857=over 4
858
a949ebcd 859=item Arguments: $path
860
861=item Return value: None
480e6e85 862
863=back
864
865Constructs the C<%ENV> keys for the given path, by calling
a949ebcd 866L</build_environment_vars_for>.
480e6e85 867
5a63c13e 868=head2 active_paths
869
870=over 4
871
872=item Arguments: None
873
874=item Return value: @paths
875
876=back
877
878Returns a list of active C<local::lib> paths, according to the
24351831 879C<PERL_LOCAL_LIB_ROOT> environment variable and verified against
880what is really in C<@INC>.
5a63c13e 881
480e6e85 882=head2 install_base_perl_path
883
884=over 4
885
a949ebcd 886=item Arguments: $path
887
888=item Return value: $install_base_perl_path
480e6e85 889
890=back
891
892Returns a path describing where to install the Perl modules for this local
893library installation. Appends the directories C<lib> and C<perl5> to the given
894path.
895
480e6e85 896=head2 install_base_bin_path
897
898=over 4
899
a949ebcd 900=item Arguments: $path
901
902=item Return value: $install_base_bin_path
480e6e85 903
904=back
905
906Returns a path describing where to install the executable programs for this
9f9da00a 907local library installation. Appends the directory C<bin> to the given path.
480e6e85 908
480e6e85 909=head2 resolve_empty_path
910
911=over 4
912
a949ebcd 913=item Arguments: $path
914
915=item Return value: $base_path
480e6e85 916
917=back
918
919Builds and returns the base path into which to set up the local module
920installation. Defaults to C<~/perl5>.
921
922=head2 resolve_home_path
923
924=over 4
925
a949ebcd 926=item Arguments: $path
927
928=item Return value: $home_path
480e6e85 929
930=back
931
932Attempts to find the user's home directory. If installed, uses C<File::HomeDir>
933for this purpose. If no definite answer is available, throws an exception.
934
935=head2 resolve_relative_path
936
937=over 4
938
a949ebcd 939=item Arguments: $path
940
941=item Return value: $absolute_path
480e6e85 942
943=back
944
945Translates the given path into an absolute path.
946
947=head2 resolve_path
948
949=over 4
950
a949ebcd 951=item Arguments: $path
952
953=item Return value: $absolute_path
480e6e85 954
955=back
956
957Calls the following in a pipeline, passing the result from the previous to the
958next, in an attempt to find where to configure the environment for a local
959library installation: L</resolve_empty_path>, L</resolve_home_path>,
960L</resolve_relative_path>. Passes the given path argument to
961L</resolve_empty_path> which then returns a result that is passed to
962L</resolve_home_path>, which then has its result passed to
963L</resolve_relative_path>. The result of this final call is returned from
964L</resolve_path>.
965
0fb70b9a 966=head1 A WARNING ABOUT UNINST=1
967
968Be careful about using local::lib in combination with "make install UNINST=1".
969The idea of this feature is that will uninstall an old version of a module
970before installing a new one. However it lacks a safety check that the old
971version and the new version will go in the same directory. Used in combination
972with local::lib, you can potentially delete a globally accessible version of a
381738d7 973module while installing the new version in a local place. Only combine "make
0fb70b9a 974install UNINST=1" and local::lib if you understand these possible consequences.
975
dc8ddd06 976=head1 LIMITATIONS
977
788ea146 978=over 4
979
0d6470a5 980=item * Directory names with spaces in them are not well supported by the perl
981toolchain and the programs it uses. Pure-perl distributions should support
982spaces, but problems are more likely with dists that require compilation. A
983workaround you can do is moving your local::lib to a directory with spaces
984B<after> you installed all modules inside your local::lib bootstrap. But be
985aware that you can't update or install CPAN modules after the move.
47e70ca1 986
788ea146 987=item * Rather basic shell detection. Right now anything with csh in its name is
618272fe 988assumed to be a C shell or something compatible, and everything else is assumed
53699c99 989to be Bourne, except on Win32 systems. If the C<SHELL> environment variable is
990not set, a Bourne-compatible shell is assumed.
dc8ddd06 991
0d6470a5 992=item * Kills any existing PERL_MM_OPT or PERL_MB_OPT.
dc8ddd06 993
788ea146 994=item * Should probably auto-fixup CPAN config if not already done.
995
996=back
e423efce 997
dc8ddd06 998Patches very much welcome for any of the above.
bc30e1d5 999
788ea146 1000=over 4
1001
0d6470a5 1002=item * On Win32 systems, does not have a way to write the created environment
1003variables to the registry, so that they can persist through a reboot.
53699c99 1004
788ea146 1005=back
1006
9a021b2b 1007=head1 TROUBLESHOOTING
1008
1009If you've configured local::lib to install CPAN modules somewhere in to your
1010home directory, and at some point later you try to install a module with C<cpan
1011-i Foo::Bar>, but it fails with an error like: C<Warning: You do not have
1012permissions to install into /usr/lib64/perl5/site_perl/5.8.8/x86_64-linux at
1013/usr/lib64/perl5/5.8.8/Foo/Bar.pm> and buried within the install log is an
1014error saying C<'INSTALL_BASE' is not a known MakeMaker parameter name>, then
1015you've somehow lost your updated ExtUtils::MakeMaker module.
1016
1017To remedy this situation, rerun the bootstrapping procedure documented above.
1018
1019Then, run C<rm -r ~/.cpan/build/Foo-Bar*>
1020
1021Finally, re-run C<cpan -i Foo::Bar> and it should install without problems.
1022
618272fe 1023=head1 ENVIRONMENT
1024
1025=over 4
1026
1027=item SHELL
1028
53699c99 1029=item COMSPEC
1030
618272fe 1031local::lib looks at the user's C<SHELL> environment variable when printing out
1032commands to add to the shell configuration file.
1033
53699c99 1034On Win32 systems, C<COMSPEC> is also examined.
1035
618272fe 1036=back
1037
163f162c 1038=head1 SEE ALSO
1039
1040=over 4
1041
1042=item * L<Perl Advent article, 2011|http://perladvent.org/2011/2011-12-01.html>
1043
1044=back
1045
cc19e8d4 1046=head1 SUPPORT
1047
1048IRC:
1049
1050 Join #local-lib on irc.perl.org.
1051
b5cc15f7 1052=head1 AUTHOR
1053
1054Matt S Trout <mst@shadowcat.co.uk> http://www.shadowcat.co.uk/
1055
d6b71a2d 1056auto_install fixes kindly sponsored by http://www.takkle.com/
1057
b5c1154d 1058=head1 CONTRIBUTORS
1059
1060Patches to correctly output commands for csh style shells, as well as some
1061documentation additions, contributed by Christopher Nehren <apeiron@cpan.org>.
1062
cc19e8d4 1063Doc patches for a custom local::lib directory, more cleanups in the english
0d6470a5 1064documentation and a L<german documentation|POD2::DE::local::lib> contributed by
1065Torsten Raudssus <torsten@raudssus.de>.
8b1e8e69 1066
be160790 1067Hans Dieter Pearcey <hdp@cpan.org> sent in some additional tests for ensuring
9a021b2b 1068things will install properly, submitted a fix for the bug causing problems with
1069writing Makefiles during bootstrapping, contributed an example program, and
1070submitted yet another fix to ensure that local::lib can install and bootstrap
1071properly. Many, many thanks!
1072
1073pattern of Freenode IRC contributed the beginnings of the Troubleshooting
1074section. Many thanks!
be160790 1075
53699c99 1076Patch to add Win32 support contributed by Curtis Jewell <csjewell@cpan.org>.
1077
03b91976 1078Warnings for missing PATH/PERL5LIB (as when not running interactively) silenced
1079by a patch from Marco Emilio Poleggi.
1080
1f8043c8 1081Mark Stosberg <mark@summersault.com> provided the code for the now deleted
1082'--self-contained' option.
1083
76f30678 1084Documentation patches to make win32 usage clearer by
1085David Mertens <dcmertens.perl@gmail.com> (run4flat).
1086
0d6470a5 1087Brazilian L<portuguese translation|POD2::PT_BR::local::lib> and minor doc
1088patches contributed by Breno G. de Oliveira <garu@cpan.org>.
ccf362c0 1089
a0b3d98a 1090Improvements to stacking multiple local::lib dirs and removing them from the
1091environment later on contributed by Andrew Rodland <arodland@cpan.org>.
1092
0d6470a5 1093Patch for Carp version mismatch contributed by Hakim Cassimally
1094<osfameron@cpan.org>.
cd3eb741 1095
7c0db165 1096=head1 COPYRIGHT
1097
cc19e8d4 1098Copyright (c) 2007 - 2010 the local::lib L</AUTHOR> and L</CONTRIBUTORS> as
7c0db165 1099listed above.
1100
b5cc15f7 1101=head1 LICENSE
1102
73c9a8ad 1103This is free software; you can redistribute it and/or modify it under
1104the same terms as the Perl 5 programming language system itself.
b5cc15f7 1105
1106=cut