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