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