ylwrap revision 3e747e6d
13e747e6dSmrg#! /bin/sh 23e747e6dSmrg# ylwrap - wrapper for lex/yacc invocations. 33e747e6dSmrg 43e747e6dSmrgscriptversion=2007-11-22.22 53e747e6dSmrg 63e747e6dSmrg# Copyright (C) 1996, 1997, 1998, 1999, 2001, 2002, 2003, 2004, 2005, 73e747e6dSmrg# 2007 Free Software Foundation, Inc. 83e747e6dSmrg# 93e747e6dSmrg# Written by Tom Tromey <tromey@cygnus.com>. 103e747e6dSmrg# 113e747e6dSmrg# This program is free software; you can redistribute it and/or modify 123e747e6dSmrg# it under the terms of the GNU General Public License as published by 133e747e6dSmrg# the Free Software Foundation; either version 2, or (at your option) 143e747e6dSmrg# any later version. 153e747e6dSmrg# 163e747e6dSmrg# This program is distributed in the hope that it will be useful, 173e747e6dSmrg# but WITHOUT ANY WARRANTY; without even the implied warranty of 183e747e6dSmrg# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 193e747e6dSmrg# GNU General Public License for more details. 203e747e6dSmrg# 213e747e6dSmrg# You should have received a copy of the GNU General Public License 223e747e6dSmrg# along with this program; if not, write to the Free Software 233e747e6dSmrg# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 243e747e6dSmrg# 02110-1301, USA. 253e747e6dSmrg 263e747e6dSmrg# As a special exception to the GNU General Public License, if you 273e747e6dSmrg# distribute this file as part of a program that contains a 283e747e6dSmrg# configuration script generated by Autoconf, you may include it under 293e747e6dSmrg# the same distribution terms that you use for the rest of that program. 303e747e6dSmrg 313e747e6dSmrg# This file is maintained in Automake, please report 323e747e6dSmrg# bugs to <bug-automake@gnu.org> or send patches to 333e747e6dSmrg# <automake-patches@gnu.org>. 343e747e6dSmrg 353e747e6dSmrgcase "$1" in 363e747e6dSmrg '') 373e747e6dSmrg echo "$0: No files given. Try \`$0 --help' for more information." 1>&2 383e747e6dSmrg exit 1 393e747e6dSmrg ;; 403e747e6dSmrg --basedir) 413e747e6dSmrg basedir=$2 423e747e6dSmrg shift 2 433e747e6dSmrg ;; 443e747e6dSmrg -h|--h*) 453e747e6dSmrg cat <<\EOF 463e747e6dSmrgUsage: ylwrap [--help|--version] INPUT [OUTPUT DESIRED]... -- PROGRAM [ARGS]... 473e747e6dSmrg 483e747e6dSmrgWrapper for lex/yacc invocations, renaming files as desired. 493e747e6dSmrg 503e747e6dSmrg INPUT is the input file 513e747e6dSmrg OUTPUT is one file PROG generates 523e747e6dSmrg DESIRED is the file we actually want instead of OUTPUT 533e747e6dSmrg PROGRAM is program to run 543e747e6dSmrg ARGS are passed to PROG 553e747e6dSmrg 563e747e6dSmrgAny number of OUTPUT,DESIRED pairs may be used. 573e747e6dSmrg 583e747e6dSmrgReport bugs to <bug-automake@gnu.org>. 593e747e6dSmrgEOF 603e747e6dSmrg exit $? 613e747e6dSmrg ;; 623e747e6dSmrg -v|--v*) 633e747e6dSmrg echo "ylwrap $scriptversion" 643e747e6dSmrg exit $? 653e747e6dSmrg ;; 663e747e6dSmrgesac 673e747e6dSmrg 683e747e6dSmrg 693e747e6dSmrg# The input. 703e747e6dSmrginput="$1" 713e747e6dSmrgshift 723e747e6dSmrgcase "$input" in 733e747e6dSmrg [\\/]* | ?:[\\/]*) 743e747e6dSmrg # Absolute path; do nothing. 753e747e6dSmrg ;; 763e747e6dSmrg *) 773e747e6dSmrg # Relative path. Make it absolute. 783e747e6dSmrg input="`pwd`/$input" 793e747e6dSmrg ;; 803e747e6dSmrgesac 813e747e6dSmrg 823e747e6dSmrgpairlist= 833e747e6dSmrgwhile test "$#" -ne 0; do 843e747e6dSmrg if test "$1" = "--"; then 853e747e6dSmrg shift 863e747e6dSmrg break 873e747e6dSmrg fi 883e747e6dSmrg pairlist="$pairlist $1" 893e747e6dSmrg shift 903e747e6dSmrgdone 913e747e6dSmrg 923e747e6dSmrg# The program to run. 933e747e6dSmrgprog="$1" 943e747e6dSmrgshift 953e747e6dSmrg# Make any relative path in $prog absolute. 963e747e6dSmrgcase "$prog" in 973e747e6dSmrg [\\/]* | ?:[\\/]*) ;; 983e747e6dSmrg *[\\/]*) prog="`pwd`/$prog" ;; 993e747e6dSmrgesac 1003e747e6dSmrg 1013e747e6dSmrg# FIXME: add hostname here for parallel makes that run commands on 1023e747e6dSmrg# other machines. But that might take us over the 14-char limit. 1033e747e6dSmrgdirname=ylwrap$$ 1043e747e6dSmrgtrap "cd '`pwd`'; rm -rf $dirname > /dev/null 2>&1" 1 2 3 15 1053e747e6dSmrgmkdir $dirname || exit 1 1063e747e6dSmrg 1073e747e6dSmrgcd $dirname 1083e747e6dSmrg 1093e747e6dSmrgcase $# in 1103e747e6dSmrg 0) "$prog" "$input" ;; 1113e747e6dSmrg *) "$prog" "$@" "$input" ;; 1123e747e6dSmrgesac 1133e747e6dSmrgret=$? 1143e747e6dSmrg 1153e747e6dSmrgif test $ret -eq 0; then 1163e747e6dSmrg set X $pairlist 1173e747e6dSmrg shift 1183e747e6dSmrg first=yes 1193e747e6dSmrg # Since DOS filename conventions don't allow two dots, 1203e747e6dSmrg # the DOS version of Bison writes out y_tab.c instead of y.tab.c 1213e747e6dSmrg # and y_tab.h instead of y.tab.h. Test to see if this is the case. 1223e747e6dSmrg y_tab_nodot="no" 1233e747e6dSmrg if test -f y_tab.c || test -f y_tab.h; then 1243e747e6dSmrg y_tab_nodot="yes" 1253e747e6dSmrg fi 1263e747e6dSmrg 1273e747e6dSmrg # The directory holding the input. 1283e747e6dSmrg input_dir=`echo "$input" | sed -e 's,\([\\/]\)[^\\/]*$,\1,'` 1293e747e6dSmrg # Quote $INPUT_DIR so we can use it in a regexp. 1303e747e6dSmrg # FIXME: really we should care about more than `.' and `\'. 1313e747e6dSmrg input_rx=`echo "$input_dir" | sed 's,\\\\,\\\\\\\\,g;s,\\.,\\\\.,g'` 1323e747e6dSmrg 1333e747e6dSmrg while test "$#" -ne 0; do 1343e747e6dSmrg from="$1" 1353e747e6dSmrg # Handle y_tab.c and y_tab.h output by DOS 1363e747e6dSmrg if test $y_tab_nodot = "yes"; then 1373e747e6dSmrg if test $from = "y.tab.c"; then 1383e747e6dSmrg from="y_tab.c" 1393e747e6dSmrg else 1403e747e6dSmrg if test $from = "y.tab.h"; then 1413e747e6dSmrg from="y_tab.h" 1423e747e6dSmrg fi 1433e747e6dSmrg fi 1443e747e6dSmrg fi 1453e747e6dSmrg if test -f "$from"; then 1463e747e6dSmrg # If $2 is an absolute path name, then just use that, 1473e747e6dSmrg # otherwise prepend `../'. 1483e747e6dSmrg case "$2" in 1493e747e6dSmrg [\\/]* | ?:[\\/]*) target="$2";; 1503e747e6dSmrg *) target="../$2";; 1513e747e6dSmrg esac 1523e747e6dSmrg 1533e747e6dSmrg # We do not want to overwrite a header file if it hasn't 1543e747e6dSmrg # changed. This avoid useless recompilations. However the 1553e747e6dSmrg # parser itself (the first file) should always be updated, 1563e747e6dSmrg # because it is the destination of the .y.c rule in the 1573e747e6dSmrg # Makefile. Divert the output of all other files to a temporary 1583e747e6dSmrg # file so we can compare them to existing versions. 1593e747e6dSmrg if test $first = no; then 1603e747e6dSmrg realtarget="$target" 1613e747e6dSmrg target="tmp-`echo $target | sed s/.*[\\/]//g`" 1623e747e6dSmrg fi 1633e747e6dSmrg # Edit out `#line' or `#' directives. 1643e747e6dSmrg # 1653e747e6dSmrg # We don't want the resulting debug information to point at 1663e747e6dSmrg # an absolute srcdir; it is better for it to just mention the 1673e747e6dSmrg # .y file with no path. 1683e747e6dSmrg # 1693e747e6dSmrg # We want to use the real output file name, not yy.lex.c for 1703e747e6dSmrg # instance. 1713e747e6dSmrg # 1723e747e6dSmrg # We want the include guards to be adjusted too. 1733e747e6dSmrg FROM=`echo "$from" | sed \ 1743e747e6dSmrg -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'\ 1753e747e6dSmrg -e 's/[^ABCDEFGHIJKLMNOPQRSTUVWXYZ]/_/g'` 1763e747e6dSmrg TARGET=`echo "$2" | sed \ 1773e747e6dSmrg -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'\ 1783e747e6dSmrg -e 's/[^ABCDEFGHIJKLMNOPQRSTUVWXYZ]/_/g'` 1793e747e6dSmrg 1803e747e6dSmrg sed -e "/^#/!b" -e "s,$input_rx,," -e "s,$from,$2," \ 1813e747e6dSmrg -e "s,$FROM,$TARGET," "$from" >"$target" || ret=$? 1823e747e6dSmrg 1833e747e6dSmrg # Check whether header files must be updated. 1843e747e6dSmrg if test $first = no; then 1853e747e6dSmrg if test -f "$realtarget" && cmp -s "$realtarget" "$target"; then 1863e747e6dSmrg echo "$2" is unchanged 1873e747e6dSmrg rm -f "$target" 1883e747e6dSmrg else 1893e747e6dSmrg echo updating "$2" 1903e747e6dSmrg mv -f "$target" "$realtarget" 1913e747e6dSmrg fi 1923e747e6dSmrg fi 1933e747e6dSmrg else 1943e747e6dSmrg # A missing file is only an error for the first file. This 1953e747e6dSmrg # is a blatant hack to let us support using "yacc -d". If -d 1963e747e6dSmrg # is not specified, we don't want an error when the header 1973e747e6dSmrg # file is "missing". 1983e747e6dSmrg if test $first = yes; then 1993e747e6dSmrg ret=1 2003e747e6dSmrg fi 2013e747e6dSmrg fi 2023e747e6dSmrg shift 2033e747e6dSmrg shift 2043e747e6dSmrg first=no 2053e747e6dSmrg done 2063e747e6dSmrgelse 2073e747e6dSmrg ret=$? 2083e747e6dSmrgfi 2093e747e6dSmrg 2103e747e6dSmrg# Remove the directory. 2113e747e6dSmrgcd .. 2123e747e6dSmrgrm -rf $dirname 2133e747e6dSmrg 2143e747e6dSmrgexit $ret 2153e747e6dSmrg 2163e747e6dSmrg# Local Variables: 2173e747e6dSmrg# mode: shell-script 2183e747e6dSmrg# sh-indentation: 2 2193e747e6dSmrg# eval: (add-hook 'write-file-hooks 'time-stamp) 2203e747e6dSmrg# time-stamp-start: "scriptversion=" 2213e747e6dSmrg# time-stamp-format: "%:y-%02m-%02d.%02H" 2223e747e6dSmrg# time-stamp-end: "$" 2233e747e6dSmrg# End: 224