Building library that depends on another library.
Jilles Tjoelker
jilles at stack.nl
Sun May 5 21:58:42 UTC 2013
On Sun, May 05, 2013 at 10:14:36PM +0200, Pawel Jakub Dawidek wrote:
> I'm trying to connect two libraries to the build without hacks and it
> doesn't work...
> My two libraries are libcapsicum and libnv. libcapsicum depends on libnv.
> I want to specify this dependency explicitely in libcapsicum's Makefile:
> DPADD= ${LIBNV}
> LDADD= -lnv
> (LIBNV was added to bsd.libnames.mk, in case you wonder.)
> From conversation with kan@ (Alexander Kabaev) declaring dependency
> directly in library's Makefile is required for symbol versioning to
> work. It just sounds right, too.
> If this is done, libcapsicum doesn't compile:
> ===> lib/libcapsicum (all)
> cc [...]
> cc [...]
> building static capsicum library
> ranlib libcapsicum.a
> cc [...]
> cc [...]
> make: don't know how to make
> /usr/home/pjd/obj/usr/home/pjd/p4/capsicum/tmp/usr/lib/libnv.a. Stop
> *** [all] Error code 2
>
> Stop in /usr/home/pjd/p4/capsicum/lib.
> *** [lib__L] Error code 1
> Note that when build fails libnv.{a,so} exist in <OBJDIR>/lib/libnv/,
> but of course not in <OBJDIR>/tmp/usr/lib/.
> It looks like to make such dependency work one HAS TO add libnv to
> _prebuild_libs in src/Makefile.inc1, which seems wrong.
[removing incorrect sentence about LD_LIBRARY_PATH here]
> My understanding was that all I need to do is to add my two libraries in
> proper order to SUBDIR_ORDERED variable in src/lib/Makefile.
> This means that currently SUBDIR_ORDERED is totally useless.
> No matter how libraries are ordered there, to compile, they need
> libraries they depend on in Makefile.inc1's _prebuild_libs.
This analysis seems correct. The order in SUBDIR_ORDERED in
src/lib/Makefile is useless because it first makes obj in all
directories, then depend, then all, then install; therefore, libraries
are not installed to ${WORLDTMP}/usr/lib to be picked up in time by
libraries depending on them.
Instead, the directories in _prebuild_libs first get
obj/depend/all/install for the first directory so that libraries are
installed in time. As noted in the comment in src/Makefile.inc1, the
script src/tools/make_libdeps.sh can be helpful in determining what to
put in _prebuild_libs.
> I can of course just add libnv to _prebuild_libs and make it compile
> twice for no reason, but maybe there is a better way or maybe I'm just
> missing something?
It just runs make through it twice. The second time, it does not compile
anything.
--
Jilles Tjoelker
More information about the freebsd-arch
mailing list