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 |