showbuildsrcs.pl to HTML.

index -|- end

Generated: Tue Feb 2 17:54:55 2010 from showbuildsrcs.pl 2009/08/21 5.9 KB.

#!/perl -w
# NAME: showbuildsrcs.pl
# AIM: Analyse the build.log for sources compiled
use strict;
use warnings;
require 'logfile.pl' or die "Unable to load logfile.pl ...\n";
# log file stuff
my ($LF);
my $pgmname = $0;
if ($pgmname =~ /\w{1}:\\.*/) {
   my @tmpsp = split(/\\/,$pgmname);
   $pgmname = $tmpsp[-1];
}
my $outfile = "temp.$pgmname.txt";
open_log($outfile);
prt( "$0 ... Hello, World ...\n" );
my $in_file = 'S:\geoff\projects\Handbrake\hb-svn\build\log\build3a.txt';
my $base_dir = '/home/geoff/projects/Handbrake/hb-svn/';
sub trim_act_dir($) {
   my ($dir) = shift;
   my $ch = substr($dir,0,1);
   my $l = length($base_dir);
   $dir = substr($dir,1) if ($ch eq '`');
   $dir =~ s/'$//;
   if (substr($dir,0,$l) eq $base_dir) {
      $dir = substr($dir,$l);
   }
   return $dir;
}
sub has_c_param($) {
   my ($ln) = shift;
   my @arr = split(/\s/,$ln);
   my $ac = scalar @arr;
   for (my $i = 0; $i < $ac; $i++) {
      my $p = $arr[$i];
      if ($p eq '-c') {
         if (($i + 1) < $ac) {
            return 1;
         }
      }
   }
   return 0;
}
sub get_c_param($) {
   my ($lnc) = shift;
   my @arr = split(/\s/,$lnc);
   my $ac = scalar @arr;
   for (my $i = 0; $i < $ac; $i++) {
      my $p = $arr[$i];
      if ($p eq '-c') {
         if (($i + 1) < $ac) {
            my $res = $arr[$i+1];
            if ($res eq '-o') {
               my $i2 = $i + 1 + 2;
               if ($i2 < $ac) {
                  if ( ($arr[$i2] eq '`test') && (($i2 + 2) < $ac) ) {
                     $res = $arr[$i2+2];
                     $res =~ s/'//g;
                     return $res;
                  } else {
                     return $arr[$i2];
                  }
               }
               return "$res??? CHECKME!!!";
            }
            return $res;
         }
      }
   }
   return "";
}
sub has_o_param($) {
   my ($ln) = shift;
   my @arr = split(/\s/,$ln);
   my $ac = scalar @arr;
   for (my $i = 0; $i < $ac; $i++) {
      my $p = $arr[$i];
      if ($p eq '-o') {
         if (($i + 1) < $ac) {
            return 1;
         }
      }
   }
   return 0;
}
sub get_o_param($) {
   my ($lno) = shift;
   my @arr = split(/\s/,$lno);
   my $ac = scalar @arr;
   for (my $i = 0; $i < $ac; $i++) {
      my $p = $arr[$i];
      if ($p eq '-o') {
         if (($i + 1) < $ac) {
            return $arr[$i+1];
         }
      }
   }
   return "";
}
sub process_in_file($) {
   my ($inf) = shift;
   my @srcstack = ();
   if (open INF, "<$inf") {
      my @lines = <INF>;
      close INF;
      my ($lncnt, $line, $actdir, $ch, $indir, $actfil, $pline, $tmp);
      my ($has_c, $has_o);
      $lncnt = scalar @lines;
      prt( "Got $lncnt lines from $inf...\n" );
      $indir++;
      my @dirstack = ();
      my $lnnum = 0;
      $pline = '';
      foreach $line (@lines) {
         chomp $line;
         $lnnum++;
         # make[2]: Entering directory `/home/geoff/projects/Handbrake/hb-svn/build/contrib/a52dec/a52dec'
         if ($line =~ /make.*: Entering directory (.+)/) {
            $actdir = trim_act_dir($1);
            ##prt( "Entering [$actdir]\n" );
            $indir++;
            push(@dirstack,$actdir);
         } elsif ($indir) {
            # make[2]: Leaving directory `/home/geoff/projects/Handbrake/hb-svn/build/contrib/a52dec/a52dec'
            if ($line =~ /make.*: Leaving directory (.+)/) {
               $actdir = trim_act_dir($1);
               if (@dirstack) {
                  if ($dirstack[-1] eq $actdir) {
                     pop @dirstack;
                     $indir--;
                  } else {
                     prt( "Leaving  [$actdir] NOT STACK TOP!!!\n" );
                  }
               } else {
                  prt( "Leaving  [$actdir] NO STACK!!!\n" );
               }
            }
         }
         if ($indir) {
            #/usr/bin/gcc -DHAVE_CONFIG_H -I. -I. -I../include -I../include -I../include -O3 -fomit-frame-pointer -c bitstream.c -o bitstream.o
            if ($line =~ /^\/usr\/bin\/gcc/) {
               $has_c = has_c_param($line);
               $has_o = has_o_param($line);
               $actfil = get_c_param($line);
               if (length($actfil)) {
                  prt( "$lnnum:SRC: $actdir/$actfil\n" );
                  push(@srcstack, [$actfil, $actdir, 0, 0, ""]);
               } else {
                  $actfil = get_o_param($line);
                  if (length($actfil)) {
                     prt( "$lnnum: OUT: $actdir/$actfil\n" );
                     prt("\n");
                     push(@srcstack, [$actfil, $actdir, 1, 0, $line]);
                  } else {
                     prt( "NO -c nor -o! $lnnum:[$line]\n" );
                  }
               }
            } elsif ($line =~ /^ranlib\s+(.+)/) {
               $tmp = "".($lnnum - 1);
               if ($pline =~ /^chmod/) {
                  # skip this
               } else {
                  prt( "$tmp: Lib: [$pline]\n\n" );
                  push(@srcstack, [$pline, $actdir, 2, 0, $line]);
               }
            }
         }
         $pline = $line;   # keep this line
      }
      if (@dirstack) {
         prt( "WARNING: still stacked items...\n" );
      } else {
         prt( "Directory stack correctly NULL\n" );
      }
      prt( "Done $lnnum lines... ($lncnt)\n" );
   } else {
      prt( "ERROR: can not open [$inf]\n" );
   }
   return @srcstack;
}
sub output_entry($$$$) {
   my ($src,$dir,$flag,$rdc) = @_;
   if ($flag == 0) {
      prt( "\n" ) if ($$rdc == 0);
      prt( "SRC: $dir/$src\n" );
      $$rdc++;
   } elsif ($flag == 1) {
      prt( "Out: $dir/$src\n" );
      prt("\n") if ($$rdc);
      $$rdc = 0;
   } else {
      prt( "Lib: $src\n" );
      prt("\n") if ($$rdc);
      $$rdc = 0;
   }
}
sub process_srcs($) {
   my ($rsrcs) = shift;
   my $scnt = scalar @$rsrcs;
   my ($dir, $src, $flag, $done, $cont, $adir, $dcnt);
   prt( "Extracted $scnt sources, and results...\n" );
   $cont = 1;
   $adir = '';
   my %donedirs = ();
   $dcnt = 0;
   while ($cont) {
      $cont = 0;
      for (my $i = 0; $i < $scnt; $i++) {
         $src = $$rsrcs[$i][0];
         $dir = $$rsrcs[$i][1];
         $flag = $$rsrcs[$i][2];
         $done = $$rsrcs[$i][3];
         if (!$done) {
            if (!defined $donedirs{$dir}) {
               $dcnt = 0;
               $adir = $dir;
               $donedirs{$dir} = 1;
               $cont++;
               output_entry($src,$dir,$flag,\$dcnt);
               $$rsrcs[$i][3] = 1;
               $i++;
               for (; $i < $scnt; $i++) {
                  $src = $$rsrcs[$i][0];
                  $dir = $$rsrcs[$i][1];
                  $flag = $$rsrcs[$i][2];
                  $done = $$rsrcs[$i][3];
                  if (!$done && ($dir eq $adir)) {
                     output_entry($src,$dir,$flag,\$dcnt);
                     $$rsrcs[$i][3] = 1;
                  }
               }
            }
         }
      }
   }
   prt( "Done $scnt sources, and results...\n\n" );
}
my @srcs = process_in_file($in_file);
process_srcs(\@srcs);
close_log($outfile,1);
exit(0);
# eof

index -|- top

checked by tidy  Valid HTML 4.01 Transitional