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