diff --git a/t/src/checkdepend.t b/t/src/checkdepend.t
index d7b2f10..0c2ef36 100644
|
a
|
b
|
|
| 1 | 1 | #! perl |
| 2 | | |
| 3 | | # Copyright (C) 2009-2010, Parrot Foundation. |
| | 2 | # Copyright (C) 2009-2011, Parrot Foundation. |
| 4 | 3 | |
| 5 | 4 | use strict; |
| 6 | 5 | use warnings; |
| … |
… |
|
| 10 | 9 | use File::Find; |
| 11 | 10 | use File::Spec; |
| 12 | 11 | use Test::More; |
| | 12 | use lib qw( lib ); |
| | 13 | use Parrot::Config; |
| 13 | 14 | |
| 14 | 15 | =head1 NAME |
| 15 | 16 | |
| … |
… |
|
| 48 | 49 | exit; |
| 49 | 50 | } |
| 50 | 51 | |
| 51 | | my @incfiles = []; |
| | 52 | my @incfiles = (); |
| 52 | 53 | find( { wanted => \&wanted, no_chdir => 1 }, |
| 53 | 54 | qw/src compilers include frontend/ ); |
| 54 | 55 | |
| … |
… |
|
| 57 | 58 | foreach my $file (sort grep /\.[hc]$/, @incfiles) { |
| 58 | 59 | # skip pmcs - we don't handle inheritance correctly |
| 59 | 60 | next if $file =~ m{^src/(?:dyn)?pmc/}; |
| | 61 | next if ($file eq 'src/nci/extra_thunks.c' and |
| | 62 | ! defined $Parrot::Config::PConfig_Temp{PARROT_HAS_EXTRA_NCI_THUNKS}); |
| 60 | 63 | |
| 61 | 64 | open my $fh, '<', $file; |
| 62 | 65 | my $guts; |
| … |
… |
|
| 102 | 105 | } |
| 103 | 106 | } |
| 104 | 107 | |
| | 108 | our $rules = []; |
| | 109 | get_rules('Makefile', $rules); |
| | 110 | |
| | 111 | #expand all variables |
| | 112 | our %vars; |
| | 113 | foreach (@$rules) { |
| | 114 | #expand any known variables |
| | 115 | while ($_->{line} =~ /\$\(([A-Z_]+)\)/) { |
| | 116 | my $var_name = $1; |
| | 117 | if (exists $vars{$var_name}) { |
| | 118 | $_->{line} =~ s/\$\($var_name\)/$vars{$var_name}/g; |
| | 119 | } |
| | 120 | else { |
| | 121 | $_->{line} =~ s/\$\($var_name\)//g; |
| | 122 | } |
| | 123 | } |
| | 124 | |
| | 125 | #store any new definitions |
| | 126 | if ($_->{line} =~ /^(\w+)\s+=\s+(.*)$/) { |
| | 127 | $vars{$1} = $2; |
| | 128 | } |
| | 129 | } |
| | 130 | |
| | 131 | if (@ARGV && $ARGV[0] eq '--dump') { |
| | 132 | print "$_->{line}\n" for (@$rules); |
| | 133 | exit 0; |
| | 134 | } |
| | 135 | |
| | 136 | my $test_count = grep {/\.(c)$/} (keys %deps); |
| | 137 | plan( tests => $test_count ); |
| | 138 | |
| | 139 | my @files = keys %deps; |
| | 140 | @files = @ARGV if @ARGV; |
| | 141 | |
| | 142 | check_files($rules, \@files, '.c', $vars{O}); |
| | 143 | |
| | 144 | ##### SUBROUTINES ##### |
| | 145 | |
| | 146 | sub wanted { |
| | 147 | if ($File::Find::name =~ /\.(c|h)$/) { |
| | 148 | push @incfiles, $File::Find::name; |
| | 149 | } |
| | 150 | } |
| | 151 | |
| 105 | 152 | sub get_rules { |
| 106 | 153 | |
| 107 | 154 | my ($filename, $rules) = @_; |
| … |
… |
|
| 129 | 176 | |
| 130 | 177 | # Convert all \-newline continuations into single lines for ease of |
| 131 | 178 | # processing. Leave blank lines to keep line numbers accurate. |
| 132 | | if (exists $rules->[$escape_start]{line} && |
| | 179 | if ( |
| | 180 | exists $rules->[$escape_start]{line} && |
| 133 | 181 | $rules->[$escape_start]{line} !~ /\\$/ && |
| 134 | | $rules->[$global_line_num]{line} =~ /\\$/) { |
| 135 | | |
| | 182 | $rules->[$global_line_num]{line} =~ /\\$/ |
| | 183 | ) { |
| 136 | 184 | $escape_start = $global_line_num; |
| 137 | 185 | } |
| 138 | 186 | |
| 139 | | if ($rules->[$escape_start]{line} && $rules->[$escape_start]{line} =~ /\\$/ && |
| 140 | | $escape_start != $global_line_num) { |
| | 187 | if ( |
| | 188 | $rules->[$escape_start]{line} && |
| | 189 | $rules->[$escape_start]{line} =~ /\\$/ && |
| | 190 | $escape_start != $global_line_num |
| | 191 | ) { |
| 141 | 192 | |
| 142 | 193 | $rules->[$escape_start]{line} =~ s/\\$//; |
| 143 | | $rules->[$escape_start]{line} .= $rules->[$global_line_num]{line}; |
| | 194 | $rules->[$escape_start]{line} |
| | 195 | .= $rules->[$global_line_num]{line}; |
| 144 | 196 | $rules->[$global_line_num]{line} = ''; |
| 145 | 197 | } |
| 146 | 198 | |
| … |
… |
|
| 151 | 203 | close $mf; |
| 152 | 204 | } |
| 153 | 205 | |
| 154 | | our $rules = []; |
| 155 | | get_rules('Makefile', $rules); |
| 156 | | |
| 157 | | #expand all variables |
| 158 | | our %vars; |
| 159 | | foreach (@$rules) { |
| 160 | | #expand any known variables |
| 161 | | while ($_->{line} =~ /\$\(([A-Z_]+)\)/) { |
| 162 | | my $var_name = $1; |
| 163 | | if (exists $vars{$var_name}) { |
| 164 | | $_->{line} =~ s/\$\($var_name\)/$vars{$var_name}/g; |
| 165 | | } |
| 166 | | else { |
| 167 | | $_->{line} =~ s/\$\($var_name\)//g; |
| 168 | | } |
| 169 | | } |
| 170 | | |
| 171 | | #store any new definitions |
| 172 | | if ($_->{line} =~ /^(\w+)\s+=\s+(.*)$/) { |
| 173 | | $vars{$1} = $2; |
| 174 | | } |
| 175 | | } |
| 176 | | |
| 177 | | if (@ARGV && $ARGV[0] eq '--dump') { |
| 178 | | print "$_->{line}\n" for (@$rules); |
| 179 | | exit 0; |
| 180 | | } |
| 181 | | |
| 182 | | my $test_count = grep {/\.(c)$/} (keys %deps); |
| 183 | | |
| 184 | | plan( tests => $test_count ); |
| 185 | | |
| 186 | | #foreach my $header (sort grep {/\.h$/} (keys %deps)) { |
| 187 | | # # static headers shouldn't depend on anything else. |
| 188 | | # if ($rules =~ /^$header\s*:\s*(.*)\s*$/m) { |
| 189 | | # #is("", $1, "$header should have no dependencies"); |
| 190 | | # } |
| 191 | | #} |
| 192 | | |
| 193 | | my @files = keys %deps; |
| 194 | | @files = @ARGV if @ARGV; |
| 195 | | |
| 196 | | check_files($rules, \@files, '.c', $vars{O}); |
| 197 | | |
| 198 | 206 | sub check_files { |
| 199 | 207 | |
| 200 | 208 | my ($rules, $possible_files, $src_ext, $obj_ext) = @_; |
| … |
… |
|
| 227 | 235 | } |
| 228 | 236 | } |
| 229 | 237 | |
| 230 | | |
| 231 | 238 | sub collapse_path { |
| 232 | 239 | my $path = shift; |
| 233 | 240 | return $path unless defined $path; |
| … |
… |
|
| 260 | 267 | } |
| 261 | 268 | } |
| 262 | 269 | } |
| 263 | | |
| 264 | 270 | return keys %all_deps; |
| 265 | 271 | } |
| 266 | 272 | |
| 267 | 273 | # I'd rather use Test::Differences, but this lets us skip a dependency. |
| 268 | | |
| 269 | 274 | sub is_list_same { |
| 270 | 275 | my $got = shift; |
| 271 | 276 | my $exp = shift; |
| … |
… |
|
| 273 | 278 | |
| 274 | 279 | # keep track of the number of times something appears to |
| 275 | 280 | # avoid redundant includes) |
| 276 | | |
| 277 | 281 | my(%got, %exp); |
| 278 | 282 | for my $file (@$got) { $got{$file}++ }; |
| 279 | 283 | for my $file (@$exp) { $exp{$file}++ }; |
| … |
… |
|
| 310 | 314 | return; |
| 311 | 315 | } |
| 312 | 316 | |
| 313 | | sub wanted { |
| 314 | | if ($File::Find::name =~ /\.(c|h)$/) { |
| 315 | | push @incfiles, $File::Find::name; |
| 316 | | } |
| 317 | | } |
| 318 | | |
| 319 | 317 | # Local Variables: |
| 320 | 318 | # mode: cperl |
| 321 | 319 | # cperl-indent-level: 4 |