dtneededsize: +-r
[massrebuild.git] / dtneededsize
index da07789..6603bde 100755 (executable)
@@ -4,6 +4,8 @@ use warnings;
 use File::Basename qw(&dirname);
 use File::Find;
 use Data::Dumper;
+use Statistics::Basic::StdDev;
+use List::Util;
 
 $|=1;
 sub readfile {
@@ -16,6 +18,14 @@ sub readfile {
   return $r;
 }
 
+my %R;
+if (($ARGV[0]||"") eq "-r") {
+  shift;
+  my $r=readfile shift;
+  $R{$1}=1 while $r=~s/^(.*?)\n//;
+  die $r if $r;
+}
+
 my %D;
 # ==> build/Cadence-1.0.0-0.12.20200504git5787908.fc33.src.rpm.dtneeded <==
 # /usr/lib/debug/.dwz/Cadence isdwzcommon 479079 NA
@@ -24,6 +34,7 @@ my %D;
 # ==> build/CVector-1.0.3.1-21.fc33.src.rpm.dtneeded <==
 # /usr/lib64/libCVector-1.0.3.so.2.0.0 nodwzcommon 28088 28896
 for my $dtneededfn (glob "build/*.dtneeded") {
+  next if %R && !$R{($dtneededfn=~m{^build/(.*?)-[^-]*-[^-]*$})[0]."-debuginfo"};
   local *F;
   open F,$dtneededfn or die "$dtneededfn: $1";
   local $_;
@@ -56,17 +67,25 @@ find {
     if (-l $binfn) {
       my $target=readlink $binfn or die $binfn;
       $binfn=~s{^[.]}{};
-      my $ref=\$SYMLINK{$binfn};
-      die if $$ref;
+      my $final;
       if ($target=~m{^/}) {
-       $$ref=$target;
+       $final=$target;
 #warn "$binfn,target=rel=$$ref\n";
       } else {
        my $base=dirname(".$binfn");
        my $abs=File::Spec->rel2abs($target,$base);
-       $$ref="/".File::Spec->abs2rel($abs);
+       $final="/".File::Spec->abs2rel($abs);
 #warn "$binfn,base=$base,target=$target,abs=$abs,rel=$$ref\n";
       }
+      1 while $final=~s{/[^/]+/[.][.]/}{/};
+      1 while $final=~s{/[^/]+/[.][.]$}{};
+      if ($final=~m{/[.][.]}) {
+       warn "$binfn,target=$target,final=$final\n";
+       return;
+      }
+      my $ref=\$SYMLINK{$binfn};
+      die if $$ref;
+      $$ref=$final;
       return;
     }
     return if !-f $binfn;
@@ -104,7 +123,10 @@ find {
 #}
 
 my $dwzsizeall=0;
+my $dwzsizeduplall=0;
 my $dtsizeall=0;
+my @ratioall;
+my @ratioduplall;
 my $computed=0;
 BINFN: for my $binfn (@DEBUG) {
 #  warn "$binfn...\n".Dumper([sort @{$F{$binfn}{"needed"}}]);
@@ -143,6 +165,7 @@ BINFN: for my $binfn (@DEBUG) {
   }
 #warn Dumper $binfn,\%l;
   my $dwzsizetot=0;
+  my $dwzsizedupltot=0;
   my $dtsizetot=0;
   my %dwzcommons;
   for my $l (keys(%l)) {
@@ -161,23 +184,30 @@ BINFN: for my $binfn (@DEBUG) {
     my $dwzsize=$ref->[1];
     die if !defined $dwzsize;
     $dwzsizetot+=$dwzsize;
+    $dwzsizedupltot+=$dwzsize;
     $computed++;
     my $dwzcommon=$ref->[0];
     next if $dwzcommon eq "nodwzcommon";
     die if $dwzcommon eq "isdwzcommon";
-    next if $dwzcommons{$dwzcommon}++;
+    my $duplicate=$dwzcommons{$dwzcommon}++;
     my $dwzcommonref=$D{$dwzcommon};
     die if !$dwzcommonref;
     die if $dwzcommonref->[0] ne "isdwzcommon";
     die if $dwzcommonref->[2] ne "NA";
     my $dwzcommonsize=$dwzcommonref->[1];
-    $dwzsizetot+=$dwzcommonsize;
+    $dwzsizetot+=$dwzcommonsize if !$duplicate;
+    $dwzsizedupltot+=$dwzcommonsize;
   }
   print "$binfn: dwzsizetot=$dwzsizetot dtsizetot=$dtsizetot\n";
 warn "$binfn: ".Dumper(\%dwzcommons);
   $dwzsizeall+=$dwzsizetot;
+  $dwzsizeduplall+=$dwzsizedupltot;
   $dtsizeall+=$dtsizetot;
+  push @ratioall    ,$dwzsizetot    /$dtsizetot;
+  push @ratioduplall,$dwzsizedupltot/$dtsizetot;
 #  warn "$binfn done\n".Dumper([sort keys(%l)]);
 }
-print "dwzsizeall=$dwzsizeall dtsizeall=$dtsizeall\n";
-print "computed=$computed of DEBUG=".(0+@DEBUG)."\n";
+print "dwzsizeall    =$dwzsizeall"    ." dtsizeall=$dtsizeall =".$dwzsizeall    /$dtsizeall." avg=".List::Util::sum(@ratioall    )/@ratioall    ." stddev=".Statistics::Basic::stddev(\@ratioall    )."\n";
+print "dwzsizeduplall=$dwzsizeduplall"." dtsizeall=$dtsizeall =".$dwzsizeduplall/$dtsizeall." avg=".List::Util::sum(@ratioduplall)/@ratioduplall." stddev=".Statistics::Basic::stddev(\@ratioduplall)."\n";
+print "computed=$computed of DEBUG=".(0+@DEBUG)." =".$computed/@DEBUG."\n";
+#print Dumper \@ratioall;