Simpler. Technically less correct, but who cares.
[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
7c0db165 14our $VERSION = '1.004008'; # 1.4.7
b9c94c15 15my @KNOWN_FLAGS = (qw/--self-contained/);
b5cc15f7 16
17sub import {
0fb70b9a 18 my ($class, @args) = @_;
b9c94c15 19 @args <= 1 + @KNOWN_FLAGS or die <<'DEATH';
20Please see `perldoc local::lib` for directions on using this module.
21DEATH
0fb70b9a 22
e4892f2b 23 # Remember what PERL5LIB was when we started
24 my $perl5lib = $ENV{PERL5LIB};
25
b9c94c15 26 my %arg_store;
27 for my $arg (@args) {
28 # check for lethal dash first to stop processing before causing problems
29 if ($arg =~ /−/) {
d4dbe584 30 die <<'DEATH';
31WHOA THERE! It looks like you've got some fancy dashes in your commandline!
32These are *not* the traditional -- dashes that software recognizes. You
33probably got these by copy-pasting from the perldoc for this module as
34rendered by a UTF8-capable formatter. This most typically happens on an OS X
35terminal, but can happen elsewhere too. Please try again after replacing the
36dashes with normal minus signs.
37DEATH
b9c94c15 38 }
39 elsif(grep { $arg eq $_ } @KNOWN_FLAGS) {
40 (my $flag = $arg) =~ s/--//;
41 $arg_store{$flag} = 1;
42 }
43 elsif($arg =~ /^--/) {
44 die "Unknown import argument: $arg";
45 }
46 else {
47 # assume that what's left is a path
48 $arg_store{path} = $arg;
49 }
d4dbe584 50 }
b9c94c15 51
52 if($arg_store{'self-contained'}) {
53 # The only directories that remain are those that we just defined and those
54 # where core modules are stored. We put PERL5LIB first, so it'll be favored
55 # over privlibexp and archlibexp
a9489cb0 56
57 @INC = _uniq(
b9c94c15 58 $class->install_base_perl_path($arg_store{path}),
59 $class->install_base_arch_path($arg_store{path}),
53699c99 60 split( $Config{path_sep}, $perl5lib ),
61 $Config::Config{privlibexp},
62 $Config::Config{archlibexp}
a9489cb0 63 );
64
69b80106 65 # We explicitly set PERL5LIB here to the above de-duped list to prevent
a9489cb0 66 # @INC from growing with each invocation
69b80106 67 $ENV{PERL5LIB} = join( $Config{path_sep}, @INC );
0fb70b9a 68 }
b9c94c15 69
70 $arg_store{path} = $class->resolve_path($arg_store{path});
71 $class->setup_local_lib_for($arg_store{path});
0fb70b9a 72
6e5079df 73 for (@INC) { # Untaint @INC
74 next if ref; # Skip entry if it is an ARRAY, CODE, blessed, etc.
75 m/(.*)/ and $_ = $1;
76 }
b5cc15f7 77}
78
5b94dce5 79sub pipeline;
b5cc15f7 80
5b94dce5 81sub pipeline {
b5cc15f7 82 my @methods = @_;
83 my $last = pop(@methods);
84 if (@methods) {
85 \sub {
86 my ($obj, @args) = @_;
5b94dce5 87 $obj->${pipeline @methods}(
b5cc15f7 88 $obj->$last(@args)
89 );
90 };
91 } else {
92 \sub {
93 shift->$last(@_);
94 };
95 }
96}
97
275c9dae 98=begin testing
99
100#:: test pipeline
b5cc15f7 101
102package local::lib;
103
104{ package Foo; sub foo { -$_[1] } sub bar { $_[1]+2 } sub baz { $_[1]+3 } }
105my $foo = bless({}, 'Foo');
4c375968 106Test::More::ok($foo->${pipeline qw(foo bar baz)}(10) == -15);
b5cc15f7 107
275c9dae 108=end testing
109
b5cc15f7 110=cut
111
a9489cb0 112sub _uniq {
113 my %seen;
114 grep { ! $seen{$_}++ } @_;
115}
116
b5cc15f7 117sub resolve_path {
118 my ($class, $path) = @_;
5b94dce5 119 $class->${pipeline qw(
b5cc15f7 120 resolve_relative_path
121 resolve_home_path
122 resolve_empty_path
123 )}($path);
124}
125
126sub resolve_empty_path {
127 my ($class, $path) = @_;
128 if (defined $path) {
129 $path;
130 } else {
131 '~/perl5';
132 }
133}
134
275c9dae 135=begin testing
136
137#:: test classmethod setup
b5cc15f7 138
139my $c = 'local::lib';
140
275c9dae 141=end testing
142
143=begin testing
b5cc15f7 144
275c9dae 145#:: test classmethod
b5cc15f7 146
147is($c->resolve_empty_path, '~/perl5');
148is($c->resolve_empty_path('foo'), 'foo');
149
275c9dae 150=end testing
151
b5cc15f7 152=cut
153
154sub resolve_home_path {
155 my ($class, $path) = @_;
156 return $path unless ($path =~ /^~/);
157 my ($user) = ($path =~ /^~([^\/]+)/); # can assume ^~ so undef for 'us'
158 my $tried_file_homedir;
159 my $homedir = do {
8c6c886f 160 no warnings 'numeric'; # Disable warning caused by version comparison with dev releases..
161 if (eval { require File::HomeDir } && $File::HomeDir::VERSION >= 0.65) {
b5cc15f7 162 $tried_file_homedir = 1;
163 if (defined $user) {
164 File::HomeDir->users_home($user);
165 } else {
dc8ddd06 166 File::HomeDir->my_home;
b5cc15f7 167 }
168 } else {
169 if (defined $user) {
170 (getpwnam $user)[7];
171 } else {
172 if (defined $ENV{HOME}) {
173 $ENV{HOME};
174 } else {
175 (getpwuid $<)[7];
176 }
177 }
178 }
179 };
180 unless (defined $homedir) {
181 Carp::croak(
182 "Couldn't resolve homedir for "
183 .(defined $user ? $user : 'current user')
184 .($tried_file_homedir ? '' : ' - consider installing File::HomeDir')
185 );
186 }
187 $path =~ s/^~[^\/]*/$homedir/;
188 $path;
189}
190
191sub resolve_relative_path {
192 my ($class, $path) = @_;
53699c99 193 $path = File::Spec->rel2abs($path);
b5cc15f7 194}
195
275c9dae 196=begin testing
197
198#:: test classmethod
b5cc15f7 199
200local *File::Spec::rel2abs = sub { shift; 'FOO'.shift; };
201is($c->resolve_relative_path('bar'),'FOObar');
202
275c9dae 203=end testing
204
b5cc15f7 205=cut
206
207sub setup_local_lib_for {
208 my ($class, $path) = @_;
53699c99 209 $path = $class->ensure_dir_structure_for($path);
b5cc15f7 210 if ($0 eq '-') {
211 $class->print_environment_vars_for($path);
212 exit 0;
213 } else {
214 $class->setup_env_hash_for($path);
a9489cb0 215 @INC = _uniq(split($Config{path_sep}, $ENV{PERL5LIB}), @INC);
b5cc15f7 216 }
217}
218
219sub modulebuildrc_path {
220 my ($class, $path) = @_;
221 File::Spec->catfile($path, '.modulebuildrc');
222}
223
224sub install_base_bin_path {
225 my ($class, $path) = @_;
226 File::Spec->catdir($path, 'bin');
227}
228
229sub install_base_perl_path {
230 my ($class, $path) = @_;
231 File::Spec->catdir($path, 'lib', 'perl5');
232}
233
234sub install_base_arch_path {
235 my ($class, $path) = @_;
236 File::Spec->catdir($class->install_base_perl_path($path), $Config{archname});
237}
238
239sub ensure_dir_structure_for {
240 my ($class, $path) = @_;
241 unless (-d $path) {
242 warn "Attempting to create directory ${path}\n";
243 }
244 File::Path::mkpath($path);
53699c99 245 # Need to have the path exist to make a short name for it, so
246 # converting to a short name here.
247 $path = Win32::GetShortPathName($path) if $^O eq 'MSWin32';
b5cc15f7 248 my $modulebuildrc_path = $class->modulebuildrc_path($path);
249 if (-e $modulebuildrc_path) {
250 unless (-f _) {
251 Carp::croak("${modulebuildrc_path} exists but is not a plain file");
252 }
253 } else {
254 warn "Attempting to create file ${modulebuildrc_path}\n";
255 open MODULEBUILDRC, '>', $modulebuildrc_path
256 || Carp::croak("Couldn't open ${modulebuildrc_path} for writing: $!");
18bb63e0 257 print MODULEBUILDRC qq{install --install_base ${path}\n}
b5cc15f7 258 || Carp::croak("Couldn't write line to ${modulebuildrc_path}: $!");
259 close MODULEBUILDRC
260 || Carp::croak("Couldn't close file ${modulebuildrc_path}: $@");
261 }
53699c99 262
263 return $path;
b5cc15f7 264}
265
c2447f35 266sub INTERPOLATE_ENV () { 1 }
267sub LITERAL_ENV () { 0 }
b5cc15f7 268
269sub print_environment_vars_for {
270 my ($class, $path) = @_;
c2447f35 271 my @envs = $class->build_environment_vars_for($path, LITERAL_ENV);
b5cc15f7 272 my $out = '';
1bc71e56 273
0353dbc0 274 # rather basic csh detection, goes on the assumption that something won't
275 # call itself csh unless it really is. also, default to bourne in the
276 # pathological situation where a user doesn't have $ENV{SHELL} defined.
277 # note also that shells with funny names, like zoid, are assumed to be
278 # bourne.
279 my $shellbin = 'sh';
280 if(defined $ENV{'SHELL'}) {
281 my @shell_bin_path_parts = File::Spec->splitpath($ENV{'SHELL'});
282 $shellbin = $shell_bin_path_parts[-1];
283 }
1bc71e56 284 my $shelltype = do {
285 local $_ = $shellbin;
b42496e0 286 if(/csh/) {
1bc71e56 287 'csh'
b42496e0 288 } else {
1bc71e56 289 'bourne'
290 }
291 };
292
f58534b1 293 # Both Win32 and Cygwin have $ENV{COMSPEC} set.
294 if (defined $ENV{'COMSPEC'} && $^O ne 'cygwin') {
53699c99 295 my @shell_bin_path_parts = File::Spec->splitpath($ENV{'COMSPEC'});
296 $shellbin = $shell_bin_path_parts[-1];
297 $shelltype = do {
298 local $_ = $shellbin;
299 if(/command\.com/) {
300 'win32'
301 } elsif(/cmd\.exe/) {
302 'win32'
303 } elsif(/4nt\.exe/) {
304 'win32'
305 } else {
306 $shelltype
307 }
308 };
309 }
310
b5cc15f7 311 while (@envs) {
312 my ($name, $value) = (shift(@envs), shift(@envs));
313 $value =~ s/(\\")/\\$1/g;
1bc71e56 314 $out .= $class->${\"build_${shelltype}_env_declaration"}($name, $value);
b5cc15f7 315 }
316 print $out;
317}
318
1bc71e56 319# simple routines that take two arguments: an %ENV key and a value. return
320# strings that are suitable for passing directly to the relevant shell to set
321# said key to said value.
322sub build_bourne_env_declaration {
323 my $class = shift;
324 my($name, $value) = @_;
325 return qq{export ${name}="${value}"\n};
326}
327
328sub build_csh_env_declaration {
329 my $class = shift;
330 my($name, $value) = @_;
331 return qq{setenv ${name} "${value}"\n};
332}
333
53699c99 334sub build_win32_env_declaration {
335 my $class = shift;
336 my($name, $value) = @_;
337 return qq{set ${name}=${value}\n};
338}
339
b5cc15f7 340sub setup_env_hash_for {
341 my ($class, $path) = @_;
c2447f35 342 my %envs = $class->build_environment_vars_for($path, INTERPOLATE_ENV);
b5cc15f7 343 @ENV{keys %envs} = values %envs;
344}
345
346sub build_environment_vars_for {
347 my ($class, $path, $interpolate) = @_;
348 return (
349 MODULEBUILDRC => $class->modulebuildrc_path($path),
350 PERL_MM_OPT => "INSTALL_BASE=${path}",
53699c99 351 PERL5LIB => join($Config{path_sep},
b5cc15f7 352 $class->install_base_perl_path($path),
353 $class->install_base_arch_path($path),
c2447f35 354 ($ENV{PERL5LIB} ?
355 ($interpolate == INTERPOLATE_ENV
356 ? ($ENV{PERL5LIB})
53699c99 357 : (($^O ne 'MSWin32') ? '$PERL5LIB' : '%PERL5LIB%' ))
c2447f35 358 : ())
b5cc15f7 359 ),
53699c99 360 PATH => join($Config{path_sep},
b5cc15f7 361 $class->install_base_bin_path($path),
c2447f35 362 ($interpolate == INTERPOLATE_ENV
b5cc15f7 363 ? $ENV{PATH}
53699c99 364 : (($^O ne 'MSWin32') ? '$PATH' : '%PATH%' ))
b5cc15f7 365 ),
366 )
367}
368
275c9dae 369=begin testing
370
371#:: test classmethod
b5cc15f7 372
373File::Path::rmtree('t/var/splat');
374
4c375968 375$c->ensure_dir_structure_for('t/var/splat');
b5cc15f7 376
377ok(-d 't/var/splat');
378
379ok(-f 't/var/splat/.modulebuildrc');
380
275c9dae 381=end testing
382
b5cc15f7 383=head1 NAME
384
385local::lib - create and use a local lib/ for perl modules with PERL5LIB
386
387=head1 SYNOPSIS
388
389In code -
390
391 use local::lib; # sets up a local lib at ~/perl5
392
393 use local::lib '~/foo'; # same, but ~/foo
394
1bc71e56 395 # Or...
396 use FindBin;
397 use local::lib "$FindBin::Bin/../support"; # app-local support library
398
b5cc15f7 399From the shell -
400
0fb70b9a 401 # Install LWP and it's missing dependencies to the 'my_lwp' directory
402 perl -MCPAN -Mlocal::lib=my_lwp -e 'CPAN::install(LWP)'
403
404 # Install LWP and *all non-core* dependencies to the 'my_lwp' directory
405 perl -MCPAN -Mlocal::lib=--self-contained,my_lwp -e 'CPAN::install(LWP)'
406
407 # Just print out useful shell commands
b5cc15f7 408 $ perl -Mlocal::lib
409 export MODULEBUILDRC=/home/username/perl/.modulebuildrc
410 export PERL_MM_OPT='INSTALL_BASE=/home/username/perl'
411 export PERL5LIB='/home/username/perl/lib/perl5:/home/username/perl/lib/perl5/i386-linux'
412 export PATH="/home/username/perl/bin:$PATH"
413
322b0a0d 414=head2 The bootstrapping technique
bc30e1d5 415
730f5dda 416A typical way to install local::lib is using what is known as the
417"bootstrapping" technique. You would do this if your system administrator
418hasn't already installed local::lib. In this case, you'll need to install
419local::lib in your home directory.
715c31a0 420
730f5dda 4211. Download and unpack the local::lib tarball from CPAN (search for "Download"
422on the CPAN page about local::lib). Do this as an ordinary user, not as root
423or administrator. Unpack the file in your home directory or in any other
424convenient location.
715c31a0 425
730f5dda 4262. Run this:
715c31a0 427
730f5dda 428 perl Makefile.PL --bootstrap
715c31a0 429
730f5dda 430If the system asks you whether it should automatically configure as much
431as possible, you would typically answer yes.
432
4333. Run this:
434
435 make test && make install
436
4374. Arrange for Perl to use your own packages instead of the system
438packages. If you are using bash, you can do this as follows:
439
440 echo 'eval $(perl -I$HOME/perl5/lib/perl5 -Mlocal::lib)' >>~/.bashrc
441
442If you are using C shell, you can do this as follows:
443
444 /bin/csh
445 echo $SHELL
618272fe 446 /bin/csh
730f5dda 447 perl -I$HOME/perl5/lib/perl5 -Mlocal::lib >> ~/.cshrc
dc8ddd06 448
53699c99 449You can also pass --bootstrap=~/foo to get a different location -
8b1e8e69 450
730f5dda 451 perl Makefile.PL --bootstrap=~/foo
452 make test && make install
8b1e8e69 453
730f5dda 454 echo 'eval $(perl -I$HOME/foo/lib/perl5 -Mlocal::lib=$HOME/foo)' >>~/.bashrc
618272fe 455
aab64481 456After writing your shell configuration file, be sure to re-read it to get the
457changed settings into your current shell's environment. Bourne shells use C<.
458~/.bashrc> for this, whereas C shells use C<source ~/.cshrc>. Replace .bashrc or
459.cshrc with the name of the file you wrote above with the echo command.
460
b9c94c15 461If you're on a slower machine, or are operating under draconian disk space
462limitations, you can disable the automatic generation of manpages from POD when
463installing modules by using the C<--no-manpages> argument when bootstrapping:
464
730f5dda 465 perl Makefile.PL --bootstrap --no-manpages
b9c94c15 466
977a9ca3 467If you want to install multiple Perl module environments, say for application evelopment,
468install local::lib globally and then:
469
730f5dda 470 cd ~/mydir1
471 perl -Mlocal::lib=./
472 eval $(perl -Mlocal::lib=./) ### To set the environment for this shell alone
473 printenv ### You will see that ~/mydir1 is in the PERL5LIB
474 perl -MCPAN -e install ... ### whatever modules you want
475 cd ../mydir2
476 ... REPEAT ...
477
478For multiple environments for multiple apps you may need to include a modified
479version of the C<< use FindBin >> instructions in the "In code" sample above.
480If you did something like the above, you have a set of Perl modules at C<<
481~/mydir1/lib >>. If you have a script at C<< ~/mydir1/scripts/myscript.pl >>,
482you need to tell it where to find the modules you installed for it at C<<
483~/mydir1/lib >>.
977a9ca3 484
485In C<< ~/mydir1/scripts/myscript.pl >>:
486
730f5dda 487 use strict;
488 use warnings;
489 use local::lib "$FindBin::Bin/.."; ### points to ~/mydir1 and local::lib finds lib
490 use lib "$FindBin::Bin/../lib"; ### points to ~/mydir1/lib
977a9ca3 491
492Put this before any BEGIN { ... } blocks that require the modules you installed.
493
53699c99 494=head2 Differences when using this module under Win32
495
730f5dda 496 C:\>perl -Mlocal::lib
497 set MODULEBUILDRC=C:\DOCUME~1\ADMINI~1\perl5\.modulebuildrc
498 set PERL_MM_OPT=INSTALL_BASE=C:\DOCUME~1\ADMINI~1\perl5
499 set PERL5LIB=C:\DOCUME~1\ADMINI~1\perl5\lib\perl5;C:\DOCUME~1\ADMINI~1\perl5\lib\perl5\MSWin32-x86-multi-thread
500 set PATH=C:\DOCUME~1\ADMINI~1\perl5\bin;%PATH%
501
502 ### To set the environment for this shell alone
503 C:\>perl -Mlocal::lib > %TEMP%\tmp.bat && %TEMP%\tmp.bat && del %TEMP%\temp.bat
504 ### instead of $(perl -Mlocal::lib=./)
53699c99 505
506If you want the environment entries to persist, you'll need to add then to the
507Control Panel's System applet yourself at the moment.
508
509The "~" is translated to the user's profile directory (the directory named for
510the user under "Documents and Settings" (Windows XP or earlier) or "Users"
511(Windows Vista or later) unless $ENV{HOME} exists. After that, the home
512directory is translated to a short name (which means the directory must exist)
513and the subdirectories are created.
514
730f5dda 515=head1 RATIONALE
516
517The version of a Perl package on your machine is not always the version you
518need. Obviously, the best thing to do would be to update to the version you
519need. However, you might be in a situation where you're prevented from doing
520this. Perhaps you don't have system administrator privileges; or perhaps you
521are using a package management system such as Debian, and nobody has yet gotten
522around to packaging up the version you need.
523
524local::lib solves this problem by allowing you to create your own directory of
525Perl packages downloaded from CPAN (in a multi-user system, this would typically
526be within your own home directory). The existing system Perl installation is
527not affected; you simply invoke Perl with special options so that Perl uses the
528packages in your own local package directory rather than the system packages.
529local::lib arranges things so that your locally installed version of the Perl
530packages takes precedence over the system installation.
531
532If you are using a package management system (such as Debian), you don't need to
533worry about Debian and CPAN stepping on each other's toes. Your local version
534of the packages will be written to an entirely separate directory from those
535installed by Debian.
536
618272fe 537=head1 DESCRIPTION
538
539This module provides a quick, convenient way of bootstrapping a user-local Perl
540module library located within the user's home directory. It also constructs and
541prints out for the user the list of environment variables using the syntax
542appropriate for the user's current shell (as specified by the C<SHELL>
730f5dda 543environment variable), suitable for directly adding to one's shell
544configuration file.
545
546More generally, local::lib allows for the bootstrapping and usage of a
547directory containing Perl modules outside of Perl's C<@INC>. This makes it
548easier to ship an application with an app-specific copy of a Perl module, or
549collection of modules. Useful in cases like when an upstream maintainer hasn't
550applied a patch to a module of theirs that you need for your application.
1bc71e56 551
552On import, local::lib sets the following environment variables to appropriate
553values:
554
555=over 4
556
557=item MODULEBUILDRC
558
559=item PERL_MM_OPT
560
561=item PERL5LIB
562
563=item PATH
564
565PATH is appended to, rather than clobbered.
566
567=back
568
569These values are then available for reference by any code after import.
570
480e6e85 571=head1 METHODS
572
573=head2 ensure_directory_structure_for
574
575=over 4
576
577=item Arguments: path
578
579=back
580
581Attempts to create the given path, and all required parent directories. Throws
582an exception on failure.
583
584=head2 print_environment_vars_for
585
586=over 4
587
588=item Arguments: path
589
590=back
591
592Prints to standard output the variables listed above, properly set to use the
593given path as the base directory.
594
595=head2 setup_env_hash_for
596
597=over 4
598
599=item Arguments: path
600
601=back
602
603Constructs the C<%ENV> keys for the given path, by calling
604C<build_environment_vars_for>.
605
606=head2 install_base_perl_path
607
608=over 4
609
610=item Arguments: path
611
612=back
613
614Returns a path describing where to install the Perl modules for this local
615library installation. Appends the directories C<lib> and C<perl5> to the given
616path.
617
618=head2 install_base_arch_path
619
620=over 4
621
622=item Arguments: path
623
624=back
625
626Returns a path describing where to install the architecture-specific Perl
627modules for this local library installation. Based on the
628L</install_base_perl_path> method's return value, and appends the value of
629C<$Config{archname}>.
630
631=head2 install_base_bin_path
632
633=over 4
634
635=item Arguments: path
636
637=back
638
639Returns a path describing where to install the executable programs for this
640local library installation. Based on the L</install_base_perl_path> method's
641return value, and appends the directory C<bin>.
642
643=head2 modulebuildrc_path
644
645=over 4
646
647=item Arguments: path
648
649=back
650
651Returns a path describing where to install the C<.modulebuildrc> file, based on
652the given path.
653
654=head2 resolve_empty_path
655
656=over 4
657
658=item Arguments: path
659
660=back
661
662Builds and returns the base path into which to set up the local module
663installation. Defaults to C<~/perl5>.
664
665=head2 resolve_home_path
666
667=over 4
668
669=item Arguments: path
670
671=back
672
673Attempts to find the user's home directory. If installed, uses C<File::HomeDir>
674for this purpose. If no definite answer is available, throws an exception.
675
676=head2 resolve_relative_path
677
678=over 4
679
680=item Arguments: path
681
682=back
683
684Translates the given path into an absolute path.
685
686=head2 resolve_path
687
688=over 4
689
690=item Arguments: path
691
692=back
693
694Calls the following in a pipeline, passing the result from the previous to the
695next, in an attempt to find where to configure the environment for a local
696library installation: L</resolve_empty_path>, L</resolve_home_path>,
697L</resolve_relative_path>. Passes the given path argument to
698L</resolve_empty_path> which then returns a result that is passed to
699L</resolve_home_path>, which then has its result passed to
700L</resolve_relative_path>. The result of this final call is returned from
701L</resolve_path>.
702
0fb70b9a 703=head1 A WARNING ABOUT UNINST=1
704
705Be careful about using local::lib in combination with "make install UNINST=1".
706The idea of this feature is that will uninstall an old version of a module
707before installing a new one. However it lacks a safety check that the old
708version and the new version will go in the same directory. Used in combination
709with local::lib, you can potentially delete a globally accessible version of a
381738d7 710module while installing the new version in a local place. Only combine "make
0fb70b9a 711install UNINST=1" and local::lib if you understand these possible consequences.
712
dc8ddd06 713=head1 LIMITATIONS
714
618272fe 715Rather basic shell detection. Right now anything with csh in its name is
716assumed to be a C shell or something compatible, and everything else is assumed
53699c99 717to be Bourne, except on Win32 systems. If the C<SHELL> environment variable is
718not set, a Bourne-compatible shell is assumed.
dc8ddd06 719
720Bootstrap is a hack and will use CPAN.pm for ExtUtils::MakeMaker even if you
721have CPANPLUS installed.
722
723Kills any existing PERL5LIB, PERL_MM_OPT or MODULEBUILDRC.
724
e423efce 725Should probably auto-fixup CPAN config if not already done.
726
dc8ddd06 727Patches very much welcome for any of the above.
bc30e1d5 728
53699c99 729On Win32 systems, does not have a way to write the created environment variables
730to the registry, so that they can persist through a reboot.
731
9a021b2b 732=head1 TROUBLESHOOTING
733
734If you've configured local::lib to install CPAN modules somewhere in to your
735home directory, and at some point later you try to install a module with C<cpan
736-i Foo::Bar>, but it fails with an error like: C<Warning: You do not have
737permissions to install into /usr/lib64/perl5/site_perl/5.8.8/x86_64-linux at
738/usr/lib64/perl5/5.8.8/Foo/Bar.pm> and buried within the install log is an
739error saying C<'INSTALL_BASE' is not a known MakeMaker parameter name>, then
740you've somehow lost your updated ExtUtils::MakeMaker module.
741
742To remedy this situation, rerun the bootstrapping procedure documented above.
743
744Then, run C<rm -r ~/.cpan/build/Foo-Bar*>
745
746Finally, re-run C<cpan -i Foo::Bar> and it should install without problems.
747
618272fe 748=head1 ENVIRONMENT
749
750=over 4
751
752=item SHELL
753
53699c99 754=item COMSPEC
755
618272fe 756local::lib looks at the user's C<SHELL> environment variable when printing out
757commands to add to the shell configuration file.
758
53699c99 759On Win32 systems, C<COMSPEC> is also examined.
760
618272fe 761=back
762
b5cc15f7 763=head1 AUTHOR
764
765Matt S Trout <mst@shadowcat.co.uk> http://www.shadowcat.co.uk/
766
d6b71a2d 767auto_install fixes kindly sponsored by http://www.takkle.com/
768
b5c1154d 769=head1 CONTRIBUTORS
770
771Patches to correctly output commands for csh style shells, as well as some
772documentation additions, contributed by Christopher Nehren <apeiron@cpan.org>.
773
0fb70b9a 774'--self-contained' feature contributed by Mark Stosberg <mark@summersault.com>.
775
b9c94c15 776Ability to pass '--self-contained' without a directory inspired by frew on
777irc.perl.org/#catalyst.
778
c4dbb66c 779Doc patches for a custom local::lib directory contributed by Torsten Raudssus
8b1e8e69 780<torsten@raudssus.de>.
781
be160790 782Hans Dieter Pearcey <hdp@cpan.org> sent in some additional tests for ensuring
9a021b2b 783things will install properly, submitted a fix for the bug causing problems with
784writing Makefiles during bootstrapping, contributed an example program, and
785submitted yet another fix to ensure that local::lib can install and bootstrap
786properly. Many, many thanks!
787
788pattern of Freenode IRC contributed the beginnings of the Troubleshooting
789section. Many thanks!
be160790 790
53699c99 791Patch to add Win32 support contributed by Curtis Jewell <csjewell@cpan.org>.
792
7c0db165 793=head1 COPYRIGHT
794
795Copyright (c) 2007 - 2009 the local::lib L</AUTHOR> and L</CONTRIBUTORS> as
796listed above.
797
b5cc15f7 798=head1 LICENSE
799
7c0db165 800This library is free software and may be distributed under the same terms
801as perl itself.
b5cc15f7 802
803=cut
804
8051;