Home | History | Annotate | Download | only in util
      1 #!/usr/bin/perl -w
      2 # usage:
      3 # [somebody@somewhere ~/gpxe/src]$ ./util/diffsize.pl [<old rev> [<new rev>]]
      4 # by default <old rev> is HEAD and <new rev> is the working tree
      5 
      6 use strict;
      7 
      8 -d "bin" or die "Please run me in the gPXE src directory\n";
      9 mkdir ".sizes";
     10 
     11 my($oldrev, $newrev);
     12 my($oldname, $newname);
     13 
     14 if (@ARGV) {
     15   $oldname = shift;
     16 } else {
     17   $oldname = "HEAD";
     18 }
     19 
     20 if (@ARGV) {
     21   $newname = shift;
     22 } else {
     23   $newrev = "tree" . time();
     24 }
     25 
     26 $oldrev = `git rev-parse $oldname`;
     27 chomp $oldrev;
     28 
     29 unless (defined $newrev) {
     30   $newrev = `git rev-parse $newname`;
     31   chomp $newrev;
     32 }
     33 
     34 sub calc_sizes($$) {
     35   my($name, $rev) = @_;
     36   my $output;
     37   my $lastrev;
     38   my $stashed = 0;
     39   my $res = 0;
     40 
     41   return if -e ".sizes/$rev.sizes";
     42 
     43   if (defined $name) {
     44     $output = `git stash`;
     45     $stashed = 1 unless $output =~ /No local changes to save/;
     46     $lastrev = `git name-rev --name-only HEAD`;
     47     system("git checkout $name >/dev/null"); $res ||= $?;
     48   }
     49 
     50   system("make -j4 bin/gpxe.lkrn >/dev/null"); $res ||= $?;
     51   system("make bin/gpxe.lkrn.sizes > .sizes/$rev.sizes"); $res ||= $?;
     52 
     53   if (defined $name) {
     54     system("git checkout $lastrev >/dev/null"); $res ||= $?;
     55     system("git stash pop >/dev/null") if $stashed; $res ||= $?;
     56   }
     57 
     58   if ($res) {
     59     unlink(".sizes/$rev.sizes");
     60     die "Error making sizes file\n";
     61   }
     62 }
     63 
     64 our %Sizes;
     65 
     66 sub save_sizes($$) {
     67   my($id, $rev) = @_;
     68   my $file = ".sizes/$rev.sizes";
     69 
     70   open SIZES, $file or die "opening $file: $!\n";
     71   while (<SIZES>) {
     72     my($text, $data, $bss, $total, $hex, $name) = split;
     73     $name =~ s|bin/||; $name =~ s|\.o$||;
     74 
     75     # Skip the header and totals lines
     76     next if $total =~ /[a-z]/ or $name =~ /TOTALS/;
     77 
     78     # Skip files named with dash, due to old Makefile bug
     79     next if $name =~ /-/;
     80 
     81     $Sizes{$name} = {old => 0, new => 0} unless exists $Sizes{$name};
     82     $Sizes{$name}{$id} = $total;
     83   }
     84 }
     85 
     86 calc_sizes($oldname, $oldrev);
     87 calc_sizes($newname, $newrev);
     88 
     89 save_sizes('old', $oldrev);
     90 save_sizes('new', $newrev);
     91 
     92 my $total = 0;
     93 
     94 for (sort keys %Sizes) {
     95   my $diff = $Sizes{$_}{new} - $Sizes{$_}{old};
     96   if (abs($diff) >= 16) {
     97     printf "%12s %+d\n", substr($_, 0, 12), $Sizes{$_}{new} - $Sizes{$_}{old};
     98   }
     99   $total += $diff;
    100 }
    101 printf "      TOTAL: %+d\n", $total;
    102