summaryrefslogtreecommitdiff
path: root/devel/bmake/files/mk/yacc.mk
blob: 6872f4a4a7e53c8f20ba451d0eb60ff174b2e67a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
# $Id: yacc.mk,v 1.1.1.1 2020/05/24 05:35:53 nia Exp $

#
#	@(#) Copyright (c) 1999-2011, Simon J. Gerraty
#
#	This file is provided in the hope that it will
#	be of use.  There is absolutely NO WARRANTY.
#	Permission to copy, redistribute or otherwise
#	use this file is hereby granted provided that 
#	the above copyright notice and this notice are
#	left intact. 
#      
#	Please send copies of changes and bug-fixes to:
#	sjg@crufty.net
#

# this file contains rules to DTRT when SRCS contains foo.y or foo.c
# when only a foo.y exists.

YACC?= yacc
YFLAGS?= -v -t
RM?= rm

YACC.y?= ${YACC} ${YFLAGS}

.if ${YACC.y:M-d} == "" || defined(NO_RENAME_Y_TAB_H)

.y.c:
	${YACC.y} ${.IMPSRC}
	[ ! -s y.tab.c ] || mv y.tab.c ${.TARGET}
	${RM} -f y.tab.[!h]

.else

# the touch of the .c is to ensure it is newer than .h (paranoia)
.y.h:
	${YACC.y} ${.IMPSRC}
	[ ! -s y.tab.c ] || mv y.tab.c ${.TARGET:T:R}.c
	[ ! -s y.tab.h ] || cmp -s y.tab.h ${.TARGET:T:R}.h \
		|| mv y.tab.h ${.TARGET:T:R}.h
	touch ${.TARGET:T:R}.c
	${RM} -f y.tab.*

# Normally the .y.h rule does the work - to avoid races.
# If for any reason the .c is lost but the .h remains,
# regenerate the .c
.y.c:	${.TARGET:T:R}.h
	[ -s ${.TARGET} ] || { \
		${YACC.y} ${.IMPSRC} && \
		{ [ ! -s y.tab.c ] || mv y.tab.c ${.TARGET}; \
		${RM} y.tab.*; }; }
.endif

beforedepend:	${SRCS:T:M*.y:S/.y/.c/g}

CLEANFILES+= ${SRCS:T:M*.y:S/.y/.[ch]/g}
CLEANFILES+= y.tab.[ch]