svn commit: r241298 - in head: . gnu/usr.bin/cc/cc_int gnu/usr.bin/cc/include kerberos5 kerberos5/tools/asn1_compile kerberos5/tools/slc lib/clang/include share/mk tools/build/make_check usr.sbin/c...

Marcel Moolenaar marcel at xcllnt.net
Mon Oct 8 17:50:40 UTC 2012


On Oct 8, 2012, at 1:08 AM, Bruce Evans <brde at optusnet.com.au> wrote:

> On Sun, 7 Oct 2012, Marcel Moolenaar wrote:
> 
>> On Oct 6, 2012, at 10:31 PM, Bruce Evans <brde at optusnet.com.au> wrote:
>> 
>>> On Sat, 6 Oct 2012, Marcel Moolenaar wrote:
>>> 
>>>> Log:
>>>> Add support for bmake. This includes:
>>>> ....
>>>> Modified: head/share/mk/bsd.dep.mk
>>>> ==============================================================================
>>>> --- head/share/mk/bsd.dep.mk	Sat Oct  6 19:57:27 2012	(r241297)
>>>> +++ head/share/mk/bsd.dep.mk	Sat Oct  6 20:01:05 2012	(r241298)
>>>> @@ -102,8 +102,8 @@ ${_YC} y.tab.h: ${_YSRC}
>>>> CLEANFILES+= y.tab.c y.tab.h
>>>> .elif !empty(YFLAGS:M-d)
>>>> .for _YH in ${_YC:R}.h
>>>> -.ORDER: ${_YC} ${_YH}
>>>> -${_YC} ${_YH}: ${_YSRC}
>>>> +${_YH}: ${_YC}
>>>> +${_YC}: ${_YSRC}
>>>> 	${YACC} ${YFLAGS} -o ${_YC} ${.ALLSRC}
>>>> SRCS+=	${_YH}
>>>> CLEANFILES+= ${_YH}
>>> 
>>> This is broken.  Yacc headers don't depend on generated yacc .c files.
>>> Now there is only a null rule to create the headers.  One broken case
>>> is when the header somehow gets deleted.  It bcomes out of date, but
>>> running make to update it only runs the null rule, so it remains
>>> nonexistent.
>> 
>> The problem with the old rule is that it's broken as well. The
>> change attempts to fix a real parallel build problem. Your
>> comment is valid though. What about the following (possibly
>> white-space corrupted) patch from Simon:
> 
> What's wrong with the old rule?  It uses the .ORDER directive to force
> creation of the 2 generated files in sequential order, so that parallel
> builds can't happen.

Since the source file is re-created when the header is created,
any parallel work done with the C file is a problem.

At HP, where we used clearcase & clearmake, we had to create
an intermediate tarfile, the result of the yacc(1) rule and
then have the .h and .c file depend on the tarfile. Each got
unique created by extracting only ${.TARGET}.

Roughly and loosely speaking:

.tar: .y
	yacc and create tar file

.c: .tar
	tar x y.tab.c

.h: .tar
	tar x y.tab.h

I think something like this is the only way to get something
that's 100% correct.

-- 
Marcel Moolenaar
marcel at xcllnt.net




More information about the svn-src-head mailing list