fish shell support
[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) = @_;
447 my $value = $class->_interpolate($args, '"%s"', '"', '\\%s');
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'
570 : /command(?:\.com)?$/i ? 'cmd'
571 : /cmd(?:\.exe)?$/i ? 'cmd'
572 : /4nt(?:\.exe)?$/i ? 'cmd'
573 : /powershell(?:\.exe)?$/i ? 'powershell'
574 : 'bourne';
0353dbc0 575 }
c4e3c83b 576}
577
0d6470a5 5781;
579__END__
275c9dae 580
898f36cf 581=encoding utf8
582
b5cc15f7 583=head1 NAME
584
585local::lib - create and use a local lib/ for perl modules with PERL5LIB
586
587=head1 SYNOPSIS
588
589In code -
590
591 use local::lib; # sets up a local lib at ~/perl5
592
593 use local::lib '~/foo'; # same, but ~/foo
594
1bc71e56 595 # Or...
596 use FindBin;
597 use local::lib "$FindBin::Bin/../support"; # app-local support library
598
b5cc15f7 599From the shell -
600
359329d3 601 # Install LWP and its missing dependencies to the '~/perl5' directory
602 perl -MCPAN -Mlocal::lib -e 'CPAN::install(LWP)'
0fb70b9a 603
0fb70b9a 604 # Just print out useful shell commands
b5cc15f7 605 $ perl -Mlocal::lib
e322149f 606 export PERL_MB_OPT='--install_base /home/username/perl5'
c4e3c83b 607 export PERL_MM_OPT='INSTALL_BASE=/home/username/perl5'
0d6470a5 608 export PERL5LIB="/home/username/perl5/lib/perl5"
c4e3c83b 609 export PATH="/home/username/perl5/bin:$PATH"
b5cc15f7 610
a19f7fe9 611From a .bashrc file -
612
613 [ $SHLVL -eq 1 ] && eval "$(perl -I$HOME/perl5/lib/perl5 -Mlocal::lib)"
614
322b0a0d 615=head2 The bootstrapping technique
bc30e1d5 616
730f5dda 617A typical way to install local::lib is using what is known as the
618"bootstrapping" technique. You would do this if your system administrator
619hasn't already installed local::lib. In this case, you'll need to install
8522f4d5 620local::lib in your home directory.
898f36cf 621
0ad9f83d 622Even if you do have administrative privileges, you will still want to set up your
898f36cf 623environment variables, as discussed in step 4. Without this, you would still
624install the modules into the system CPAN installation and also your Perl scripts
625will not use the lib/ path you bootstrapped with local::lib.
626
04f8efde 627By default local::lib installs itself and the CPAN modules into ~/perl5.
628
898f36cf 629Windows users must also see L</Differences when using this module under Win32>.
715c31a0 630
cab8f91f 631=over 4
632
633=item 1.
634
635Download and unpack the local::lib tarball from CPAN (search for "Download"
730f5dda 636on the CPAN page about local::lib). Do this as an ordinary user, not as root
637or administrator. Unpack the file in your home directory or in any other
638convenient location.
715c31a0 639
cab8f91f 640=item 2.
641
642Run this:
715c31a0 643
730f5dda 644 perl Makefile.PL --bootstrap
715c31a0 645
730f5dda 646If the system asks you whether it should automatically configure as much
647as possible, you would typically answer yes.
648
04f8efde 649In order to install local::lib into a directory other than the default, you need
650to specify the name of the directory when you call bootstrap, as follows:
898f36cf 651
652 perl Makefile.PL --bootstrap=~/foo
653
cab8f91f 654=item 3.
655
656Run this: (local::lib assumes you have make installed on your system)
730f5dda 657
658 make test && make install
659
cab8f91f 660=item 4.
661
662Now we need to setup the appropriate environment variables, so that Perl
898f36cf 663starts using our newly generated lib/ directory. If you are using bash or
664any other Bourne shells, you can add this to your shell startup script this
665way:
730f5dda 666
a19f7fe9 667 echo '[ $SHLVL -eq 1 ] && eval "$(perl -I$HOME/perl5/lib/perl5 -Mlocal::lib)"' >>~/.bashrc
730f5dda 668
669If you are using C shell, you can do this as follows:
670
671 /bin/csh
672 echo $SHELL
618272fe 673 /bin/csh
d8666a05 674 echo 'eval `perl -I$HOME/perl5/lib/perl5 -Mlocal::lib`' >> ~/.cshrc
dc8ddd06 675
0d6470a5 676If you passed to bootstrap a directory other than default, you also need to
677give that as import parameter to the call of the local::lib module like this
678way:
8b1e8e69 679
a19f7fe9 680 echo '[ $SHLVL -eq 1 ] && eval "$(perl -I$HOME/foo/lib/perl5 -Mlocal::lib=$HOME/foo)"' >>~/.bashrc
618272fe 681
aab64481 682After writing your shell configuration file, be sure to re-read it to get the
8522f4d5 683changed settings into your current shell's environment. Bourne shells use
898f36cf 684C<. ~/.bashrc> for this, whereas C shells use C<source ~/.cshrc>.
aab64481 685
cab8f91f 686=back
687
b9c94c15 688If you're on a slower machine, or are operating under draconian disk space
689limitations, you can disable the automatic generation of manpages from POD when
690installing modules by using the C<--no-manpages> argument when bootstrapping:
691
730f5dda 692 perl Makefile.PL --bootstrap --no-manpages
b9c94c15 693
8522f4d5 694To avoid doing several bootstrap for several Perl module environments on the
695same account, for example if you use it for several different deployed
696applications independently, you can use one bootstrapped local::lib
898f36cf 697installation to install modules in different directories directly this way:
977a9ca3 698
730f5dda 699 cd ~/mydir1
700 perl -Mlocal::lib=./
701 eval $(perl -Mlocal::lib=./) ### To set the environment for this shell alone
898f36cf 702 printenv ### You will see that ~/mydir1 is in the PERL5LIB
730f5dda 703 perl -MCPAN -e install ... ### whatever modules you want
704 cd ../mydir2
705 ... REPEAT ...
706
a19f7fe9 707When used in a C<.bashrc> file, it is recommended that you protect against
708re-activating a directory in a sub-shell. This can be done by checking the
709C<$SHLVL> variable as shown in synopsis. Without this, sub-shells created by
710the user or other programs will override changes made to the parent shell's
711environment.
712
480534a8 713If you are working with several C<local::lib> environments, you may want to
714remove some of them from the current environment without disturbing the others.
715You can deactivate one environment like this (using bourne sh):
716
717 eval $(perl -Mlocal::lib=--deactivate,~/path)
718
719which will generate and run the commands needed to remove C<~/path> from your
720various search paths. Whichever environment was B<activated most recently> will
721remain the target for module installations. That is, if you activate
722C<~/path_A> and then you activate C<~/path_B>, new modules you install will go
723in C<~/path_B>. If you deactivate C<~/path_B> then modules will be installed
724into C<~/pathA> -- but if you deactivate C<~/path_A> then they will still be
725installed in C<~/pathB> because pathB was activated later.
726
727You can also ask C<local::lib> to clean itself completely out of the current
728shell's environment with the C<--deactivate-all> option.
730f5dda 729For multiple environments for multiple apps you may need to include a modified
730version of the C<< use FindBin >> instructions in the "In code" sample above.
731If you did something like the above, you have a set of Perl modules at C<<
732~/mydir1/lib >>. If you have a script at C<< ~/mydir1/scripts/myscript.pl >>,
733you need to tell it where to find the modules you installed for it at C<<
734~/mydir1/lib >>.
977a9ca3 735
736In C<< ~/mydir1/scripts/myscript.pl >>:
737
730f5dda 738 use strict;
739 use warnings;
740 use local::lib "$FindBin::Bin/.."; ### points to ~/mydir1 and local::lib finds lib
741 use lib "$FindBin::Bin/../lib"; ### points to ~/mydir1/lib
977a9ca3 742
743Put this before any BEGIN { ... } blocks that require the modules you installed.
744
53699c99 745=head2 Differences when using this module under Win32
746
76f30678 747To set up the proper environment variables for your current session of
748C<CMD.exe>, you can use this:
749
730f5dda 750 C:\>perl -Mlocal::lib
e322149f 751 set PERL_MB_OPT=--install_base C:\DOCUME~1\ADMINI~1\perl5
730f5dda 752 set PERL_MM_OPT=INSTALL_BASE=C:\DOCUME~1\ADMINI~1\perl5
0d6470a5 753 set PERL5LIB=C:\DOCUME~1\ADMINI~1\perl5\lib\perl5
730f5dda 754 set PATH=C:\DOCUME~1\ADMINI~1\perl5\bin;%PATH%
8522f4d5 755
898f36cf 756 ### To set the environment for this shell alone
d4ccf2ea 757 C:\>perl -Mlocal::lib > %TEMP%\tmp.bat && %TEMP%\tmp.bat && del %TEMP%\tmp.bat
730f5dda 758 ### instead of $(perl -Mlocal::lib=./)
53699c99 759
d8666a05 760If you want the environment entries to persist, you'll need to add them to the
76f30678 761Control Panel's System applet yourself or use L<App::local::lib::Win32Helper>.
53699c99 762
763The "~" is translated to the user's profile directory (the directory named for
764the user under "Documents and Settings" (Windows XP or earlier) or "Users"
9bc0788f 765(Windows Vista or later)) unless $ENV{HOME} exists. After that, the home
53699c99 766directory is translated to a short name (which means the directory must exist)
767and the subdirectories are created.
768
d8666a05 769=head3 PowerShell
770
1ff92911 771local::lib also supports PowerShell, and can be used with the
d8666a05 772C<Invoke-Expression> cmdlet.
773
774 Invoke-Expression "$(perl -Mlocal::lib)"
775
730f5dda 776=head1 RATIONALE
777
778The version of a Perl package on your machine is not always the version you
779need. Obviously, the best thing to do would be to update to the version you
780need. However, you might be in a situation where you're prevented from doing
781this. Perhaps you don't have system administrator privileges; or perhaps you
782are using a package management system such as Debian, and nobody has yet gotten
783around to packaging up the version you need.
784
785local::lib solves this problem by allowing you to create your own directory of
786Perl packages downloaded from CPAN (in a multi-user system, this would typically
787be within your own home directory). The existing system Perl installation is
788not affected; you simply invoke Perl with special options so that Perl uses the
789packages in your own local package directory rather than the system packages.
790local::lib arranges things so that your locally installed version of the Perl
791packages takes precedence over the system installation.
792
793If you are using a package management system (such as Debian), you don't need to
794worry about Debian and CPAN stepping on each other's toes. Your local version
795of the packages will be written to an entirely separate directory from those
8522f4d5 796installed by Debian.
730f5dda 797
618272fe 798=head1 DESCRIPTION
799
800This module provides a quick, convenient way of bootstrapping a user-local Perl
801module library located within the user's home directory. It also constructs and
802prints out for the user the list of environment variables using the syntax
803appropriate for the user's current shell (as specified by the C<SHELL>
730f5dda 804environment variable), suitable for directly adding to one's shell
805configuration file.
806
807More generally, local::lib allows for the bootstrapping and usage of a
808directory containing Perl modules outside of Perl's C<@INC>. This makes it
809easier to ship an application with an app-specific copy of a Perl module, or
810collection of modules. Useful in cases like when an upstream maintainer hasn't
811applied a patch to a module of theirs that you need for your application.
1bc71e56 812
813On import, local::lib sets the following environment variables to appropriate
814values:
815
816=over 4
817
e322149f 818=item PERL_MB_OPT
1bc71e56 819
820=item PERL_MM_OPT
821
822=item PERL5LIB
823
824=item PATH
825
2ad10b57 826=item PERL_LOCAL_LIB_ROOT
827
1bc71e56 828=back
829
0d6470a5 830When possible, these will be appended to instead of overwritten entirely.
831
1bc71e56 832These values are then available for reference by any code after import.
833
b0c48f8e 834=head1 CREATING A SELF-CONTAINED SET OF MODULES
835
a949ebcd 836See L<lib::core::only> for one way to do this - but note that
d8b1a404 837there are a number of caveats, and the best approach is always to perform a
838build against a clean perl (i.e. site and vendor as close to empty as possible).
b0c48f8e 839
2ad10b57 840=head1 IMPORT OPTIONS
480534a8 841
842Options are values that can be passed to the C<local::lib> import besides the
843directory to use. They are specified as C<use local::lib '--option'[, path];>
844or C<perl -Mlocal::lib=--option[,path]>.
845
846=head2 --deactivate
847
848Remove the chosen path (or the default path) from the module search paths if it
849was added by C<local::lib>, instead of adding it.
850
851=head2 --deactivate-all
852
853Remove all directories that were added to search paths by C<local::lib> from the
854search paths.
855
daad8782 856=head2 --shelltype
857
858Specify the shell type to use for output. By default, the shell will be
859detected based on the environment. Should be one of: C<bourne>, C<csh>,
860C<cmd>, or C<powershell>.
861
80816e53 862=head2 --no-create
863
864Prevents C<local::lib> from creating directories when activating dirs. This is
865likely to cause issues on Win32 systems.
866
2ad10b57 867=head1 CLASS METHODS
480e6e85 868
a949ebcd 869=head2 ensure_dir_structure_for
480e6e85 870
871=over 4
872
a949ebcd 873=item Arguments: $path
874
875=item Return value: None
480e6e85 876
877=back
878
879Attempts to create the given path, and all required parent directories. Throws
880an exception on failure.
881
882=head2 print_environment_vars_for
883
884=over 4
885
a949ebcd 886=item Arguments: $path
887
888=item Return value: None
480e6e85 889
890=back
891
892Prints to standard output the variables listed above, properly set to use the
893given path as the base directory.
894
a949ebcd 895=head2 build_environment_vars_for
896
897=over 4
898
c40e10d7 899=item Arguments: $path
a949ebcd 900
9f9da00a 901=item Return value: %environment_vars
a949ebcd 902
903=back
904
291b5a3a 905Returns a hash with the variables listed above, properly set to use the
906given path as the base directory.
907
480e6e85 908=head2 setup_env_hash_for
909
910=over 4
911
a949ebcd 912=item Arguments: $path
913
914=item Return value: None
480e6e85 915
916=back
917
918Constructs the C<%ENV> keys for the given path, by calling
a949ebcd 919L</build_environment_vars_for>.
480e6e85 920
5a63c13e 921=head2 active_paths
922
923=over 4
924
925=item Arguments: None
926
927=item Return value: @paths
928
929=back
930
931Returns a list of active C<local::lib> paths, according to the
24351831 932C<PERL_LOCAL_LIB_ROOT> environment variable and verified against
933what is really in C<@INC>.
5a63c13e 934
480e6e85 935=head2 install_base_perl_path
936
937=over 4
938
a949ebcd 939=item Arguments: $path
940
941=item Return value: $install_base_perl_path
480e6e85 942
943=back
944
945Returns a path describing where to install the Perl modules for this local
946library installation. Appends the directories C<lib> and C<perl5> to the given
947path.
948
2ad10b57 949=head2 lib_paths_for
950
951=over 4
952
953=item Arguments: $path
954
955=item Return value: @lib_paths
956
957=back
958
959Returns the list of paths perl will search for libraries, given a base path.
960This includes the base path itself, the architecture specific subdirectory, and
961perl version specific subdirectories. These paths may not all exist.
962
480e6e85 963=head2 install_base_bin_path
964
965=over 4
966
a949ebcd 967=item Arguments: $path
968
969=item Return value: $install_base_bin_path
480e6e85 970
971=back
972
973Returns a path describing where to install the executable programs for this
9f9da00a 974local library installation. Appends the directory C<bin> to the given path.
480e6e85 975
2ad10b57 976=head2 installer_options_for
977
978=over 4
979
980=item Arguments: $path
981
49c9e334 982=item Return value: %installer_env_vars
2ad10b57 983
984=back
985
49c9e334 986Returns a hash of environment variables that should be set to cause
2ad10b57 987installation into the given path.
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
2ad10b57 1046=head1 OBJECT INTERFACE
1047
1048=head2 new
1049
1050=over 4
1051
1052=item Arguments: %attributes
1053
1054=item Return value: $local_lib
1055
1056=back
1057
1058Constructs a new C<local::lib> object, representing the current state of
1059C<@INC> and the relevant environment variables.
1060
1061=head1 ATTRIBUTES
1062
1063=head2 roots
1064
1065An arrayref representing active C<local::lib> directories.
1066
1067=head2 inc
1068
1069An arrayref representing C<@INC>.
1070
1071=head2 libs
1072
1073An arrayref representing the PERL5LIB environment variable.
1074
1075=head2 bins
1076
1077An arrayref representing the PATH environment variable.
1078
1079=head2 extra
1080
1081A hashref of extra environment variables (e.g. C<PERL_MM_OPT> and
1082C<PERL_MB_OPT>)
1083
1084=head2 no_create
1085
1086If set, C<local::lib> will not try to create directories when activating them.
1087
1088=head1 OBJECT METHODS
1089
1090=head2 clone
1091
1092=over 4
1093
1094=item Arguments: %attributes
1095
1096=item Return value: $local_lib
1097
1098=back
1099
1100Constructs a new C<local::lib> object based on the existing one, overriding the
1101specified attributes.
1102
1103=head2 activate
1104
1105=over 4
1106
1107=item Arguments: $path
1108
1109=item Return value: $new_local_lib
1110
1111=back
1112
1113Constructs a new instance with the specified path active.
1114
1115=head2 deactivate
1116
1117=over 4
1118
1119=item Arguments: $path
1120
1121=item Return value: $new_local_lib
1122
1123=back
1124
1125Constructs a new instance with the specified path deactivated.
1126
1127=head2 deactivate_all
1128
1129=over 4
1130
1131=item Arguments: None
1132
1133=item Return value: $new_local_lib
1134
1135=back
1136
1137Constructs a new instance with all C<local::lib> directories deactivated.
1138
1139=head2 environment_vars_string
1140
1141=over 4
1142
1143=item Arguments: [ $shelltype ]
1144
1145=item Return value: $shell_env_string
1146
1147=back
1148
1149Returns a string to set up the C<local::lib>, meant to be run by a shell.
1150
1151=head2 build_environment_vars
1152
1153=over 4
1154
1155=item Arguments: None
1156
1157=item Return value: %environment_vars
1158
1159=back
1160
1161Returns a hash with the variables listed above, properly set to use the
1162given path as the base directory.
1163
1164=head2 setup_env_hash
1165
1166=over 4
1167
1168=item Arguments: None
1169
1170=item Return value: None
1171
1172=back
1173
1174Constructs the C<%ENV> keys for the given path, by calling
1175L</build_environment_vars>.
1176
1177=head2 setup_local_lib
1178
1179Constructs the C<%ENV> hash using L</setup_env_hash>, and set up C<@INC>.
1180
0fb70b9a 1181=head1 A WARNING ABOUT UNINST=1
1182
1183Be careful about using local::lib in combination with "make install UNINST=1".
1184The idea of this feature is that will uninstall an old version of a module
1185before installing a new one. However it lacks a safety check that the old
1186version and the new version will go in the same directory. Used in combination
1187with local::lib, you can potentially delete a globally accessible version of a
381738d7 1188module while installing the new version in a local place. Only combine "make
0fb70b9a 1189install UNINST=1" and local::lib if you understand these possible consequences.
1190
dc8ddd06 1191=head1 LIMITATIONS
1192
788ea146 1193=over 4
1194
0d6470a5 1195=item * Directory names with spaces in them are not well supported by the perl
1196toolchain and the programs it uses. Pure-perl distributions should support
1197spaces, but problems are more likely with dists that require compilation. A
1198workaround you can do is moving your local::lib to a directory with spaces
1199B<after> you installed all modules inside your local::lib bootstrap. But be
1200aware that you can't update or install CPAN modules after the move.
47e70ca1 1201
788ea146 1202=item * Rather basic shell detection. Right now anything with csh in its name is
618272fe 1203assumed to be a C shell or something compatible, and everything else is assumed
53699c99 1204to be Bourne, except on Win32 systems. If the C<SHELL> environment variable is
1205not set, a Bourne-compatible shell is assumed.
dc8ddd06 1206
0d6470a5 1207=item * Kills any existing PERL_MM_OPT or PERL_MB_OPT.
dc8ddd06 1208
788ea146 1209=item * Should probably auto-fixup CPAN config if not already done.
1210
6a9fd065 1211=item * local::lib loads L<File::Spec>. When used to set shell variables,
1212this isn't a problem. When used inside a perl script, any L<File::Spec>
1213version inside the local::lib will be ignored. A workaround for this is using
1214C<use lib "$ENV{HOME}/perl5/lib/perl5";> inside the script instead of using
1215C<local::lib> directly.
1216
0921389e 1217=item * Conflicts with L<ExtUtils::MakeMaker>'s C<PREFIX> option.
1218C<local::lib> uses the C<INSTALL_BASE> option, as it has more predictable and
1219sane behavior. If something attempts to use the C<PREFIX> option when running
1220a F<Makefile.PL>, L<ExtUtils::MakeMaker> will refuse to run, as the two
1221options conflict. This can be worked around by temporarily unsetting the
1222C<PERL_MM_OPT> environment variable.
1223
1224=item * Conflicts with L<Module::Build>'s C<--prefix> option. Similar to the
1225previous limitation, but any C<--prefix> option specified will be ignored.
b0b2a40f 1226This can be worked around by temporarily unsetting the C<PERL_MB_OPT>
1227environment variable.
0921389e 1228
788ea146 1229=back
e423efce 1230
dc8ddd06 1231Patches very much welcome for any of the above.
bc30e1d5 1232
788ea146 1233=over 4
1234
0d6470a5 1235=item * On Win32 systems, does not have a way to write the created environment
1236variables to the registry, so that they can persist through a reboot.
53699c99 1237
788ea146 1238=back
1239
9a021b2b 1240=head1 TROUBLESHOOTING
1241
1242If you've configured local::lib to install CPAN modules somewhere in to your
1243home directory, and at some point later you try to install a module with C<cpan
1244-i Foo::Bar>, but it fails with an error like: C<Warning: You do not have
1245permissions to install into /usr/lib64/perl5/site_perl/5.8.8/x86_64-linux at
1246/usr/lib64/perl5/5.8.8/Foo/Bar.pm> and buried within the install log is an
1247error saying C<'INSTALL_BASE' is not a known MakeMaker parameter name>, then
1248you've somehow lost your updated ExtUtils::MakeMaker module.
1249
1250To remedy this situation, rerun the bootstrapping procedure documented above.
1251
1252Then, run C<rm -r ~/.cpan/build/Foo-Bar*>
1253
1254Finally, re-run C<cpan -i Foo::Bar> and it should install without problems.
1255
618272fe 1256=head1 ENVIRONMENT
1257
1258=over 4
1259
1260=item SHELL
1261
53699c99 1262=item COMSPEC
1263
618272fe 1264local::lib looks at the user's C<SHELL> environment variable when printing out
1265commands to add to the shell configuration file.
1266
53699c99 1267On Win32 systems, C<COMSPEC> is also examined.
1268
618272fe 1269=back
1270
163f162c 1271=head1 SEE ALSO
1272
1273=over 4
1274
1275=item * L<Perl Advent article, 2011|http://perladvent.org/2011/2011-12-01.html>
1276
1277=back
1278
cc19e8d4 1279=head1 SUPPORT
1280
1281IRC:
1282
1283 Join #local-lib on irc.perl.org.
1284
b5cc15f7 1285=head1 AUTHOR
1286
1287Matt S Trout <mst@shadowcat.co.uk> http://www.shadowcat.co.uk/
1288
d6b71a2d 1289auto_install fixes kindly sponsored by http://www.takkle.com/
1290
b5c1154d 1291=head1 CONTRIBUTORS
1292
1293Patches to correctly output commands for csh style shells, as well as some
1294documentation additions, contributed by Christopher Nehren <apeiron@cpan.org>.
1295
cc19e8d4 1296Doc patches for a custom local::lib directory, more cleanups in the english
0d6470a5 1297documentation and a L<german documentation|POD2::DE::local::lib> contributed by
1298Torsten Raudssus <torsten@raudssus.de>.
8b1e8e69 1299
be160790 1300Hans Dieter Pearcey <hdp@cpan.org> sent in some additional tests for ensuring
9a021b2b 1301things will install properly, submitted a fix for the bug causing problems with
1302writing Makefiles during bootstrapping, contributed an example program, and
1303submitted yet another fix to ensure that local::lib can install and bootstrap
1304properly. Many, many thanks!
1305
1306pattern of Freenode IRC contributed the beginnings of the Troubleshooting
1307section. Many thanks!
be160790 1308
53699c99 1309Patch to add Win32 support contributed by Curtis Jewell <csjewell@cpan.org>.
1310
03b91976 1311Warnings for missing PATH/PERL5LIB (as when not running interactively) silenced
1312by a patch from Marco Emilio Poleggi.
1313
1f8043c8 1314Mark Stosberg <mark@summersault.com> provided the code for the now deleted
1315'--self-contained' option.
1316
76f30678 1317Documentation patches to make win32 usage clearer by
1318David Mertens <dcmertens.perl@gmail.com> (run4flat).
1319
0d6470a5 1320Brazilian L<portuguese translation|POD2::PT_BR::local::lib> and minor doc
1321patches contributed by Breno G. de Oliveira <garu@cpan.org>.
ccf362c0 1322
a0b3d98a 1323Improvements to stacking multiple local::lib dirs and removing them from the
1324environment later on contributed by Andrew Rodland <arodland@cpan.org>.
1325
0d6470a5 1326Patch for Carp version mismatch contributed by Hakim Cassimally
1327<osfameron@cpan.org>.
cd3eb741 1328
38bfb3a4 1329Rewrite of internals and numerous bug fixes and added features contributed by
1330Graham Knop <haarg@haarg.org>.
1331
7c0db165 1332=head1 COPYRIGHT
1333
2bfba45f 1334Copyright (c) 2007 - 2013 the local::lib L</AUTHOR> and L</CONTRIBUTORS> as
7c0db165 1335listed above.
1336
b5cc15f7 1337=head1 LICENSE
1338
73c9a8ad 1339This is free software; you can redistribute it and/or modify it under
1340the same terms as the Perl 5 programming language system itself.
b5cc15f7 1341
1342=cut