Commit | Line | Data |
---|---|---|
1ef586b1 TC |
1 | #!perl -w |
2 | use strict; | |
3 | use Config; | |
4 | use ExtUtils::Manifest 'maniread'; | |
86c50c46 | 5 | use Cwd; |
7fcc2ea8 TC |
6 | use Getopt::Long; |
7 | ||
8 | my @tests; | |
9 | my $verbose; | |
6aadff55 | 10 | my $nodc; |
40b02446 | 11 | my $make_opts = ""; |
1c7c3940 | 12 | my $regen_only; |
7fcc2ea8 | 13 | GetOptions("t|test=s" => \@tests, |
40b02446 | 14 | "m=s" => \$make_opts, |
6aadff55 | 15 | "n" => \$nodc, |
1c7c3940 TC |
16 | "v" => \$verbose, |
17 | "r" => \$regen_only) | |
7fcc2ea8 | 18 | or die; |
1ef586b1 | 19 | |
1c7c3940 TC |
20 | my $do_build = !$regen_only; |
21 | if ($do_build) { | |
22 | my $make = $Config{make}; | |
23 | # if there's a way to make with profiling for a recursive build like | |
24 | # Imager I don't see how | |
25 | if (-f 'Makefile') { | |
26 | run("$make clean"); | |
27 | } | |
28 | run("cover -delete"); | |
a6f7bffe | 29 | run("$^X Makefile.PL --coverage @ARGV") |
1c7c3940 TC |
30 | and die "Makefile.PL failed\n"; |
31 | run("$make $make_opts 'OTHERLDFLAGS=-ftest-coverage -fprofile-arcs'") | |
32 | and die "build failed\n"; | |
1ef586b1 | 33 | |
1c7c3940 TC |
34 | { |
35 | local $ENV{DEVEL_COVER_OPTIONS} = "-db," . getcwd() . "/cover_db,-coverage,statement,branch,condition,subroutine"; | |
36 | my $makecmd = "$make test"; | |
37 | $makecmd .= " TEST_VERBOSE=1" if $verbose; | |
38 | $makecmd .= " HARNESS_PERL_SWITCHES=-MDevel::Cover" unless $nodc; | |
39 | if (@tests) { | |
40 | $makecmd .= " TEST_FILES='@tests'"; | |
41 | } | |
42 | run($makecmd) | |
43 | and die "Test failed\n"; | |
7fcc2ea8 | 44 | } |
86c50c46 | 45 | } |
1ef586b1 TC |
46 | |
47 | # build gcov files | |
48 | my $mani = maniread(); | |
49 | # split by directory | |
50 | my %paths; | |
51 | for my $filename (keys %$mani) { | |
52 | next unless $filename =~ /\.(xs|c|im)$/; | |
778ca6eb TC |
53 | (my $gcda = $filename) =~ s/\.\w+$/.gcda/; |
54 | next unless -f $gcda; | |
1ef586b1 TC |
55 | if ($filename =~ m!^(\w+)/(\w+\.\w+)$!) { |
56 | push @{$paths{$1}}, $2; | |
57 | } | |
58 | else { | |
59 | push @{$paths{''}}, $filename; | |
60 | } | |
8091ecbe TC |
61 | if ($filename =~ s/\.(xs|im)$/.c/) { |
62 | if ($filename =~ m!^(\w+)/(\w+\.\w+)$!) { | |
63 | push @{$paths{$1}}, $2; | |
64 | } | |
65 | else { | |
66 | push @{$paths{''}}, $filename; | |
67 | } | |
68 | } | |
1ef586b1 TC |
69 | } |
70 | ||
a6f7bffe TC |
71 | my $gcov2perl = $Config{sitebin} . "/gcov2perl"; |
72 | ||
1ef586b1 TC |
73 | for my $path (keys %paths) { |
74 | if ($path) { | |
7fcc2ea8 | 75 | run("cd $path ; gcov -abc @{$paths{$path}} ; cd .."); |
1ef586b1 TC |
76 | } |
77 | else { | |
7fcc2ea8 | 78 | run("gcov -abc @{$paths{$path}}"); |
1ef586b1 TC |
79 | } |
80 | my $dir = $path ? $path : '.'; | |
81 | for my $file (@{$paths{$path}}) { | |
a6f7bffe | 82 | run("$gcov2perl $dir/$file.gcov"); |
1ef586b1 TC |
83 | } |
84 | } | |
85 | ||
86 | my @dbs = "cover_db", map "$_/cover_db", grep $_, keys %paths; | |
7fcc2ea8 TC |
87 | # we already ran gcov |
88 | run("cover -nogcov -ignore_re '^t/'"); | |
1ef586b1 | 89 | |
7fcc2ea8 TC |
90 | sub run { |
91 | my $cmd = shift; | |
92 | ||
93 | print "Running: $cmd\n" if $verbose; | |
94 | return system $cmd; | |
95 | } | |
1c7c3940 TC |
96 | |
97 | =head1 NAME | |
98 | ||
99 | imcover.perl - perform C and perl coverage testing for Imager | |
100 | ||
101 | =head1 SYNOPSIS | |
102 | ||
103 | perl imcover.perl [-m=...][-t=...][-n][-v][-r] -- ... Makefile.PL options | |
104 | ||
105 | =head1 DESCRIPTION | |
106 | ||
107 | Builds Imager with the C< -ftest-coverage -fprofile-arcs > gcc options | |
108 | and then runs perl's tests. | |
109 | ||
110 | =cut |