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