#!/usr/bin/perl -w # usage: # [somebody@somewhere ~/ipxe/src]$ ./util/diffsize.pl [ []] # by default is HEAD and 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 () { 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;