Subject: Re: USE_NEW_TOOLCHAIN toolchain build not parallel-safe
To: Alan Barrett <apb@cequrux.com>
From: Todd Vierling <tv@wasabisystems.com>
List: tech-toolchain
Date: 10/19/2001 00:12:51
On Tue, 9 Oct 2001, Alan Barrett wrote:

: > One of the fundamental problems here is that make(1) has no
: > notion of a rule that builds more than one target simultaneously
: > (genrtl.c/genrtl.h) -- Solaris's parallel make uses the '+' operator
: > for this, i.e.:
: >
: > genrtl.c + genrtl.h: foo
: > 	bar
:
: You can use "::" for that sort of thing:
:
: ${FILES}:: ${PREREQUISITES}
: 	command-to-make-them-all-simultaneously

No, this is not how "::" works.  Read make(1).  I just tested it to verify
that the behavior I'm looking for is not some undocumented feature.

What Solaris does with "+" is *link* two targets into a single unit, such
that they will only be built together (because the command used generates
them simultaneously).  This means that if one of the targets is built, the
rest of the targets on that line get marked as up-to-date and will not be
rebuilt.  It also means that only one parallel job can build any of the
targets at a time.

In a parallel world, that's extremely important; for instance, make might
auto-build the .c in one job in order to do a .c.o rule, and while building
the .o, another job could start rebuilding the .c midstream because of a
dependency on the .h... instant race condition failure.

-- 
-- Todd Vierling <tv@wasabisystems.com>  *  Wasabi NetBSD:  Run with it.
-- CDs, Integration, Embedding, Support -- http://www.wasabisystems.com/