xref: /freebsd/contrib/file/compile (revision 28a8b562974a1424f460cb17023c2106bd0c2e26)
128a8b562SDavid E. O'Brien#! /bin/sh
228a8b562SDavid E. O'Brien# Wrapper for compilers which do not understand `-c -o'.
328a8b562SDavid E. O'Brien
428a8b562SDavid E. O'Brienscriptversion=2005-05-14.22
528a8b562SDavid E. O'Brien
628a8b562SDavid E. O'Brien# Copyright (C) 1999, 2000, 2003, 2004, 2005 Free Software Foundation, Inc.
728a8b562SDavid E. O'Brien# Written by Tom Tromey <tromey@cygnus.com>.
828a8b562SDavid E. O'Brien#
928a8b562SDavid E. O'Brien# This program is free software; you can redistribute it and/or modify
1028a8b562SDavid E. O'Brien# it under the terms of the GNU General Public License as published by
1128a8b562SDavid E. O'Brien# the Free Software Foundation; either version 2, or (at your option)
1228a8b562SDavid E. O'Brien# any later version.
1328a8b562SDavid E. O'Brien#
1428a8b562SDavid E. O'Brien# This program is distributed in the hope that it will be useful,
1528a8b562SDavid E. O'Brien# but WITHOUT ANY WARRANTY; without even the implied warranty of
1628a8b562SDavid E. O'Brien# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1728a8b562SDavid E. O'Brien# GNU General Public License for more details.
1828a8b562SDavid E. O'Brien#
1928a8b562SDavid E. O'Brien# You should have received a copy of the GNU General Public License
2028a8b562SDavid E. O'Brien# along with this program; if not, write to the Free Software
2128a8b562SDavid E. O'Brien# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
2228a8b562SDavid E. O'Brien
2328a8b562SDavid E. O'Brien# As a special exception to the GNU General Public License, if you
2428a8b562SDavid E. O'Brien# distribute this file as part of a program that contains a
2528a8b562SDavid E. O'Brien# configuration script generated by Autoconf, you may include it under
2628a8b562SDavid E. O'Brien# the same distribution terms that you use for the rest of that program.
2728a8b562SDavid E. O'Brien
2828a8b562SDavid E. O'Brien# This file is maintained in Automake, please report
2928a8b562SDavid E. O'Brien# bugs to <bug-automake@gnu.org> or send patches to
3028a8b562SDavid E. O'Brien# <automake-patches@gnu.org>.
3128a8b562SDavid E. O'Brien
3228a8b562SDavid E. O'Briencase $1 in
3328a8b562SDavid E. O'Brien  '')
3428a8b562SDavid E. O'Brien     echo "$0: No command.  Try \`$0 --help' for more information." 1>&2
3528a8b562SDavid E. O'Brien     exit 1;
3628a8b562SDavid E. O'Brien     ;;
3728a8b562SDavid E. O'Brien  -h | --h*)
3828a8b562SDavid E. O'Brien    cat <<\EOF
3928a8b562SDavid E. O'BrienUsage: compile [--help] [--version] PROGRAM [ARGS]
4028a8b562SDavid E. O'Brien
4128a8b562SDavid E. O'BrienWrapper for compilers which do not understand `-c -o'.
4228a8b562SDavid E. O'BrienRemove `-o dest.o' from ARGS, run PROGRAM with the remaining
4328a8b562SDavid E. O'Brienarguments, and rename the output as expected.
4428a8b562SDavid E. O'Brien
4528a8b562SDavid E. O'BrienIf you are trying to build a whole package this is not the
4628a8b562SDavid E. O'Brienright script to run: please start by reading the file `INSTALL'.
4728a8b562SDavid E. O'Brien
4828a8b562SDavid E. O'BrienReport bugs to <bug-automake@gnu.org>.
4928a8b562SDavid E. O'BrienEOF
5028a8b562SDavid E. O'Brien    exit $?
5128a8b562SDavid E. O'Brien    ;;
5228a8b562SDavid E. O'Brien  -v | --v*)
5328a8b562SDavid E. O'Brien    echo "compile $scriptversion"
5428a8b562SDavid E. O'Brien    exit $?
5528a8b562SDavid E. O'Brien    ;;
5628a8b562SDavid E. O'Brienesac
5728a8b562SDavid E. O'Brien
5828a8b562SDavid E. O'Brienofile=
5928a8b562SDavid E. O'Briencfile=
6028a8b562SDavid E. O'Brieneat=
6128a8b562SDavid E. O'Brien
6228a8b562SDavid E. O'Brienfor arg
6328a8b562SDavid E. O'Briendo
6428a8b562SDavid E. O'Brien  if test -n "$eat"; then
6528a8b562SDavid E. O'Brien    eat=
6628a8b562SDavid E. O'Brien  else
6728a8b562SDavid E. O'Brien    case $1 in
6828a8b562SDavid E. O'Brien      -o)
6928a8b562SDavid E. O'Brien	# configure might choose to run compile as `compile cc -o foo foo.c'.
7028a8b562SDavid E. O'Brien	# So we strip `-o arg' only if arg is an object.
7128a8b562SDavid E. O'Brien	eat=1
7228a8b562SDavid E. O'Brien	case $2 in
7328a8b562SDavid E. O'Brien	  *.o | *.obj)
7428a8b562SDavid E. O'Brien	    ofile=$2
7528a8b562SDavid E. O'Brien	    ;;
7628a8b562SDavid E. O'Brien	  *)
7728a8b562SDavid E. O'Brien	    set x "$@" -o "$2"
7828a8b562SDavid E. O'Brien	    shift
7928a8b562SDavid E. O'Brien	    ;;
8028a8b562SDavid E. O'Brien	esac
8128a8b562SDavid E. O'Brien	;;
8228a8b562SDavid E. O'Brien      *.c)
8328a8b562SDavid E. O'Brien	cfile=$1
8428a8b562SDavid E. O'Brien	set x "$@" "$1"
8528a8b562SDavid E. O'Brien	shift
8628a8b562SDavid E. O'Brien	;;
8728a8b562SDavid E. O'Brien      *)
8828a8b562SDavid E. O'Brien	set x "$@" "$1"
8928a8b562SDavid E. O'Brien	shift
9028a8b562SDavid E. O'Brien	;;
9128a8b562SDavid E. O'Brien    esac
9228a8b562SDavid E. O'Brien  fi
9328a8b562SDavid E. O'Brien  shift
9428a8b562SDavid E. O'Briendone
9528a8b562SDavid E. O'Brien
9628a8b562SDavid E. O'Brienif test -z "$ofile" || test -z "$cfile"; then
9728a8b562SDavid E. O'Brien  # If no `-o' option was seen then we might have been invoked from a
9828a8b562SDavid E. O'Brien  # pattern rule where we don't need one.  That is ok -- this is a
9928a8b562SDavid E. O'Brien  # normal compilation that the losing compiler can handle.  If no
10028a8b562SDavid E. O'Brien  # `.c' file was seen then we are probably linking.  That is also
10128a8b562SDavid E. O'Brien  # ok.
10228a8b562SDavid E. O'Brien  exec "$@"
10328a8b562SDavid E. O'Brienfi
10428a8b562SDavid E. O'Brien
10528a8b562SDavid E. O'Brien# Name of file we expect compiler to create.
10628a8b562SDavid E. O'Briencofile=`echo "$cfile" | sed -e 's|^.*/||' -e 's/\.c$/.o/'`
10728a8b562SDavid E. O'Brien
10828a8b562SDavid E. O'Brien# Create the lock directory.
10928a8b562SDavid E. O'Brien# Note: use `[/.-]' here to ensure that we don't use the same name
11028a8b562SDavid E. O'Brien# that we are using for the .o file.  Also, base the name on the expected
11128a8b562SDavid E. O'Brien# object file name, since that is what matters with a parallel build.
11228a8b562SDavid E. O'Brienlockdir=`echo "$cofile" | sed -e 's|[/.-]|_|g'`.d
11328a8b562SDavid E. O'Brienwhile true; do
11428a8b562SDavid E. O'Brien  if mkdir "$lockdir" >/dev/null 2>&1; then
11528a8b562SDavid E. O'Brien    break
11628a8b562SDavid E. O'Brien  fi
11728a8b562SDavid E. O'Brien  sleep 1
11828a8b562SDavid E. O'Briendone
11928a8b562SDavid E. O'Brien# FIXME: race condition here if user kills between mkdir and trap.
12028a8b562SDavid E. O'Brientrap "rmdir '$lockdir'; exit 1" 1 2 15
12128a8b562SDavid E. O'Brien
12228a8b562SDavid E. O'Brien# Run the compile.
12328a8b562SDavid E. O'Brien"$@"
12428a8b562SDavid E. O'Brienret=$?
12528a8b562SDavid E. O'Brien
12628a8b562SDavid E. O'Brienif test -f "$cofile"; then
12728a8b562SDavid E. O'Brien  mv "$cofile" "$ofile"
12828a8b562SDavid E. O'Brienelif test -f "${cofile}bj"; then
12928a8b562SDavid E. O'Brien  mv "${cofile}bj" "$ofile"
13028a8b562SDavid E. O'Brienfi
13128a8b562SDavid E. O'Brien
13228a8b562SDavid E. O'Brienrmdir "$lockdir"
13328a8b562SDavid E. O'Brienexit $ret
13428a8b562SDavid E. O'Brien
13528a8b562SDavid E. O'Brien# Local Variables:
13628a8b562SDavid E. O'Brien# mode: shell-script
13728a8b562SDavid E. O'Brien# sh-indentation: 2
13828a8b562SDavid E. O'Brien# eval: (add-hook 'write-file-hooks 'time-stamp)
13928a8b562SDavid E. O'Brien# time-stamp-start: "scriptversion="
14028a8b562SDavid E. O'Brien# time-stamp-format: "%:y-%02m-%02d.%02H"
14128a8b562SDavid E. O'Brien# time-stamp-end: "$"
14228a8b562SDavid E. O'Brien# End:
143