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