18e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#! /bin/sh
28e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# Wrapper for compilers which do not understand `-c -o'.
38e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
48e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsscriptversion=2005-05-14.22
58e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
68e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# Copyright (C) 1999, 2000, 2003, 2004, 2005 Free Software Foundation, Inc.
78e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# Written by Tom Tromey <tromey@cygnus.com>.
88e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#
98e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# This program is free software; you can redistribute it and/or modify
108e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# it under the terms of the GNU General Public License as published by
118e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# the Free Software Foundation; either version 2, or (at your option)
128e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# any later version.
138e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#
148e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# This program is distributed in the hope that it will be useful,
158e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# but WITHOUT ANY WARRANTY; without even the implied warranty of
168e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
178e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# GNU General Public License for more details.
188e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#
198e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# You should have received a copy of the GNU General Public License
208e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# along with this program; if not, write to the Free Software
218e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
228e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
238e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# As a special exception to the GNU General Public License, if you
248e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# distribute this file as part of a program that contains a
258e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# configuration script generated by Autoconf, you may include it under
268e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# the same distribution terms that you use for the rest of that program.
278e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
288e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# This file is maintained in Automake, please report
298e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# bugs to <bug-automake@gnu.org> or send patches to
308e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# <automake-patches@gnu.org>.
318e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
328e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelscase $1 in
338e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  '')
348e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels     echo "$0: No command.  Try \`$0 --help' for more information." 1>&2
358e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels     exit 1;
368e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels     ;;
378e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  -h | --h*)
388e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    cat <<\EOF
398e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas EckelsUsage: compile [--help] [--version] PROGRAM [ARGS]
408e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
418e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas EckelsWrapper for compilers which do not understand `-c -o'.
428e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas EckelsRemove `-o dest.o' from ARGS, run PROGRAM with the remaining
438e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsarguments, and rename the output as expected.
448e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
458e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas EckelsIf you are trying to build a whole package this is not the
468e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsright script to run: please start by reading the file `INSTALL'.
478e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
488e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas EckelsReport bugs to <bug-automake@gnu.org>.
498e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas EckelsEOF
508e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    exit $?
518e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    ;;
528e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  -v | --v*)
538e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    echo "compile $scriptversion"
548e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    exit $?
558e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    ;;
568e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsesac
578e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
588e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsofile=
598e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelscfile=
608e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelseat=
618e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
628e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsfor arg
638e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsdo
648e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  if test -n "$eat"; then
658e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    eat=
668e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  else
678e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    case $1 in
688e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      -o)
698e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels	# configure might choose to run compile as `compile cc -o foo foo.c'.
708e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels	# So we strip `-o arg' only if arg is an object.
718e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels	eat=1
728e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels	case $2 in
738e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels	  *.o | *.obj)
748e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels	    ofile=$2
758e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels	    ;;
768e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels	  *)
778e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels	    set x "$@" -o "$2"
788e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels	    shift
798e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels	    ;;
808e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels	esac
818e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels	;;
828e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      *.c)
838e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels	cfile=$1
848e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels	set x "$@" "$1"
858e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels	shift
868e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels	;;
878e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      *)
888e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels	set x "$@" "$1"
898e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels	shift
908e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels	;;
918e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    esac
928e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  fi
938e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  shift
948e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsdone
958e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
968e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsif test -z "$ofile" || test -z "$cfile"; then
978e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  # If no `-o' option was seen then we might have been invoked from a
988e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  # pattern rule where we don't need one.  That is ok -- this is a
998e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  # normal compilation that the losing compiler can handle.  If no
1008e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  # `.c' file was seen then we are probably linking.  That is also
1018e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  # ok.
1028e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  exec "$@"
1038e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsfi
1048e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1058e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# Name of file we expect compiler to create.
1068e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelscofile=`echo "$cfile" | sed -e 's|^.*/||' -e 's/\.c$/.o/'`
1078e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1088e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# Create the lock directory.
1098e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# Note: use `[/.-]' here to ensure that we don't use the same name
1108e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# that we are using for the .o file.  Also, base the name on the expected
1118e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# object file name, since that is what matters with a parallel build.
1128e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelslockdir=`echo "$cofile" | sed -e 's|[/.-]|_|g'`.d
1138e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelswhile true; do
1148e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  if mkdir "$lockdir" >/dev/null 2>&1; then
1158e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    break
1168e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  fi
1178e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  sleep 1
1188e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsdone
1198e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# FIXME: race condition here if user kills between mkdir and trap.
1208e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelstrap "rmdir '$lockdir'; exit 1" 1 2 15
1218e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1228e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# Run the compile.
1238e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels"$@"
1248e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsret=$?
1258e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1268e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsif test -f "$cofile"; then
1278e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  mv "$cofile" "$ofile"
1288e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelselif test -f "${cofile}bj"; then
1298e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  mv "${cofile}bj" "$ofile"
1308e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsfi
1318e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1328e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsrmdir "$lockdir"
1338e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsexit $ret
1348e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1358e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# Local Variables:
1368e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# mode: shell-script
1378e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# sh-indentation: 2
1388e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# eval: (add-hook 'write-file-hooks 'time-stamp)
1398e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# time-stamp-start: "scriptversion="
1408e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# time-stamp-format: "%:y-%02m-%02d.%02H"
1418e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# time-stamp-end: "$"
1428e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# End:
143