allow supplying make options to imcover.perl and abort on make failure
[imager.git] / imcover.perl
CommitLineData
1ef586b1
TC
1#!perl -w
2use strict;
3use Config;
4use ExtUtils::Manifest 'maniread';
86c50c46 5use Cwd;
7fcc2ea8
TC
6use Getopt::Long;
7
8my @tests;
9my $verbose;
6aadff55 10my $nodc;
40b02446 11my $make_opts = "";
7fcc2ea8 12GetOptions("t|test=s" => \@tests,
40b02446 13 "m=s" => \$make_opts,
6aadff55 14 "n" => \$nodc,
7fcc2ea8
TC
15 "v" => \$verbose)
16 or die;
1ef586b1
TC
17
18my $make = $Config{make};
19# if there's a way to make with profiling for a recursive build like
20# Imager I don't see how
21if (-f 'Makefile') {
7fcc2ea8 22 run("$make clean");
1ef586b1 23}
7fcc2ea8 24run("cover -delete");
25e68978 25run("perl Makefile.PL --coverage @ARGV")
40b02446
TC
26 and die "Makefile.PL failed\n";
27run("$make $make_opts 'OTHERLDFLAGS=-ftest-coverage -fprofile-arcs'")
28 and die "build failed\n";
1ef586b1 29
86c50c46 30{
bdea445e 31 local $ENV{DEVEL_COVER_OPTIONS} = "-db," . getcwd() . "/cover_db,-coverage,statement,branch,condition,subroutine";
6aadff55
TC
32 my $makecmd = "$make test TEST_VERBOSE=1";
33 $makecmd .= " HARNESS_PERL_SWITCHES=-MDevel::Cover" unless $nodc;
7fcc2ea8
TC
34 if (@tests) {
35 $makecmd .= " TEST_FILES='@tests'";
36 }
40b02446
TC
37 run($makecmd)
38 and die "Test failed\n";
86c50c46 39}
1ef586b1
TC
40
41# build gcov files
42my $mani = maniread();
43# split by directory
44my %paths;
45for my $filename (keys %$mani) {
46 next unless $filename =~ /\.(xs|c|im)$/;
778ca6eb
TC
47 (my $gcda = $filename) =~ s/\.\w+$/.gcda/;
48 next unless -f $gcda;
1ef586b1
TC
49 if ($filename =~ m!^(\w+)/(\w+\.\w+)$!) {
50 push @{$paths{$1}}, $2;
51 }
52 else {
53 push @{$paths{''}}, $filename;
54 }
55}
56
57for my $path (keys %paths) {
58 if ($path) {
7fcc2ea8 59 run("cd $path ; gcov -abc @{$paths{$path}} ; cd ..");
1ef586b1
TC
60 }
61 else {
7fcc2ea8 62 run("gcov -abc @{$paths{$path}}");
1ef586b1
TC
63 }
64 my $dir = $path ? $path : '.';
65 for my $file (@{$paths{$path}}) {
7fcc2ea8 66 run("gcov2perl $dir/$file.gcov");
1ef586b1
TC
67 }
68}
69
70my @dbs = "cover_db", map "$_/cover_db", grep $_, keys %paths;
7fcc2ea8
TC
71# we already ran gcov
72run("cover -nogcov -ignore_re '^t/'");
1ef586b1 73
7fcc2ea8
TC
74sub run {
75 my $cmd = shift;
76
77 print "Running: $cmd\n" if $verbose;
78 return system $cmd;
79}