package Package::Install; use strict; use base qw(Package::Base); use Data::Dumper; use ExtUtils::MakeMaker; use Package::Configure; use Term::ANSIColor; sub init { my($self,%arg) = @_; $self->SUPER::init(%arg); $self->configure(Package::Configure->new(%arg)) unless $self->configure(); } =head2 compile_manifest() Usage : $obj->compile_manifest() Function: Called by L, this iterates over all .pm files in the distro MANIFEST and tries to compile them (perl -c) prints to STDERR a diagnostic message for each. Args : none. =cut sub compile_manifest { my ($self) = @_; my $statusformat = "%-60s[%s]\n"; my $fail = colored('FAILED','red'); my $pass = colored(' OK ','green'); my $base = 'lib/'; if(! -e 'MANIFEST'){ print STDERR colored(" can't find MANIFEST ($!), skipping", 'red bold')."\n"; return undef; } my @entries; open(M,"MANIFEST"); while(my $file = ){ chomp $file; next unless $file =~ /\.pm$/ and $file =~ /^$base/; my($pack) = $file =~ /^(.+)\.pm$/; #untaint $pack =~ s/^$base//; #strip leading path $pack =~ s!/!::!g; #replace all / with :: push @entries, $pack; } close(M); print STDERR colored("compiling modules in MANIFEST", 'cyan')."\n"; foreach my $pack (@entries){ eval "use $pack"; if($@ && $ENV{DEBUG}){ print "\n$@\n" } print STDERR sprintf($statusformat,"use $pack", ($@ ? $fail : $pass)); } } =head2 write_makefile() Usage : $obj->write_makefile(%arg) Function: calls ExtUtils::MakeMaker's WriteMakefile() with provided %arg, as well as PL_FILES and EXE_FILES as determined by Package::Configure (config file [PL_FILES] [EXE_FILES] sections). Returns : Args : an anonymous hash of WriteMakefile() args. See L for details. =cut sub write_makefile { my ($self,%arg) = @_; $self->compile_manifest(); my %pl_files; my @exe_files; if($self->configure->ini()){ %pl_files = map {$_ => $self->configure->ini()->val('PL_FILES',$_)} $self->configure->ini()->Parameters('PL_FILES'); #warn Dumper(\%pl_files); @exe_files = grep { $self->configure->ini()->val('EXE_FILES',$_) =~ /y1/i } $self->configure->ini()->Parameters('EXE_FILES'); } if($arg{bootstrap}){ $pl_files{'bin/pstub.PL'} = 'bin/pstub'; push @exe_files, 'bin/pstub'; delete($arg{bootstrap}); } WriteMakefile( %arg, 'PL_FILES' => \%pl_files, 'EXE_FILES' => \@exe_files, ); } =head2 configure() Usage : $obj->configure($newval) Function: holds a Package::Configure instance Example : Returns : value of configure (a scalar) Args : on set, new value (a scalar or undef, optional) =cut sub configure { my($self,$val) = @_; $self->{'configure'} = $val if defined($val); return $self->{'configure'}; } =head1 METHODS FOR ExtUtils::MakeMaker =cut sub MY::clean { package MY; my $inherited = shift->SUPER::clean(@_); $inherited .= "\t\$(RM_F) pkg_config.cache\n"; return $inherited; } 1;