ylwrap revision 1.1 1 #! /bin/sh
2 # ylwrap - wrapper for lex/yacc invocations.
3
4 scriptversion=2005-02-02.22
5
6 # Copyright (C) 1996, 1997, 1998, 1999, 2001, 2002, 2003, 2004, 2005
7 # Free Software Foundation, Inc.
8 #
9 # Written by Tom Tromey <tromey (at] cygnus.com>.
10 #
11 # This program is free software; you can redistribute it and/or modify
12 # it under the terms of the GNU General Public License as published by
13 # the Free Software Foundation; either version 2, or (at your option)
14 # any later version.
15 #
16 # This program is distributed in the hope that it will be useful,
17 # but WITHOUT ANY WARRANTY; without even the implied warranty of
18 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 # GNU General Public License for more details.
20 #
21 # You should have received a copy of the GNU General Public License
22 # along with this program; if not, write to the Free Software
23 # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
24
25 # As a special exception to the GNU General Public License, if you
26 # distribute this file as part of a program that contains a
27 # configuration script generated by Autoconf, you may include it under
28 # the same distribution terms that you use for the rest of that program.
29
30 # This file is maintained in Automake, please report
31 # bugs to <bug-automake (at] gnu.org> or send patches to
32 # <automake-patches (at] gnu.org>.
33
34 case "$1" in
35 '')
36 echo "$0: No files given. Try \`$0 --help' for more information." 1>&2
37 exit 1
38 ;;
39 --basedir)
40 basedir=$2
41 shift 2
42 ;;
43 -h|--h*)
44 cat <<\EOF
45 Usage: ylwrap [--help|--version] INPUT [OUTPUT DESIRED]... -- PROGRAM [ARGS]...
46
47 Wrapper for lex/yacc invocations, renaming files as desired.
48
49 INPUT is the input file
50 OUTPUT is one file PROG generates
51 DESIRED is the file we actually want instead of OUTPUT
52 PROGRAM is program to run
53 ARGS are passed to PROG
54
55 Any number of OUTPUT,DESIRED pairs may be used.
56
57 This wrapper will prefix each conflicting yacc/lex symbol with a unique name
58 produced from INPUT. For example, if INPUT is foo_parse.y, then yyparse()
59 becomes foo_parse(). This requires that both your .l and corresponding .y
60 files have the same prefix (e.g., foo_parse.y and foo_tok.l).
61
62 Report bugs to <bug-automake (at] gnu.org>.
63 EOF
64 exit $?
65 ;;
66 -v|--v*)
67 echo "ylwrap $scriptversion"
68 exit $?
69 ;;
70 esac
71
72
73 # The input.
74 input="$1"
75 shift
76 case "$input" in
77 [\\/]* | ?:[\\/]*)
78 # Absolute path; do nothing.
79 ;;
80 *)
81 # Relative path. Make it absolute.
82 input="`pwd`/$input"
83 ;;
84 esac
85
86 pairlist=
87 while test "$#" -ne 0; do
88 if test "$1" = "--"; then
89 shift
90 break
91 fi
92 pairlist="$pairlist $1"
93 shift
94 done
95
96 # The program to run.
97 prog="$1"
98 shift
99 # Make any relative path in $prog absolute.
100 case "$prog" in
101 [\\/]* | ?:[\\/]*) ;;
102 *[\\/]*) prog="`pwd`/$prog" ;;
103 esac
104
105 # FIXME: add hostname here for parallel makes that run commands on
106 # other machines. But that might take us over the 14-char limit.
107 dirname=ylwrap$$
108 trap "cd `pwd`; rm -rf $dirname > /dev/null 2>&1" 1 2 3 15
109 mkdir $dirname || exit 1
110
111 cd $dirname
112
113 case $# in
114 0) $prog "$input" ;;
115 *) $prog "$@" "$input" ;;
116 esac
117 ret=$?
118
119 if test $ret -eq 0; then
120 set X $pairlist
121 shift
122 first=yes
123 # Since DOS filename conventions don't allow two dots,
124 # the DOS version of Bison writes out y_tab.c instead of y.tab.c
125 # and y_tab.h instead of y.tab.h. Test to see if this is the case.
126 y_tab_nodot="no"
127 if test -f y_tab.c || test -f y_tab.h; then
128 y_tab_nodot="yes"
129 fi
130
131 # The directory holding the input.
132 input_dir=`echo "$input" | sed -e 's,\([\\/]\)[^\\/]*$,\1,'`
133 # Quote $INPUT_DIR so we can use it in a regexp.
134 # FIXME: really we should care about more than `.' and `\'.
135 input_rx=`echo "$input_dir" | sed 's,\\\\,\\\\\\\\,g;s,\\.,\\\\.,g'`
136
137 while test "$#" -ne 0; do
138 from="$1"
139 # Handle y_tab.c and y_tab.h output by DOS
140 if test $y_tab_nodot = "yes"; then
141 if test $from = "y.tab.c"; then
142 from="y_tab.c"
143 else
144 if test $from = "y.tab.h"; then
145 from="y_tab.h"
146 fi
147 fi
148 fi
149 if test -f "$from"; then
150 # If $2 is an absolute path name, then just use that,
151 # otherwise prepend `../'.
152 case "$2" in
153 [\\/]* | ?:[\\/]*) target="$2";;
154 *) target="../$2";;
155 esac
156
157 # We do not want to overwrite a header file if it hasn't
158 # changed. This avoid useless recompilations. However the
159 # parser itself (the first file) should always be updated,
160 # because it is the destination of the .y.c rule in the
161 # Makefile. Divert the output of all other files to a temporary
162 # file so we can compare them to existing versions.
163 if test $first = no; then
164 realtarget="$target"
165 target="tmp-`echo $target | sed s/.*[\\/]//g`"
166 fi
167 # Edit out `#line' or `#' directives.
168 #
169 # We don't want the resulting debug information to point at
170 # an absolute srcdir; it is better for it to just mention the
171 # .y file with no path.
172 #
173 # We want to use the real output file name, not yy.lex.c for
174 # instance.
175 #
176 # We want the include guards to be adjusted too.
177 FROM=`echo "$from" | sed \
178 -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'\
179 -e 's/[^ABCDEFGHIJKLMNOPQRSTUVWXYZ]/_/g'`
180 TARGET=`echo "$2" | sed \
181 -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'\
182 -e 's/[^ABCDEFGHIJKLMNOPQRSTUVWXYZ]/_/g'`
183 prefix=`echo $input | sed \
184 -e 's,^.*/,,g' \
185 -e 's/_parse.[yl]$/_/g' \
186 -e 's/_tok.[yl]$/_/g'`
187
188 case $prefix in
189 *.y)
190 code_prefix="$(basename $prefix _gram.y)_yy";;
191 *.l)
192 code_prefix="$(basename $prefix _lex.l)_yy";;
193 *)
194 code_prefix="$prefix";;
195 esac
196 sed -e "/^#/!b" -e "s,$input_rx,," -e "s,$from,$2," \
197 -e "s,$FROM,$TARGET," "$from" | sed "s/yy/$code_prefix/g" > "$target" || ret=$?
198
199 # Check whether header files must be updated.
200 if test $first = no; then
201 if test -f "$realtarget" && cmp -s "$realtarget" "$target"; then
202 echo "$2" is unchanged
203 rm -f "$target"
204 else
205 echo updating "$2"
206 mv -f "$target" "$realtarget"
207 fi
208 fi
209 else
210 # A missing file is only an error for the first file. This
211 # is a blatant hack to let us support using "yacc -d". If -d
212 # is not specified, we don't want an error when the header
213 # file is "missing".
214 if test $first = yes; then
215 ret=1
216 fi
217 fi
218 shift
219 shift
220 first=no
221 done
222 else
223 ret=$?
224 fi
225
226 # Remove the directory.
227 cd ..
228 rm -rf $dirname
229
230 exit $ret
231
232 # Local Variables:
233 # mode: shell-script
234 # sh-indentation: 2
235 # eval: (add-hook 'write-file-hooks 'time-stamp)
236 # time-stamp-start: "scriptversion="
237 # time-stamp-format: "%:y-%02m-%02d.%02H"
238 # time-stamp-end: "$"
239 # End:
240