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>