Category: | Utility Scripts |
Author/Contact Info | demerphq |
Description: |
MakeAll.pl - Build, test and optionally install a module on all versions of perl located in path.
This program will run the standard
and optionally
for each distinct perl executable it finds in the path (it uses some tricks to make sure they aren't dupes). On Win32 it will use make or nmake as is necessary based on whether the script itself is run under Activestate perl or Cygwin perl. On non win32 machines it will use make. Copyright Yves Orton 2004. Released under the same terms as Perl itself. Please see the Perl Artistic License distributed with Perl for details. |
## MakeAll.pl -- See pod at bottom. use strict; use warnings; use Data::Dumper; use File::Find; use File::Spec; use Getopt::Long; use Pod::Usage; use Text::Wrap qw(wrap); use Cwd; use vars qw/$VERSION/; $VERSION='0.1'; sub _join { return join("\n",map { wrap ""," ",$_ } @_),"\n"; } GetOptions( 'help|?' => \(my $Help =0 ), 'run|r!' => \(my $Run =1 ), 'install|i!' => \(my $Install =0 ), 'verbose|v:+'=> \(my $Verbose =0 ), 'debug|d:+' => \(my $Debug =0 ), 'scan|s!' => \(my $Scan =0 ), 'man' => \(my $Man =0 ) ) or pod2usage(2); pod2usage(1) if $Help; pod2usage(-exitstatus => 0, -verbose => 2) if $Man; warn "Run:$Run : Install:$Install : Verbose:$Verbose : Scan:$Scan\n" if $Debug; if($Scan) { $Run=0; $Verbose||=1; } my $fs='File::Spec'; my @vers; foreach my $dir (split /;/,$ENV{PATH}) { foreach (glob $fs->catdir("$dir","perl*.*")) { if(/(perl(?:\d+\.\d+\.\d+)?(\.exe)?)$/i and -e $_){ my $name=$1; my $spec=$_; chomp( my ($ver,$arch,@V)=`$spec -V:version -V:archname -V +`); s/\w+='([^'']+)';/$1/g for $ver,$arch; my $V=join "\n",@V; push @vers,[$name,$spec,$ver,$arch,$V]; } } } my %seen; my %vers; @vers=reverse grep { if (!$seen{$_->[-1]}) { $seen{$_->[-1]}=$_->[0]; printf "--- Found %s at %s version %s on %s ---\n",@$_ if $Verbose; $vers{$_->[2]}{$_->[3]}++; 1 } else { printf "--- Skipping duplicate of %s at %s version %s +on %s ---\n", $seen{$_->[-1]},@{$_}[1..$#$_-1] if $Verbose>2; 0 } } sort { $b->[0] cmp $a->[0] || $b->[2] cmp $a->[2] || $b->[3] cmp $a->[3] } @vers; exit(0) unless $Run; print "--- Work Dir: ".cwd()." ---\n"; my %status; foreach my $perl (@vers) { my ($name,$spec,$ver,$arch,$V)=@$perl; my $test_name="Perl$ver ($arch) ".($vers{$perl->[2]}{$perl->[3]}>1 + ? "[$spec]" : ''); $status{$test_name}=0; print "--- Testing $test_name ---\n"; unlink 'Makefile'; print "Makefile.PL\n" if $Verbose; my $makefile=`$spec Makefile.PL 2>&1 `; unless(-e 'Makefile') { warn "Failed to build with $test_name\nMakefile.PL output:\n$m +akefile\n"; next; } elsif ($Verbose>2) { print "$makefile\n"; } #print $makefile,"\n"; my $maker='make'; $maker="n$maker" if $arch=~/Win32/i; print "$maker\n" if $Verbose; my $make_out=`$maker 2>&1 `; my $exit=$? >> 8; if ($exit) { warn "Failed to build with $test_name\n$maker output:\n$make_o +ut\n"; next; } elsif ($Verbose>2) { print "$make_out\n"; } print "$maker test\n" if $Verbose; chomp(my @res=`$maker test 2>&1 `); if ($exit) { warn "Failed test with $test_name\n$maker test output:\n"._joi +n(@res)."\n"; next; } if (join("",@res)=~/No tests defined/i) { warn "No tests defined for the module\n"; next; } unless ($Verbose>4) { # remove some stuff at the front, like possible version # copyright crap from the maker. shift @res while @res and $res[0]!~/\Q$name\E/; shift @res if @res and $res[0]=~/\Q$name\E/; } #print Dumper(\@res),"\n\n"; #All tests successful, 38 subtests skipped. #Files=16, Tests=279, 12 wallclock secs ( 0.00 cusr + 0.00 csys = + 0.00 CPU) if ($res[-1]=~/Stop|Error|Failed/i) { pop @res while @res and $res[-1]!~/$maker/i; pop @res; if ($Verbose>2) { print _join(@res)."\n"; } else { my @out; unshift @out,pop @res until $res[-1]=~/^\s*Failed\s+\d+/; unshift @out,pop @res; print _join(@out); } } else { #all goood if ($Verbose>2) { print _join(@res); } else { #all goood print "$res[-2]\n$res[-1]\n"; } $status{$test_name}=1; if ($Install) { # should trap errors here... my $install=`$maker install 2>&1 `; my $exit=$? >> 8; if ($exit) { warn "Exitcode $exit.\nFailed install with $test_name\ +n$maker install output:\n$install\n"; next; } elsif ($Verbose>2) { print "$install\n"; } } } print "---End Test---\n\n"; } __END__ =head1 NAME MakeAll.pl - Build, test and optionally install a module on all versio +ns of perl located in path. =head1 SYNOPSIS MakeAll.pl [options] [file ...] Options: --help brief help message --man full documentation --verbose be talkative, repeat or assign a higher value for + more --install do an install in each perl if build is good --no-run don't run test, just scan path --scan short for --verbose --no-run =head1 DESCRIPTION B<This program> will run the standard perl Makefile.PL make make test and optionally make install for each distinct perl executable it finds in the path (it uses some t +ricks to make sure they aren't dupes). On Win32 it will use make or nmake as is necessary + based on whether the script itself is run under Activestate perl or Cygwin perl. On non + win32 machines it will use make. =head1 NOTES Theres probably issues with this on some platform or another. Patches +welcome. =head1 AUTHOR AND COPYRIGHT Copyright Yves Orton 2004. Released under the same terms as Perl itsel +f. Please see the Perl Artistic License distributed with Perl for details. =cut |
|
---|
Replies are listed 'Best First'. | |
---|---|
Re: MakeAll.Pl (Config.pm)
by tye (Sage) on May 01, 2004 at 16:56 UTC | |
by ysth (Canon) on May 02, 2004 at 10:21 UTC | |
Re: MakeAll.Pl
by ysth (Canon) on May 02, 2004 at 10:13 UTC | |
by ysth (Canon) on May 03, 2004 at 16:17 UTC |