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