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