Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 20 Dec 2000 13:02:41 +0200
From:      Peter Pentchev <roam@orbitel.bg>
To:        Alfred Perlstein <bright@wintelcom.net>, asami@FreeBSD.org, ports@FreeBSD.org
Subject:   Re: ports lockfile?
Message-ID:  <20001220130240.G644@ringworld.oblivion.bg>
In-Reply-To: <20001220123326.F644@ringworld.oblivion.bg>; from roam@orbitel.bg on Wed, Dec 20, 2000 at 12:33:26PM %2B0200
References:  <20001219113535.Q19572@fw.wintelcom.net> <20001220094157.C644@ringworld.oblivion.bg> <20001219235750.I19572@fw.wintelcom.net> <20001220121640.E644@ringworld.oblivion.bg> <20001220123326.F644@ringworld.oblivion.bg>

next in thread | previous in thread | raw e-mail | index | archive | help
(and yes, I love talking to myself ;)

On Wed, Dec 20, 2000 at 12:33:26PM +0200, Peter Pentchev wrote:
> On Wed, Dec 20, 2000 at 12:16:41PM +0200, Peter Pentchev wrote:
> > On Tue, Dec 19, 2000 at 11:57:50PM -0800, Alfred Perlstein wrote:
> [snip]
> > > 
> > > Well here's the very tricky part that I really haven't worked out
> > > how to do this, the lockf program runs a program with the lock, so
> > > I need to make the lockf program run make again.
> > > 
> > > If I define something when re-running the make then any recursive
> > > makes will have this defined right?  So I won't be able to lock
> > > the dependancy makes.
> > > 
> > > It'd be interesting to add an option to make so that it will lock
> > > the initial makefile used.  That sounds pretty hackish so any
> > > alternative ideas would be welcome and helpful.
> > 
> > I'm thinking along the lines of having a LOCKDIRS variable, listing
> > all locked dirs from all ports in the build process, then having
> > bsd.port.mk check for it *outside any targets*, if that is possible.
> > (most probably not.. just thinking out loud, please ignore the static ;)
> > If it is not defined, bsd.port.mk should do something like
> > 
> > lockf Makefile make ${MAKEFLAGS} LOCKDIRS="${LOCKDIRS} ${.CURDIR}"
> > 
> > I hope what I've written is at least vaguely understandable; fact is,
> > I myself am not very clear on what I mean :)  Got no time to play
> > around with this right now, unfortunately :(  Just tossing out
> > a wild idea..
> 
> More random thoughts about 'checking outside of any targets'.
> 
> I think bsd.port.mk could perform a check for ${.CURDIR} being
> listed in ${LOCKDIRS} as near the start as possible, and set
> an appropriate flag variable.  Later, all targets check this flag,
> and if there is no lock obtained, they simply revert to no-ops.
> This should avoid a possible problem with:
> 
> make w/o lock
> - check for lock (LOCKDIRS), find none
> - flock make, adding .CURDIR to LOCKDIRS
> 
> --- check for lock, detect one
> --- build
> --- exit releasing lock
> 
> - proceed with build - oops! :)
> 
> Now.. is there a way to do variable substitution so that we S// out
> a whole (whitespace-delimited) word (in this case, ${.CURDIR})
> out of a variable (in this case, LOCKDIRS) ?  The lock-check
> would then become something like
> 
> .if ${LOCKDIR} == ${LOCKDIR:S,something about ${.CURDIR},,}
> # no lock - the S// substituted nothing
> # set a 'do the lockf and noop everything else' flag
> .else
> # set a 'locked, proceed as usual' flag (or just do not set the other one :)
> .endif


OK, so S// *can* substitute whole words.  However, apparently I'm missing
something in make's '.if' syntax.  Anybody, hit me with a cluebar, hit me
hard, tell me why should the attached complain about a malformed conditional
in the LOCKDIRS != :S// test..

G'luck,
Peter

-- 
This sentence would be seven words long if it were six words shorter.

.if	("${LOCKDIRS}" != "${LOCKDIRS:S,^${.CURDIR}$,,}")
LOCKED=	yes
.else
# set it explicitly to avoid inheriting a 'yes'
LOCKED=	no
.endif

pre-everything:
.if	${LOCKED} != "yes"
	@${ECHO} "Attempting to acquire a lock on ${.CURDIR}/Makefile.."
	# I wonder if the following would result in a funny chain of LOCKDIRS
	# in a multi-port build make invocations..
	@${ECHO} lockf ${.CURDIR}/Makefile make ${MAKEFLAGS} LOCKDIRS="${LOCKDIRS} ${.CURDIR}"
.endif

do-build:
.if	${LOCKED} == "yes"
	@${ECHO} "the real build"
.endif

.include <bsd.port.mk>


To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-ports" in the body of the message




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