Some libraries are more libraries than others. It is one of those moments when you ask yourself if migrating to a newer version of a library fucks up the entire system. But you need that foo library as it implements feature bar. In my case, I wanted libpcre3 8.20+ in order to enable PCRE JIT. Though luck. Not even Debian sid packages 8.20.
Now I know that there’s apt-cache rdepends, but it lists all the reverse dependencies of a specific package. I needed just the reverse dependencies of the installed packages. With a little bash-fu, here it goes:
#!/bin/bash
function package_rdepends
{
for package in $(apt-cache rdepends $1 | grep -Ev "^$1$" | grep -v 'Reverse Depends:')
do
apt-cache policy $package | grep 'Installed: (none)' > /dev/null 2>&1
if [ $? -eq 1 ]
then
echo $package
fi
done
}
package_rdepends $1 | sort -u
Saved as installed-rdepends. Made executable.
./installed-rdepends libpcre3
grep
libglib2.0-0
libglib2.0-dev
libpcre3-dev
libpcrecpp0
The above script may be slow for packages with many reverse dependencies due to the fact that each package has an individual lookup. Didn’t have the patience to measure the time it takes to do a lookup for libc6. Some benchmarks for the package lookup:
time apt-cache policy libpcre3 | grep 'Installed: (none)' > /dev/null 2>&1
real 0m0.006s
user 0m0.005s
sys 0m0.003s
time dpkg -L libpcre3 > /dev/null 2>&1
real 0m0.017s
user 0m0.012s
sys 0m0.005s
time dpkg -l libpcre3 > /dev/null 2>&1
real 0m0.667s
user 0m0.600s
sys 0m0.067s
time dpkg -s libpcre3 > /dev/null 2>&1
real 0m0.587s
user 0m0.533s
sys 0m0.054s
time cat /var/lib/dpkg/available | grep -E "Package: libpcre3$" > /dev/null 2>&1
real 0m0.034s
user 0m0.015s
sys 0m0.048s
However, I didn’t try these results on a bare metal installation.