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