104007ebaSmrg#! /bin/sh
204007ebaSmrg# Wrapper for compilers which do not understand '-c -o'.
304007ebaSmrg
405cf1079Smrgscriptversion=2018-03-07.03; # UTC
504007ebaSmrg
679d5fcd7Smrg# Copyright (C) 1999-2021 Free Software Foundation, Inc.
704007ebaSmrg# Written by Tom Tromey <tromey@cygnus.com>.
804007ebaSmrg#
904007ebaSmrg# This program is free software; you can redistribute it and/or modify
1004007ebaSmrg# it under the terms of the GNU General Public License as published by
1104007ebaSmrg# the Free Software Foundation; either version 2, or (at your option)
1204007ebaSmrg# any later version.
1304007ebaSmrg#
1404007ebaSmrg# This program is distributed in the hope that it will be useful,
1504007ebaSmrg# but WITHOUT ANY WARRANTY; without even the implied warranty of
1604007ebaSmrg# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1704007ebaSmrg# GNU General Public License for more details.
1804007ebaSmrg#
1904007ebaSmrg# You should have received a copy of the GNU General Public License
2005cf1079Smrg# along with this program.  If not, see <https://www.gnu.org/licenses/>.
2104007ebaSmrg
2204007ebaSmrg# As a special exception to the GNU General Public License, if you
2304007ebaSmrg# distribute this file as part of a program that contains a
2404007ebaSmrg# configuration script generated by Autoconf, you may include it under
2504007ebaSmrg# the same distribution terms that you use for the rest of that program.
2604007ebaSmrg
2704007ebaSmrg# This file is maintained in Automake, please report
2804007ebaSmrg# bugs to <bug-automake@gnu.org> or send patches to
2904007ebaSmrg# <automake-patches@gnu.org>.
3004007ebaSmrg
3104007ebaSmrgnl='
3204007ebaSmrg'
3304007ebaSmrg
3404007ebaSmrg# We need space, tab and new line, in precisely that order.  Quoting is
3504007ebaSmrg# there to prevent tools from complaining about whitespace usage.
3604007ebaSmrgIFS=" ""	$nl"
3704007ebaSmrg
3804007ebaSmrgfile_conv=
3904007ebaSmrg
4004007ebaSmrg# func_file_conv build_file lazy
4104007ebaSmrg# Convert a $build file to $host form and store it in $file
4204007ebaSmrg# Currently only supports Windows hosts. If the determined conversion
4304007ebaSmrg# type is listed in (the comma separated) LAZY, no conversion will
4404007ebaSmrg# take place.
4504007ebaSmrgfunc_file_conv ()
4604007ebaSmrg{
4704007ebaSmrg  file=$1
4804007ebaSmrg  case $file in
4904007ebaSmrg    / | /[!/]*) # absolute file, and not a UNC file
5004007ebaSmrg      if test -z "$file_conv"; then
5104007ebaSmrg	# lazily determine how to convert abs files
5204007ebaSmrg	case `uname -s` in
5304007ebaSmrg	  MINGW*)
5404007ebaSmrg	    file_conv=mingw
5504007ebaSmrg	    ;;
5679d5fcd7Smrg	  CYGWIN* | MSYS*)
5704007ebaSmrg	    file_conv=cygwin
5804007ebaSmrg	    ;;
5904007ebaSmrg	  *)
6004007ebaSmrg	    file_conv=wine
6104007ebaSmrg	    ;;
6204007ebaSmrg	esac
6304007ebaSmrg      fi
6404007ebaSmrg      case $file_conv/,$2, in
6504007ebaSmrg	*,$file_conv,*)
6604007ebaSmrg	  ;;
6704007ebaSmrg	mingw/*)
6804007ebaSmrg	  file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'`
6904007ebaSmrg	  ;;
7079d5fcd7Smrg	cygwin/* | msys/*)
7104007ebaSmrg	  file=`cygpath -m "$file" || echo "$file"`
7204007ebaSmrg	  ;;
7304007ebaSmrg	wine/*)
7404007ebaSmrg	  file=`winepath -w "$file" || echo "$file"`
7504007ebaSmrg	  ;;
7604007ebaSmrg      esac
7704007ebaSmrg      ;;
7804007ebaSmrg  esac
7904007ebaSmrg}
8004007ebaSmrg
8104007ebaSmrg# func_cl_dashL linkdir
8204007ebaSmrg# Make cl look for libraries in LINKDIR
8304007ebaSmrgfunc_cl_dashL ()
8404007ebaSmrg{
8504007ebaSmrg  func_file_conv "$1"
8604007ebaSmrg  if test -z "$lib_path"; then
8704007ebaSmrg    lib_path=$file
8804007ebaSmrg  else
8904007ebaSmrg    lib_path="$lib_path;$file"
9004007ebaSmrg  fi
9104007ebaSmrg  linker_opts="$linker_opts -LIBPATH:$file"
9204007ebaSmrg}
9304007ebaSmrg
9404007ebaSmrg# func_cl_dashl library
9504007ebaSmrg# Do a library search-path lookup for cl
9604007ebaSmrgfunc_cl_dashl ()
9704007ebaSmrg{
9804007ebaSmrg  lib=$1
9904007ebaSmrg  found=no
10004007ebaSmrg  save_IFS=$IFS
10104007ebaSmrg  IFS=';'
10204007ebaSmrg  for dir in $lib_path $LIB
10304007ebaSmrg  do
10404007ebaSmrg    IFS=$save_IFS
10504007ebaSmrg    if $shared && test -f "$dir/$lib.dll.lib"; then
10604007ebaSmrg      found=yes
10704007ebaSmrg      lib=$dir/$lib.dll.lib
10804007ebaSmrg      break
10904007ebaSmrg    fi
11004007ebaSmrg    if test -f "$dir/$lib.lib"; then
11104007ebaSmrg      found=yes
11204007ebaSmrg      lib=$dir/$lib.lib
11304007ebaSmrg      break
11404007ebaSmrg    fi
11504007ebaSmrg    if test -f "$dir/lib$lib.a"; then
11604007ebaSmrg      found=yes
11704007ebaSmrg      lib=$dir/lib$lib.a
11804007ebaSmrg      break
11904007ebaSmrg    fi
12004007ebaSmrg  done
12104007ebaSmrg  IFS=$save_IFS
12204007ebaSmrg
12304007ebaSmrg  if test "$found" != yes; then
12404007ebaSmrg    lib=$lib.lib
12504007ebaSmrg  fi
12604007ebaSmrg}
12704007ebaSmrg
12804007ebaSmrg# func_cl_wrapper cl arg...
12904007ebaSmrg# Adjust compile command to suit cl
13004007ebaSmrgfunc_cl_wrapper ()
13104007ebaSmrg{
13204007ebaSmrg  # Assume a capable shell
13304007ebaSmrg  lib_path=
13404007ebaSmrg  shared=:
13504007ebaSmrg  linker_opts=
13604007ebaSmrg  for arg
13704007ebaSmrg  do
13804007ebaSmrg    if test -n "$eat"; then
13904007ebaSmrg      eat=
14004007ebaSmrg    else
14104007ebaSmrg      case $1 in
14204007ebaSmrg	-o)
14304007ebaSmrg	  # configure might choose to run compile as 'compile cc -o foo foo.c'.
14404007ebaSmrg	  eat=1
14504007ebaSmrg	  case $2 in
14604007ebaSmrg	    *.o | *.[oO][bB][jJ])
14704007ebaSmrg	      func_file_conv "$2"
14804007ebaSmrg	      set x "$@" -Fo"$file"
14904007ebaSmrg	      shift
15004007ebaSmrg	      ;;
15104007ebaSmrg	    *)
15204007ebaSmrg	      func_file_conv "$2"
15304007ebaSmrg	      set x "$@" -Fe"$file"
15404007ebaSmrg	      shift
15504007ebaSmrg	      ;;
15604007ebaSmrg	  esac
15704007ebaSmrg	  ;;
15804007ebaSmrg	-I)
15904007ebaSmrg	  eat=1
16004007ebaSmrg	  func_file_conv "$2" mingw
16104007ebaSmrg	  set x "$@" -I"$file"
16204007ebaSmrg	  shift
16304007ebaSmrg	  ;;
16404007ebaSmrg	-I*)
16504007ebaSmrg	  func_file_conv "${1#-I}" mingw
16604007ebaSmrg	  set x "$@" -I"$file"
16704007ebaSmrg	  shift
16804007ebaSmrg	  ;;
16904007ebaSmrg	-l)
17004007ebaSmrg	  eat=1
17104007ebaSmrg	  func_cl_dashl "$2"
17204007ebaSmrg	  set x "$@" "$lib"
17304007ebaSmrg	  shift
17404007ebaSmrg	  ;;
17504007ebaSmrg	-l*)
17604007ebaSmrg	  func_cl_dashl "${1#-l}"
17704007ebaSmrg	  set x "$@" "$lib"
17804007ebaSmrg	  shift
17904007ebaSmrg	  ;;
18004007ebaSmrg	-L)
18104007ebaSmrg	  eat=1
18204007ebaSmrg	  func_cl_dashL "$2"
18304007ebaSmrg	  ;;
18404007ebaSmrg	-L*)
18504007ebaSmrg	  func_cl_dashL "${1#-L}"
18604007ebaSmrg	  ;;
18704007ebaSmrg	-static)
18804007ebaSmrg	  shared=false
18904007ebaSmrg	  ;;
19004007ebaSmrg	-Wl,*)
19104007ebaSmrg	  arg=${1#-Wl,}
19204007ebaSmrg	  save_ifs="$IFS"; IFS=','
19304007ebaSmrg	  for flag in $arg; do
19404007ebaSmrg	    IFS="$save_ifs"
19504007ebaSmrg	    linker_opts="$linker_opts $flag"
19604007ebaSmrg	  done
19704007ebaSmrg	  IFS="$save_ifs"
19804007ebaSmrg	  ;;
19904007ebaSmrg	-Xlinker)
20004007ebaSmrg	  eat=1
20104007ebaSmrg	  linker_opts="$linker_opts $2"
20204007ebaSmrg	  ;;
20304007ebaSmrg	-*)
20404007ebaSmrg	  set x "$@" "$1"
20504007ebaSmrg	  shift
20604007ebaSmrg	  ;;
20704007ebaSmrg	*.cc | *.CC | *.cxx | *.CXX | *.[cC]++)
20804007ebaSmrg	  func_file_conv "$1"
20904007ebaSmrg	  set x "$@" -Tp"$file"
21004007ebaSmrg	  shift
21104007ebaSmrg	  ;;
21204007ebaSmrg	*.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO])
21304007ebaSmrg	  func_file_conv "$1" mingw
21404007ebaSmrg	  set x "$@" "$file"
21504007ebaSmrg	  shift
21604007ebaSmrg	  ;;
21704007ebaSmrg	*)
21804007ebaSmrg	  set x "$@" "$1"
21904007ebaSmrg	  shift
22004007ebaSmrg	  ;;
22104007ebaSmrg      esac
22204007ebaSmrg    fi
22304007ebaSmrg    shift
22404007ebaSmrg  done
22504007ebaSmrg  if test -n "$linker_opts"; then
22604007ebaSmrg    linker_opts="-link$linker_opts"
22704007ebaSmrg  fi
22804007ebaSmrg  exec "$@" $linker_opts
22904007ebaSmrg  exit 1
23004007ebaSmrg}
23104007ebaSmrg
23204007ebaSmrgeat=
23304007ebaSmrg
23404007ebaSmrgcase $1 in
23504007ebaSmrg  '')
23604007ebaSmrg     echo "$0: No command.  Try '$0 --help' for more information." 1>&2
23704007ebaSmrg     exit 1;
23804007ebaSmrg     ;;
23904007ebaSmrg  -h | --h*)
24004007ebaSmrg    cat <<\EOF
24104007ebaSmrgUsage: compile [--help] [--version] PROGRAM [ARGS]
24204007ebaSmrg
24304007ebaSmrgWrapper for compilers which do not understand '-c -o'.
24404007ebaSmrgRemove '-o dest.o' from ARGS, run PROGRAM with the remaining
24504007ebaSmrgarguments, and rename the output as expected.
24604007ebaSmrg
24704007ebaSmrgIf you are trying to build a whole package this is not the
24804007ebaSmrgright script to run: please start by reading the file 'INSTALL'.
24904007ebaSmrg
25004007ebaSmrgReport bugs to <bug-automake@gnu.org>.
25104007ebaSmrgEOF
25204007ebaSmrg    exit $?
25304007ebaSmrg    ;;
25404007ebaSmrg  -v | --v*)
25504007ebaSmrg    echo "compile $scriptversion"
25604007ebaSmrg    exit $?
25704007ebaSmrg    ;;
25805cf1079Smrg  cl | *[/\\]cl | cl.exe | *[/\\]cl.exe | \
25905cf1079Smrg  icl | *[/\\]icl | icl.exe | *[/\\]icl.exe )
26004007ebaSmrg    func_cl_wrapper "$@"      # Doesn't return...
26104007ebaSmrg    ;;
26204007ebaSmrgesac
26304007ebaSmrg
26404007ebaSmrgofile=
26504007ebaSmrgcfile=
26604007ebaSmrg
26704007ebaSmrgfor arg
26804007ebaSmrgdo
26904007ebaSmrg  if test -n "$eat"; then
27004007ebaSmrg    eat=
27104007ebaSmrg  else
27204007ebaSmrg    case $1 in
27304007ebaSmrg      -o)
27404007ebaSmrg	# configure might choose to run compile as 'compile cc -o foo foo.c'.
27504007ebaSmrg	# So we strip '-o arg' only if arg is an object.
27604007ebaSmrg	eat=1
27704007ebaSmrg	case $2 in
27804007ebaSmrg	  *.o | *.obj)
27904007ebaSmrg	    ofile=$2
28004007ebaSmrg	    ;;
28104007ebaSmrg	  *)
28204007ebaSmrg	    set x "$@" -o "$2"
28304007ebaSmrg	    shift
28404007ebaSmrg	    ;;
28504007ebaSmrg	esac
28604007ebaSmrg	;;
28704007ebaSmrg      *.c)
28804007ebaSmrg	cfile=$1
28904007ebaSmrg	set x "$@" "$1"
29004007ebaSmrg	shift
29104007ebaSmrg	;;
29204007ebaSmrg      *)
29304007ebaSmrg	set x "$@" "$1"
29404007ebaSmrg	shift
29504007ebaSmrg	;;
29604007ebaSmrg    esac
29704007ebaSmrg  fi
29804007ebaSmrg  shift
29904007ebaSmrgdone
30004007ebaSmrg
30104007ebaSmrgif test -z "$ofile" || test -z "$cfile"; then
30204007ebaSmrg  # If no '-o' option was seen then we might have been invoked from a
30304007ebaSmrg  # pattern rule where we don't need one.  That is ok -- this is a
30404007ebaSmrg  # normal compilation that the losing compiler can handle.  If no
30504007ebaSmrg  # '.c' file was seen then we are probably linking.  That is also
30604007ebaSmrg  # ok.
30704007ebaSmrg  exec "$@"
30804007ebaSmrgfi
30904007ebaSmrg
31004007ebaSmrg# Name of file we expect compiler to create.
31104007ebaSmrgcofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'`
31204007ebaSmrg
31304007ebaSmrg# Create the lock directory.
31404007ebaSmrg# Note: use '[/\\:.-]' here to ensure that we don't use the same name
31504007ebaSmrg# that we are using for the .o file.  Also, base the name on the expected
31604007ebaSmrg# object file name, since that is what matters with a parallel build.
31704007ebaSmrglockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d
31804007ebaSmrgwhile true; do
31904007ebaSmrg  if mkdir "$lockdir" >/dev/null 2>&1; then
32004007ebaSmrg    break
32104007ebaSmrg  fi
32204007ebaSmrg  sleep 1
32304007ebaSmrgdone
32404007ebaSmrg# FIXME: race condition here if user kills between mkdir and trap.
32504007ebaSmrgtrap "rmdir '$lockdir'; exit 1" 1 2 15
32604007ebaSmrg
32704007ebaSmrg# Run the compile.
32804007ebaSmrg"$@"
32904007ebaSmrgret=$?
33004007ebaSmrg
33104007ebaSmrgif test -f "$cofile"; then
33204007ebaSmrg  test "$cofile" = "$ofile" || mv "$cofile" "$ofile"
33304007ebaSmrgelif test -f "${cofile}bj"; then
33404007ebaSmrg  test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile"
33504007ebaSmrgfi
33604007ebaSmrg
33704007ebaSmrgrmdir "$lockdir"
33804007ebaSmrgexit $ret
33904007ebaSmrg
34004007ebaSmrg# Local Variables:
34104007ebaSmrg# mode: shell-script
34204007ebaSmrg# sh-indentation: 2
34305cf1079Smrg# eval: (add-hook 'before-save-hook 'time-stamp)
34404007ebaSmrg# time-stamp-start: "scriptversion="
34504007ebaSmrg# time-stamp-format: "%:y-%02m-%02d.%02H"
34605cf1079Smrg# time-stamp-time-zone: "UTC0"
34704007ebaSmrg# time-stamp-end: "; # UTC"
34804007ebaSmrg# End:
349