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