test warning on directory creation
[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
c8d004f4 11our $VERSION = '2.000004'; # 2.0.4
d04dfa50 12$VERSION = eval $VERSION;
1f8043c8 13
b5cc15f7 14sub import {
0fb70b9a 15 my ($class, @args) = @_;
fe8aa69b 16 push @args, @ARGV
17 if $0 eq '-';
0fb70b9a 18
e4b5a839 19 my @steps;
db6f44a9 20 my %opts;
efeadddf 21 my $shelltype;
e4892f2b 22
e4b5a839 23 while (@args) {
24 my $arg = shift @args;
b9c94c15 25 # check for lethal dash first to stop processing before causing problems
5eff9c24 26 # the fancy dash is U+2212 or \xE2\x88\x92
27 if ($arg =~ /\xE2\x88\x92/ or $arg =~ /−/) {
d4dbe584 28 die <<'DEATH';
29WHOA THERE! It looks like you've got some fancy dashes in your commandline!
30These are *not* the traditional -- dashes that software recognizes. You
31probably got these by copy-pasting from the perldoc for this module as
32rendered by a UTF8-capable formatter. This most typically happens on an OS X
33terminal, but can happen elsewhere too. Please try again after replacing the
34dashes with normal minus signs.
35DEATH
b9c94c15 36 }
e4b5a839 37 elsif ($arg eq '--self-contained') {
67502693 38 die <<'DEATH';
39FATAL: The local::lib --self-contained flag has never worked reliably and the
40original author, Mark Stosberg, was unable or unwilling to maintain it. As
41such, this flag has been removed from the local::lib codebase in order to
42prevent misunderstandings and potentially broken builds. The local::lib authors
43recommend that you look at the lib::core::only module shipped with this
44distribution in order to create a more robust environment that is equivalent to
45what --self-contained provided (although quite possibly not what you originally
46thought it provided due to the poor quality of the documentation, for which we
47apologise).
48DEATH
e4b5a839 49 }
939821af 50 elsif( $arg =~ /^--deactivate(?:=(.*))?$/ ) {
51 my $path = defined $1 ? $1 : shift @args;
e4b5a839 52 push @steps, ['deactivate', $path];
b9c94c15 53 }
e4b5a839 54 elsif ( $arg eq '--deactivate-all' ) {
55 push @steps, ['deactivate_all'];
56 }
db6f44a9 57 elsif ( $arg =~ /^--shelltype(?:=(.*))?$/ ) {
efeadddf 58 $shelltype = defined $1 ? $1 : shift @args;
db6f44a9 59 }
80816e53 60 elsif ( $arg eq '--no-create' ) {
61 $opts{no_create} = 1;
62 }
e4b5a839 63 elsif ( $arg =~ /^--/ ) {
b9c94c15 64 die "Unknown import argument: $arg";
65 }
66 else {
e4b5a839 67 push @steps, ['activate', $arg];
b9c94c15 68 }
d4dbe584 69 }
e4b5a839 70 if (!@steps) {
71 push @steps, ['activate', undef];
72 }
73
db6f44a9 74 my $self = $class->new(%opts);
e4b5a839 75
76 for (@steps) {
77 my ($method, @args) = @$_;
78 $self = $self->$method(@args);
79 }
80
81 if ($0 eq '-') {
efeadddf 82 print $self->environment_vars_string($shelltype);
e4b5a839 83 exit 0;
84 }
85 else {
67734fdc 86 $self->setup_local_lib;
e4b5a839 87 }
88}
89
90sub new {
91 my $class = shift;
92 bless {@_}, $class;
93}
94
95sub clone {
96 my $self = shift;
97 bless {%$self, @_}, ref $self;
98}
99
100sub inc { $_[0]->{inc} ||= \@INC }
101sub libs { $_[0]->{libs} ||= [ \'PERL5LIB' ] }
102sub bins { $_[0]->{bins} ||= [ \'PATH' ] }
103sub roots { $_[0]->{roots} ||= [ \'PERL_LOCAL_LIB_ROOT' ] }
104sub extra { $_[0]->{extra} ||= {} }
105sub shelltype { $_[0]->{shelltype} ||= $_[0]->guess_shelltype }
80816e53 106sub no_create { $_[0]->{no_create} }
e4b5a839 107
108my $_archname = $Config{archname};
109my $_version = $Config{version};
110my @_inc_version_list = reverse split / /, $Config{inc_version_list};
111my $_path_sep = $Config{path_sep};
112
113sub _as_list {
114 my $list = shift;
115 grep length, map {
116 !(ref $_ && ref $_ eq 'SCALAR') ? $_ : (
117 defined $ENV{$$_} ? split(/\Q$_path_sep/, $ENV{$$_})
118 : ()
119 )
120 } ref $list ? @$list : $list;
121}
122sub _remove_from {
123 my ($list, @remove) = @_;
779c192a 124 return @$list
125 if !@remove;
e4b5a839 126 my %remove = map { $_ => 1 } @remove;
127 grep !$remove{$_}, _as_list($list);
128}
129
130my @_lib_subdirs = (
131 [$_version, $_archname],
132 [$_version],
133 [$_archname],
134 (@_inc_version_list ? \@_inc_version_list : ()),
135 [],
136);
137
138sub install_base_bin_path {
139 my ($class, $path) = @_;
140 return File::Spec->catdir($path, 'bin');
141}
142sub install_base_perl_path {
143 my ($class, $path) = @_;
144 return File::Spec->catdir($path, 'lib', 'perl5');
145}
146sub install_base_arch_path {
147 my ($class, $path) = @_;
148 File::Spec->catdir($class->install_base_perl_path($path), $_archname);
149}
150
151sub lib_paths_for {
152 my ($class, $path) = @_;
153 my $base = $class->install_base_perl_path($path);
154 return map { File::Spec->catdir($base, @$_) } @_lib_subdirs;
155}
156
157sub _mm_escape_path {
158 my $path = shift;
159 $path =~ s/\\/\\\\\\\\/g;
160 if ($path =~ s/ /\\ /g) {
161 $path = qq{"\\"$path\\""};
162 }
163 return $path;
164}
165
166sub _mb_escape_path {
167 my $path = shift;
168 $path =~ s/\\/\\\\/g;
169 return qq{"$path"};
170}
171
172sub installer_options_for {
173 my ($class, $path) = @_;
49c9e334 174 return (
67502693 175 PERL_MM_OPT =>
176 defined $path ? "INSTALL_BASE="._mm_escape_path($path) : undef,
177 PERL_MB_OPT =>
178 defined $path ? "--install_base "._mb_escape_path($path) : undef,
49c9e334 179 );
e4b5a839 180}
b9c94c15 181
e4b5a839 182sub active_paths {
183 my ($self) = @_;
184 $self = ref $self ? $self : $self->new;
185
186 return grep {
187 # screen out entries that aren't actually reflected in @INC
188 my $active_ll = $self->install_base_perl_path($_);
189 grep { $_ eq $active_ll } @{$self->inc};
190 } _as_list($self->roots);
191}
192
193
194sub deactivate {
195 my ($self, $path) = @_;
196 $self = $self->new unless ref $self;
197 $path = $self->resolve_path($path);
88b1d6df 198 $path = $self->normalize_path($path);
e4b5a839 199
200 my @active_lls = $self->active_paths;
201
202 if (!grep { $_ eq $path } @active_lls) {
203 warn "Tried to deactivate inactive local::lib '$path'\n";
fe125a69 204 return $self;
0fb70b9a 205 }
b9c94c15 206
e4b5a839 207 my %args = (
67502693 208 bins => [ _remove_from($self->bins,
209 $self->install_base_bin_path($path)) ],
210 libs => [ _remove_from($self->libs,
211 $self->install_base_perl_path($path)) ],
212 inc => [ _remove_from($self->inc,
213 $self->lib_paths_for($path)) ],
e4b5a839 214 roots => [ _remove_from($self->roots, $path) ],
215 );
216
49c9e334 217 $args{extra} = { $self->installer_options_for($args{roots}[0]) };
e4b5a839 218
219 $self->clone(%args);
220}
221
222sub deactivate_all {
223 my ($self) = @_;
224 $self = $self->new unless ref $self;
225
226 my @active_lls = $self->active_paths;
227
779c192a 228 my %args;
229 if (@active_lls) {
230 %args = (
231 bins => [ _remove_from($self->bins,
232 map $self->install_base_bin_path($_), @active_lls) ],
233 libs => [ _remove_from($self->libs,
234 map $self->install_base_perl_path($_), @active_lls) ],
235 inc => [ _remove_from($self->inc,
236 map $self->lib_paths_for($_), @active_lls) ],
237 roots => [ _remove_from($self->roots, @active_lls) ],
238 );
239 }
e4b5a839 240
49c9e334 241 $args{extra} = { $self->installer_options_for(undef) };
e4b5a839 242
243 $self->clone(%args);
244}
245
246sub activate {
247 my ($self, $path) = @_;
248 $self = $self->new unless ref $self;
249 $path = $self->resolve_path($path);
80816e53 250 $self->ensure_dir_structure_for($path)
251 unless $self->no_create;
e4b5a839 252
88b1d6df 253 $path = $self->normalize_path($path);
b209481c 254
e4b5a839 255 my @active_lls = $self->active_paths;
256
b37e5f4a 257 if (grep { $_ eq $path } @active_lls[1 .. $#active_lls]) {
e4b5a839 258 $self = $self->deactivate($path);
15f79556 259 }
e4b5a839 260
b37e5f4a 261 my %args;
262 if (!@active_lls || $active_lls[0] ne $path) {
263 %args = (
264 bins => [ $self->install_base_bin_path($path), @{$self->bins} ],
265 libs => [ $self->install_base_perl_path($path), @{$self->libs} ],
266 inc => [ $self->lib_paths_for($path), @{$self->inc} ],
267 roots => [ $path, @{$self->roots} ],
268 );
269 }
e4b5a839 270
49c9e334 271 $args{extra} = { $self->installer_options_for($path) };
e4b5a839 272
273 $self->clone(%args);
274}
275
88b1d6df 276sub normalize_path {
277 my ($self, $path) = @_;
278 $path = ( Win32::GetShortPathName($path) || $path )
279 if $^O eq 'MSWin32';
280 return $path;
281}
282
e4b5a839 283sub build_environment_vars_for {
67734fdc 284 my $self = $_[0]->new->activate($_[1]);
285 $self->build_environment_vars;
286}
287sub build_environment_vars {
288 my $self = shift;
e4b5a839 289 (
290 PATH => join($_path_sep, _as_list($self->bins)),
291 PERL5LIB => join($_path_sep, _as_list($self->libs)),
292 PERL_LOCAL_LIB_ROOT => join($_path_sep, _as_list($self->roots)),
293 %{$self->extra},
294 );
295}
296
297sub setup_local_lib_for {
67734fdc 298 my $self = $_[0]->new->activate($_[1]);
299 $self->setup_local_lib;
300}
301
302sub setup_local_lib {
303 my $self = shift;
304 $self->setup_env_hash;
e4b5a839 305 @INC = @{$self->inc};
306}
307
308sub setup_env_hash_for {
67734fdc 309 my $self = $_[0]->new->activate($_[1]);
310 $self->setup_env_hash;
311}
312sub setup_env_hash {
e4b5a839 313 my $self = shift;
67734fdc 314 my %env = $self->build_environment_vars;
e4b5a839 315 for my $key (keys %env) {
316 if (defined $env{$key}) {
317 $ENV{$key} = $env{$key};
318 }
319 else {
320 delete $ENV{$key};
321 }
15f79556 322 }
e4b5a839 323}
15f79556 324
e4b5a839 325sub print_environment_vars_for {
c6611e1c 326 print $_[0]->environment_vars_string_for(@_[1..$#_]);
e4b5a839 327}
328
329sub environment_vars_string_for {
67734fdc 330 my $self = $_[0]->new->activate($_[1]);
331 $self->environment_vars_string;
332}
333sub environment_vars_string {
efeadddf 334 my ($self, $shelltype) = @_;
335
336 $shelltype ||= $self->guess_shelltype;
e4b5a839 337
efeadddf 338 my $build_method = "build_${shelltype}_env_declaration";
e4b5a839 339
340 my @envs = (
341 PATH => $self->bins,
342 PERL5LIB => $self->libs,
343 PERL_LOCAL_LIB_ROOT => $self->roots,
344 %{$self->extra},
345 );
346 my $out = '';
347 while (@envs) {
348 my ($name, $value) = (shift(@envs), shift(@envs));
349 if (
350 ref $value
351 && @$value == 1
352 && ref $value->[0]
353 && ref $value->[0] eq 'SCALAR'
354 && ${$value->[0]} eq $name) {
355 next;
356 }
f39aa2f9 357 if (
358 !ref $value
359 and defined $value
360 ? (defined $ENV{$name} && $value eq $ENV{$name})
361 : !defined $ENV{$name}
b01292d6 362 ) {
f643299c 363 next;
364 }
e4b5a839 365 $out .= $self->$build_method($name, $value);
366 }
4e1bf182 367 my $wrap_method = 'wrap_' . $self->shelltype . '_output';
368 if ($self->can($wrap_method)) {
369 return $self->$wrap_method($out);
370 }
e4b5a839 371 return $out;
372}
373
374sub build_bourne_env_declaration {
375 my ($class, $name, $args) = @_;
cf6fe9d6 376 my $value = $class->_interpolate($args, '$%s', '"', '\\%s');
377
378 if (!defined $value) {
379 return qq{unset $name;\n};
4acde142 380 }
cf6fe9d6 381
382 $value =~ s/(^|\G|$_path_sep)\$$name$_path_sep/$1\$$name\${$name+$_path_sep}/g;
383 $value =~ s/$_path_sep\$$name$/\${$name+$_path_sep}\$$name/;
384
752af3ad 385 qq{${name}="$value";\nexport ${name};\n}
e4b5a839 386}
cf6fe9d6 387
e4b5a839 388sub build_csh_env_declaration {
389 my ($class, $name, $args) = @_;
cf6fe9d6 390 my ($value, @vars) = $class->_interpolate($args, '$%s', '"', '"\\%s"');
391 if (!defined $value) {
392 return qq{unsetenv $name;\n};
393 }
4acde142 394
395 my $out = '';
cf6fe9d6 396 for my $var (@vars) {
397 $out .= qq{if ! \$?$name setenv $name '';\n};
4acde142 398 }
cf6fe9d6 399
400 my $value_without = $value;
401 if ($value_without =~ s/(?:^|$_path_sep)\$$name(?:$_path_sep|$)//g) {
402 $out .= qq{if "\$$name" != '' setenv $name "$value";\n};
403 $out .= qq{if "\$$name" == '' };
4acde142 404 }
cf6fe9d6 405 $out .= qq{setenv $name "$value_without";\n};
406 return $out;
e4b5a839 407}
cf6fe9d6 408
e4b5a839 409sub build_cmd_env_declaration {
410 my ($class, $name, $args) = @_;
cf6fe9d6 411 my $value = $class->_interpolate($args, '%%%s%%', qr([()!^"<>&|]), '^%s');
412 if (!$value) {
413 return qq{\@set $name=\n};
414 }
415
416 my $out = '';
417 my $value_without = $value;
418 if ($value_without =~ s/(?:^|$_path_sep)%$name%(?:$_path_sep|$)//g) {
419 $out .= qq{\@if not "%$name%"=="" set $name=$value\n};
420 $out .= qq{\@if "%$name%"=="" };
421 }
422 $out .= qq{\@set $name=$value_without\n};
423 return $out;
e4b5a839 424}
cf6fe9d6 425
fbbea0e7 426sub build_powershell_env_declaration {
427 my ($class, $name, $args) = @_;
cf6fe9d6 428 my $value = $class->_interpolate($args, '$env:%s', '"', '`%s');
429
430 if (!$value) {
7302e8e7 431 return qq{Remove-Item -ErrorAction 0 Env:\\$name;\n};
cf6fe9d6 432 }
433
434 my $maybe_path_sep = qq{\$(if("\$env:$name"-eq""){""}else{"$_path_sep"})};
435 $value =~ s/(^|\G|$_path_sep)\$env:$name$_path_sep/$1\$env:$name"+$maybe_path_sep+"/g;
436 $value =~ s/$_path_sep\$env:$name$/"+$maybe_path_sep+\$env:$name+"/;
437
438 qq{\$env:$name = \$("$value");\n};
4e1bf182 439}
440sub wrap_powershell_output {
441 my ($class, $out) = @_;
442 return $out || " \n";
fbbea0e7 443}
444
e4b5a839 445sub _interpolate {
cf6fe9d6 446 my ($class, $args, $var_pat, $escape, $escape_pat) = @_;
e4b5a839 447 return
448 unless defined $args;
cf6fe9d6 449 my @args = ref $args ? @$args : $args;
e4b5a839 450 return
cf6fe9d6 451 unless @args;
452 my @vars = map { $$_ } grep { ref $_ eq 'SCALAR' } @args;
453 my $string = join $_path_sep, map {
454 ref $_ eq 'SCALAR' ? sprintf($var_pat, $$_) : do {
455 s/($escape)/sprintf($escape_pat, $1)/ge; $_;
456 };
457 } @args;
458 return wantarray ? ($string, \@vars) : $string;
b5cc15f7 459}
460
5b94dce5 461sub pipeline;
b5cc15f7 462
5b94dce5 463sub pipeline {
b5cc15f7 464 my @methods = @_;
465 my $last = pop(@methods);
466 if (@methods) {
467 \sub {
468 my ($obj, @args) = @_;
5b94dce5 469 $obj->${pipeline @methods}(
b5cc15f7 470 $obj->$last(@args)
471 );
472 };
473 } else {
474 \sub {
475 shift->$last(@_);
476 };
477 }
478}
479
b5cc15f7 480sub resolve_path {
481 my ($class, $path) = @_;
e4b5a839 482
483 $path = $class->${pipeline qw(
b5cc15f7 484 resolve_relative_path
485 resolve_home_path
486 resolve_empty_path
487 )}($path);
e4b5a839 488
e4b5a839 489 $path;
b5cc15f7 490}
491
492sub resolve_empty_path {
493 my ($class, $path) = @_;
494 if (defined $path) {
495 $path;
496 } else {
497 '~/perl5';
498 }
499}
500
b5cc15f7 501sub resolve_home_path {
502 my ($class, $path) = @_;
503 return $path unless ($path =~ /^~/);
504 my ($user) = ($path =~ /^~([^\/]+)/); # can assume ^~ so undef for 'us'
b5cc15f7 505 my $homedir = do {
5c957a4b 506 if (!defined $user && defined $ENV{HOME}) {
507 $ENV{HOME}
508 }
509 else {
510 require File::Glob;
511 File::Glob::bsd_glob("~$user", File::Glob::GLOB_TILDE());
b5cc15f7 512 }
513 };
514 unless (defined $homedir) {
cd3eb741 515 require Carp;
b5cc15f7 516 Carp::croak(
517 "Couldn't resolve homedir for "
518 .(defined $user ? $user : 'current user')
b5cc15f7 519 );
520 }
521 $path =~ s/^~[^\/]*/$homedir/;
522 $path;
523}
524
525sub resolve_relative_path {
526 my ($class, $path) = @_;
53699c99 527 $path = File::Spec->rel2abs($path);
b5cc15f7 528}
529
b5cc15f7 530sub ensure_dir_structure_for {
531 my ($class, $path) = @_;
532 unless (-d $path) {
533 warn "Attempting to create directory ${path}\n";
534 }
5c957a4b 535 require File::Basename;
536 my @dirs;
537 while(!-d $path) {
538 push @dirs, $path;
539 $path = File::Basename::dirname($path);
540 }
541 mkdir $_ for reverse @dirs;
542 return;
b5cc15f7 543}
544
c4e3c83b 545sub guess_shelltype {
fc5f07c3 546 my $shellbin
547 = defined $ENV{SHELL}
548 ? (File::Spec->splitpath($ENV{SHELL}))[-1]
549 : ( $^O eq 'MSWin32' && exists $ENV{'!EXITCODE'} )
550 ? 'bash'
551 : ( $^O eq 'MSWin32' && $ENV{PROMPT} && $ENV{COMSPEC} )
552 ? (File::Spec->splitpath($ENV{COMSPEC}))[-1]
553 : ( $^O eq 'MSWin32' && !$ENV{PROMPT} )
554 ? 'powershell.exe'
555 : 'sh';
556
557 for ($shellbin) {
558 return
fb6115c2 559 /csh$/ ? 'csh'
560 : /command(?:\.com)?$/i ? 'cmd'
561 : /cmd(?:\.exe)?$/i ? 'cmd'
562 : /4nt(?:\.exe)?$/i ? 'cmd'
563 : /powershell(?:\.exe)?$/i ? 'powershell'
564 : 'bourne';
0353dbc0 565 }
c4e3c83b 566}
567
0d6470a5 5681;
569__END__
275c9dae 570
898f36cf 571=encoding utf8
572
b5cc15f7 573=head1 NAME
574
575local::lib - create and use a local lib/ for perl modules with PERL5LIB
576
577=head1 SYNOPSIS
578
579In code -
580
581 use local::lib; # sets up a local lib at ~/perl5
582
583 use local::lib '~/foo'; # same, but ~/foo
584
1bc71e56 585 # Or...
586 use FindBin;
587 use local::lib "$FindBin::Bin/../support"; # app-local support library
588
b5cc15f7 589From the shell -
590
359329d3 591 # Install LWP and its missing dependencies to the '~/perl5' directory
592 perl -MCPAN -Mlocal::lib -e 'CPAN::install(LWP)'
0fb70b9a 593
0fb70b9a 594 # Just print out useful shell commands
b5cc15f7 595 $ perl -Mlocal::lib
e322149f 596 export PERL_MB_OPT='--install_base /home/username/perl5'
c4e3c83b 597 export PERL_MM_OPT='INSTALL_BASE=/home/username/perl5'
0d6470a5 598 export PERL5LIB="/home/username/perl5/lib/perl5"
c4e3c83b 599 export PATH="/home/username/perl5/bin:$PATH"
b5cc15f7 600
a19f7fe9 601From a .bashrc file -
602
603 [ $SHLVL -eq 1 ] && eval "$(perl -I$HOME/perl5/lib/perl5 -Mlocal::lib)"
604
322b0a0d 605=head2 The bootstrapping technique
bc30e1d5 606
730f5dda 607A typical way to install local::lib is using what is known as the
608"bootstrapping" technique. You would do this if your system administrator
609hasn't already installed local::lib. In this case, you'll need to install
8522f4d5 610local::lib in your home directory.
898f36cf 611
0ad9f83d 612Even if you do have administrative privileges, you will still want to set up your
898f36cf 613environment variables, as discussed in step 4. Without this, you would still
614install the modules into the system CPAN installation and also your Perl scripts
615will not use the lib/ path you bootstrapped with local::lib.
616
04f8efde 617By default local::lib installs itself and the CPAN modules into ~/perl5.
618
898f36cf 619Windows users must also see L</Differences when using this module under Win32>.
715c31a0 620
cab8f91f 621=over 4
622
623=item 1.
624
625Download and unpack the local::lib tarball from CPAN (search for "Download"
730f5dda 626on the CPAN page about local::lib). Do this as an ordinary user, not as root
627or administrator. Unpack the file in your home directory or in any other
628convenient location.
715c31a0 629
cab8f91f 630=item 2.
631
632Run this:
715c31a0 633
730f5dda 634 perl Makefile.PL --bootstrap
715c31a0 635
730f5dda 636If the system asks you whether it should automatically configure as much
637as possible, you would typically answer yes.
638
04f8efde 639In order to install local::lib into a directory other than the default, you need
640to specify the name of the directory when you call bootstrap, as follows:
898f36cf 641
642 perl Makefile.PL --bootstrap=~/foo
643
cab8f91f 644=item 3.
645
646Run this: (local::lib assumes you have make installed on your system)
730f5dda 647
648 make test && make install
649
cab8f91f 650=item 4.
651
652Now we need to setup the appropriate environment variables, so that Perl
898f36cf 653starts using our newly generated lib/ directory. If you are using bash or
654any other Bourne shells, you can add this to your shell startup script this
655way:
730f5dda 656
a19f7fe9 657 echo '[ $SHLVL -eq 1 ] && eval "$(perl -I$HOME/perl5/lib/perl5 -Mlocal::lib)"' >>~/.bashrc
730f5dda 658
659If you are using C shell, you can do this as follows:
660
661 /bin/csh
662 echo $SHELL
618272fe 663 /bin/csh
d8666a05 664 echo 'eval `perl -I$HOME/perl5/lib/perl5 -Mlocal::lib`' >> ~/.cshrc
dc8ddd06 665
0d6470a5 666If you passed to bootstrap a directory other than default, you also need to
667give that as import parameter to the call of the local::lib module like this
668way:
8b1e8e69 669
a19f7fe9 670 echo '[ $SHLVL -eq 1 ] && eval "$(perl -I$HOME/foo/lib/perl5 -Mlocal::lib=$HOME/foo)"' >>~/.bashrc
618272fe 671
aab64481 672After writing your shell configuration file, be sure to re-read it to get the
8522f4d5 673changed settings into your current shell's environment. Bourne shells use
898f36cf 674C<. ~/.bashrc> for this, whereas C shells use C<source ~/.cshrc>.
aab64481 675
cab8f91f 676=back
677
b9c94c15 678If you're on a slower machine, or are operating under draconian disk space
679limitations, you can disable the automatic generation of manpages from POD when
680installing modules by using the C<--no-manpages> argument when bootstrapping:
681
730f5dda 682 perl Makefile.PL --bootstrap --no-manpages
b9c94c15 683
8522f4d5 684To avoid doing several bootstrap for several Perl module environments on the
685same account, for example if you use it for several different deployed
686applications independently, you can use one bootstrapped local::lib
898f36cf 687installation to install modules in different directories directly this way:
977a9ca3 688
730f5dda 689 cd ~/mydir1
690 perl -Mlocal::lib=./
691 eval $(perl -Mlocal::lib=./) ### To set the environment for this shell alone
898f36cf 692 printenv ### You will see that ~/mydir1 is in the PERL5LIB
730f5dda 693 perl -MCPAN -e install ... ### whatever modules you want
694 cd ../mydir2
695 ... REPEAT ...
696
a19f7fe9 697When used in a C<.bashrc> file, it is recommended that you protect against
698re-activating a directory in a sub-shell. This can be done by checking the
699C<$SHLVL> variable as shown in synopsis. Without this, sub-shells created by
700the user or other programs will override changes made to the parent shell's
701environment.
702
480534a8 703If you are working with several C<local::lib> environments, you may want to
704remove some of them from the current environment without disturbing the others.
705You can deactivate one environment like this (using bourne sh):
706
707 eval $(perl -Mlocal::lib=--deactivate,~/path)
708
709which will generate and run the commands needed to remove C<~/path> from your
710various search paths. Whichever environment was B<activated most recently> will
711remain the target for module installations. That is, if you activate
712C<~/path_A> and then you activate C<~/path_B>, new modules you install will go
713in C<~/path_B>. If you deactivate C<~/path_B> then modules will be installed
714into C<~/pathA> -- but if you deactivate C<~/path_A> then they will still be
715installed in C<~/pathB> because pathB was activated later.
716
717You can also ask C<local::lib> to clean itself completely out of the current
718shell's environment with the C<--deactivate-all> option.
730f5dda 719For multiple environments for multiple apps you may need to include a modified
720version of the C<< use FindBin >> instructions in the "In code" sample above.
721If you did something like the above, you have a set of Perl modules at C<<
722~/mydir1/lib >>. If you have a script at C<< ~/mydir1/scripts/myscript.pl >>,
723you need to tell it where to find the modules you installed for it at C<<
724~/mydir1/lib >>.
977a9ca3 725
726In C<< ~/mydir1/scripts/myscript.pl >>:
727
730f5dda 728 use strict;
729 use warnings;
730 use local::lib "$FindBin::Bin/.."; ### points to ~/mydir1 and local::lib finds lib
731 use lib "$FindBin::Bin/../lib"; ### points to ~/mydir1/lib
977a9ca3 732
733Put this before any BEGIN { ... } blocks that require the modules you installed.
734
53699c99 735=head2 Differences when using this module under Win32
736
76f30678 737To set up the proper environment variables for your current session of
738C<CMD.exe>, you can use this:
739
730f5dda 740 C:\>perl -Mlocal::lib
e322149f 741 set PERL_MB_OPT=--install_base C:\DOCUME~1\ADMINI~1\perl5
730f5dda 742 set PERL_MM_OPT=INSTALL_BASE=C:\DOCUME~1\ADMINI~1\perl5
0d6470a5 743 set PERL5LIB=C:\DOCUME~1\ADMINI~1\perl5\lib\perl5
730f5dda 744 set PATH=C:\DOCUME~1\ADMINI~1\perl5\bin;%PATH%
8522f4d5 745
898f36cf 746 ### To set the environment for this shell alone
d4ccf2ea 747 C:\>perl -Mlocal::lib > %TEMP%\tmp.bat && %TEMP%\tmp.bat && del %TEMP%\tmp.bat
730f5dda 748 ### instead of $(perl -Mlocal::lib=./)
53699c99 749
d8666a05 750If you want the environment entries to persist, you'll need to add them to the
76f30678 751Control Panel's System applet yourself or use L<App::local::lib::Win32Helper>.
53699c99 752
753The "~" is translated to the user's profile directory (the directory named for
754the user under "Documents and Settings" (Windows XP or earlier) or "Users"
9bc0788f 755(Windows Vista or later)) unless $ENV{HOME} exists. After that, the home
53699c99 756directory is translated to a short name (which means the directory must exist)
757and the subdirectories are created.
758
d8666a05 759=head3 PowerShell
760
1ff92911 761local::lib also supports PowerShell, and can be used with the
d8666a05 762C<Invoke-Expression> cmdlet.
763
764 Invoke-Expression "$(perl -Mlocal::lib)"
765
730f5dda 766=head1 RATIONALE
767
768The version of a Perl package on your machine is not always the version you
769need. Obviously, the best thing to do would be to update to the version you
770need. However, you might be in a situation where you're prevented from doing
771this. Perhaps you don't have system administrator privileges; or perhaps you
772are using a package management system such as Debian, and nobody has yet gotten
773around to packaging up the version you need.
774
775local::lib solves this problem by allowing you to create your own directory of
776Perl packages downloaded from CPAN (in a multi-user system, this would typically
777be within your own home directory). The existing system Perl installation is
778not affected; you simply invoke Perl with special options so that Perl uses the
779packages in your own local package directory rather than the system packages.
780local::lib arranges things so that your locally installed version of the Perl
781packages takes precedence over the system installation.
782
783If you are using a package management system (such as Debian), you don't need to
784worry about Debian and CPAN stepping on each other's toes. Your local version
785of the packages will be written to an entirely separate directory from those
8522f4d5 786installed by Debian.
730f5dda 787
618272fe 788=head1 DESCRIPTION
789
790This module provides a quick, convenient way of bootstrapping a user-local Perl
791module library located within the user's home directory. It also constructs and
792prints out for the user the list of environment variables using the syntax
793appropriate for the user's current shell (as specified by the C<SHELL>
730f5dda 794environment variable), suitable for directly adding to one's shell
795configuration file.
796
797More generally, local::lib allows for the bootstrapping and usage of a
798directory containing Perl modules outside of Perl's C<@INC>. This makes it
799easier to ship an application with an app-specific copy of a Perl module, or
800collection of modules. Useful in cases like when an upstream maintainer hasn't
801applied a patch to a module of theirs that you need for your application.
1bc71e56 802
803On import, local::lib sets the following environment variables to appropriate
804values:
805
806=over 4
807
e322149f 808=item PERL_MB_OPT
1bc71e56 809
810=item PERL_MM_OPT
811
812=item PERL5LIB
813
814=item PATH
815
2ad10b57 816=item PERL_LOCAL_LIB_ROOT
817
1bc71e56 818=back
819
0d6470a5 820When possible, these will be appended to instead of overwritten entirely.
821
1bc71e56 822These values are then available for reference by any code after import.
823
b0c48f8e 824=head1 CREATING A SELF-CONTAINED SET OF MODULES
825
a949ebcd 826See L<lib::core::only> for one way to do this - but note that
d8b1a404 827there are a number of caveats, and the best approach is always to perform a
828build against a clean perl (i.e. site and vendor as close to empty as possible).
b0c48f8e 829
2ad10b57 830=head1 IMPORT OPTIONS
480534a8 831
832Options are values that can be passed to the C<local::lib> import besides the
833directory to use. They are specified as C<use local::lib '--option'[, path];>
834or C<perl -Mlocal::lib=--option[,path]>.
835
836=head2 --deactivate
837
838Remove the chosen path (or the default path) from the module search paths if it
839was added by C<local::lib>, instead of adding it.
840
841=head2 --deactivate-all
842
843Remove all directories that were added to search paths by C<local::lib> from the
844search paths.
845
daad8782 846=head2 --shelltype
847
848Specify the shell type to use for output. By default, the shell will be
849detected based on the environment. Should be one of: C<bourne>, C<csh>,
850C<cmd>, or C<powershell>.
851
80816e53 852=head2 --no-create
853
854Prevents C<local::lib> from creating directories when activating dirs. This is
855likely to cause issues on Win32 systems.
856
2ad10b57 857=head1 CLASS METHODS
480e6e85 858
a949ebcd 859=head2 ensure_dir_structure_for
480e6e85 860
861=over 4
862
a949ebcd 863=item Arguments: $path
864
865=item Return value: None
480e6e85 866
867=back
868
869Attempts to create the given path, and all required parent directories. Throws
870an exception on failure.
871
872=head2 print_environment_vars_for
873
874=over 4
875
a949ebcd 876=item Arguments: $path
877
878=item Return value: None
480e6e85 879
880=back
881
882Prints to standard output the variables listed above, properly set to use the
883given path as the base directory.
884
a949ebcd 885=head2 build_environment_vars_for
886
887=over 4
888
c40e10d7 889=item Arguments: $path
a949ebcd 890
9f9da00a 891=item Return value: %environment_vars
a949ebcd 892
893=back
894
291b5a3a 895Returns a hash with the variables listed above, properly set to use the
896given path as the base directory.
897
480e6e85 898=head2 setup_env_hash_for
899
900=over 4
901
a949ebcd 902=item Arguments: $path
903
904=item Return value: None
480e6e85 905
906=back
907
908Constructs the C<%ENV> keys for the given path, by calling
a949ebcd 909L</build_environment_vars_for>.
480e6e85 910
5a63c13e 911=head2 active_paths
912
913=over 4
914
915=item Arguments: None
916
917=item Return value: @paths
918
919=back
920
921Returns a list of active C<local::lib> paths, according to the
24351831 922C<PERL_LOCAL_LIB_ROOT> environment variable and verified against
923what is really in C<@INC>.
5a63c13e 924
480e6e85 925=head2 install_base_perl_path
926
927=over 4
928
a949ebcd 929=item Arguments: $path
930
931=item Return value: $install_base_perl_path
480e6e85 932
933=back
934
935Returns a path describing where to install the Perl modules for this local
936library installation. Appends the directories C<lib> and C<perl5> to the given
937path.
938
2ad10b57 939=head2 lib_paths_for
940
941=over 4
942
943=item Arguments: $path
944
945=item Return value: @lib_paths
946
947=back
948
949Returns the list of paths perl will search for libraries, given a base path.
950This includes the base path itself, the architecture specific subdirectory, and
951perl version specific subdirectories. These paths may not all exist.
952
480e6e85 953=head2 install_base_bin_path
954
955=over 4
956
a949ebcd 957=item Arguments: $path
958
959=item Return value: $install_base_bin_path
480e6e85 960
961=back
962
963Returns a path describing where to install the executable programs for this
9f9da00a 964local library installation. Appends the directory C<bin> to the given path.
480e6e85 965
2ad10b57 966=head2 installer_options_for
967
968=over 4
969
970=item Arguments: $path
971
49c9e334 972=item Return value: %installer_env_vars
2ad10b57 973
974=back
975
49c9e334 976Returns a hash of environment variables that should be set to cause
2ad10b57 977installation into the given path.
978
480e6e85 979=head2 resolve_empty_path
980
981=over 4
982
a949ebcd 983=item Arguments: $path
984
985=item Return value: $base_path
480e6e85 986
987=back
988
989Builds and returns the base path into which to set up the local module
990installation. Defaults to C<~/perl5>.
991
992=head2 resolve_home_path
993
994=over 4
995
a949ebcd 996=item Arguments: $path
997
998=item Return value: $home_path
480e6e85 999
1000=back
1001
1002Attempts to find the user's home directory. If installed, uses C<File::HomeDir>
1003for this purpose. If no definite answer is available, throws an exception.
1004
1005=head2 resolve_relative_path
1006
1007=over 4
1008
a949ebcd 1009=item Arguments: $path
1010
1011=item Return value: $absolute_path
480e6e85 1012
1013=back
1014
1015Translates the given path into an absolute path.
1016
1017=head2 resolve_path
1018
1019=over 4
1020
a949ebcd 1021=item Arguments: $path
1022
1023=item Return value: $absolute_path
480e6e85 1024
1025=back
1026
1027Calls the following in a pipeline, passing the result from the previous to the
1028next, in an attempt to find where to configure the environment for a local
1029library installation: L</resolve_empty_path>, L</resolve_home_path>,
1030L</resolve_relative_path>. Passes the given path argument to
1031L</resolve_empty_path> which then returns a result that is passed to
1032L</resolve_home_path>, which then has its result passed to
1033L</resolve_relative_path>. The result of this final call is returned from
1034L</resolve_path>.
1035
2ad10b57 1036=head1 OBJECT INTERFACE
1037
1038=head2 new
1039
1040=over 4
1041
1042=item Arguments: %attributes
1043
1044=item Return value: $local_lib
1045
1046=back
1047
1048Constructs a new C<local::lib> object, representing the current state of
1049C<@INC> and the relevant environment variables.
1050
1051=head1 ATTRIBUTES
1052
1053=head2 roots
1054
1055An arrayref representing active C<local::lib> directories.
1056
1057=head2 inc
1058
1059An arrayref representing C<@INC>.
1060
1061=head2 libs
1062
1063An arrayref representing the PERL5LIB environment variable.
1064
1065=head2 bins
1066
1067An arrayref representing the PATH environment variable.
1068
1069=head2 extra
1070
1071A hashref of extra environment variables (e.g. C<PERL_MM_OPT> and
1072C<PERL_MB_OPT>)
1073
1074=head2 no_create
1075
1076If set, C<local::lib> will not try to create directories when activating them.
1077
1078=head1 OBJECT METHODS
1079
1080=head2 clone
1081
1082=over 4
1083
1084=item Arguments: %attributes
1085
1086=item Return value: $local_lib
1087
1088=back
1089
1090Constructs a new C<local::lib> object based on the existing one, overriding the
1091specified attributes.
1092
1093=head2 activate
1094
1095=over 4
1096
1097=item Arguments: $path
1098
1099=item Return value: $new_local_lib
1100
1101=back
1102
1103Constructs a new instance with the specified path active.
1104
1105=head2 deactivate
1106
1107=over 4
1108
1109=item Arguments: $path
1110
1111=item Return value: $new_local_lib
1112
1113=back
1114
1115Constructs a new instance with the specified path deactivated.
1116
1117=head2 deactivate_all
1118
1119=over 4
1120
1121=item Arguments: None
1122
1123=item Return value: $new_local_lib
1124
1125=back
1126
1127Constructs a new instance with all C<local::lib> directories deactivated.
1128
1129=head2 environment_vars_string
1130
1131=over 4
1132
1133=item Arguments: [ $shelltype ]
1134
1135=item Return value: $shell_env_string
1136
1137=back
1138
1139Returns a string to set up the C<local::lib>, meant to be run by a shell.
1140
1141=head2 build_environment_vars
1142
1143=over 4
1144
1145=item Arguments: None
1146
1147=item Return value: %environment_vars
1148
1149=back
1150
1151Returns a hash with the variables listed above, properly set to use the
1152given path as the base directory.
1153
1154=head2 setup_env_hash
1155
1156=over 4
1157
1158=item Arguments: None
1159
1160=item Return value: None
1161
1162=back
1163
1164Constructs the C<%ENV> keys for the given path, by calling
1165L</build_environment_vars>.
1166
1167=head2 setup_local_lib
1168
1169Constructs the C<%ENV> hash using L</setup_env_hash>, and set up C<@INC>.
1170
0fb70b9a 1171=head1 A WARNING ABOUT UNINST=1
1172
1173Be careful about using local::lib in combination with "make install UNINST=1".
1174The idea of this feature is that will uninstall an old version of a module
1175before installing a new one. However it lacks a safety check that the old
1176version and the new version will go in the same directory. Used in combination
1177with local::lib, you can potentially delete a globally accessible version of a
381738d7 1178module while installing the new version in a local place. Only combine "make
0fb70b9a 1179install UNINST=1" and local::lib if you understand these possible consequences.
1180
dc8ddd06 1181=head1 LIMITATIONS
1182
788ea146 1183=over 4
1184
0d6470a5 1185=item * Directory names with spaces in them are not well supported by the perl
1186toolchain and the programs it uses. Pure-perl distributions should support
1187spaces, but problems are more likely with dists that require compilation. A
1188workaround you can do is moving your local::lib to a directory with spaces
1189B<after> you installed all modules inside your local::lib bootstrap. But be
1190aware that you can't update or install CPAN modules after the move.
47e70ca1 1191
788ea146 1192=item * Rather basic shell detection. Right now anything with csh in its name is
618272fe 1193assumed to be a C shell or something compatible, and everything else is assumed
53699c99 1194to be Bourne, except on Win32 systems. If the C<SHELL> environment variable is
1195not set, a Bourne-compatible shell is assumed.
dc8ddd06 1196
0d6470a5 1197=item * Kills any existing PERL_MM_OPT or PERL_MB_OPT.
dc8ddd06 1198
788ea146 1199=item * Should probably auto-fixup CPAN config if not already done.
1200
6a9fd065 1201=item * local::lib loads L<File::Spec>. When used to set shell variables,
1202this isn't a problem. When used inside a perl script, any L<File::Spec>
1203version inside the local::lib will be ignored. A workaround for this is using
1204C<use lib "$ENV{HOME}/perl5/lib/perl5";> inside the script instead of using
1205C<local::lib> directly.
1206
0921389e 1207=item * Conflicts with L<ExtUtils::MakeMaker>'s C<PREFIX> option.
1208C<local::lib> uses the C<INSTALL_BASE> option, as it has more predictable and
1209sane behavior. If something attempts to use the C<PREFIX> option when running
1210a F<Makefile.PL>, L<ExtUtils::MakeMaker> will refuse to run, as the two
1211options conflict. This can be worked around by temporarily unsetting the
1212C<PERL_MM_OPT> environment variable.
1213
1214=item * Conflicts with L<Module::Build>'s C<--prefix> option. Similar to the
1215previous limitation, but any C<--prefix> option specified will be ignored.
b0b2a40f 1216This can be worked around by temporarily unsetting the C<PERL_MB_OPT>
1217environment variable.
0921389e 1218
788ea146 1219=back
e423efce 1220
dc8ddd06 1221Patches very much welcome for any of the above.
bc30e1d5 1222
788ea146 1223=over 4
1224
0d6470a5 1225=item * On Win32 systems, does not have a way to write the created environment
1226variables to the registry, so that they can persist through a reboot.
53699c99 1227
788ea146 1228=back
1229
9a021b2b 1230=head1 TROUBLESHOOTING
1231
1232If you've configured local::lib to install CPAN modules somewhere in to your
1233home directory, and at some point later you try to install a module with C<cpan
1234-i Foo::Bar>, but it fails with an error like: C<Warning: You do not have
1235permissions to install into /usr/lib64/perl5/site_perl/5.8.8/x86_64-linux at
1236/usr/lib64/perl5/5.8.8/Foo/Bar.pm> and buried within the install log is an
1237error saying C<'INSTALL_BASE' is not a known MakeMaker parameter name>, then
1238you've somehow lost your updated ExtUtils::MakeMaker module.
1239
1240To remedy this situation, rerun the bootstrapping procedure documented above.
1241
1242Then, run C<rm -r ~/.cpan/build/Foo-Bar*>
1243
1244Finally, re-run C<cpan -i Foo::Bar> and it should install without problems.
1245
618272fe 1246=head1 ENVIRONMENT
1247
1248=over 4
1249
1250=item SHELL
1251
53699c99 1252=item COMSPEC
1253
618272fe 1254local::lib looks at the user's C<SHELL> environment variable when printing out
1255commands to add to the shell configuration file.
1256
53699c99 1257On Win32 systems, C<COMSPEC> is also examined.
1258
618272fe 1259=back
1260
163f162c 1261=head1 SEE ALSO
1262
1263=over 4
1264
1265=item * L<Perl Advent article, 2011|http://perladvent.org/2011/2011-12-01.html>
1266
1267=back
1268
cc19e8d4 1269=head1 SUPPORT
1270
1271IRC:
1272
1273 Join #local-lib on irc.perl.org.
1274
b5cc15f7 1275=head1 AUTHOR
1276
1277Matt S Trout <mst@shadowcat.co.uk> http://www.shadowcat.co.uk/
1278
d6b71a2d 1279auto_install fixes kindly sponsored by http://www.takkle.com/
1280
b5c1154d 1281=head1 CONTRIBUTORS
1282
1283Patches to correctly output commands for csh style shells, as well as some
1284documentation additions, contributed by Christopher Nehren <apeiron@cpan.org>.
1285
cc19e8d4 1286Doc patches for a custom local::lib directory, more cleanups in the english
0d6470a5 1287documentation and a L<german documentation|POD2::DE::local::lib> contributed by
1288Torsten Raudssus <torsten@raudssus.de>.
8b1e8e69 1289
be160790 1290Hans Dieter Pearcey <hdp@cpan.org> sent in some additional tests for ensuring
9a021b2b 1291things will install properly, submitted a fix for the bug causing problems with
1292writing Makefiles during bootstrapping, contributed an example program, and
1293submitted yet another fix to ensure that local::lib can install and bootstrap
1294properly. Many, many thanks!
1295
1296pattern of Freenode IRC contributed the beginnings of the Troubleshooting
1297section. Many thanks!
be160790 1298
53699c99 1299Patch to add Win32 support contributed by Curtis Jewell <csjewell@cpan.org>.
1300
03b91976 1301Warnings for missing PATH/PERL5LIB (as when not running interactively) silenced
1302by a patch from Marco Emilio Poleggi.
1303
1f8043c8 1304Mark Stosberg <mark@summersault.com> provided the code for the now deleted
1305'--self-contained' option.
1306
76f30678 1307Documentation patches to make win32 usage clearer by
1308David Mertens <dcmertens.perl@gmail.com> (run4flat).
1309
0d6470a5 1310Brazilian L<portuguese translation|POD2::PT_BR::local::lib> and minor doc
1311patches contributed by Breno G. de Oliveira <garu@cpan.org>.
ccf362c0 1312
a0b3d98a 1313Improvements to stacking multiple local::lib dirs and removing them from the
1314environment later on contributed by Andrew Rodland <arodland@cpan.org>.
1315
0d6470a5 1316Patch for Carp version mismatch contributed by Hakim Cassimally
1317<osfameron@cpan.org>.
cd3eb741 1318
38bfb3a4 1319Rewrite of internals and numerous bug fixes and added features contributed by
1320Graham Knop <haarg@haarg.org>.
1321
7c0db165 1322=head1 COPYRIGHT
1323
2bfba45f 1324Copyright (c) 2007 - 2013 the local::lib L</AUTHOR> and L</CONTRIBUTORS> as
7c0db165 1325listed above.
1326
b5cc15f7 1327=head1 LICENSE
1328
73c9a8ad 1329This is free software; you can redistribute it and/or modify it under
1330the same terms as the Perl 5 programming language system itself.
b5cc15f7 1331
1332=cut