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