197ee6427Smrg#! /bin/sh
297ee6427Smrg# Wrapper for compilers which do not understand '-c -o'.
397ee6427Smrg
497ee6427Smrgscriptversion=2012-10-14.11; # UTC
597ee6427Smrg
697ee6427Smrg# Copyright (C) 1999-2014 Free Software Foundation, Inc.
797ee6427Smrg# Written by Tom Tromey <tromey@cygnus.com>.
897ee6427Smrg#
997ee6427Smrg# This program is free software; you can redistribute it and/or modify
1097ee6427Smrg# it under the terms of the GNU General Public License as published by
1197ee6427Smrg# the Free Software Foundation; either version 2, or (at your option)
1297ee6427Smrg# any later version.
1397ee6427Smrg#
1497ee6427Smrg# This program is distributed in the hope that it will be useful,
1597ee6427Smrg# but WITHOUT ANY WARRANTY; without even the implied warranty of
1697ee6427Smrg# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1797ee6427Smrg# GNU General Public License for more details.
1897ee6427Smrg#
1997ee6427Smrg# You should have received a copy of the GNU General Public License
2097ee6427Smrg# along with this program.  If not, see <http://www.gnu.org/licenses/>.
2197ee6427Smrg
2297ee6427Smrg# As a special exception to the GNU General Public License, if you
2397ee6427Smrg# distribute this file as part of a program that contains a
2497ee6427Smrg# configuration script generated by Autoconf, you may include it under
2597ee6427Smrg# the same distribution terms that you use for the rest of that program.
2697ee6427Smrg
2797ee6427Smrg# This file is maintained in Automake, please report
2897ee6427Smrg# bugs to <bug-automake@gnu.org> or send patches to
2997ee6427Smrg# <automake-patches@gnu.org>.
3097ee6427Smrg
3197ee6427Smrgnl='
3297ee6427Smrg'
3397ee6427Smrg
3497ee6427Smrg# We need space, tab and new line, in precisely that order.  Quoting is
3597ee6427Smrg# there to prevent tools from complaining about whitespace usage.
3697ee6427SmrgIFS=" ""	$nl"
3797ee6427Smrg
3897ee6427Smrgfile_conv=
3997ee6427Smrg
4097ee6427Smrg# func_file_conv build_file lazy
4197ee6427Smrg# Convert a $build file to $host form and store it in $file
4297ee6427Smrg# Currently only supports Windows hosts. If the determined conversion
4397ee6427Smrg# type is listed in (the comma separated) LAZY, no conversion will
4497ee6427Smrg# take place.
4597ee6427Smrgfunc_file_conv ()
4697ee6427Smrg{
4797ee6427Smrg  file=$1
4897ee6427Smrg  case $file in
4997ee6427Smrg    / | /[!/]*) # absolute file, and not a UNC file
5097ee6427Smrg      if test -z "$file_conv"; then
5197ee6427Smrg	# lazily determine how to convert abs files
5297ee6427Smrg	case `uname -s` in
5397ee6427Smrg	  MINGW*)
5497ee6427Smrg	    file_conv=mingw
5597ee6427Smrg	    ;;
5697ee6427Smrg	  CYGWIN*)
5797ee6427Smrg	    file_conv=cygwin
5897ee6427Smrg	    ;;
5997ee6427Smrg	  *)
6097ee6427Smrg	    file_conv=wine
6197ee6427Smrg	    ;;
6297ee6427Smrg	esac
6397ee6427Smrg      fi
6497ee6427Smrg      case $file_conv/,$2, in
6597ee6427Smrg	*,$file_conv,*)
6697ee6427Smrg	  ;;
6797ee6427Smrg	mingw/*)
6897ee6427Smrg	  file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'`
6997ee6427Smrg	  ;;
7097ee6427Smrg	cygwin/*)
7197ee6427Smrg	  file=`cygpath -m "$file" || echo "$file"`
7297ee6427Smrg	  ;;
7397ee6427Smrg	wine/*)
7497ee6427Smrg	  file=`winepath -w "$file" || echo "$file"`
7597ee6427Smrg	  ;;
7697ee6427Smrg      esac
7797ee6427Smrg      ;;
7897ee6427Smrg  esac
7997ee6427Smrg}
8097ee6427Smrg
8197ee6427Smrg# func_cl_dashL linkdir
8297ee6427Smrg# Make cl look for libraries in LINKDIR
8397ee6427Smrgfunc_cl_dashL ()
8497ee6427Smrg{
8597ee6427Smrg  func_file_conv "$1"
8697ee6427Smrg  if test -z "$lib_path"; then
8797ee6427Smrg    lib_path=$file
8897ee6427Smrg  else
8997ee6427Smrg    lib_path="$lib_path;$file"
9097ee6427Smrg  fi
9197ee6427Smrg  linker_opts="$linker_opts -LIBPATH:$file"
9297ee6427Smrg}
9397ee6427Smrg
9497ee6427Smrg# func_cl_dashl library
9597ee6427Smrg# Do a library search-path lookup for cl
9697ee6427Smrgfunc_cl_dashl ()
9797ee6427Smrg{
9897ee6427Smrg  lib=$1
9997ee6427Smrg  found=no
10097ee6427Smrg  save_IFS=$IFS
10197ee6427Smrg  IFS=';'
10297ee6427Smrg  for dir in $lib_path $LIB
10397ee6427Smrg  do
10497ee6427Smrg    IFS=$save_IFS
10597ee6427Smrg    if $shared && test -f "$dir/$lib.dll.lib"; then
10697ee6427Smrg      found=yes
10797ee6427Smrg      lib=$dir/$lib.dll.lib
10897ee6427Smrg      break
10997ee6427Smrg    fi
11097ee6427Smrg    if test -f "$dir/$lib.lib"; then
11197ee6427Smrg      found=yes
11297ee6427Smrg      lib=$dir/$lib.lib
11397ee6427Smrg      break
11497ee6427Smrg    fi
11597ee6427Smrg    if test -f "$dir/lib$lib.a"; then
11697ee6427Smrg      found=yes
11797ee6427Smrg      lib=$dir/lib$lib.a
11897ee6427Smrg      break
11997ee6427Smrg    fi
12097ee6427Smrg  done
12197ee6427Smrg  IFS=$save_IFS
12297ee6427Smrg
12397ee6427Smrg  if test "$found" != yes; then
12497ee6427Smrg    lib=$lib.lib
12597ee6427Smrg  fi
12697ee6427Smrg}
12797ee6427Smrg
12897ee6427Smrg# func_cl_wrapper cl arg...
12997ee6427Smrg# Adjust compile command to suit cl
13097ee6427Smrgfunc_cl_wrapper ()
13197ee6427Smrg{
13297ee6427Smrg  # Assume a capable shell
13397ee6427Smrg  lib_path=
13497ee6427Smrg  shared=:
13597ee6427Smrg  linker_opts=
13697ee6427Smrg  for arg
13797ee6427Smrg  do
13897ee6427Smrg    if test -n "$eat"; then
13997ee6427Smrg      eat=
14097ee6427Smrg    else
14197ee6427Smrg      case $1 in
14297ee6427Smrg	-o)
14397ee6427Smrg	  # configure might choose to run compile as 'compile cc -o foo foo.c'.
14497ee6427Smrg	  eat=1
14597ee6427Smrg	  case $2 in
14697ee6427Smrg	    *.o | *.[oO][bB][jJ])
14797ee6427Smrg	      func_file_conv "$2"
14897ee6427Smrg	      set x "$@" -Fo"$file"
14997ee6427Smrg	      shift
15097ee6427Smrg	      ;;
15197ee6427Smrg	    *)
15297ee6427Smrg	      func_file_conv "$2"
15397ee6427Smrg	      set x "$@" -Fe"$file"
15497ee6427Smrg	      shift
15597ee6427Smrg	      ;;
15697ee6427Smrg	  esac
15797ee6427Smrg	  ;;
15897ee6427Smrg	-I)
15997ee6427Smrg	  eat=1
16097ee6427Smrg	  func_file_conv "$2" mingw
16197ee6427Smrg	  set x "$@" -I"$file"
16297ee6427Smrg	  shift
16397ee6427Smrg	  ;;
16497ee6427Smrg	-I*)
16597ee6427Smrg	  func_file_conv "${1#-I}" mingw
16697ee6427Smrg	  set x "$@" -I"$file"
16797ee6427Smrg	  shift
16897ee6427Smrg	  ;;
16997ee6427Smrg	-l)
17097ee6427Smrg	  eat=1
17197ee6427Smrg	  func_cl_dashl "$2"
17297ee6427Smrg	  set x "$@" "$lib"
17397ee6427Smrg	  shift
17497ee6427Smrg	  ;;
17597ee6427Smrg	-l*)
17697ee6427Smrg	  func_cl_dashl "${1#-l}"
17797ee6427Smrg	  set x "$@" "$lib"
17897ee6427Smrg	  shift
17997ee6427Smrg	  ;;
18097ee6427Smrg	-L)
18197ee6427Smrg	  eat=1
18297ee6427Smrg	  func_cl_dashL "$2"
18397ee6427Smrg	  ;;
18497ee6427Smrg	-L*)
18597ee6427Smrg	  func_cl_dashL "${1#-L}"
18697ee6427Smrg	  ;;
18797ee6427Smrg	-static)
18897ee6427Smrg	  shared=false
18997ee6427Smrg	  ;;
19097ee6427Smrg	-Wl,*)
19197ee6427Smrg	  arg=${1#-Wl,}
19297ee6427Smrg	  save_ifs="$IFS"; IFS=','
19397ee6427Smrg	  for flag in $arg; do
19497ee6427Smrg	    IFS="$save_ifs"
19597ee6427Smrg	    linker_opts="$linker_opts $flag"
19697ee6427Smrg	  done
19797ee6427Smrg	  IFS="$save_ifs"
19897ee6427Smrg	  ;;
19997ee6427Smrg	-Xlinker)
20097ee6427Smrg	  eat=1
20197ee6427Smrg	  linker_opts="$linker_opts $2"
20297ee6427Smrg	  ;;
20397ee6427Smrg	-*)
20497ee6427Smrg	  set x "$@" "$1"
20597ee6427Smrg	  shift
20697ee6427Smrg	  ;;
20797ee6427Smrg	*.cc | *.CC | *.cxx | *.CXX | *.[cC]++)
20897ee6427Smrg	  func_file_conv "$1"
20997ee6427Smrg	  set x "$@" -Tp"$file"
21097ee6427Smrg	  shift
21197ee6427Smrg	  ;;
21297ee6427Smrg	*.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO])
21397ee6427Smrg	  func_file_conv "$1" mingw
21497ee6427Smrg	  set x "$@" "$file"
21597ee6427Smrg	  shift
21697ee6427Smrg	  ;;
21797ee6427Smrg	*)
21897ee6427Smrg	  set x "$@" "$1"
21997ee6427Smrg	  shift
22097ee6427Smrg	  ;;
22197ee6427Smrg      esac
22297ee6427Smrg    fi
22397ee6427Smrg    shift
22497ee6427Smrg  done
22597ee6427Smrg  if test -n "$linker_opts"; then
22697ee6427Smrg    linker_opts="-link$linker_opts"
22797ee6427Smrg  fi
22897ee6427Smrg  exec "$@" $linker_opts
22997ee6427Smrg  exit 1
23097ee6427Smrg}
23197ee6427Smrg
23297ee6427Smrgeat=
23397ee6427Smrg
23497ee6427Smrgcase $1 in
23597ee6427Smrg  '')
23697ee6427Smrg     echo "$0: No command.  Try '$0 --help' for more information." 1>&2
23797ee6427Smrg     exit 1;
23897ee6427Smrg     ;;
23997ee6427Smrg  -h | --h*)
24097ee6427Smrg    cat <<\EOF
24197ee6427SmrgUsage: compile [--help] [--version] PROGRAM [ARGS]
24297ee6427Smrg
24397ee6427SmrgWrapper for compilers which do not understand '-c -o'.
24497ee6427SmrgRemove '-o dest.o' from ARGS, run PROGRAM with the remaining
24597ee6427Smrgarguments, and rename the output as expected.
24697ee6427Smrg
24797ee6427SmrgIf you are trying to build a whole package this is not the
24897ee6427Smrgright script to run: please start by reading the file 'INSTALL'.
24997ee6427Smrg
25097ee6427SmrgReport bugs to <bug-automake@gnu.org>.
25197ee6427SmrgEOF
25297ee6427Smrg    exit $?
25397ee6427Smrg    ;;
25497ee6427Smrg  -v | --v*)
25597ee6427Smrg    echo "compile $scriptversion"
25697ee6427Smrg    exit $?
25797ee6427Smrg    ;;
25897ee6427Smrg  cl | *[/\\]cl | cl.exe | *[/\\]cl.exe )
25997ee6427Smrg    func_cl_wrapper "$@"      # Doesn't return...
26097ee6427Smrg    ;;
26197ee6427Smrgesac
26297ee6427Smrg
26397ee6427Smrgofile=
26497ee6427Smrgcfile=
26597ee6427Smrg
26697ee6427Smrgfor arg
26797ee6427Smrgdo
26897ee6427Smrg  if test -n "$eat"; then
26997ee6427Smrg    eat=
27097ee6427Smrg  else
27197ee6427Smrg    case $1 in
27297ee6427Smrg      -o)
27397ee6427Smrg	# configure might choose to run compile as 'compile cc -o foo foo.c'.
27497ee6427Smrg	# So we strip '-o arg' only if arg is an object.
27597ee6427Smrg	eat=1
27697ee6427Smrg	case $2 in
27797ee6427Smrg	  *.o | *.obj)
27897ee6427Smrg	    ofile=$2
27997ee6427Smrg	    ;;
28097ee6427Smrg	  *)
28197ee6427Smrg	    set x "$@" -o "$2"
28297ee6427Smrg	    shift
28397ee6427Smrg	    ;;
28497ee6427Smrg	esac
28597ee6427Smrg	;;
28697ee6427Smrg      *.c)
28797ee6427Smrg	cfile=$1
28897ee6427Smrg	set x "$@" "$1"
28997ee6427Smrg	shift
29097ee6427Smrg	;;
29197ee6427Smrg      *)
29297ee6427Smrg	set x "$@" "$1"
29397ee6427Smrg	shift
29497ee6427Smrg	;;
29597ee6427Smrg    esac
29697ee6427Smrg  fi
29797ee6427Smrg  shift
29897ee6427Smrgdone
29997ee6427Smrg
30097ee6427Smrgif test -z "$ofile" || test -z "$cfile"; then
30197ee6427Smrg  # If no '-o' option was seen then we might have been invoked from a
30297ee6427Smrg  # pattern rule where we don't need one.  That is ok -- this is a
30397ee6427Smrg  # normal compilation that the losing compiler can handle.  If no
30497ee6427Smrg  # '.c' file was seen then we are probably linking.  That is also
30597ee6427Smrg  # ok.
30697ee6427Smrg  exec "$@"
30797ee6427Smrgfi
30897ee6427Smrg
30997ee6427Smrg# Name of file we expect compiler to create.
31097ee6427Smrgcofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'`
31197ee6427Smrg
31297ee6427Smrg# Create the lock directory.
31397ee6427Smrg# Note: use '[/\\:.-]' here to ensure that we don't use the same name
31497ee6427Smrg# that we are using for the .o file.  Also, base the name on the expected
31597ee6427Smrg# object file name, since that is what matters with a parallel build.
31697ee6427Smrglockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d
31797ee6427Smrgwhile true; do
31897ee6427Smrg  if mkdir "$lockdir" >/dev/null 2>&1; then
31997ee6427Smrg    break
32097ee6427Smrg  fi
32197ee6427Smrg  sleep 1
32297ee6427Smrgdone
32397ee6427Smrg# FIXME: race condition here if user kills between mkdir and trap.
32497ee6427Smrgtrap "rmdir '$lockdir'; exit 1" 1 2 15
32597ee6427Smrg
32697ee6427Smrg# Run the compile.
32797ee6427Smrg"$@"
32897ee6427Smrgret=$?
32997ee6427Smrg
33097ee6427Smrgif test -f "$cofile"; then
33197ee6427Smrg  test "$cofile" = "$ofile" || mv "$cofile" "$ofile"
33297ee6427Smrgelif test -f "${cofile}bj"; then
33397ee6427Smrg  test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile"
33497ee6427Smrgfi
33597ee6427Smrg
33697ee6427Smrgrmdir "$lockdir"
33797ee6427Smrgexit $ret
33897ee6427Smrg
33997ee6427Smrg# Local Variables:
34097ee6427Smrg# mode: shell-script
34197ee6427Smrg# sh-indentation: 2
34297ee6427Smrg# eval: (add-hook 'write-file-hooks 'time-stamp)
34397ee6427Smrg# time-stamp-start: "scriptversion="
34497ee6427Smrg# time-stamp-format: "%:y-%02m-%02d.%02H"
34597ee6427Smrg# time-stamp-time-zone: "UTC"
34697ee6427Smrg# time-stamp-end: "; # UTC"
34797ee6427Smrg# End:
348