xref: /freebsd/contrib/byacc/test/run_make.sh (revision 4d846d26)
1#!/bin/sh
2# $Id: run_make.sh,v 1.21 2022/11/06 20:57:33 tom Exp $
3# vi:ts=4 sw=4:
4
5# do a test-compile on each of the ".c" files in the test-directory
6
7BISON=`bison --version 2>/dev/null | head -n 1 | sed -e 's/^[^0-9.]*//' -e 's/[^0-9.]*$//'`
8
9if test $# = 1
10then
11	PROG_DIR=`pwd`
12	TEST_DIR=$1
13else
14	PROG_DIR=..
15	TEST_DIR=.
16fi
17THIS_DIR=`pwd`
18
19: "${FGREP:=grep -F}"
20ifBTYACC=`$FGREP -l 'define YYBTYACC' config.h > /dev/null; test $? != 0; echo $?`
21
22if test "$ifBTYACC" = 0; then
23	REF_DIR=${TEST_DIR}/yacc
24else
25	REF_DIR=${TEST_DIR}/btyacc
26fi
27
28MY_MAKE="make -f $PROG_DIR/makefile srcdir=$PROG_DIR"
29
30run_make() {
31	C_FILE=`basename "$1"`
32	O_FILE=`basename "$C_FILE" .c`.o
33	shift
34	RETEST=`unset CDPATH; cd $TEST_DIR; pwd`
35	cd "$REF_DIR"
36	test -f "$I_FILE" && rm "$I_FILE"
37	make -f "$PROG_DIR/makefile" EXTRA_CFLAGS=-I$RETEST srcdir="$PROG_DIR" "$O_FILE" "$@"
38	test -f "$O_FILE" && rm "$O_FILE"
39	cd "$THIS_DIR"
40}
41
42echo "** `date`"
43echo "** program is in $PROG_DIR"
44echo "** test-files in $REF_DIR"
45
46for input in ${REF_DIR}/*.c
47do
48	case $input in #(vi
49	${REF_DIR}/err_*|\
50	${REF_DIR}/test-err_*)
51		continue
52		;;
53	esac
54
55	test -f "$input" || continue
56
57	run_make "$input"
58
59	DEFS=
60	case $input in #(vi
61	${REF_DIR}/pure_*)
62		# DEFS="-DYYLEX_PARAM=flag -DYYLEX_PARAM_TYPE=int"
63		;;
64	esac
65
66	if test "x$DEFS" != "x"
67	then
68		run_make "$input" DEFINES="$DEFS"
69	fi
70done
71
72if test -n "$BISON"
73then
74	echo "** compare with bison $BISON"
75	for input in ${TEST_DIR}/*.y
76	do
77		test -f "$input" || continue
78		case $input in
79		${TEST_DIR}/err_*|\
80		${TEST_DIR}/test-err_*)
81			continue
82			;;
83		${TEST_DIR}/ok_syntax*|\
84		${TEST_DIR}/varsyntax*)
85			# Bison does not support all byacc legacy syntax
86			continue
87			;;
88		${TEST_DIR}/btyacc_*)
89			# Bison does not support the btyacc []-action & inherited attribute extensions.
90			continue
91			;;
92		esac
93
94		# Bison does not support pure-parser from command-line.
95		# Also, its support for %expect is generally broken.
96		# Work around these issues using a temporary file.
97
98		echo "... testing $input"
99		rm -f run_make.[coy]
100
101		case $input in
102		${TEST_DIR}/pure_*)
103			if test -z "`$FGREP -i -l '%pure-parser' "$input"`"
104			then
105				echo "%pure-parser" >>run_make.y
106			fi
107			;;
108		esac
109
110		sed -e '/^%expect/s,%expect.*,,' "$input" >>run_make.y
111
112		case $BISON in
113		[3-9].[0-9]*.[0-9]*)
114			bison -Wno-other -Wno-conflicts-sr -Wconflicts-rr -y -Wno-yacc run_make.y
115			;;
116		*)
117			bison -y run_make.y
118			;;
119		esac
120		if test -f "y.tab.c"
121		then
122			sed -e '/^#line/s,"run_make.y","'"$input"'",' y.tab.c >run_make.c
123
124			rm -f y.tab.c
125
126			input=run_make.c
127			object=run_make.o
128			if test -f $input
129			then
130				$MY_MAKE $object DEFINES='-DYYENABLE_NLS=0 -DYYLTYPE_IS_TRIVIAL=1 -DYYSTACK_USE_ALLOCA=0 -DYYMAXDEPTH=0'
131			else
132				echo "?? $input not found"
133			fi
134		fi
135		rm -f run_make.[coy]
136	done
137fi
138
139YACC=
140for name in /usr/ccs/bin/yacc
141do
142	if test -f $name
143	then
144		YACC=$name
145	fi
146done
147
148if test -n "$YACC"
149then
150	echo "** compare with $YACC"
151	for input in ${TEST_DIR}/*.y
152	do
153		test -f "$input" || continue
154
155		echo "... testing $input"
156		rm -f run_make.[coy]
157
158		case $input in
159		pure_*)
160			echo "... skipping $input"
161			continue;
162			;;
163		*)
164			if $FGREP -i '%pure-parser' "$input" >/dev/null ||
165			   $FGREP -i '%parse-param' "$input" >/dev/null ||
166			   $FGREP -i '%lex-param' "$input" >/dev/null ||
167			   $FGREP -i '%token-table' "$input" >/dev/null ||
168			   $FGREP 'YYLEX_PARAM' "$input" >/dev/null
169			then
170				echo "... skipping $input"
171				continue;
172			fi
173			;;
174		esac
175
176		sed -e '/^%expect/s,%expect.*,,' "$input" >>run_make.y
177
178		$YACC run_make.y
179		if test -f y.tab.c
180		then
181			sed -e '/^#line/s,"run_make.y","'"$input"'",' y.tab.c >run_make.c
182
183			rm -f y.tab.c
184
185			input=run_make.c
186			object=run_make.o
187			if test -f $input
188			then
189				$MY_MAKE $object
190			else
191				echo "?? $input not found"
192			fi
193		fi
194		rm -f run_make.[coy]
195	done
196fi
197