| #!/usr/bin/perl -w |
| # usage: |
| # [somebody@somewhere ~/ipxe/src]$ ./util/diffsize.pl [<old rev> [<new rev>]] |
| # by default <old rev> is HEAD and <new rev> is the working tree |
| |
| use strict; |
| |
| -d "bin" or die "Please run me in the iPXE src directory\n"; |
| mkdir ".sizes"; |
| |
| my($oldrev, $newrev); |
| my($oldname, $newname); |
| |
| if (@ARGV) { |
| $oldname = shift; |
| } else { |
| $oldname = "HEAD"; |
| } |
| |
| if (@ARGV) { |
| $newname = shift; |
| } else { |
| $newrev = "tree" . time(); |
| } |
| |
| $oldrev = `git rev-parse $oldname`; |
| chomp $oldrev; |
| |
| unless (defined $newrev) { |
| $newrev = `git rev-parse $newname`; |
| chomp $newrev; |
| } |
| |
| sub calc_sizes($$) { |
| my($name, $rev) = @_; |
| my $output; |
| my $lastrev; |
| my $stashed = 0; |
| my $res = 0; |
| |
| return if -e ".sizes/$rev.sizes"; |
| |
| if (defined $name) { |
| $output = `git stash`; |
| $stashed = 1 unless $output =~ /No local changes to save/; |
| $lastrev = `git name-rev --name-only HEAD`; |
| system("git checkout $name >/dev/null"); $res ||= $?; |
| } |
| |
| system("make -j4 bin/ipxe.lkrn >/dev/null"); $res ||= $?; |
| system("make bin/ipxe.lkrn.sizes > .sizes/$rev.sizes"); $res ||= $?; |
| |
| if (defined $name) { |
| system("git checkout $lastrev >/dev/null"); $res ||= $?; |
| system("git stash pop >/dev/null") if $stashed; $res ||= $?; |
| } |
| |
| if ($res) { |
| unlink(".sizes/$rev.sizes"); |
| die "Error making sizes file\n"; |
| } |
| } |
| |
| our %Sizes; |
| |
| sub save_sizes($$) { |
| my($id, $rev) = @_; |
| my $file = ".sizes/$rev.sizes"; |
| |
| open SIZES, $file or die "opening $file: $!\n"; |
| while (<SIZES>) { |
| my($text, $data, $bss, $total, $hex, $name) = split; |
| $name =~ s|bin/||; $name =~ s|\.o$||; |
| |
| # Skip the header and totals lines |
| next if $total =~ /[a-z]/ or $name =~ /TOTALS/; |
| |
| # Skip files named with dash, due to old Makefile bug |
| next if $name =~ /-/; |
| |
| $Sizes{$name} = {old => 0, new => 0} unless exists $Sizes{$name}; |
| $Sizes{$name}{$id} = $total; |
| } |
| } |
| |
| calc_sizes($oldname, $oldrev); |
| calc_sizes($newname, $newrev); |
| |
| save_sizes('old', $oldrev); |
| save_sizes('new', $newrev); |
| |
| my $total = 0; |
| |
| for (sort keys %Sizes) { |
| my $diff = $Sizes{$_}{new} - $Sizes{$_}{old}; |
| if (abs($diff) >= 16) { |
| printf "%12s %+d\n", substr($_, 0, 12), $Sizes{$_}{new} - $Sizes{$_}{old}; |
| } |
| $total += $diff; |
| } |
| printf " TOTAL: %+d\n", $total; |