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