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.