package Module::Install::With; ### HIGHLY EXPERIMENTAL - TALK TO ADAMK BEFORE USING ANY OF THESE COMMANDS # Provides chunks of functionality for detecting with and interacting with # the rest of the toolchain, helping Module::Install play well with others. # # That is CPAN vs CPANPLUS vs standalone, and EUMM vs MB. use strict; use Module::Install::Base; use File::Spec (); use vars qw{$VERSION $ISCORE @ISA}; BEGIN { $VERSION = '0.67'; $ISCORE = 1; @ISA = qw{Module::Install::Base}; } ##################################################################### # CPAN Client # What CPAN client are we running under sub cpan { return 'cpanpm' if cpanpm(); return 'cpanplus' if cpanplus(); return 'legacy' if cpanlegacy(); } # Are we running a legacy client sub cpanlegacy { return 1 if cpanpm_legacy(); return 1 if cpanplus_legacy(); return ''; } # Are we currently running under a CPAN.pm client (modern method) # Returns the version of the CPAN.pm client. sub cpanpm { my $script = File::Spec->rel2abs($0); return ( $ENV{PERL5_CPAN_IS_EXECUTING} and -f $script and $ENV{PERL5_CPAN_IS_EXECUTING} eq $script ) ? ($ENV{PERL5_CPAN_IS_VERSION} || -1) : ''; } # Are we currently running under the legacy CPAN client # This method is not reliable. sub cpanpm_legacy { my $self = shift; # Does the lock file exist? my $home = $self->cpanpm_config('cpan_home'); my $lock = File::Spec->catfile( $home, '.lock' ); return unless -f $lock; # Check the lock local *LOCK; return unless open(LOCK, $lock); my $cpanpm; if ( $^O eq 'MSWin32' ) { require Cwd; my $cwd = File::Spec->canonpath( Cwd::cwd() ); my $cpan = File::Spec->canonpath( $home ); $cpanpm = (index( $cwd, $cpan ) > -1); } else { $cpanpm = ( == getppid()); } close LOCK; return !! $cpanpm; } # Get a CPAN.pm config value sub cpanpm_config { my $self = shift; # Load the CPAN.pm configuration unless ( $CPAN::VERSION ) { require CPAN; # XXX - TODO, handle error for this $CPAN::HandleConfig::VERSION ? CPAN::HandleConfig->load # Newer CPAN.pm versions : CPAN::Config->load; # Older CPAN.pm versions } $CPAN::Config->{shift()}; } # Are we currently running under the CPANPLUS client sub cpanplus { my $script = File::Spec->rel2abs($0); return ( $ENV{PERL5_CPANPLUS_IS_EXECUTING} and -f $script and $ENV{PERL5_CPANPLUS_IS_EXECUTING} eq $script ) ? ($ENV{PERL5_CPANPLUS_IS_VERSION} || -1) : ''; } # Is CPANPLUS actually installed sub cpanplus_available { $_[0]->can_use('CPANPLUS'); } # Are we (maybe) running under a legacy version of CPANPLUS sub cpanplus_legacy { !! $ENV{CPANPLUS_IS_RUNNING}; } ##################################################################### # Installer Target # Are we targeting ExtUtils::MakeMaker (running as Makefile.PL) sub eumm { !! ($0 =~ /Makefile.PL$/i); } # Are we targeting Module::Build (running as Build.PL) sub mb { !! ($0 =~ /Build.PL$/i); } # Indicates the use of an ExtUtils::MakeMaker-only feature sub no_mb { my $self = shift; return 1 unless $self->mb; # This installer is being run via a Build.PL but uses # a feature that does not support Module::Build. die "Build.PL tried to use a feature unsupported by Module::Build"; } ##################################################################### # Testing and Configuration Contexts # Are we in an interactive configuration environment sub interactive { # Treat things interactively ONLY based on input !! -t STDIN; } # Are we currently running under some sort of automated testing system sub automated_testing { !! $ENV{AUTOMATED_TESTING}; } sub user_context { ! $Module::Install::AUTHOR; } sub author_context { !! $Module::Install::AUTHOR; } 1;