Building library that depends on another library.

mdf at FreeBSD.org mdf at FreeBSD.org
Tue May 7 19:21:03 UTC 2013


On Tue, May 7, 2013 at 11:50 AM, Pawel Jakub Dawidek <pjd at freebsd.org>wrote:

> On Mon, May 06, 2013 at 08:49:15PM +0200, Dag-Erling Smørgrav wrote:
> > Pawel Jakub Dawidek <pjd at FreeBSD.org> writes:
> > > It looks like to make such dependency work one HAS TO add libnv to
> > > _prebuild_libs in src/Makefile.inc1, which seems wrong.
> >
> > It may seem wrong, but it is correct, cf the following comment in
> > Makefile.inc1:
> >
> > # The list of libraries with dependents (${_prebuild_libs}) and their
> > # interdependencies (__L) are built automatically by the
> > # ${.CURDIR}/tools/make_libdeps.sh script.
>
> Yes, this also means SUBDIR_ORDERED in lib/Makefile doesn't make sense.
>
> All in all I really don't like to add libraries to Makefile.inc1, it
> doesn't sound right. I'd like this to be self-contained. For bsd.prog.mk
> it is enough to specify DPADD/LDADD in program's Makefile instead of
> hacking some central Makefile.
>
> I came up with something like the following. Instead of:
>
> DPADD=  ${LIBNV}
> LDADD=  -lnv
> (plus modifying src/Makefile.inc1)
>
> I only add:
>
> LDADD=  -L${.OBJDIR}/../libnv -lnv
>
> What do people think?
>

I won't claim any knowledge of various Makefile variables, but at work we
use this.  (I think gcooper is changing this to have the -L in LDFLAGS so
the LDADD stays pure; I suppose it is better but it's even more verbose).

We also use rcorder on our makefiles so they're built in the right order,
which AFAICT serves the same purpose as DPADD but perhaps less annoyingly
(no need to define LIBNV somewhere).  However, it still requires
over-specification (and a mis-spelling will break it).  So for our
libraries, each Makefile should have a # PROIVIDE: line as well as
potentially some # REQUIRE: lines.  Using rcorder has the advantage that it
will detect circular dependencies.

It would be nice if the existence of an LDADD in the Makefile would
automatically also mean the ordering of build was determined; DPADD/LDADD
should be in parallel already.  And for our use of rcorder, it's redundant
to have both a REQUIRE line and an LDADD line.  But I think quickly we're
getting past what make(1) can do and into the realms of "build systems are
hard".

Cheers,
matthew


More information about the freebsd-arch mailing list