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