Home | History | Annotate | Download | only in cpp
      1 #! /bin/sh
      2 
      3 # Wrapper for compilers which do not understand `-c -o'.
      4 
      5 # Copyright 1999, 2000 Free Software Foundation, Inc.
      6 # Written by Tom Tromey <tromey (at] cygnus.com>.
      7 #
      8 # This program is free software; you can redistribute it and/or modify
      9 # it under the terms of the GNU General Public License as published by
     10 # the Free Software Foundation; either version 2, or (at your option)
     11 # any later version.
     12 #
     13 # This program is distributed in the hope that it will be useful,
     14 # but WITHOUT ANY WARRANTY; without even the implied warranty of
     15 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     16 # GNU General Public License for more details.
     17 #
     18 # You should have received a copy of the GNU General Public License
     19 # along with this program; if not, write to the Free Software
     20 # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
     21 
     22 # As a special exception to the GNU General Public License, if you
     23 # distribute this file as part of a program that contains a
     24 # configuration script generated by Autoconf, you may include it under
     25 # the same distribution terms that you use for the rest of that program.
     26 
     27 # Usage:
     28 # compile PROGRAM [ARGS]...
     29 # `-o FOO.o' is removed from the args passed to the actual compile.
     30 
     31 prog=$1
     32 shift
     33 
     34 ofile=
     35 cfile=
     36 args=
     37 while test $# -gt 0; do
     38    case "$1" in
     39     -o)
     40        # configure might choose to run compile as `compile cc -o foo foo.c'.
     41        # So we do something ugly here.
     42        ofile=$2
     43        shift
     44        case "$ofile" in
     45 	*.o | *.obj)
     46 	   ;;
     47 	*)
     48 	   args="$args -o $ofile"
     49 	   ofile=
     50 	   ;;
     51        esac
     52        ;;
     53     *.c)
     54        cfile=$1
     55        args="$args $1"
     56        ;;
     57     *)
     58        args="$args $1"
     59        ;;
     60    esac
     61    shift
     62 done
     63 
     64 if test -z "$ofile" || test -z "$cfile"; then
     65    # If no `-o' option was seen then we might have been invoked from a
     66    # pattern rule where we don't need one.  That is ok -- this is a
     67    # normal compilation that the losing compiler can handle.  If no
     68    # `.c' file was seen then we are probably linking.  That is also
     69    # ok.
     70    exec "$prog" $args
     71 fi
     72 
     73 # Name of file we expect compiler to create.
     74 cofile=`echo $cfile | sed -e 's|^.*/||' -e 's/\.c$/.o/'`
     75 
     76 # Create the lock directory.
     77 # Note: use `[/.-]' here to ensure that we don't use the same name
     78 # that we are using for the .o file.  Also, base the name on the expected
     79 # object file name, since that is what matters with a parallel build.
     80 lockdir=`echo $cofile | sed -e 's|[/.-]|_|g'`.d
     81 while true; do
     82    if mkdir $lockdir > /dev/null 2>&1; then
     83       break
     84    fi
     85    sleep 1
     86 done
     87 # FIXME: race condition here if user kills between mkdir and trap.
     88 trap "rmdir $lockdir; exit 1" 1 2 15
     89 
     90 # Run the compile.
     91 "$prog" $args
     92 status=$?
     93 
     94 if test -f "$cofile"; then
     95    mv "$cofile" "$ofile"
     96 fi
     97 
     98 rmdir $lockdir
     99 exit $status
    100