|
|
1.1 root 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 <[email protected]>.
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 <[email protected]> or send patches to
33: # <[email protected]>.
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 <[email protected]>.
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:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.