How to create lib (and run) dependency list at Makefile

Kevin Oberman rkoberman at gmail.com
Tue Aug 13 04:25:18 UTC 2013


On Mon, Aug 12, 2013 at 12:15 PM, Boris Samorodov <bsam at passap.ru> wrote:

> Hi All,
>
> recently I've upgaded my ports. Then I get:
> -----
> % pkg_libchk -a
> rasqal-0.9.30: /usr/local/bin/roqet misses libcurl.so.6
> rasqal-0.9.30: /usr/local/lib/librasqal.so.3 misses libcurl.so.6
> -----
>
> So, I assume that textproc/rasqal was not bumped after ftp/curl update.
> The dependency was not specified. I tested a patch and filed a PR.
> But while working with port I get strange (at least to me) results.
>
> The binary file which is installed by textproc/rasqal is bin/roqet.
> Let's see which libraries (installed from ports) it uses:
> -----
> % ldd -f '%p\n' /usr/local/bin/roqet | grep '/usr/local'
> /usr/local/lib/librasqal.so.3
> /usr/local/lib/libraptor2.so.0
> /usr/local/lib/libicuuc.so.50
> /usr/local/lib/libxslt.so.2
> /usr/local/lib/libyajl.so.2
> /usr/local/lib/libxml2.so.5
> /usr/local/lib/libiconv.so.3
> /usr/local/lib/libcurl.so.7
> /usr/local/lib/libicudata.so.50
> -----
>
> That means this file depends upon (origins):
> -----
> converters/libiconv
> devel/icu
> devel/yajl
> ftp/curl
> textproc/libxml2
> textproc/libxslt
> textproc/raptor2
> -----
>
> Am I right that those ports should be specified as LIB (or RUN)
> dependencies for textproc/rasqal?
>
> Here is the current run dependencies (for the whole port, not just
> one binary file!):
> -----
> % make -C /usr/ports/textproc/rasqal run-depends-list
> /usr/ports/devel/pcre
> /usr/ports/textproc/raptor2
> -----
>
> Seems that I'm mistaken somewhere, because 6(!) library dependencies
> are not registered!
>
> PS. All those ports shows up as indirect dependencies (checked with
> 'make all-depends-list'). But imho they should be a _direct_ ones.
>
> Am I wrong here? Thanks!
> --
> WBR, Boris Samorodov (bsam)
> FreeBSD Committer, http://www.FreeBSD.org The Power To Serve
> _______________________________________________
> freebsd-ports at freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/freebsd-ports
> To unsubscribe, send any mail to "freebsd-ports-unsubscribe at freebsd.org"
>

Yes, you are wrong, but it's not obvious.

When a program links to a sharable library, it also links to any library to
which the sharable links.
As it turns out, libraptor2.so does, in fact, link to libcurl.so (and a
bunch of others).

First, when rolling a port it is impractical to try to track down every
library that a library I need links to. And it is totally unnecessary For
the port and package, as the ports system automagically take care of
including dependencies of dependencies. When running he executable, the
rtld takes care of all of this.

There are some real complications that pop up now an again. One is figuring
out which ports need to be re-built. You can't just scan Makefiles for
LIBDEPENDS. That's why I prefer running pkg_libchk. Then I KNOW what ports
need rebuilding after a library version bump. port(master|upgrade) -r will
also do this correctly, but will also cause many ports that DON'T link to
the sharable that had a version bump. They're safe, but not efficient.
pkg_libchk is both safe and efficient, but takes a little thought. (The
magic incantation is:
pkg_libchk -o | grep BUMPED_LIB | cut -d: -f1 | sort | uniq
This will provide a list of what needs rebuilding.  (Similar commands using
other tools like awk will also work, of course).
-- 
R. Kevin Oberman, Network Engineer
E-mail: rkoberman at gmail.com


More information about the freebsd-ports mailing list