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