I've tried to put together a patch for this. It gets the dependencies right for my /usr/bin/*, but might need more review. Cheers T.
--- /usr/bin/dpkg-shlibdeps Sun Sep 15 20:36:46 2002 +++ /semitmp/dpkg/dpkg-shlibdeps Thu Mar 27 18:51:31 2003 @@ -221,6 +221,11 @@ "dependency field $libf[$i])"); } +sub doesmatch { + my ($ver1, $cmp, $ver2) = @_; + return ! system("dpkg", "--compare-versions",$ver1,$cmp,$ver2); +} + sub scanshlibsfile { my ($fn,$ln,$lsn,$lf) = @_; my ($da,$dv,$dk); @@ -241,10 +246,63 @@ $da= $'; for $dv (split(/,/,$da)) { $dv =~ s/^\s+//; $dv =~ s/\s+$//; + (my $dv_pkg, my $dv_vercmp, my $dv_version) = $dv =~ /^([a-zA-Z0-9+-.]+)(?:\s*\(([<>=]+)\s*([^)\s]+)\s*\))?/; + my $dv_cmpfirst = substr($dv_vercmp,0,1); if (defined($depstrength{$lf})) { - if (!defined($predefdepfdep{$dv}) || - $depstrength{$predefdepfdep{$dv}} < $depstrength{$lf}) { - $predefdepfdep{$dv}= $lf; + if ($dv !~ m/\|/) { + my $issubstantial = 1; # is this really new information? + for my $adepfield (@depfields[$depstrength{$lf}-1..$#depfields-1]) { + if (defined($newdep{$adepfield}) && defined($newdep{$adepfield}{$dv_pkg})) { + if ($dv_vercmp eq "") { $issubstantial = 0; } + if ($issubstantial && defined($newdep{$adepfield}{$dv_pkg}{"="}) + && doesmatch($newdep{$adepfield}{$dv_pkg}{"="}[1], $dv_vercmp, $dv_version)) { + $issubstantial = 0; + } + if ($issubstantial && $dv_cmpfirst ne "=" && + defined($newdep{$adepfield}{$dv_pkg}{$dv_cmpfirst})) { + my $neededcmp = $dv_vercmp; + if ($dv_cercmp eq $newdep{$adepfield}{$dv_pkg}{$dv_cmpfirst}) { + $neededcmp = $dv_cmpfirst."="; + } + if (doesmatch($newdep{$adepfield}{$dv_pkg}{$dv_cmpfirst}[1], + $neededcmp, $dv_version)) { + $issubstantial = 0; + } + } + } + } + if ($issubstantial) { + $newdep{$lf}{$dv_pkg}{$dv_cmpfirst} = [$dv_vercmp,$dv_version]; + # Delete Obsolete + # only unversined dependcy could be left to delete at depstrength of current version + if ($dv_vercmp ne "" && defined($newdep{$lf}{$dv_pkg}{""})) { + undefine($newdep{$lf}{$dv_pkg}{""}); + } + for my $adepfield (@depfields[0..$depstrength{$lf}-2]) { + if (defined($newdep{$adepfield}) && defined($newdep{$adepfield}{$dv_pkg})) { + if (defined($newdep{$adepfield}{$dv_pkg}{""})) { + undefine($newdep{$adepfield}{$dv_pkg}{""}); + } + if ($dv_vercmp eq "=" && defined($newdep{$adepfield}{$dv_pkg}{"="}) + && doesmatch($newdep{$adepfield}{$dv_pkg}{"="}[1], "=", $dv_version)) { + undefine($newdep{$adepfield}{$dv_pkg}{"="}); + } + if (($dv_cmpfirst eq ">" || $dv_cmpfirst eq "<") && + defined($newdep{$adepfield}{$dv_pkg}{$dv_cmpfirst})) { + my $neededcmp = defined($newdep{$adepfield}{$dv_pkg}{$dv_cmpfirst}); + if ($dv_cercmp eq $newdep{$adepfield}{$dv_pkg}{$dv_cmpfirst}) { + $neededcmp = $dv_cmpfirst."="; + } + if (doesmatch($dv_version, $neededcmp, + $newdep{$adepfield}{$dv_pkg}{$dv_cmpfirst}[1])) { + undefine($newdep{$adepfield}{$dv_pkg}{$dv_cmpfirst}); + } + } + } + } + }} + else { # cannot handle |s, so I'll just take them... + $newdep{$lf}{$dv_pkg}{'|'}{$dv} = $dv; } } else { $dk= "$lf: $dv"; @@ -280,14 +338,31 @@ } else { $fh= 'STDOUT'; } + +for $lf (keys %newdep) { + print $lf."\n"; + for $apkg (sort keys %{$newdep{$lf}}) { + for $aop (sort keys %{$newdep{$lf}{$apkg}}) { + $newdefdepf{$lf}.= ', ' if length($newdefdepf{$lf}); + if ($aop ne '|') { + $newdefdepf{$lf}.= $apkg; + $newdefdepf{$lf}.= " (".join(' ', @{$newdep{$lf}{$apkg}{$aop}}).")" if length($aop); + } + else { + $newdefdepf{$lf} .= join(', ',sort keys %{$newdep{$lf}{$apkg}{$aop}}); + } + } + } +} + for $dv (sort keys %predefdepfdep) { $lf= $predefdepfdep{$dv}; $defdepf{$lf}.= ', ' if length($defdepf{$lf}); $defdepf{$lf}.= $dv; } for $lf (reverse @depfields) { - next unless defined($defdepf{$lf}); - print($fh "$varnameprefix:$lf=$defdepf{$lf}\n") + next unless defined($newdefdepf{$lf}); + print($fh "$varnameprefix:$lf=$newdefdepf{$lf}\n") || syserr("write output entry"); } for $lf (sort keys %unkdepf) {
Attachment:
pgphnvaSVaSZh.pgp
Description: PGP signature