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