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