2 # Copyright 1999, 2000, 2001 Patrik Stridvall
4 # This library is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU Lesser General Public
6 # License as published by the Free Software Foundation; either
7 # version 2.1 of the License, or (at your option) any later version.
9 # This library is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 # Lesser General Public License for more details.
14 # You should have received a copy of the GNU Lesser General Public
15 # License along with this library; if not, write to the Free Software
16 # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
23 use setup qw($current_dir $wine_dir $winapi_dir);
25 use vars qw($VERSION @ISA @EXPORT @EXPORT_OK);
30 @EXPORT_OK = qw($directory $tool $file $line $message);
32 use vars qw($directory $tool $file $line $message);
34 use output qw($output);
35 use options qw($options);
42 #sub winebuild_output($$);
47 ########################################################################
49 ########################################################################
54 ########################################################################
56 ########################################################################
61 if(!defined($where)) {
69 $context .= "<$where>";
73 $context = "<$where>";
80 $output->write("$directory: $context: can't parse output: '$current'\n");
82 $output->write("$directory: $context: can't parse output: '$current'\n");
87 ########################################################################
89 ########################################################################
98 if(/^\*\*\* \[(.*?)\] Error (\d+)$/) {
100 } elsif(/^\*\*\* Error code (\d+)$/) {
102 } elsif(/^\*\*\* Warning:\s+/) { #
103 if(/^File \`(.+?)\' has modification time in the future \((.+?) > \(.+?\)\)$/) {
106 error("make_output");
108 } elsif(/^\`(.*?)\' is up to date.$/) {
110 } elsif(/^\[(.*?)\] Error (\d+) \(ignored\)$/) {
112 } elsif(/^don\'t know how to make (.*?)\. Stop$/) {
114 } elsif(/^(Entering|Leaving) directory \`(.*?)\'$/) {
115 if($1 eq "Entering") {
122 foreach my $component (split(/\//, $directory)) {
123 if($component eq "wine") {
126 push @components, $component;
129 $directory = join("/", @components);
130 } elsif(/^(.*?) is older than (.*?), please rerun (.*?)\$/) {
132 } elsif(/^Nothing to be done for \`(.*?)\'\.$/) {
134 } elsif(s/^warning:\s+//) {
135 if(/^Clock skew detected. Your build may be incomplete.$/) {
138 error("make_output");
140 } elsif(/^Stop in (.*?)\.$/) {
145 error("make_output");
150 ########################################################################
152 ########################################################################
160 if(/rc\s+(\S+)(\s+\S+)+$/) {
163 $read_files =~ s/^\s*//;
164 $read_files = [split(/\s+/, $read_files)];
169 return ($read_files, $write_files);
172 ########################################################################
174 ########################################################################
182 if(/-o\s+(\S+)\s+(\S+)$/) {
189 return ($read_files, $write_files);
192 ########################################################################
194 ########################################################################
196 sub bison_command($) {
202 ########################################################################
204 ########################################################################
212 ########################################################################
214 ########################################################################
219 if(/^(.*?): No such file or directory/) {
220 $message = "directory '$1' doesn't exist";
224 ########################################################################
226 ########################################################################
228 sub flex_command($) {
234 ########################################################################
236 ########################################################################
244 ########################################################################
246 ########################################################################
252 if(/-o\s+(\S+)\s+(\S+)$/) {
256 $write_file =~ s%^\./%%;
257 $read_file =~ s%^\./%%;
259 $write_files = [$write_file];
260 $read_files = [$read_file];
261 } elsif(/-o\s+(\S+)/) {
264 $write_file =~ s%^\./%%;
266 $write_files = [$write_file];
267 $read_files = ["<???>"];
268 } elsif(/^-shared.*?-o\s+(\S+)/) {
271 $write_file =~ s%^\./%%;
273 $write_files = [$write_file];
274 $read_files = ["<???>"];
276 error("gcc_command");
279 return ($read_files, $write_files);
282 ########################################################################
284 ########################################################################
292 if(s/^warning:\s+//) {
295 if(/^((?:signed |unsigned )?(?:int|long)) format, (different type|\S+) arg \(arg (\d+)\)$/) {
298 HACCEL|HACMDRIVER|HANDLE|HBITMAP|HBRUSH|HCALL|HCURSOR|HDC|HDRVR|HDESK|HDRAWDIB
299 HGDIOBJ|HKL|HGLOBAL|HIMC|HINSTANCE|HKEY|HLOCAL|
300 HMENU|HMIDISTRM|HMIDIIN|HMIDIOUT|HMIXER|HMIXEROBJ|HMMIO|HMODULE|
301 HLINE|HPEN|HPHONE|HPHONEAPP|
302 HRASCONN|HRGN|HRSRC|HWAVEIN|HWAVEOUT|HWINSTA|HWND|
303 SC_HANDLE|WSAEVENT|handle_t|pointer)$/x)
309 } elsif(/^\(near initialization for \`(.*?)\'\)$/) {
311 } elsif(/^\`(.*?)\' defined but not used$/) {
313 } elsif(/^\`(.*?)\' is not at beginning of declaration$/) {
315 } elsif(/^\`%x\' yields only last 2 digits of year in some locales$/) {
317 } elsif(/^assignment makes integer from pointer without a cast$/) {
319 } elsif(/^assignment makes pointer from integer without a cast$/) {
321 } elsif(/^assignment from incompatible pointer type$/) {
323 } elsif(/^cast from pointer to integer of different size$/) {
325 } elsif(/^comparison between pointer and integer$/) {
327 } elsif(/^comparison between signed and unsigned$/) {
329 } elsif(/^comparison of unsigned expression < 0 is always false$/) {
331 } elsif(/^comparison of unsigned expression >= 0 is always true$/) {
333 } elsif(/^conflicting types for built-in function \`(.*?)\'$/) {
335 } elsif(/^empty body in an if-statement$/) {
337 } elsif(/^empty body in an else-statement$/) {
339 } elsif(/^implicit declaration of function \`(.*?)\'$/) {
341 } elsif(/^initialization from incompatible pointer type$/) {
343 } elsif(/^initialization makes pointer from integer without a cast$/) {
345 } elsif(/^missing initializer$/) {
347 } elsif(/^ordered comparison of pointer with integer zero$/) {
349 } elsif(/^passing arg (\d+) of (?:pointer to function|\`(\S+)\') from incompatible pointer type$/) {
352 if(defined($name) && $name =~ /^GDI_AllocObject$/) {
357 } elsif(/^passing arg (\d+) of (?:pointer to function|\`(\S+)\') makes integer from pointer without a cast$/) {
359 } elsif(/^passing arg (\d+) of (?:pointer to function|\`(\S+)\') makes pointer from integer without a cast$/) {
361 } elsif(/^return makes integer from pointer without a cast$/) {
363 } elsif(/^return makes pointer from integer without a cast$/) {
365 } elsif(/^type of \`(.*?)\' defaults to \`(.*?)\'$/) {
367 } elsif(/^unused variable \`(.*?)\'$/) {
369 } elsif(!$options->pedantic) {
377 $message = "function $function: warning: $_";
379 $message = "warning: $_";
384 } elsif(/^\`(.*?)\' undeclared \(first use in this function\)$/) {
386 } elsif(/^\(Each undeclared identifier is reported only once$/) {
388 } elsif(/^conflicting types for \`(.*?)\'$/) {
390 } elsif(/^for each function it appears in.\)$/) {
392 } elsif(/^too many arguments to function$/) {
394 } elsif(/^previous declaration of \`(.*?)\'$/) {
396 } elsif(/^parse error before `(.*?)'$/) {
398 } elsif(!$options->pedantic) {
403 } elsif(/^In function \`(.*?)\':$/) {
405 } elsif(/^At top level:$/) {
412 ########################################################################
414 ########################################################################
416 sub install_command($) {
422 ########################################################################
424 ########################################################################
432 if(/-r\s+(.*?)\s+-o\s+(\S+)$/) {
434 $read_files = [split(/\s+/, $1)];
439 return ($read_files, $write_files);
442 ########################################################################
444 ########################################################################
450 if(/^In function \`(.*?)\':$/) {
452 } elsif(/^more undefined references to \`(.*?)\' follow$/) {
454 } elsif(/^the use of \`(.+?)\' is dangerous, better use \`(.+?)\'$/) {
456 } elsif(/^undefined reference to \`(.*?)\'$/) {
458 } elsif(/^warning: (.*?)\(\) possibly used unsafely; consider using (.*?)\(\)$/) {
460 } elsif(/^warning: type and size of dynamic symbol \`(.*?)\' are not defined$/) {
467 ########################################################################
469 ########################################################################
471 sub ldconfig_command($) {
477 ########################################################################
479 ########################################################################
481 sub makedep_command($) {
487 ########################################################################
489 ########################################################################
491 sub mkdir_command($) {
497 ########################################################################
499 ########################################################################
501 sub ranlib_command($) {
507 $read_files = [split(/\s+/)];
510 return ($read_files, $write_files);
513 ########################################################################
515 ########################################################################
520 return ([], [], [split(/\s+/, $_)]);
523 ########################################################################
525 ########################################################################
533 ########################################################################
535 ########################################################################
537 sub strip_command($) {
543 ########################################################################
545 ########################################################################
547 sub winebuild_command($) {
553 ########################################################################
555 ########################################################################
557 sub winebuild_output($$) {
564 ########################################################################
566 ########################################################################
577 my $rc_file = $mc_file;
578 $rc_file =~ s/\.mc$/.rc/;
580 $write_files = [$rc_file];
581 $read_files = [$mc_file];
583 error("wmc_command");
586 return ($read_files, $write_files);
589 ########################################################################
591 ########################################################################
598 ########################################################################
600 ########################################################################
611 my $o_file = $rc_file;
612 $o_file =~ s/\.rc$/.o/;
614 $write_files = [$o_file];
615 $read_files = [$rc_file];
617 error("wrc_command");
620 return ($read_files, $write_files);
623 ########################################################################
625 ########################################################################
632 ########################################################################
634 ########################################################################
641 my $read_files = ["<???>"];
642 my $write_files = ["<???>"];
643 my $remove_files = [];
647 if(s/^\[\s+-d\s+(.*?)\s+\]\s+\|\|\s+//) {
653 ($read_files, $write_files) = ar_command($_);
654 } elsif(s/^as\s+//) {
656 ($read_files, $write_files) = as_command($_);
657 } elsif(s/^bison\s+//) {
659 ($read_files, $write_files) = bison_command($_);
660 } elsif(s/^cd\s+//) {
662 ($read_files, $write_files) = cd_command($_);
663 } elsif(s/^flex\s+//) {
665 ($read_files, $write_files) = flex_command($_);
666 } elsif(s/^for\s+//) {
668 ($read_files, $write_files) = for_command($_);
669 } elsif(s/^\/usr\/bin\/install\s+//) {
671 ($read_files, $write_files) = install_command($_);
672 } elsif(s/^ld\s+//) {
674 ($read_files, $write_files) = ld_command($_);
675 } elsif(s/^\/sbin\/ldconfig\s+//) {
677 ($read_files, $write_files) = ldconfig_command();
678 } elsif(s/^gcc\s+//) {
680 ($read_files, $write_files) = gcc_command($_);
681 } elsif(s/^(?:(?:\.\.\/)+|\.\/)tools\/makedep\s+//) {
683 ($read_files, $write_files) = makedep_command($_);
684 } elsif(s/^mkdir\s+//) {
686 ($read_files, $write_files) = mkdir_command($_);
687 } elsif(s/^ranlib\s+//) {
689 ($read_files, $write_files) = ranlib_command($_);
690 } elsif(s/^rm\s+//) {
692 ($read_files, $write_files, $remove_files) = rm_command($_);
693 } elsif(s/^sed\s+//) {
695 ($read_files, $write_files) = sed_command($_);
696 } elsif(s/^strip\s+//) {
698 ($read_files, $write_files) = strip_command($_);
699 } elsif(s/^LD_LIBRARY_PATH="(?:(?:\.\.\/)*unicode)?:\$LD_LIBRARY_PATH"\s+(?:\.\.\/)*tools\/winebuild\/winebuild\s+//) {
701 ($read_files, $write_files) = winebuild_command($_);
702 } elsif(s/^LD_LIBRARY_PATH="(?:(?:\.\.\/)*unicode)?:\$LD_LIBRARY_PATH"\s+(?:\.\.\/)*tools\/wmc\/wmc\s+//) {
704 ($read_files, $write_files) = wmc_command($_);
705 } elsif(s/^LD_LIBRARY_PATH="(?:(?:\.\.\/)*unicode)?:\$LD_LIBRARY_PATH"\s+(?:\.\.\/)*tools\/wrc\/wrc\s+//) {
707 ($read_files, $write_files) = wrc_command($_);
710 return ($tool, $read_files, $write_files, $remove_files);
713 ########################################################################
715 ########################################################################
726 my ($new_tool, $read_files, $write_files, $remove_files) = command($_);
727 if(defined($new_tool)) {
733 if($directory && $directory ne ".") {
734 $progress .= "$directory: ";
737 $progress .= "$tool: ";
740 if($tool =~ /^(?:cd|make)$/) {
742 } elsif($tool eq "ld"/) {
743 foreach my $file (@{$read_files}) {
744 $output->lazy_progress("${progress}reading '$file'");
746 my $file = $$write_files[0];
747 $output->progress("$progress: writing '$file'");
748 } elsif($tool eq "rm") {
749 foreach my $file (@{$remove_files}) {
750 $output->lazy_progress("${progress}removing '$file'");
753 if($#$read_files >= 0) {
754 $progress .= "read[" . join(" ", @{$read_files}) . "]";
756 if($#$write_files >= 0) {
757 if($#$read_files >= 0) {
760 $progress .= "write[" . join(" ", @{$write_files}) . "]";
762 if($#$remove_files >= 0) {
763 if($#$read_files >= 0 || $#$write_files >= 0) {
766 $progress .= "remove[" . join(" ", @{$remove_files}) . "]";
769 $output->progress($progress);
775 my $make = $options->make;
777 if(/^Wine build complete\.$/) {
779 } elsif(/^(.*?) is newer than (.*?), please rerun (.*?)\!$/) {
781 } elsif(/^(.*?) is older than (.*?), please rerun (.*?)$/) {
783 } elsif(/^\`(.*?)\' is up to date.$/) {
786 } elsif(s/^$make(?:\[(\d+)\])?:\s*//) {
789 } elsif(!defined($tool)) {
791 } elsif($tool eq "make") {
793 } elsif($tool eq "bison" && /^conflicts:\s+\d+\s+shift\/reduce$/) {
795 } elsif($tool eq "gcc" && /^(?:In file included |\s*)from (.+?):(\d+)[,:]$/) {
797 } elsif($tool =~ /^(?:gcc|ld)$/ && s/^(.+?\.s?o)(?:\(.*?\))?:\s*//) {
800 } elsif($tool =~ /^(?:gcc|ld)$/ && s/^(.*?)ld:\s*//) {
803 } elsif($tool =~ /^(?:gcc|ld)$/ && s/^collect2:\s*//) {
805 ld_output("collect2", $_);
806 } elsif($tool eq "gcc" && s/^(.+?\.[chly]):\s*//) {
808 } elsif($tool eq "ld" && s/^(.+?\.c):(?:\d+:)?\s*//) {
810 } elsif($tool eq "winebuild" && s/^(.+?\.spec):\s*//) {
811 winebuild_output($1, $_);
812 } elsif($tool eq "wmc" && s/^(.+?\.mc):\s*//) {
814 } elsif($tool eq "wrc" && s/^(.+?\.rc):\s*//) {
816 } elsif($tool eq "cd" && s/^\/bin\/sh:\s*cd:\s*//) {