1bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev#! /bin/sh
2bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev# Wrapper for compilers which do not understand `-c -o'.
3bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
4bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishevscriptversion=2005-05-14.22
5bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
6bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev# Copyright (C) 1999, 2000, 2003, 2004, 2005 Free Software Foundation, Inc.
7bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev# Written by Tom Tromey <tromey@cygnus.com>.
8bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev#
9bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev# This program is free software; you can redistribute it and/or modify
10bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev# it under the terms of the GNU General Public License as published by
11bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev# the Free Software Foundation; either version 2, or (at your option)
12bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev# any later version.
13bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev#
14bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev# This program is distributed in the hope that it will be useful,
15bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev# but WITHOUT ANY WARRANTY; without even the implied warranty of
16bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev# GNU General Public License for more details.
18bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev#
19bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev# You should have received a copy of the GNU General Public License
20bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev# along with this program; if not, write to the Free Software
21bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
22bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
23bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev# As a special exception to the GNU General Public License, if you
24bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev# distribute this file as part of a program that contains a
25bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev# configuration script generated by Autoconf, you may include it under
26bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev# the same distribution terms that you use for the rest of that program.
27bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
28bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev# This file is maintained in Automake, please report
29bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev# bugs to <bug-automake@gnu.org> or send patches to
30bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev# <automake-patches@gnu.org>.
31bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
32bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishevcase $1 in
33bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev  '')
34bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev     echo "$0: No command.  Try \`$0 --help' for more information." 1>&2
35bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev     exit 1;
36bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev     ;;
37bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev  -h | --h*)
38bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev    cat <<\EOF
39bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor GoulishevUsage: compile [--help] [--version] PROGRAM [ARGS]
40bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
41bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor GoulishevWrapper for compilers which do not understand `-c -o'.
42bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor GoulishevRemove `-o dest.o' from ARGS, run PROGRAM with the remaining
43bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishevarguments, and rename the output as expected.
44bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
45bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor GoulishevIf you are trying to build a whole package this is not the
46bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishevright script to run: please start by reading the file `INSTALL'.
47bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
48bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor GoulishevReport bugs to <bug-automake@gnu.org>.
49bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor GoulishevEOF
50bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev    exit $?
51bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev    ;;
52bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev  -v | --v*)
53bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev    echo "compile $scriptversion"
54bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev    exit $?
55bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev    ;;
56bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishevesac
57bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
58bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishevofile=
59bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishevcfile=
60bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulisheveat=
61bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
62bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishevfor arg
63bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishevdo
64bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev  if test -n "$eat"; then
65bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev    eat=
66bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev  else
67bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev    case $1 in
68bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev      -o)
69bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	# configure might choose to run compile as `compile cc -o foo foo.c'.
70bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	# So we strip `-o arg' only if arg is an object.
71bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	eat=1
72bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	case $2 in
73bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	  *.o | *.obj)
74bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	    ofile=$2
75bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	    ;;
76bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	  *)
77bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	    set x "$@" -o "$2"
78bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	    shift
79bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	    ;;
80bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	esac
81bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	;;
82bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev      *.c)
83bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	cfile=$1
84bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	set x "$@" "$1"
85bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	shift
86bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	;;
87bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev      *)
88bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	set x "$@" "$1"
89bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	shift
90bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	;;
91bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev    esac
92bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev  fi
93bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev  shift
94bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishevdone
95bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
96bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishevif test -z "$ofile" || test -z "$cfile"; then
97bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev  # If no `-o' option was seen then we might have been invoked from a
98bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev  # pattern rule where we don't need one.  That is ok -- this is a
99bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev  # normal compilation that the losing compiler can handle.  If no
100bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev  # `.c' file was seen then we are probably linking.  That is also
101bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev  # ok.
102bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev  exec "$@"
103bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishevfi
104bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
105bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev# Name of file we expect compiler to create.
106bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishevcofile=`echo "$cfile" | sed -e 's|^.*/||' -e 's/\.c$/.o/'`
107bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
108bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev# Create the lock directory.
109bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev# Note: use `[/.-]' here to ensure that we don't use the same name
110bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev# that we are using for the .o file.  Also, base the name on the expected
111bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev# object file name, since that is what matters with a parallel build.
112bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishevlockdir=`echo "$cofile" | sed -e 's|[/.-]|_|g'`.d
113bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishevwhile true; do
114bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev  if mkdir "$lockdir" >/dev/null 2>&1; then
115bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev    break
116bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev  fi
117bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev  sleep 1
118bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishevdone
119bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev# FIXME: race condition here if user kills between mkdir and trap.
120bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishevtrap "rmdir '$lockdir'; exit 1" 1 2 15
121bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
122bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev# Run the compile.
123bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev"$@"
124bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishevret=$?
125bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
126bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishevif test -f "$cofile"; then
127bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev  mv "$cofile" "$ofile"
128bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishevelif test -f "${cofile}bj"; then
129bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev  mv "${cofile}bj" "$ofile"
130bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishevfi
131bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
132bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishevrmdir "$lockdir"
133bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishevexit $ret
134bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
135bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev# Local Variables:
136bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev# mode: shell-script
137bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev# sh-indentation: 2
138bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev# eval: (add-hook 'write-file-hooks 'time-stamp)
139bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev# time-stamp-start: "scriptversion="
140bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev# time-stamp-format: "%:y-%02m-%02d.%02H"
141bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev# time-stamp-end: "$"
142bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev# End:
143