Update tests for de-duplication
[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 ();
11use Carp ();
12use Config;
13
45fa6ab3 14our $VERSION = '1.008001'; # 1.8.1
1f8043c8 15
15f79556 16our @KNOWN_FLAGS = qw(--self-contained --deactivate --deactivate-all);
17
18sub DEACTIVATE_ONE () { 1 }
19sub DEACTIVATE_ALL () { 2 }
b5cc15f7 20
3939a7ae 21sub INTERPOLATE_ENV () { 1 }
22sub LITERAL_ENV () { 0 }
23
b5cc15f7 24sub import {
0fb70b9a 25 my ($class, @args) = @_;
26
e4892f2b 27 # Remember what PERL5LIB was when we started
ea0824e7 28 my $perl5lib = $ENV{PERL5LIB} || '';
e4892f2b 29
b9c94c15 30 my %arg_store;
31 for my $arg (@args) {
32 # check for lethal dash first to stop processing before causing problems
33 if ($arg =~ /−/) {
d4dbe584 34 die <<'DEATH';
35WHOA THERE! It looks like you've got some fancy dashes in your commandline!
36These are *not* the traditional -- dashes that software recognizes. You
37probably got these by copy-pasting from the perldoc for this module as
38rendered by a UTF8-capable formatter. This most typically happens on an OS X
39terminal, but can happen elsewhere too. Please try again after replacing the
40dashes with normal minus signs.
41DEATH
b9c94c15 42 }
43 elsif(grep { $arg eq $_ } @KNOWN_FLAGS) {
44 (my $flag = $arg) =~ s/--//;
45 $arg_store{$flag} = 1;
46 }
47 elsif($arg =~ /^--/) {
48 die "Unknown import argument: $arg";
49 }
50 else {
51 # assume that what's left is a path
52 $arg_store{path} = $arg;
53 }
d4dbe584 54 }
b9c94c15 55
b10fc4d4 56 if($arg_store{'self-contained'}) {
1f8043c8 57 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 58 }
b9c94c15 59
15f79556 60 my $deactivating = 0;
61 if ($arg_store{deactivate}) {
62 $deactivating = DEACTIVATE_ONE;
63 }
64 if ($arg_store{'deactivate-all'}) {
65 $deactivating = DEACTIVATE_ALL;
66 }
67
b9c94c15 68 $arg_store{path} = $class->resolve_path($arg_store{path});
15f79556 69 $class->setup_local_lib_for($arg_store{path}, $deactivating);
0fb70b9a 70
6e5079df 71 for (@INC) { # Untaint @INC
72 next if ref; # Skip entry if it is an ARRAY, CODE, blessed, etc.
73 m/(.*)/ and $_ = $1;
74 }
b5cc15f7 75}
76
5b94dce5 77sub pipeline;
b5cc15f7 78
5b94dce5 79sub pipeline {
b5cc15f7 80 my @methods = @_;
81 my $last = pop(@methods);
82 if (@methods) {
83 \sub {
84 my ($obj, @args) = @_;
5b94dce5 85 $obj->${pipeline @methods}(
b5cc15f7 86 $obj->$last(@args)
87 );
88 };
89 } else {
90 \sub {
91 shift->$last(@_);
92 };
93 }
94}
95
275c9dae 96=begin testing
97
98#:: test pipeline
b5cc15f7 99
100package local::lib;
101
102{ package Foo; sub foo { -$_[1] } sub bar { $_[1]+2 } sub baz { $_[1]+3 } }
103my $foo = bless({}, 'Foo');
4c375968 104Test::More::ok($foo->${pipeline qw(foo bar baz)}(10) == -15);
b5cc15f7 105
275c9dae 106=end testing
107
b5cc15f7 108=cut
109
a9489cb0 110sub _uniq {
111 my %seen;
112 grep { ! $seen{$_}++ } @_;
113}
114
b5cc15f7 115sub resolve_path {
116 my ($class, $path) = @_;
5b94dce5 117 $class->${pipeline qw(
b5cc15f7 118 resolve_relative_path
119 resolve_home_path
120 resolve_empty_path
121 )}($path);
122}
123
124sub resolve_empty_path {
125 my ($class, $path) = @_;
126 if (defined $path) {
127 $path;
128 } else {
129 '~/perl5';
130 }
131}
132
275c9dae 133=begin testing
134
135#:: test classmethod setup
b5cc15f7 136
137my $c = 'local::lib';
138
275c9dae 139=end testing
140
141=begin testing
b5cc15f7 142
275c9dae 143#:: test classmethod
b5cc15f7 144
145is($c->resolve_empty_path, '~/perl5');
146is($c->resolve_empty_path('foo'), 'foo');
147
275c9dae 148=end testing
149
b5cc15f7 150=cut
151
152sub resolve_home_path {
153 my ($class, $path) = @_;
154 return $path unless ($path =~ /^~/);
155 my ($user) = ($path =~ /^~([^\/]+)/); # can assume ^~ so undef for 'us'
156 my $tried_file_homedir;
157 my $homedir = do {
8c6c886f 158 if (eval { require File::HomeDir } && $File::HomeDir::VERSION >= 0.65) {
b5cc15f7 159 $tried_file_homedir = 1;
160 if (defined $user) {
161 File::HomeDir->users_home($user);
162 } else {
dc8ddd06 163 File::HomeDir->my_home;
b5cc15f7 164 }
165 } else {
166 if (defined $user) {
167 (getpwnam $user)[7];
168 } else {
169 if (defined $ENV{HOME}) {
170 $ENV{HOME};
171 } else {
172 (getpwuid $<)[7];
173 }
174 }
175 }
176 };
177 unless (defined $homedir) {
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
210 if (! $deactivating) {
211 if (@active_lls && $active_lls[-1] eq $path) {
212 exit 0 if $0 eq '-';
213 return; # Asked to add what's already at the top of the stack
214 } elsif (grep { $_ eq $path} @active_lls) {
215 # Asked to add a dir that's lower in the stack -- so we remove it from
216 # where it is, and then add it back at the top.
217 $class->setup_env_hash_for($path, DEACTIVATE_ONE);
218 # Which means we can no longer output "PERL5LIB=...:$PERL5LIB" stuff
219 # anymore because we're taking something *out*.
220 $interpolate = INTERPOLATE_ENV;
221 }
222 }
223
224 $path = $class->ensure_dir_structure_for($path);
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
730f5dda 648 C:\>perl -Mlocal::lib > %TEMP%\tmp.bat && %TEMP%\tmp.bat && del %TEMP%\temp.bat
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
792=head2 install_base_perl_path
793
794=over 4
795
a949ebcd 796=item Arguments: $path
797
798=item Return value: $install_base_perl_path
480e6e85 799
800=back
801
802Returns a path describing where to install the Perl modules for this local
803library installation. Appends the directories C<lib> and C<perl5> to the given
804path.
805
806=head2 install_base_arch_path
807
808=over 4
809
a949ebcd 810=item Arguments: $path
811
812=item Return value: $install_base_arch_path
480e6e85 813
814=back
815
816Returns a path describing where to install the architecture-specific Perl
817modules for this local library installation. Based on the
818L</install_base_perl_path> method's return value, and appends the value of
819C<$Config{archname}>.
820
821=head2 install_base_bin_path
822
823=over 4
824
a949ebcd 825=item Arguments: $path
826
827=item Return value: $install_base_bin_path
480e6e85 828
829=back
830
831Returns a path describing where to install the executable programs for this
832local library installation. Based on the L</install_base_perl_path> method's
833return value, and appends the directory C<bin>.
834
480e6e85 835=head2 resolve_empty_path
836
837=over 4
838
a949ebcd 839=item Arguments: $path
840
841=item Return value: $base_path
480e6e85 842
843=back
844
845Builds and returns the base path into which to set up the local module
846installation. Defaults to C<~/perl5>.
847
848=head2 resolve_home_path
849
850=over 4
851
a949ebcd 852=item Arguments: $path
853
854=item Return value: $home_path
480e6e85 855
856=back
857
858Attempts to find the user's home directory. If installed, uses C<File::HomeDir>
859for this purpose. If no definite answer is available, throws an exception.
860
861=head2 resolve_relative_path
862
863=over 4
864
a949ebcd 865=item Arguments: $path
866
867=item Return value: $absolute_path
480e6e85 868
869=back
870
871Translates the given path into an absolute path.
872
873=head2 resolve_path
874
875=over 4
876
a949ebcd 877=item Arguments: $path
878
879=item Return value: $absolute_path
480e6e85 880
881=back
882
883Calls the following in a pipeline, passing the result from the previous to the
884next, in an attempt to find where to configure the environment for a local
885library installation: L</resolve_empty_path>, L</resolve_home_path>,
886L</resolve_relative_path>. Passes the given path argument to
887L</resolve_empty_path> which then returns a result that is passed to
888L</resolve_home_path>, which then has its result passed to
889L</resolve_relative_path>. The result of this final call is returned from
890L</resolve_path>.
891
0fb70b9a 892=head1 A WARNING ABOUT UNINST=1
893
894Be careful about using local::lib in combination with "make install UNINST=1".
895The idea of this feature is that will uninstall an old version of a module
896before installing a new one. However it lacks a safety check that the old
897version and the new version will go in the same directory. Used in combination
898with local::lib, you can potentially delete a globally accessible version of a
381738d7 899module while installing the new version in a local place. Only combine "make
0fb70b9a 900install UNINST=1" and local::lib if you understand these possible consequences.
901
dc8ddd06 902=head1 LIMITATIONS
903
47e70ca1 904The perl toolchain is unable to handle directory names with spaces in it,
a8e981cf 905so you cant put your local::lib bootstrap into a directory with spaces. What
906you can do is moving your local::lib to a directory with spaces B<after> you
907installed all modules inside your local::lib bootstrap. But be aware that you
908cant update or install CPAN modules after the move.
47e70ca1 909
618272fe 910Rather basic shell detection. Right now anything with csh in its name is
911assumed to be a C shell or something compatible, and everything else is assumed
53699c99 912to be Bourne, except on Win32 systems. If the C<SHELL> environment variable is
913not set, a Bourne-compatible shell is assumed.
dc8ddd06 914
915Bootstrap is a hack and will use CPAN.pm for ExtUtils::MakeMaker even if you
916have CPANPLUS installed.
917
e322149f 918Kills any existing PERL5LIB, PERL_MM_OPT or PERL_MB_OPT.
dc8ddd06 919
e423efce 920Should probably auto-fixup CPAN config if not already done.
921
dc8ddd06 922Patches very much welcome for any of the above.
bc30e1d5 923
53699c99 924On Win32 systems, does not have a way to write the created environment variables
925to the registry, so that they can persist through a reboot.
926
9a021b2b 927=head1 TROUBLESHOOTING
928
929If you've configured local::lib to install CPAN modules somewhere in to your
930home directory, and at some point later you try to install a module with C<cpan
931-i Foo::Bar>, but it fails with an error like: C<Warning: You do not have
932permissions to install into /usr/lib64/perl5/site_perl/5.8.8/x86_64-linux at
933/usr/lib64/perl5/5.8.8/Foo/Bar.pm> and buried within the install log is an
934error saying C<'INSTALL_BASE' is not a known MakeMaker parameter name>, then
935you've somehow lost your updated ExtUtils::MakeMaker module.
936
937To remedy this situation, rerun the bootstrapping procedure documented above.
938
939Then, run C<rm -r ~/.cpan/build/Foo-Bar*>
940
941Finally, re-run C<cpan -i Foo::Bar> and it should install without problems.
942
618272fe 943=head1 ENVIRONMENT
944
945=over 4
946
947=item SHELL
948
53699c99 949=item COMSPEC
950
618272fe 951local::lib looks at the user's C<SHELL> environment variable when printing out
952commands to add to the shell configuration file.
953
53699c99 954On Win32 systems, C<COMSPEC> is also examined.
955
618272fe 956=back
957
cc19e8d4 958=head1 SUPPORT
959
960IRC:
961
962 Join #local-lib on irc.perl.org.
963
b5cc15f7 964=head1 AUTHOR
965
966Matt S Trout <mst@shadowcat.co.uk> http://www.shadowcat.co.uk/
967
d6b71a2d 968auto_install fixes kindly sponsored by http://www.takkle.com/
969
b5c1154d 970=head1 CONTRIBUTORS
971
972Patches to correctly output commands for csh style shells, as well as some
973documentation additions, contributed by Christopher Nehren <apeiron@cpan.org>.
974
cc19e8d4 975Doc patches for a custom local::lib directory, more cleanups in the english
a949ebcd 976documentation and a L<german documentation|POD2::DE::local::lib> contributed by Torsten Raudssus
8b1e8e69 977<torsten@raudssus.de>.
978
be160790 979Hans Dieter Pearcey <hdp@cpan.org> sent in some additional tests for ensuring
9a021b2b 980things will install properly, submitted a fix for the bug causing problems with
981writing Makefiles during bootstrapping, contributed an example program, and
982submitted yet another fix to ensure that local::lib can install and bootstrap
983properly. Many, many thanks!
984
985pattern of Freenode IRC contributed the beginnings of the Troubleshooting
986section. Many thanks!
be160790 987
53699c99 988Patch to add Win32 support contributed by Curtis Jewell <csjewell@cpan.org>.
989
03b91976 990Warnings for missing PATH/PERL5LIB (as when not running interactively) silenced
991by a patch from Marco Emilio Poleggi.
992
1f8043c8 993Mark Stosberg <mark@summersault.com> provided the code for the now deleted
994'--self-contained' option.
995
76f30678 996Documentation patches to make win32 usage clearer by
997David Mertens <dcmertens.perl@gmail.com> (run4flat).
998
a949ebcd 999Brazilian L<portuguese translation|POD2::PT_BR::local::lib> and minor doc patches contributed by Breno
ccf362c0 1000G. de Oliveira <garu@cpan.org>.
1001
a0b3d98a 1002Improvements to stacking multiple local::lib dirs and removing them from the
1003environment later on contributed by Andrew Rodland <arodland@cpan.org>.
1004
7c0db165 1005=head1 COPYRIGHT
1006
cc19e8d4 1007Copyright (c) 2007 - 2010 the local::lib L</AUTHOR> and L</CONTRIBUTORS> as
7c0db165 1008listed above.
1009
b5cc15f7 1010=head1 LICENSE
1011
7c0db165 1012This library is free software and may be distributed under the same terms
1013as perl itself.
b5cc15f7 1014
1015=cut
1016
10171;