6 use 5.008001; # probably works with earlier versions but I'm not supporting them
7 # (patches would, of course, be welcome)
14 our $VERSION = '1.004006'; # 1.4.6
15 my @KNOWN_FLAGS = (qw/--self-contained/);
18 my ($class, @args) = @_;
19 @args <= 1 + @KNOWN_FLAGS or die <<'DEATH';
20 Please see `perldoc local::lib` for directions on using this module.
23 # Remember what PERL5LIB was when we started
24 my $perl5lib = $ENV{PERL5LIB};
28 # check for lethal dash first to stop processing before causing problems
31 WHOA THERE! It looks like you've got some fancy dashes in your commandline!
32 These are *not* the traditional -- dashes that software recognizes. You
33 probably got these by copy-pasting from the perldoc for this module as
34 rendered by a UTF8-capable formatter. This most typically happens on an OS X
35 terminal, but can happen elsewhere too. Please try again after replacing the
36 dashes with normal minus signs.
39 elsif(grep { $arg eq $_ } @KNOWN_FLAGS) {
40 (my $flag = $arg) =~ s/--//;
41 $arg_store{$flag} = 1;
43 elsif($arg =~ /^--/) {
44 die "Unknown import argument: $arg";
47 # assume that what's left is a path
48 $arg_store{path} = $arg;
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
57 @INC = grep { ! $seen{$_}++ } (
58 $class->install_base_perl_path($arg_store{path}),
59 $class->install_base_arch_path($arg_store{path}),
60 split( $Config{path_sep}, $perl5lib ),
61 $Config::Config{privlibexp},
62 $Config::Config{archlibexp}
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 );
70 $arg_store{path} = $class->resolve_path($arg_store{path});
71 $class->setup_local_lib_for($arg_store{path});
73 for (@INC) { # Untaint @INC
74 next if ref; # Skip entry if it is an ARRAY, CODE, blessed, etc.
83 my $last = pop(@methods);
86 my ($obj, @args) = @_;
87 $obj->${pipeline @methods}(
104 { package Foo; sub foo { -$_[1] } sub bar { $_[1]+2 } sub baz { $_[1]+3 } }
105 my $foo = bless({}, 'Foo');
106 Test::More::ok($foo->${pipeline qw(foo bar baz)}(10) == -15);
113 my ($class, $path) = @_;
114 $class->${pipeline qw(
115 resolve_relative_path
121 sub resolve_empty_path {
122 my ($class, $path) = @_;
132 #:: test classmethod setup
134 my $c = 'local::lib';
142 is($c->resolve_empty_path, '~/perl5');
143 is($c->resolve_empty_path('foo'), 'foo');
149 sub resolve_home_path {
150 my ($class, $path) = @_;
151 return $path unless ($path =~ /^~/);
152 my ($user) = ($path =~ /^~([^\/]+)/); # can assume ^~ so undef for 'us'
153 my $tried_file_homedir;
155 if (eval { require File::HomeDir } && $File::HomeDir::VERSION >= 0.65) {
156 $tried_file_homedir = 1;
158 File::HomeDir->users_home($user);
160 File::HomeDir->my_home;
166 if (defined $ENV{HOME}) {
174 unless (defined $homedir) {
176 "Couldn't resolve homedir for "
177 .(defined $user ? $user : 'current user')
178 .($tried_file_homedir ? '' : ' - consider installing File::HomeDir')
181 $path =~ s/^~[^\/]*/$homedir/;
185 sub resolve_relative_path {
186 my ($class, $path) = @_;
187 $path = File::Spec->rel2abs($path);
194 local *File::Spec::rel2abs = sub { shift; 'FOO'.shift; };
195 is($c->resolve_relative_path('bar'),'FOObar');
201 sub setup_local_lib_for {
202 my ($class, $path) = @_;
203 $path = $class->ensure_dir_structure_for($path);
205 $class->print_environment_vars_for($path);
208 $class->setup_env_hash_for($path);
209 unshift(@INC, split($Config{path_sep}, $ENV{PERL5LIB}));
213 sub modulebuildrc_path {
214 my ($class, $path) = @_;
215 File::Spec->catfile($path, '.modulebuildrc');
218 sub install_base_bin_path {
219 my ($class, $path) = @_;
220 File::Spec->catdir($path, 'bin');
223 sub install_base_perl_path {
224 my ($class, $path) = @_;
225 File::Spec->catdir($path, 'lib', 'perl5');
228 sub install_base_arch_path {
229 my ($class, $path) = @_;
230 File::Spec->catdir($class->install_base_perl_path($path), $Config{archname});
233 sub ensure_dir_structure_for {
234 my ($class, $path) = @_;
236 warn "Attempting to create directory ${path}\n";
238 File::Path::mkpath($path);
239 # Need to have the path exist to make a short name for it, so
240 # converting to a short name here.
241 $path = Win32::GetShortPathName($path) if $^O eq 'MSWin32';
242 my $modulebuildrc_path = $class->modulebuildrc_path($path);
243 if (-e $modulebuildrc_path) {
245 Carp::croak("${modulebuildrc_path} exists but is not a plain file");
248 warn "Attempting to create file ${modulebuildrc_path}\n";
249 open MODULEBUILDRC, '>', $modulebuildrc_path
250 || Carp::croak("Couldn't open ${modulebuildrc_path} for writing: $!");
251 print MODULEBUILDRC qq{install --install_base ${path}\n}
252 || Carp::croak("Couldn't write line to ${modulebuildrc_path}: $!");
254 || Carp::croak("Couldn't close file ${modulebuildrc_path}: $@");
260 sub INTERPOLATE_ENV () { 1 }
261 sub LITERAL_ENV () { 0 }
263 sub print_environment_vars_for {
264 my ($class, $path) = @_;
265 my @envs = $class->build_environment_vars_for($path, LITERAL_ENV);
268 # rather basic csh detection, goes on the assumption that something won't
269 # call itself csh unless it really is. also, default to bourne in the
270 # pathological situation where a user doesn't have $ENV{SHELL} defined.
271 # note also that shells with funny names, like zoid, are assumed to be
274 if(defined $ENV{'SHELL'}) {
275 my @shell_bin_path_parts = File::Spec->splitpath($ENV{'SHELL'});
276 $shellbin = $shell_bin_path_parts[-1];
279 local $_ = $shellbin;
287 # Both Win32 and Cygwin have $ENV{COMSPEC} set.
288 if (defined $ENV{'COMSPEC'} && $^O ne 'cygwin') {
289 my @shell_bin_path_parts = File::Spec->splitpath($ENV{'COMSPEC'});
290 $shellbin = $shell_bin_path_parts[-1];
292 local $_ = $shellbin;
295 } elsif(/cmd\.exe/) {
297 } elsif(/4nt\.exe/) {
306 my ($name, $value) = (shift(@envs), shift(@envs));
307 $value =~ s/(\\")/\\$1/g;
308 $out .= $class->${\"build_${shelltype}_env_declaration"}($name, $value);
313 # simple routines that take two arguments: an %ENV key and a value. return
314 # strings that are suitable for passing directly to the relevant shell to set
315 # said key to said value.
316 sub build_bourne_env_declaration {
318 my($name, $value) = @_;
319 return qq{export ${name}="${value}"\n};
322 sub build_csh_env_declaration {
324 my($name, $value) = @_;
325 return qq{setenv ${name} "${value}"\n};
328 sub build_win32_env_declaration {
330 my($name, $value) = @_;
331 return qq{set ${name}=${value}\n};
334 sub setup_env_hash_for {
335 my ($class, $path) = @_;
336 my %envs = $class->build_environment_vars_for($path, INTERPOLATE_ENV);
337 @ENV{keys %envs} = values %envs;
340 sub build_environment_vars_for {
341 my ($class, $path, $interpolate) = @_;
343 MODULEBUILDRC => $class->modulebuildrc_path($path),
344 PERL_MM_OPT => "INSTALL_BASE=${path}",
345 PERL5LIB => join($Config{path_sep},
346 $class->install_base_perl_path($path),
347 $class->install_base_arch_path($path),
349 ($interpolate == INTERPOLATE_ENV
351 : (($^O ne 'MSWin32') ? '$PERL5LIB' : '%PERL5LIB%' ))
354 PATH => join($Config{path_sep},
355 $class->install_base_bin_path($path),
356 ($interpolate == INTERPOLATE_ENV
358 : (($^O ne 'MSWin32') ? '$PATH' : '%PATH%' ))
367 File::Path::rmtree('t/var/splat');
369 $c->ensure_dir_structure_for('t/var/splat');
371 ok(-d 't/var/splat');
373 ok(-f 't/var/splat/.modulebuildrc');
379 local::lib - create and use a local lib/ for perl modules with PERL5LIB
385 use local::lib; # sets up a local lib at ~/perl5
387 use local::lib '~/foo'; # same, but ~/foo
391 use local::lib "$FindBin::Bin/../support"; # app-local support library
395 # Install LWP and it's missing dependencies to the 'my_lwp' directory
396 perl -MCPAN -Mlocal::lib=my_lwp -e 'CPAN::install(LWP)'
398 # Install LWP and *all non-core* dependencies to the 'my_lwp' directory
399 perl -MCPAN -Mlocal::lib=--self-contained,my_lwp -e 'CPAN::install(LWP)'
401 # Just print out useful shell commands
403 export MODULEBUILDRC=/home/username/perl/.modulebuildrc
404 export PERL_MM_OPT='INSTALL_BASE=/home/username/perl'
405 export PERL5LIB='/home/username/perl/lib/perl5:/home/username/perl/lib/perl5/i386-linux'
406 export PATH="/home/username/perl/bin:$PATH"
408 To bootstrap if you don't have local::lib itself installed -
410 <download local::lib tarball from CPAN, unpack and cd into dir>
412 $ perl Makefile.PL --bootstrap
413 $ make test && make install
415 $ echo 'eval $(perl -I$HOME/perl5/lib/perl5 -Mlocal::lib)' >>~/.bashrc
422 % perl -I$HOME/perl5/lib/perl5 -Mlocal::lib >> ~/.cshrc
424 You can also pass --bootstrap=~/foo to get a different location -
426 $ perl Makefile.PL --bootstrap=~/foo
427 $ make test && make install
429 $ echo 'eval $(perl -I$HOME/foo/lib/perl5 -Mlocal::lib=$HOME/foo)' >>~/.bashrc
431 If you're on a slower machine, or are operating under draconian disk space
432 limitations, you can disable the automatic generation of manpages from POD when
433 installing modules by using the C<--no-manpages> argument when bootstrapping:
435 $ perl Makefile.PL --bootstrap --no-manpages
437 If you want to install multiple Perl module environments, say for application evelopment,
438 install local::lib globally and then:
441 $ perl -Mlocal::lib=./
442 $ eval $(perl -Mlocal::lib=./) ### To set the environment for this shell alone
443 $ printenv ### You will see that ~/mydir1 is in the PERL5LIB
444 $ perl -MCPAN -e install ... ### whatever modules you want
448 For multiple environments for multiple apps you may need to include a modified version of
449 the C<< use FindBin >> instructions in the "In code" sample above. If you did something like
450 the above, you have a set of Perl modules at C<< ~/mydir1/lib >>. If you have a script at
451 C<< ~/mydir1/scripts/myscript.pl >>, you need to tell it where to find the modules you installed
452 for it at C<< ~/mydir1/lib >>.
454 In C<< ~/mydir1/scripts/myscript.pl >>:
458 use local::lib "$FindBin::Bin/.."; ### points to ~/mydir1 and local::lib finds lib
459 use lib "$FindBin::Bin/../lib"; ### points to ~/mydir1/lib
461 Put this before any BEGIN { ... } blocks that require the modules you installed.
463 =head2 Differences when using this module under Win32
465 C:\>perl -Mlocal::lib
466 set MODULEBUILDRC=C:\DOCUME~1\ADMINI~1\perl5\.modulebuildrc
467 set PERL_MM_OPT=INSTALL_BASE=C:\DOCUME~1\ADMINI~1\perl5
468 set PERL5LIB=C:\DOCUME~1\ADMINI~1\perl5\lib\perl5;C:\DOCUME~1\ADMINI~1\perl5\lib\perl5\MSWin32-x86-multi-thread
469 set PATH=C:\DOCUME~1\ADMINI~1\perl5\bin;%PATH%
471 ### To set the environment for this shell alone
472 C:\>perl -Mlocal::lib > %TEMP%\tmp.bat && %TEMP%\tmp.bat && del %TEMP%\temp.bat
473 ### instead of $(perl -Mlocal::lib=./)
475 If you want the environment entries to persist, you'll need to add then to the
476 Control Panel's System applet yourself at the moment.
478 The "~" is translated to the user's profile directory (the directory named for
479 the user under "Documents and Settings" (Windows XP or earlier) or "Users"
480 (Windows Vista or later) unless $ENV{HOME} exists. After that, the home
481 directory is translated to a short name (which means the directory must exist)
482 and the subdirectories are created.
486 This module provides a quick, convenient way of bootstrapping a user-local Perl
487 module library located within the user's home directory. It also constructs and
488 prints out for the user the list of environment variables using the syntax
489 appropriate for the user's current shell (as specified by the C<SHELL>
490 environment variable), suitable for directly adding to one's shell configuration
493 More generally, local::lib allows for the bootstrapping and usage of a directory
494 containing Perl modules outside of Perl's C<@INC>. This makes it easier to ship
495 an application with an app-specific copy of a Perl module, or collection of
496 modules. Useful in cases like when an upstream maintainer hasn't applied a patch
497 to a module of theirs that you need for your application.
499 On import, local::lib sets the following environment variables to appropriate
512 PATH is appended to, rather than clobbered.
516 These values are then available for reference by any code after import.
520 =head2 ensure_directory_structure_for
524 =item Arguments: path
528 Attempts to create the given path, and all required parent directories. Throws
529 an exception on failure.
531 =head2 print_environment_vars_for
535 =item Arguments: path
539 Prints to standard output the variables listed above, properly set to use the
540 given path as the base directory.
542 =head2 setup_env_hash_for
546 =item Arguments: path
550 Constructs the C<%ENV> keys for the given path, by calling
551 C<build_environment_vars_for>.
553 =head2 install_base_perl_path
557 =item Arguments: path
561 Returns a path describing where to install the Perl modules for this local
562 library installation. Appends the directories C<lib> and C<perl5> to the given
565 =head2 install_base_arch_path
569 =item Arguments: path
573 Returns a path describing where to install the architecture-specific Perl
574 modules for this local library installation. Based on the
575 L</install_base_perl_path> method's return value, and appends the value of
576 C<$Config{archname}>.
578 =head2 install_base_bin_path
582 =item Arguments: path
586 Returns a path describing where to install the executable programs for this
587 local library installation. Based on the L</install_base_perl_path> method's
588 return value, and appends the directory C<bin>.
590 =head2 modulebuildrc_path
594 =item Arguments: path
598 Returns a path describing where to install the C<.modulebuildrc> file, based on
601 =head2 resolve_empty_path
605 =item Arguments: path
609 Builds and returns the base path into which to set up the local module
610 installation. Defaults to C<~/perl5>.
612 =head2 resolve_home_path
616 =item Arguments: path
620 Attempts to find the user's home directory. If installed, uses C<File::HomeDir>
621 for this purpose. If no definite answer is available, throws an exception.
623 =head2 resolve_relative_path
627 =item Arguments: path
631 Translates the given path into an absolute path.
637 =item Arguments: path
641 Calls the following in a pipeline, passing the result from the previous to the
642 next, in an attempt to find where to configure the environment for a local
643 library installation: L</resolve_empty_path>, L</resolve_home_path>,
644 L</resolve_relative_path>. Passes the given path argument to
645 L</resolve_empty_path> which then returns a result that is passed to
646 L</resolve_home_path>, which then has its result passed to
647 L</resolve_relative_path>. The result of this final call is returned from
650 =head1 A WARNING ABOUT UNINST=1
652 Be careful about using local::lib in combination with "make install UNINST=1".
653 The idea of this feature is that will uninstall an old version of a module
654 before installing a new one. However it lacks a safety check that the old
655 version and the new version will go in the same directory. Used in combination
656 with local::lib, you can potentially delete a globally accessible version of a
657 module while installing the new version in a local place. Only combine "make
658 install UNINST=1" and local::lib if you understand these possible consequences.
662 Rather basic shell detection. Right now anything with csh in its name is
663 assumed to be a C shell or something compatible, and everything else is assumed
664 to be Bourne, except on Win32 systems. If the C<SHELL> environment variable is
665 not set, a Bourne-compatible shell is assumed.
667 Bootstrap is a hack and will use CPAN.pm for ExtUtils::MakeMaker even if you
668 have CPANPLUS installed.
670 Kills any existing PERL5LIB, PERL_MM_OPT or MODULEBUILDRC.
672 Should probably auto-fixup CPAN config if not already done.
674 Patches very much welcome for any of the above.
676 On Win32 systems, does not have a way to write the created environment variables
677 to the registry, so that they can persist through a reboot.
679 =head1 TROUBLESHOOTING
681 If you've configured local::lib to install CPAN modules somewhere in to your
682 home directory, and at some point later you try to install a module with C<cpan
683 -i Foo::Bar>, but it fails with an error like: C<Warning: You do not have
684 permissions to install into /usr/lib64/perl5/site_perl/5.8.8/x86_64-linux at
685 /usr/lib64/perl5/5.8.8/Foo/Bar.pm> and buried within the install log is an
686 error saying C<'INSTALL_BASE' is not a known MakeMaker parameter name>, then
687 you've somehow lost your updated ExtUtils::MakeMaker module.
689 To remedy this situation, rerun the bootstrapping procedure documented above.
691 Then, run C<rm -r ~/.cpan/build/Foo-Bar*>
693 Finally, re-run C<cpan -i Foo::Bar> and it should install without problems.
703 local::lib looks at the user's C<SHELL> environment variable when printing out
704 commands to add to the shell configuration file.
706 On Win32 systems, C<COMSPEC> is also examined.
712 Matt S Trout <mst@shadowcat.co.uk> http://www.shadowcat.co.uk/
714 auto_install fixes kindly sponsored by http://www.takkle.com/
718 Patches to correctly output commands for csh style shells, as well as some
719 documentation additions, contributed by Christopher Nehren <apeiron@cpan.org>.
721 '--self-contained' feature contributed by Mark Stosberg <mark@summersault.com>.
723 Ability to pass '--self-contained' without a directory inspired by frew on
724 irc.perl.org/#catalyst.
726 Doc patches for a custom local::lib directory contributed by Torsten Raudssus
727 <torsten@raudssus.de>.
729 Hans Dieter Pearcey <hdp@cpan.org> sent in some additional tests for ensuring
730 things will install properly, submitted a fix for the bug causing problems with
731 writing Makefiles during bootstrapping, contributed an example program, and
732 submitted yet another fix to ensure that local::lib can install and bootstrap
733 properly. Many, many thanks!
735 pattern of Freenode IRC contributed the beginnings of the Troubleshooting
736 section. Many thanks!
738 Patch to add Win32 support contributed by Curtis Jewell <csjewell@cpan.org>.
742 This library is free software under the same license as perl itself.