dtneededsize: +duplicate commons size
[massrebuild.git] / dtneededsize
index da07789..1caeb10 100755 (executable)
@@ -56,17 +56,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,6 +112,7 @@ find {
 #}
 
 my $dwzsizeall=0;
+my $dwzsizeduplall=0;
 my $dtsizeall=0;
 my $computed=0;
 BINFN: for my $binfn (@DEBUG) {
@@ -143,6 +152,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 +171,27 @@ 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;
 #  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."\n";
+print "dwzsizeduplall=$dwzsizeduplall"." dtsizeall=$dtsizeall =".$dwzsizeduplall/$dtsizeall."\n";
+print "computed=$computed of DEBUG=".(0+@DEBUG)." =".$computed/@DEBUG."\n";