7 use setup qw($current_dir $wine_dir $winapi_dir $winapi_check_dir);
9 use vars qw($VERSION @ISA @EXPORT @EXPORT_OK);
14 @EXPORT_OK = qw($directory $tool $file $line $message);
16 use vars qw($directory $tool $file $line $message);
18 use output qw($output);
19 use options qw($options);
21 ########################################################################
23 ########################################################################
28 ########################################################################
30 ########################################################################
35 if(!defined($where)) {
43 $context .= "<$where>";
47 $context = "<$where>";
54 $output->write("make_filter: $context: can't parse output: '$current'\n");
56 $output->write("make_filter: $context: can't parse output: '$current'\n");
61 ########################################################################
63 ########################################################################
74 my ($new_tool, $read_files, $write_files, $remove_files) = command($_);
75 if(defined($new_tool)) {
81 if($directory && $directory ne ".") {
82 $progress .= "$directory: ";
84 $progress .= "$tool: ";
86 if($tool =~ /^cd|make$/) {
88 } elsif($tool =~ /^ld$/) {
89 foreach my $file (@{$read_files}) {
90 $output->lazy_progress("$progress: reading '$file'");
92 my $file = $$write_files[0];
93 $output->progress("$progress: writing '$file'");
94 } elsif($tool =~ /^rm$/) {
95 foreach my $file (@{$remove_files}) {
96 $output->lazy_progress("$progress: removing '$file'");
99 if($#$read_files >= 0) {
100 $progress .= "read[" . join(" ", @{$read_files}) . "]";
102 if($#$write_files >= 0) {
103 if($#$read_files >= 0) {
106 $progress .= "write[" . join(" ", @{$write_files}) . "]";
108 if($#$remove_files >= 0) {
109 if($#$read_files >= 0 || $#$write_files >= 0) {
112 $progress .= "remove[" . join(" ", @{$remove_files}) . "]";
115 $output->progress($progress);
121 if(/^Wine build complete\.$/) {
123 } elsif(/^(.*?) is newer than (.*?), please rerun (.*?)\!$/) {
125 } elsif(/^(.*?) is older than (.*?), please rerun (.*?)$/) {
127 } elsif(s/^make(?:\[(\d+)\])?:\s*//) {
130 } elsif(!defined($tool)) {
132 } elsif($tool eq "bison" && /^conflicts:\s+\d+\s+shift\/reduce$/) {
134 } elsif($tool eq "gcc" && /^In file included from (.+?):(\d+):$/) {
136 } elsif($tool =~ /^gcc|ld$/ && s/^(.+?\.o(?:\(.*?\))?):\s*//) {
138 } elsif($tool eq "gcc" && s/^(.+?\.[chly]):\s*//) {
140 } elsif($tool eq "winebuild" && s/^(.+?\.spec):\s*//) {
141 winebuild_output($1, $_);
142 } elsif($tool eq "wmc" && s/^(.+?\.mc):\s*//) {
144 } elsif($tool eq "wrc" && s/^(.+?\.rc):\s*//) {
146 } elsif($tool eq "cd" && s/^\/bin\/sh:\s*cd:\s*//) {
157 ########################################################################
159 ########################################################################
170 } elsif(/^\*\*\* \[(.*?)\] Error (\d+)$/) {
172 } elsif(/^\*\*\* Warning:\s+/) { #
173 if(/^File \`(.+?)\' has modification time in the future \((.+?) > \(.+?\)\)$/) {
176 error("make_output");
178 } elsif(/^\`(.*?)\' is up to date.$/) {
180 } elsif(/^\[(.*?)\] Error (\d+) \(ignored\)$/) {
182 } elsif(/^(Entering|Leaving) directory \`(.*?)\'$/) {
183 if($1 eq "Entering") {
190 foreach my $component (split(/\//, $directory)) {
191 if($component eq "wine") {
194 push @components, $component;
197 $directory = join("/", @components);
198 } elsif(/^(.*?) is older than (.*?), please rerun (.*?)\$/) {
200 } elsif(/^Nothing to be done for \`(.*?)\'\.$/) {
202 } elsif(s/^warning:\s+//) {
203 if(/^Clock skew detected. Your build may be incomplete.$/) {
206 error("make_output");
209 error("make_output");
214 ########################################################################
216 ########################################################################
223 my $read_files = ["<???>"];
224 my $write_files = ["<???>"];
225 my $remove_files = [];
229 if(s/^\[\s+-d\s+(.*?)\s+\]\s+\|\|\s+//) {
235 ($read_files, $write_files) = ar_command($_);
236 } elsif(s/^as\s+//) {
238 ($read_files, $write_files) = as_command($_);
239 } elsif(s/^bison\s+//) {
241 ($read_files, $write_files) = bison_command($_);
242 } elsif(s/^cd\s+//) {
244 ($read_files, $write_files) = cd_command($_);
245 } elsif(s/^flex\s+//) {
247 ($read_files, $write_files) = flex_command($_);
248 } elsif(s/^for\s+//) {
250 ($read_files, $write_files) = for_command($_);
251 } elsif(s/^\/usr\/bin\/install\s+//) {
253 ($read_files, $write_files) = install_command($_);
254 } elsif(s/^ld\s+//) {
256 ($read_files, $write_files) = ld_command($_);
257 } elsif(s/^\/sbin\/ldconfig\s+//) {
259 ($read_files, $write_files) = ldconfig_command();
260 } elsif(s/^gcc\s+//) {
262 ($read_files, $write_files) = gcc_command($_);
263 } elsif(s/^(?:(?:\.\.\/)+|\.\/)tools\/makedep\s+//) {
265 ($read_files, $write_files) = makedep_command($_);
266 } elsif(s/^mkdir\s+//) {
268 ($read_files, $write_files) = mkdir_command($_);
269 } elsif(s/^ranlib\s+//) {
271 ($read_files, $write_files) = ranlib_command($_);
272 } elsif(s/^rm\s+//) {
274 ($read_files, $write_files, $remove_files) = rm_command($_);
275 } elsif(s/^sed\s+//) {
277 ($read_files, $write_files) = sed_command($_);
278 } elsif(s/^strip\s+//) {
280 ($read_files, $write_files) = strip_command($_);
281 } elsif(s/^LD_LIBRARY_PATH="(?:(?:\.\.\/)*unicode)?:\$LD_LIBRARY_PATH"\s+(?:\.\.\/)*tools\/winebuild\/winebuild\s+//) {
283 ($read_files, $write_files) = winebuild_command($_);
284 } elsif(s/^LD_LIBRARY_PATH="(?:(?:\.\.\/)*unicode)?:\$LD_LIBRARY_PATH"\s+(?:\.\.\/)*tools\/wmc\/wmc\s+//) {
286 ($read_files, $write_files) = wmc_command($_);
287 } elsif(s/^LD_LIBRARY_PATH="(?:(?:\.\.\/)*unicode)?:\$LD_LIBRARY_PATH"\s+(?:\.\.\/)*tools\/wrc\/wrc\s+//) {
289 ($read_files, $write_files) = wrc_command($_);
292 return ($tool, $read_files, $write_files, $remove_files);
295 ########################################################################
297 ########################################################################
305 if(/rc\s+(\S+)(\s+\S+)+$/) {
308 $read_files =~ s/^\s*//;
309 $read_files = [split(/\s+/, $read_files)];
314 return ($read_files, $write_files);
317 ########################################################################
319 ########################################################################
327 if(/-o\s+(\S+)\s+(\S+)$/) {
334 return ($read_files, $write_files);
337 ########################################################################
339 ########################################################################
347 ########################################################################
349 ########################################################################
357 ########################################################################
359 ########################################################################
364 if(/^(.*?): No such file or directory/) {
365 $message = "directory '$1' doesn't exist";
369 ########################################################################
371 ########################################################################
379 ########################################################################
381 ########################################################################
389 ########################################################################
391 ########################################################################
397 if(/-o\s+(\S+)\s+(\S+)$/) {
400 } elsif(/-o\s+(\S+)/) {
402 $read_files = ["<???>"];
403 } elsif(/^-shared.*?-o\s+(\S+)/) {
405 $read_files = ["<???>"];
407 error("gcc_command");
410 return ($read_files, $write_files);
413 ########################################################################
415 ########################################################################
423 if(s/^warning:\s+//) {
428 } elsif(/^((?:signed |unsigned )?(?:int|long)) format, (different type|\S+) arg \(arg (\d+)\)$/) {
431 HACCEL|HANDLE|HBITMAP|HBRUSH|HCALL|HCURSOR|HDC|HDRVR|HDESK|
432 HGDIOBJ|HKL|HGLOBAL|HINSTANCE|HKEY|
433 HMENU|HMIDISTRM|HMIDIIN|HMIDIOUT|HMIXER|HMIXEROBJ|HMMIO|HMODULE|
434 HLINE|HPHONE|HPHONEAPP|
435 HRASCONN|HRGN|HRSRC|HWAVEIN|HWAVEOUT|HWINSTA|HWND|WSAEVENT|
442 } elsif(/^\(near initialization for \`(.*?)\'\)$/) {
444 } elsif(/^\`(.*?)\' defined but not used$/) {
446 } elsif(/^\`(.*?)\' is not at beginning of declaration$/) {
448 } elsif(/^\`%x\' yields only last 2 digits of year in some locales$/) {
450 } elsif(/^assignment makes integer from pointer without a cast$/) {
452 } elsif(/^assignment makes pointer from integer without a cast$/) {
454 } elsif(/^assignment from incompatible pointer type$/) {
456 } elsif(/^cast from pointer to integer of different size$/) {
458 } elsif(/^comparison between pointer and integer$/) {
460 } elsif(/^comparison between signed and unsigned$/) {
462 } elsif(/^comparison of unsigned expression < 0 is always false$/) {
464 } elsif(/^comparison of unsigned expression >= 0 is always true$/) {
466 } elsif(/^conflicting types for built-in function \`(.*?)\'$/) {
468 } elsif(/^empty body in an if-statement$/) {
470 } elsif(/^empty body in an else-statement$/) {
472 } elsif(/^implicit declaration of function \`(.*?)\'$/) {
474 } elsif(/^initialization from incompatible pointer type$/) {
476 } elsif(/^initialization makes pointer from integer without a cast$/) {
478 } elsif(/^missing initializer$/) {
480 } elsif(/^ordered comparison of pointer with integer zero$/) {
482 } elsif(/^passing arg (\d+) of (?:pointer to function|\`(\S+)\') from incompatible pointer type$/) {
485 if(defined($name) && $name =~ /^GDI_AllocObject$/) {
490 } elsif(/^passing arg (\d+) of (?:pointer to function|\`(\S+)\') makes integer from pointer without a cast$/) {
492 } elsif(/^passing arg (\d+) of (?:pointer to function|\`(\S+)\') makes pointer from integer without a cast$/) {
494 } elsif(/^return makes integer from pointer without a cast$/) {
496 } elsif(/^return makes pointer from integer without a cast$/) {
498 } elsif(/^type of \`(.*?)\' defaults to \`(.*?)\'$/) {
500 } elsif(/^unused variable \`(.*?)\'$/) {
502 } elsif(!$options->pedantic) {
510 $message = "function $function: warning: $_";
512 $message = "warning: $_";
517 } elsif(/^\`(.*?)\' undeclared \(first use in this function\)$/) {
519 } elsif(/^\(Each undeclared identifier is reported only once$/) {
521 } elsif(/^conflicting types for \`(.*?)\'$/) {
523 } elsif(/^for each function it appears in.\)$/) {
525 } elsif(/^too many arguments to function$/) {
527 } elsif(/^previous declaration of \`(.*?)\'$/) {
529 } elsif(/^parse error before `(.*?)'$/) {
531 } elsif(!$options->pedantic) {
536 } elsif(/^In function \`(.*?)\':$/) {
538 } elsif(/^At top level:$/) {
545 ########################################################################
547 ########################################################################
549 sub install_command {
555 ########################################################################
557 ########################################################################
565 if(/-r\s+(.*?)\s+-o\s+(\S+)$/) {
567 $read_files = [split(/\s+/, $1)];
572 return ($read_files, $write_files);
575 ########################################################################
577 ########################################################################
583 if(/^the use of \`(.+?)\' is dangerous, better use \`(.+?)\'$/) {
588 ########################################################################
590 ########################################################################
592 sub ldconfig_command {
598 ########################################################################
600 ########################################################################
602 sub makedep_command {
608 ########################################################################
610 ########################################################################
618 ########################################################################
620 ########################################################################
628 $read_files = [split(/\s+/)];
631 return ($read_files, $write_files);
634 ########################################################################
636 ########################################################################
641 return ([], [], [split(/\s+/, $_)]);
644 ########################################################################
646 ########################################################################
654 ########################################################################
656 ########################################################################
664 ########################################################################
666 ########################################################################
668 sub winebuild_command {
674 ########################################################################
676 ########################################################################
678 sub winebuild_output {
685 ########################################################################
687 ########################################################################
698 my $rc_file = $mc_file;
699 $rc_file =~ s/\.mc$/.rc/;
701 $write_files = [$rc_file];
702 $read_files = [$mc_file];
704 error("wmc_command");
707 return ($read_files, $write_files);
710 ########################################################################
712 ########################################################################
719 ########################################################################
721 ########################################################################
732 my $o_file = $rc_file;
733 $o_file =~ s/\.rc$/.o/;
735 $write_files = [$o_file];
736 $read_files = [$rc_file];
738 error("wrc_command");
741 return ($read_files, $write_files);
744 ########################################################################
746 ########################################################################