Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 25 Mar 2009 12:57:51 -0400
From:      Coleman Kane <cokane@FreeBSD.org>
To:        Dmitry Marakasov <amdmi3@amdmi3.ru>
Cc:        ports@FreeBSD.org, Niclas Zeising <niclas.zeising@gmail.com>, Pav Lucistnik <pav@FreeBSD.org>
Subject:   Re: HEADS UP multi processor compilations for everyone
Message-ID:  <1238000271.2543.42.camel@localhost>
In-Reply-To: <20090325163050.GD32386@hades.panopticon>
References:  <1237901632.1849.19.camel@pav.hide.vol.cz> <49C8EE21.3080702@gmail.com> <1237906449.1849.25.camel@pav.hide.vol.cz> <1237906705.1741.13.camel@localhost> <1237907945.1849.27.camel@pav.hide.vol.cz> <1237912100.1741.16.camel@localhost> <1237912382.1849.35.camel@pav.hide.vol.cz> <20090325163050.GD32386@hades.panopticon>

next in thread | previous in thread | raw e-mail | index | archive | help

--=-kOyVzeDSAVQap3XfDcNw
Content-Type: text/plain
Content-Transfer-Encoding: quoted-printable

On Wed, 2009-03-25 at 19:30 +0300, Dmitry Marakasov wrote:
> * Pav Lucistnik (pav@FreeBSD.org) wrote:
>=20
> > > > This would break very fast -- it's passing -j3 to port Makefile ins=
tead
> > > > of vendor Makefile.
> > >=20
> > > This has worked fine for me for countless years, except where the
> > > vendor's Makefiles were not parallel-safe. This has been my trick to =
get
> > > larger things (like mysql or xorg-server) to make in parallel. It *di=
d*
> > > work. If this has changed, then it definitely warrants mention in
> > > UPDATING.
> >=20
> > Then it must have worked all these years by pure chance :)
>=20
> Be the way, could anyone clarify how this works? My idea was that
> passing -j to port Makefile does nothing, as make/gmake on vendor's
> Makefile is ran without any -j flags -> you get usual singlethreaded
> build. However, I have a broken port, which uses gmake and something
> like that:
>=20
> sometarget:
>   (cd xxx; make)
>=20
> and that fails with -j (make: illegal option -- -). So is there
> some magic with recursive make calls and -j?
>=20

When processing a Makefile, make's that support concurrent operation
look for targets that will execute the $(MAKE) program. Whenever a
compliant make is run (make or gmake), if it detects $(MAKE) in a rule
then it will automatically expand that rule into a child process that
has some sort of magical connection to the parent process. The
connection allows the different make processes to share the same pool of
"process count" resources amongst each other.

I am not sure what the implementation is, but this communication
mechanism allows child "make" processes called with "$(MAKE) ..." from
inside a Makefile to globally only use N children (from -j N), and
otherwise block until more "free jobs" are available amongst their
shared job pool.

I hope that's clear... Probably more so than the explanation given on
GNU make's manual.

--=20
Coleman Kane

--=-kOyVzeDSAVQap3XfDcNw
Content-Type: application/pgp-signature; name="signature.asc"
Content-Description: This is a digitally signed message part

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.9 (FreeBSD)

iEYEABECAAYFAknKYooACgkQcMSxQcXat5d7mwCfSOz0Tj9tjgK8JjVtkPTt1hPI
DiIAn0zf/ACrg1speJNrOa0PVwv2zJ7W
=kqvg
-----END PGP SIGNATURE-----

--=-kOyVzeDSAVQap3XfDcNw--




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?1238000271.2543.42.camel>