don't blindly untaint @INC
[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);
b5cc15f7 69}
70
5b94dce5 71sub pipeline;
b5cc15f7 72
5b94dce5 73sub pipeline {
b5cc15f7 74 my @methods = @_;
75 my $last = pop(@methods);
76 if (@methods) {
77 \sub {
78 my ($obj, @args) = @_;
5b94dce5 79 $obj->${pipeline @methods}(
b5cc15f7 80 $obj->$last(@args)
81 );
82 };
83 } else {
84 \sub {
85 shift->$last(@_);
86 };
87 }
88}
89
275c9dae 90=begin testing
91
92#:: test pipeline
b5cc15f7 93
94package local::lib;
95
96{ package Foo; sub foo { -$_[1] } sub bar { $_[1]+2 } sub baz { $_[1]+3 } }
8522f4d5 97my $foo = bless({}, 'Foo');
4c375968 98Test::More::ok($foo->${pipeline qw(foo bar baz)}(10) == -15);
b5cc15f7 99
275c9dae 100=end testing
101
b5cc15f7 102=cut
103
a9489cb0 104sub _uniq {
105 my %seen;
106 grep { ! $seen{$_}++ } @_;
107}
108
b5cc15f7 109sub resolve_path {
110 my ($class, $path) = @_;
5b94dce5 111 $class->${pipeline qw(
b5cc15f7 112 resolve_relative_path
113 resolve_home_path
114 resolve_empty_path
115 )}($path);
116}
117
118sub resolve_empty_path {
119 my ($class, $path) = @_;
120 if (defined $path) {
121 $path;
122 } else {
123 '~/perl5';
124 }
125}
126
275c9dae 127=begin testing
128
129#:: test classmethod setup
b5cc15f7 130
131my $c = 'local::lib';
132
275c9dae 133=end testing
134
135=begin testing
b5cc15f7 136
275c9dae 137#:: test classmethod
b5cc15f7 138
139is($c->resolve_empty_path, '~/perl5');
140is($c->resolve_empty_path('foo'), 'foo');
141
275c9dae 142=end testing
143
b5cc15f7 144=cut
145
146sub resolve_home_path {
147 my ($class, $path) = @_;
148 return $path unless ($path =~ /^~/);
149 my ($user) = ($path =~ /^~([^\/]+)/); # can assume ^~ so undef for 'us'
b5cc15f7 150 my $homedir = do {
5c957a4b 151 if (!defined $user && defined $ENV{HOME}) {
152 $ENV{HOME}
153 }
154 else {
155 require File::Glob;
156 File::Glob::bsd_glob("~$user", File::Glob::GLOB_TILDE());
b5cc15f7 157 }
158 };
159 unless (defined $homedir) {
cd3eb741 160 require Carp;
b5cc15f7 161 Carp::croak(
162 "Couldn't resolve homedir for "
163 .(defined $user ? $user : 'current user')
b5cc15f7 164 );
165 }
166 $path =~ s/^~[^\/]*/$homedir/;
167 $path;
168}
169
170sub resolve_relative_path {
171 my ($class, $path) = @_;
53699c99 172 $path = File::Spec->rel2abs($path);
b5cc15f7 173}
174
275c9dae 175=begin testing
176
177#:: test classmethod
b5cc15f7 178
179local *File::Spec::rel2abs = sub { shift; 'FOO'.shift; };
180is($c->resolve_relative_path('bar'),'FOObar');
181
275c9dae 182=end testing
183
b5cc15f7 184=cut
185
186sub setup_local_lib_for {
4c718913 187 my ($class, $path, $deactivating) = @_;
3939a7ae 188
189 my $interpolate = LITERAL_ENV;
190 my @active_lls = $class->active_paths;
191
f22d40d7 192 $class->ensure_dir_structure_for($path)
193 unless $deactivating;
c1ed5f4b 194
195 # On Win32 directories often contain spaces. But some parts of the CPAN
196 # toolchain don't like that. To avoid this, GetShortPathName() gives us
197 # an alternate representation that has none.
198 # This only works if the directory already exists.
199 $path = Win32::GetShortPathName($path) if $^O eq 'MSWin32';
82efaec7 200
3939a7ae 201 if (! $deactivating) {
a27f7456 202 if (@active_lls && $active_lls[0] eq $path) {
3939a7ae 203 exit 0 if $0 eq '-';
204 return; # Asked to add what's already at the top of the stack
205 } elsif (grep { $_ eq $path} @active_lls) {
206 # Asked to add a dir that's lower in the stack -- so we remove it from
207 # where it is, and then add it back at the top.
208 $class->setup_env_hash_for($path, DEACTIVATE_ONE);
209 # Which means we can no longer output "PERL5LIB=...:$PERL5LIB" stuff
210 # anymore because we're taking something *out*.
211 $interpolate = INTERPOLATE_ENV;
212 }
213 }
214
b5cc15f7 215 if ($0 eq '-') {
3939a7ae 216 $class->print_environment_vars_for($path, $deactivating, $interpolate);
b5cc15f7 217 exit 0;
218 } else {
4c718913 219 $class->setup_env_hash_for($path, $deactivating);
cdd450c5 220 my $arch_dir = $Config{archname};
221 @INC = _uniq(
c50d554b 222 (
223 # Inject $path/$archname for each path in PERL5LIB
224 map { ( File::Spec->catdir($_, $arch_dir), $_ ) }
225 split($Config{path_sep}, $ENV{PERL5LIB})
226 ),
227 @INC
cdd450c5 228 );
b5cc15f7 229 }
230}
231
b5cc15f7 232sub install_base_bin_path {
233 my ($class, $path) = @_;
234 File::Spec->catdir($path, 'bin');
235}
236
237sub install_base_perl_path {
238 my ($class, $path) = @_;
239 File::Spec->catdir($path, 'lib', 'perl5');
240}
241
242sub install_base_arch_path {
243 my ($class, $path) = @_;
244 File::Spec->catdir($class->install_base_perl_path($path), $Config{archname});
245}
246
247sub ensure_dir_structure_for {
248 my ($class, $path) = @_;
249 unless (-d $path) {
250 warn "Attempting to create directory ${path}\n";
251 }
5c957a4b 252 require File::Basename;
253 my @dirs;
254 while(!-d $path) {
255 push @dirs, $path;
256 $path = File::Basename::dirname($path);
257 }
258 mkdir $_ for reverse @dirs;
259 return;
b5cc15f7 260}
261
0d6470a5 262=begin testing
263
264#:: test classmethod
265
266File::Path::rmtree('t/var/splat');
267
268$c->ensure_dir_structure_for('t/var/splat');
269
270ok(-d 't/var/splat');
271
272=end testing
273
274=cut
275
c4e3c83b 276sub guess_shelltype {
0353dbc0 277 my $shellbin = 'sh';
278 if(defined $ENV{'SHELL'}) {
279 my @shell_bin_path_parts = File::Spec->splitpath($ENV{'SHELL'});
280 $shellbin = $shell_bin_path_parts[-1];
281 }
1bc71e56 282 my $shelltype = do {
283 local $_ = $shellbin;
b42496e0 284 if(/csh/) {
1bc71e56 285 'csh'
b42496e0 286 } else {
1bc71e56 287 'bourne'
288 }
289 };
290
f58534b1 291 # Both Win32 and Cygwin have $ENV{COMSPEC} set.
292 if (defined $ENV{'COMSPEC'} && $^O ne 'cygwin') {
53699c99 293 my @shell_bin_path_parts = File::Spec->splitpath($ENV{'COMSPEC'});
294 $shellbin = $shell_bin_path_parts[-1];
295 $shelltype = do {
296 local $_ = $shellbin;
297 if(/command\.com/) {
298 'win32'
299 } elsif(/cmd\.exe/) {
300 'win32'
301 } elsif(/4nt\.exe/) {
302 'win32'
303 } else {
304 $shelltype
305 }
306 };
307 }
c4e3c83b 308 return $shelltype;
309}
310
311sub print_environment_vars_for {
3939a7ae 312 my ($class, $path, $deactivating, $interpolate) = @_;
313 print $class->environment_vars_string_for($path, $deactivating, $interpolate);
8cc924b8 314}
315
316sub environment_vars_string_for {
3939a7ae 317 my ($class, $path, $deactivating, $interpolate) = @_;
318 my @envs = $class->build_environment_vars_for($path, $deactivating, $interpolate);
c4e3c83b 319 my $out = '';
320
321 # rather basic csh detection, goes on the assumption that something won't
322 # call itself csh unless it really is. also, default to bourne in the
323 # pathological situation where a user doesn't have $ENV{SHELL} defined.
324 # note also that shells with funny names, like zoid, are assumed to be
325 # bourne.
326
327 my $shelltype = $class->guess_shelltype;
53699c99 328
b5cc15f7 329 while (@envs) {
330 my ($name, $value) = (shift(@envs), shift(@envs));
4c718913 331 $value =~ s/(\\")/\\$1/g if defined $value;
1bc71e56 332 $out .= $class->${\"build_${shelltype}_env_declaration"}($name, $value);
b5cc15f7 333 }
8cc924b8 334 return $out;
b5cc15f7 335}
336
1bc71e56 337# simple routines that take two arguments: an %ENV key and a value. return
338# strings that are suitable for passing directly to the relevant shell to set
339# said key to said value.
340sub build_bourne_env_declaration {
341 my $class = shift;
342 my($name, $value) = @_;
4c718913 343 return defined($value) ? qq{export ${name}="${value}";\n} : qq{unset ${name};\n};
1bc71e56 344}
345
346sub build_csh_env_declaration {
347 my $class = shift;
348 my($name, $value) = @_;
2d98051c 349 return defined($value) ? qq{setenv ${name} "${value}";\n} : qq{unsetenv ${name};\n};
1bc71e56 350}
351
53699c99 352sub build_win32_env_declaration {
353 my $class = shift;
354 my($name, $value) = @_;
4c718913 355 return defined($value) ? qq{set ${name}=${value}\n} : qq{set ${name}=\n};
53699c99 356}
357
b5cc15f7 358sub setup_env_hash_for {
4c718913 359 my ($class, $path, $deactivating) = @_;
360 my %envs = $class->build_environment_vars_for($path, $deactivating, INTERPOLATE_ENV);
b5cc15f7 361 @ENV{keys %envs} = values %envs;
362}
363
364sub build_environment_vars_for {
4c718913 365 my ($class, $path, $deactivating, $interpolate) = @_;
366
ee0e1840 367 if ($deactivating && $deactivating == DEACTIVATE_ONE) {
4c718913 368 return $class->build_deactivate_environment_vars_for($path, $interpolate);
ee0e1840 369 } elsif ($deactivating && $deactivating == DEACTIVATE_ALL) {
15f79556 370 return $class->build_deact_all_environment_vars_for($path, $interpolate);
4c718913 371 } else {
372 return $class->build_activate_environment_vars_for($path, $interpolate);
373 }
374}
375
1bf7d892 376# Build an environment value for a variable like PATH from a list of paths.
377# References to existing variables are given as references to the variable name.
378# Duplicates are removed.
379#
380# options:
381# - interpolate: INTERPOLATE_ENV/LITERAL_ENV
382# - exists: paths are included only if they exist (default: interpolate == INTERPOLATE_ENV)
383# - filter: function to apply to each path do decide if it must be included
384# - empty: the value to return in the case of empty value
f878d9c1 385my %ENV_LIST_VALUE_DEFAULTS = (
1bf7d892 386 interpolate => INTERPOLATE_ENV,
387 exists => undef,
388 filter => sub { 1 },
389 empty => undef,
390);
48eb676f 391sub _env_list_value {
1bf7d892 392 my $options = shift;
393 die(sprintf "unknown option '$_' at %s line %u\n", (caller)[1..2])
f878d9c1 394 for grep { !exists $ENV_LIST_VALUE_DEFAULTS{$_} } keys %$options;
395 my %options = (%ENV_LIST_VALUE_DEFAULTS, %{ $options });
1bf7d892 396 $options{exists} = $options{interpolate} == INTERPOLATE_ENV
397 unless defined $options{exists};
398
399 my %seen;
400
401 my $value = join($Config{path_sep}, map {
402 ref $_ ? ($^O eq 'MSWin32' ? "%${$_}%" : "\$${$_}") : $_
403 } grep {
404 ref $_ || (defined $_
405 && length($_) > 0
406 && !$seen{$_}++
407 && $options{filter}->($_)
408 && (!$options{exists} || -e $_))
409 } map {
410 if (ref $_ eq 'SCALAR' && $options{interpolate} == INTERPOLATE_ENV) {
373b3c18 411 defined $ENV{${$_}} ? (split /\Q$Config{path_sep}/, $ENV{${$_}}) : ()
1bf7d892 412 } else {
413 $_
414 }
415 } @_);
416 return length($value) ? $value : $options{empty};
417}
418
4c718913 419sub build_activate_environment_vars_for {
b5cc15f7 420 my ($class, $path, $interpolate) = @_;
421 return (
1bf7d892 422 PERL_LOCAL_LIB_ROOT =>
423 _env_list_value(
424 { interpolate => $interpolate, exists => 0, empty => '' },
1bf7d892 425 $path,
a27f7456 426 \'PERL_LOCAL_LIB_ROOT',
393c618d 427 ),
c4f03552 428 $class->installer_options_for($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
93b577b5 443sub _mm_escape_path {
444 my $path = shift;
445 $path =~ s/\\/\\\\\\\\/g;
446 if ($path =~ s/ /\\ /g) {
447 $path = qq{"\\"$path\\""};
448 }
449 return $path;
450}
451
452sub _mb_escape_path {
453 my $path = shift;
454 $path =~ s/\\/\\\\/g;
455 return qq{"$path"};
456}
457
29500601 458sub active_paths {
459 my ($class) = @_;
460
461 return () unless defined $ENV{PERL_LOCAL_LIB_ROOT};
24351831 462
463 return grep {
464 # screen out entries that aren't actually reflected in @INC
465 my $active_ll = $class->install_base_perl_path($_);
466 grep { $_ eq $active_ll } @INC
467 }
468 grep { $_ ne '' }
469 split /\Q$Config{path_sep}\E/, $ENV{PERL_LOCAL_LIB_ROOT};
29500601 470}
471
4c718913 472sub build_deactivate_environment_vars_for {
473 my ($class, $path, $interpolate) = @_;
474
29500601 475 my @active_lls = $class->active_paths;
4c718913 476
477 if (!grep { $_ eq $path } @active_lls) {
478 warn "Tried to deactivate inactive local::lib '$path'\n";
479 return ();
480 }
481
1bf7d892 482 my $perl_path = $class->install_base_perl_path($path);
1bf7d892 483 my $bin_path = $class->install_base_bin_path($path);
484
4c718913 485
486 my %env = (
1bf7d892 487 PERL_LOCAL_LIB_ROOT => _env_list_value(
488 {
489 exists => 0,
490 },
491 grep { $_ ne $path } @active_lls
4c718913 492 ),
1bf7d892 493 PERL5LIB => _env_list_value(
494 {
495 exists => 0,
496 filter => sub {
2164a41e 497 $_ ne $perl_path
1bf7d892 498 },
499 },
500 \'PERL5LIB',
4c718913 501 ),
1bf7d892 502 PATH => _env_list_value(
503 {
504 exists => 0,
505 filter => sub { $_ ne $bin_path },
506 },
507 \'PATH',
4c718913 508 ),
509 );
510
511 # If removing ourselves from the "top of the stack", set install paths to
512 # correspond with the new top of stack.
a27f7456 513 if ($active_lls[0] eq $path) {
514 my $new_top = $active_lls[1];
c4f03552 515 my %opts = $class->installer_options_for($new_top);
516 $env{keys %opts} = values %opts;
4c718913 517 }
518
519 return %env;
520}
521
c4f03552 522sub installer_options_for {
523 my ($class, $path) = @_;
524 return (
525 PERL_MM_OPT => defined $path ? "INSTALL_BASE="._mm_escape_path($path) : undef,
526 PERL_MB_OPT => defined $path ? "--install_base "._mb_escape_path($path) : undef,
527 )
528}
529
15f79556 530sub build_deact_all_environment_vars_for {
531 my ($class, $path, $interpolate) = @_;
532
29500601 533 my @active_lls = $class->active_paths;
15f79556 534
1bf7d892 535 my %perl_paths = map { (
536 $class->install_base_perl_path($_) => 1,
1bf7d892 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
9f9da00a 850=item Return value: %environment_vars
a949ebcd 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
480e6e85 898=head2 install_base_bin_path
899
900=over 4
901
a949ebcd 902=item Arguments: $path
903
904=item Return value: $install_base_bin_path
480e6e85 905
906=back
907
908Returns a path describing where to install the executable programs for this
9f9da00a 909local library installation. Appends the directory C<bin> to the given path.
480e6e85 910
480e6e85 911=head2 resolve_empty_path
912
913=over 4
914
a949ebcd 915=item Arguments: $path
916
917=item Return value: $base_path
480e6e85 918
919=back
920
921Builds and returns the base path into which to set up the local module
922installation. Defaults to C<~/perl5>.
923
924=head2 resolve_home_path
925
926=over 4
927
a949ebcd 928=item Arguments: $path
929
930=item Return value: $home_path
480e6e85 931
932=back
933
934Attempts to find the user's home directory. If installed, uses C<File::HomeDir>
935for this purpose. If no definite answer is available, throws an exception.
936
937=head2 resolve_relative_path
938
939=over 4
940
a949ebcd 941=item Arguments: $path
942
943=item Return value: $absolute_path
480e6e85 944
945=back
946
947Translates the given path into an absolute path.
948
949=head2 resolve_path
950
951=over 4
952
a949ebcd 953=item Arguments: $path
954
955=item Return value: $absolute_path
480e6e85 956
957=back
958
959Calls the following in a pipeline, passing the result from the previous to the
960next, in an attempt to find where to configure the environment for a local
961library installation: L</resolve_empty_path>, L</resolve_home_path>,
962L</resolve_relative_path>. Passes the given path argument to
963L</resolve_empty_path> which then returns a result that is passed to
964L</resolve_home_path>, which then has its result passed to
965L</resolve_relative_path>. The result of this final call is returned from
966L</resolve_path>.
967
0fb70b9a 968=head1 A WARNING ABOUT UNINST=1
969
970Be careful about using local::lib in combination with "make install UNINST=1".
971The idea of this feature is that will uninstall an old version of a module
972before installing a new one. However it lacks a safety check that the old
973version and the new version will go in the same directory. Used in combination
974with local::lib, you can potentially delete a globally accessible version of a
381738d7 975module while installing the new version in a local place. Only combine "make
0fb70b9a 976install UNINST=1" and local::lib if you understand these possible consequences.
977
dc8ddd06 978=head1 LIMITATIONS
979
788ea146 980=over 4
981
0d6470a5 982=item * Directory names with spaces in them are not well supported by the perl
983toolchain and the programs it uses. Pure-perl distributions should support
984spaces, but problems are more likely with dists that require compilation. A
985workaround you can do is moving your local::lib to a directory with spaces
986B<after> you installed all modules inside your local::lib bootstrap. But be
987aware that you can't update or install CPAN modules after the move.
47e70ca1 988
788ea146 989=item * Rather basic shell detection. Right now anything with csh in its name is
618272fe 990assumed to be a C shell or something compatible, and everything else is assumed
53699c99 991to be Bourne, except on Win32 systems. If the C<SHELL> environment variable is
992not set, a Bourne-compatible shell is assumed.
dc8ddd06 993
0d6470a5 994=item * Kills any existing PERL_MM_OPT or PERL_MB_OPT.
dc8ddd06 995
788ea146 996=item * Should probably auto-fixup CPAN config if not already done.
997
998=back
e423efce 999
dc8ddd06 1000Patches very much welcome for any of the above.
bc30e1d5 1001
788ea146 1002=over 4
1003
0d6470a5 1004=item * On Win32 systems, does not have a way to write the created environment
1005variables to the registry, so that they can persist through a reboot.
53699c99 1006
788ea146 1007=back
1008
9a021b2b 1009=head1 TROUBLESHOOTING
1010
1011If you've configured local::lib to install CPAN modules somewhere in to your
1012home directory, and at some point later you try to install a module with C<cpan
1013-i Foo::Bar>, but it fails with an error like: C<Warning: You do not have
1014permissions to install into /usr/lib64/perl5/site_perl/5.8.8/x86_64-linux at
1015/usr/lib64/perl5/5.8.8/Foo/Bar.pm> and buried within the install log is an
1016error saying C<'INSTALL_BASE' is not a known MakeMaker parameter name>, then
1017you've somehow lost your updated ExtUtils::MakeMaker module.
1018
1019To remedy this situation, rerun the bootstrapping procedure documented above.
1020
1021Then, run C<rm -r ~/.cpan/build/Foo-Bar*>
1022
1023Finally, re-run C<cpan -i Foo::Bar> and it should install without problems.
1024
618272fe 1025=head1 ENVIRONMENT
1026
1027=over 4
1028
1029=item SHELL
1030
53699c99 1031=item COMSPEC
1032
618272fe 1033local::lib looks at the user's C<SHELL> environment variable when printing out
1034commands to add to the shell configuration file.
1035
53699c99 1036On Win32 systems, C<COMSPEC> is also examined.
1037
618272fe 1038=back
1039
163f162c 1040=head1 SEE ALSO
1041
1042=over 4
1043
1044=item * L<Perl Advent article, 2011|http://perladvent.org/2011/2011-12-01.html>
1045
1046=back
1047
cc19e8d4 1048=head1 SUPPORT
1049
1050IRC:
1051
1052 Join #local-lib on irc.perl.org.
1053
b5cc15f7 1054=head1 AUTHOR
1055
1056Matt S Trout <mst@shadowcat.co.uk> http://www.shadowcat.co.uk/
1057
d6b71a2d 1058auto_install fixes kindly sponsored by http://www.takkle.com/
1059
b5c1154d 1060=head1 CONTRIBUTORS
1061
1062Patches to correctly output commands for csh style shells, as well as some
1063documentation additions, contributed by Christopher Nehren <apeiron@cpan.org>.
1064
cc19e8d4 1065Doc patches for a custom local::lib directory, more cleanups in the english
0d6470a5 1066documentation and a L<german documentation|POD2::DE::local::lib> contributed by
1067Torsten Raudssus <torsten@raudssus.de>.
8b1e8e69 1068
be160790 1069Hans Dieter Pearcey <hdp@cpan.org> sent in some additional tests for ensuring
9a021b2b 1070things will install properly, submitted a fix for the bug causing problems with
1071writing Makefiles during bootstrapping, contributed an example program, and
1072submitted yet another fix to ensure that local::lib can install and bootstrap
1073properly. Many, many thanks!
1074
1075pattern of Freenode IRC contributed the beginnings of the Troubleshooting
1076section. Many thanks!
be160790 1077
53699c99 1078Patch to add Win32 support contributed by Curtis Jewell <csjewell@cpan.org>.
1079
03b91976 1080Warnings for missing PATH/PERL5LIB (as when not running interactively) silenced
1081by a patch from Marco Emilio Poleggi.
1082
1f8043c8 1083Mark Stosberg <mark@summersault.com> provided the code for the now deleted
1084'--self-contained' option.
1085
76f30678 1086Documentation patches to make win32 usage clearer by
1087David Mertens <dcmertens.perl@gmail.com> (run4flat).
1088
0d6470a5 1089Brazilian L<portuguese translation|POD2::PT_BR::local::lib> and minor doc
1090patches contributed by Breno G. de Oliveira <garu@cpan.org>.
ccf362c0 1091
a0b3d98a 1092Improvements to stacking multiple local::lib dirs and removing them from the
1093environment later on contributed by Andrew Rodland <arodland@cpan.org>.
1094
0d6470a5 1095Patch for Carp version mismatch contributed by Hakim Cassimally
1096<osfameron@cpan.org>.
cd3eb741 1097
7c0db165 1098=head1 COPYRIGHT
1099
cc19e8d4 1100Copyright (c) 2007 - 2010 the local::lib L</AUTHOR> and L</CONTRIBUTORS> as
7c0db165 1101listed above.
1102
b5cc15f7 1103=head1 LICENSE
1104
73c9a8ad 1105This is free software; you can redistribute it and/or modify it under
1106the same terms as the Perl 5 programming language system itself.
b5cc15f7 1107
1108=cut