Subject: Re: BSD .mk files and multiple programs
To: Harlan Stenn <Harlan.Stenn@pfcs.com>
From: Simon J. Gerraty <sjg@crufty.net>
List: tech-userlevel
Date: 11/29/2002 16:36:01
On Fri, 29 Nov 2002 18:09:39 -0500, Harlan Stenn writes:
>> >Could I snarf you stuff/chagnes?  The amount of stuff I found on google was
>> 
>> My changes are in NetBSD's make.
>
>As in "already committed to NetBSD's make"?  If not, could I get a copy?

Yes, already committed for a couple of years.

>Too slow.  My goal (at the moment) is to have Makefile's contain information
>very similar to an automake's Makefile.am, which means:
>
>
> bin_PROGRAMS = foo1 foo1
> foo1_SOURCES = ...
> foo1_CFLAGS = ...
> foo2_SOURCES = ...
> foo2_LDADD = ...
>
> noinst_LTLIBRARIES = libabc.la libdef.la
> libabc_la_SOURCES = ...
> libdef_la_sources = ...	(Needs work - I don't want to require libtool)
>
> htmldir = ${Prefix}/share/html
> html_DATA = index.html
>
>and when I "make install" everything gets built and the _PROGRAMS and _DATA
>targets are properly installed.
>
>I believe (but do not know) that using a shell loop to get the variables
>will be Slow; I suspect I will want to automate a loop that would do
>something like:

You don't need to know all the var names.  They are provided for you
in a couple of well know vars.  

>and then the same for other "primaries" (like SCRIPTS, DATA, MANS, INCLUDES,
>LIBRARIES, ...).

Yes but this is a well defined set - they are not (should not) be
arbitrary.

For example:

# multi-target test

LIBS=one two three
PROGS=four five six

one_SRCS=a.c b.c c.c
two_SRCS=d.c e.c
four_SRCS=f.c g.c

.if defined(LIB)
SRCS=${${LIB}_SRCS:U${LIB}.c}

.include <bsd.lib.mk>

.elif defined(PROG)
SRCS=${${PROG}_SRCS:U${PROG}.c}
LDADD+= ${${PROG}_LDADD}

.include <bsd.prog.mk>

.else

all:
.for var in LIBS PROGS SCRIPTS 
.for val in ${${var}}
	cd ${.CURDIR} && ${.MAKE} -f ${MAKEFILE} ${var:S/S$//}=${val}
.endfor
.endfor

.endif

$ make -n -f multi
cd /homes/sjg/make-tests && make -f /homes/sjg/make-tests/multi LIB=one
cd /homes/sjg/make-tests && make -f /homes/sjg/make-tests/multi LIB=two
cd /homes/sjg/make-tests && make -f /homes/sjg/make-tests/multi LIB=three
cd /homes/sjg/make-tests && make -f /homes/sjg/make-tests/multi PROG=four
cd /homes/sjg/make-tests && make -f /homes/sjg/make-tests/multi PROG=five
cd /homes/sjg/make-tests && make -f /homes/sjg/make-tests/multi PROG=six
$

--sjg