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