X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2Flocal%2Flib.pm;h=c9f9f485ea8e52a17657c32a07717996b563a385;hb=49c9e33470b288061568ca818c418d6adaa382e7;hp=e468dec45f420d0124c3ad3c70c7d11ec1f18113;hpb=67734fdc4b05cd11bfec9954c77a3ea2309f34cb;p=p5sagit%2Flocal-lib.git diff --git a/lib/local/lib.pm b/lib/local/lib.pm index e468dec..c9f9f48 100644 --- a/lib/local/lib.pm +++ b/lib/local/lib.pm @@ -16,6 +16,7 @@ sub import { my @steps; my %opts; + my $shelltype; while (@args) { my $arg = shift @args; @@ -32,7 +33,17 @@ dashes with normal minus signs. DEATH } elsif ($arg eq '--self-contained') { - 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"; + die <<'DEATH'; +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). +DEATH } elsif( $arg =~ /^--deactivate(?:=(.*))?$/ ) { my $path = defined $1 ? $1 : shift @args; @@ -42,8 +53,7 @@ DEATH push @steps, ['deactivate_all']; } elsif ( $arg =~ /^--shelltype(?:=(.*))?$/ ) { - my $shell = defined $1 ? $1 : shift @args; - $opts{shelltype} = $shell; + $shelltype = defined $1 ? $1 : shift @args; } elsif ( $arg eq '--no-create' ) { $opts{no_create} = 1; @@ -67,7 +77,7 @@ DEATH } if ($0 eq '-') { - $self->print_environment_vars; + print $self->environment_vars_string($shelltype); exit 0; } else { @@ -159,10 +169,12 @@ sub _mb_escape_path { sub installer_options_for { my ($class, $path) = @_; - return { - PERL_MM_OPT => defined $path ? "INSTALL_BASE="._mm_escape_path($path) : undef, - PERL_MB_OPT => defined $path ? "--install_base "._mb_escape_path($path) : undef, - }; + return ( + PERL_MM_OPT => + defined $path ? "INSTALL_BASE="._mm_escape_path($path) : undef, + PERL_MB_OPT => + defined $path ? "--install_base "._mb_escape_path($path) : undef, + ); } sub active_paths { @@ -191,13 +203,16 @@ sub deactivate { } my %args = ( - bins => [ _remove_from($self->bins, $self->install_base_bin_path($path)) ], - libs => [ _remove_from($self->libs, $self->install_base_perl_path($path)) ], - inc => [ _remove_from($self->inc, $self->lib_paths_for($path)) ], + bins => [ _remove_from($self->bins, + $self->install_base_bin_path($path)) ], + libs => [ _remove_from($self->libs, + $self->install_base_perl_path($path)) ], + inc => [ _remove_from($self->inc, + $self->lib_paths_for($path)) ], roots => [ _remove_from($self->roots, $path) ], ); - $args{extra} = $self->installer_options_for($args{roots}[0]); + $args{extra} = { $self->installer_options_for($args{roots}[0]) }; $self->clone(%args); } @@ -221,7 +236,7 @@ sub deactivate_all { ); } - $args{extra} = $self->installer_options_for(undef); + $args{extra} = { $self->installer_options_for(undef) }; $self->clone(%args); } @@ -251,7 +266,7 @@ sub activate { ); } - $args{extra} = $self->installer_options_for($path); + $args{extra} = { $self->installer_options_for($path) }; $self->clone(%args); } @@ -306,12 +321,7 @@ sub setup_env_hash { } sub print_environment_vars_for { - my $self = $_[0]->new->activate($_[1]); - $self->print_environment_vars; -} -sub print_environment_vars { - my $self = shift; - print $self->environment_vars_string; + print $_[0]->environment_vars_string_for(@_[1..$#_]); } sub environment_vars_string_for { @@ -319,9 +329,11 @@ sub environment_vars_string_for { $self->environment_vars_string; } sub environment_vars_string { - my $self = shift; + my ($self, $shelltype) = @_; - my $build_method = 'build_' . $self->shelltype . '_env_declaration'; + $shelltype ||= $self->guess_shelltype; + + my $build_method = "build_${shelltype}_env_declaration"; my @envs = ( PATH => $self->bins, @@ -835,6 +847,8 @@ values: =item PATH +=item PERL_LOCAL_LIB_ROOT + =back When possible, these will be appended to instead of overwritten entirely. @@ -847,7 +861,7 @@ See L for one way to do this - but note that there are a number of caveats, and the best approach is always to perform a build against a clean perl (i.e. site and vendor as close to empty as possible). -=head1 OPTIONS +=head1 IMPORT OPTIONS Options are values that can be passed to the C import besides the directory to use. They are specified as C @@ -874,7 +888,7 @@ C, or C. Prevents C from creating directories when activating dirs. This is likely to cause issues on Win32 systems. -=head1 METHODS +=head1 CLASS METHODS =head2 ensure_dir_structure_for @@ -956,6 +970,20 @@ Returns a path describing where to install the Perl modules for this local library installation. Appends the directories C and C to the given path. +=head2 lib_paths_for + +=over 4 + +=item Arguments: $path + +=item Return value: @lib_paths + +=back + +Returns the list of paths perl will search for libraries, given a base path. +This includes the base path itself, the architecture specific subdirectory, and +perl version specific subdirectories. These paths may not all exist. + =head2 install_base_bin_path =over 4 @@ -969,6 +997,19 @@ path. Returns a path describing where to install the executable programs for this local library installation. Appends the directory C to the given path. +=head2 installer_options_for + +=over 4 + +=item Arguments: $path + +=item Return value: %installer_env_vars + +=back + +Returns a hash of environment variables that should be set to cause +installation into the given path. + =head2 resolve_empty_path =over 4 @@ -1026,6 +1067,141 @@ L, which then has its result passed to L. The result of this final call is returned from L. +=head1 OBJECT INTERFACE + +=head2 new + +=over 4 + +=item Arguments: %attributes + +=item Return value: $local_lib + +=back + +Constructs a new C object, representing the current state of +C<@INC> and the relevant environment variables. + +=head1 ATTRIBUTES + +=head2 roots + +An arrayref representing active C directories. + +=head2 inc + +An arrayref representing C<@INC>. + +=head2 libs + +An arrayref representing the PERL5LIB environment variable. + +=head2 bins + +An arrayref representing the PATH environment variable. + +=head2 extra + +A hashref of extra environment variables (e.g. C and +C) + +=head2 no_create + +If set, C will not try to create directories when activating them. + +=head1 OBJECT METHODS + +=head2 clone + +=over 4 + +=item Arguments: %attributes + +=item Return value: $local_lib + +=back + +Constructs a new C object based on the existing one, overriding the +specified attributes. + +=head2 activate + +=over 4 + +=item Arguments: $path + +=item Return value: $new_local_lib + +=back + +Constructs a new instance with the specified path active. + +=head2 deactivate + +=over 4 + +=item Arguments: $path + +=item Return value: $new_local_lib + +=back + +Constructs a new instance with the specified path deactivated. + +=head2 deactivate_all + +=over 4 + +=item Arguments: None + +=item Return value: $new_local_lib + +=back + +Constructs a new instance with all C directories deactivated. + +=head2 environment_vars_string + +=over 4 + +=item Arguments: [ $shelltype ] + +=item Return value: $shell_env_string + +=back + +Returns a string to set up the C, meant to be run by a shell. + +=head2 build_environment_vars + +=over 4 + +=item Arguments: None + +=item Return value: %environment_vars + +=back + +Returns a hash with the variables listed above, properly set to use the +given path as the base directory. + +=head2 setup_env_hash + +=over 4 + +=item Arguments: None + +=item Return value: None + +=back + +Constructs the C<%ENV> keys for the given path, by calling +L. + +=head2 setup_local_lib + +Constructs the C<%ENV> hash using L, and set up C<@INC>. + =head1 A WARNING ABOUT UNINST=1 Be careful about using local::lib in combination with "make install UNINST=1".