119d64aeeSmrg#! /bin/sh
219d64aeeSmrg# Wrapper for compilers which do not understand '-c -o'.
319d64aeeSmrg
4ddb28773Smrgscriptversion=2018-03-07.03; # UTC
519d64aeeSmrg
6ddb28773Smrg# Copyright (C) 1999-2021 Free Software Foundation, Inc.
719d64aeeSmrg# Written by Tom Tromey <tromey@cygnus.com>.
819d64aeeSmrg#
919d64aeeSmrg# This program is free software; you can redistribute it and/or modify
1019d64aeeSmrg# it under the terms of the GNU General Public License as published by
1119d64aeeSmrg# the Free Software Foundation; either version 2, or (at your option)
1219d64aeeSmrg# any later version.
1319d64aeeSmrg#
1419d64aeeSmrg# This program is distributed in the hope that it will be useful,
1519d64aeeSmrg# but WITHOUT ANY WARRANTY; without even the implied warranty of
1619d64aeeSmrg# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1719d64aeeSmrg# GNU General Public License for more details.
1819d64aeeSmrg#
1919d64aeeSmrg# You should have received a copy of the GNU General Public License
20ddb28773Smrg# along with this program.  If not, see <https://www.gnu.org/licenses/>.
2119d64aeeSmrg
2219d64aeeSmrg# As a special exception to the GNU General Public License, if you
2319d64aeeSmrg# distribute this file as part of a program that contains a
2419d64aeeSmrg# configuration script generated by Autoconf, you may include it under
2519d64aeeSmrg# the same distribution terms that you use for the rest of that program.
2619d64aeeSmrg
2719d64aeeSmrg# This file is maintained in Automake, please report
2819d64aeeSmrg# bugs to <bug-automake@gnu.org> or send patches to
2919d64aeeSmrg# <automake-patches@gnu.org>.
3019d64aeeSmrg
3119d64aeeSmrgnl='
3219d64aeeSmrg'
3319d64aeeSmrg
3419d64aeeSmrg# We need space, tab and new line, in precisely that order.  Quoting is
3519d64aeeSmrg# there to prevent tools from complaining about whitespace usage.
3619d64aeeSmrgIFS=" ""	$nl"
3719d64aeeSmrg
3819d64aeeSmrgfile_conv=
3919d64aeeSmrg
4019d64aeeSmrg# func_file_conv build_file lazy
4119d64aeeSmrg# Convert a $build file to $host form and store it in $file
4219d64aeeSmrg# Currently only supports Windows hosts. If the determined conversion
4319d64aeeSmrg# type is listed in (the comma separated) LAZY, no conversion will
4419d64aeeSmrg# take place.
4519d64aeeSmrgfunc_file_conv ()
4619d64aeeSmrg{
4719d64aeeSmrg  file=$1
4819d64aeeSmrg  case $file in
4919d64aeeSmrg    / | /[!/]*) # absolute file, and not a UNC file
5019d64aeeSmrg      if test -z "$file_conv"; then
5119d64aeeSmrg	# lazily determine how to convert abs files
5219d64aeeSmrg	case `uname -s` in
5319d64aeeSmrg	  MINGW*)
5419d64aeeSmrg	    file_conv=mingw
5519d64aeeSmrg	    ;;
56ddb28773Smrg	  CYGWIN* | MSYS*)
5719d64aeeSmrg	    file_conv=cygwin
5819d64aeeSmrg	    ;;
5919d64aeeSmrg	  *)
6019d64aeeSmrg	    file_conv=wine
6119d64aeeSmrg	    ;;
6219d64aeeSmrg	esac
6319d64aeeSmrg      fi
6419d64aeeSmrg      case $file_conv/,$2, in
6519d64aeeSmrg	*,$file_conv,*)
6619d64aeeSmrg	  ;;
6719d64aeeSmrg	mingw/*)
6819d64aeeSmrg	  file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'`
6919d64aeeSmrg	  ;;
70ddb28773Smrg	cygwin/* | msys/*)
7119d64aeeSmrg	  file=`cygpath -m "$file" || echo "$file"`
7219d64aeeSmrg	  ;;
7319d64aeeSmrg	wine/*)
7419d64aeeSmrg	  file=`winepath -w "$file" || echo "$file"`
7519d64aeeSmrg	  ;;
7619d64aeeSmrg      esac
7719d64aeeSmrg      ;;
7819d64aeeSmrg  esac
7919d64aeeSmrg}
8019d64aeeSmrg
8119d64aeeSmrg# func_cl_dashL linkdir
8219d64aeeSmrg# Make cl look for libraries in LINKDIR
8319d64aeeSmrgfunc_cl_dashL ()
8419d64aeeSmrg{
8519d64aeeSmrg  func_file_conv "$1"
8619d64aeeSmrg  if test -z "$lib_path"; then
8719d64aeeSmrg    lib_path=$file
8819d64aeeSmrg  else
8919d64aeeSmrg    lib_path="$lib_path;$file"
9019d64aeeSmrg  fi
9119d64aeeSmrg  linker_opts="$linker_opts -LIBPATH:$file"
9219d64aeeSmrg}
9319d64aeeSmrg
9419d64aeeSmrg# func_cl_dashl library
9519d64aeeSmrg# Do a library search-path lookup for cl
9619d64aeeSmrgfunc_cl_dashl ()
9719d64aeeSmrg{
9819d64aeeSmrg  lib=$1
9919d64aeeSmrg  found=no
10019d64aeeSmrg  save_IFS=$IFS
10119d64aeeSmrg  IFS=';'
10219d64aeeSmrg  for dir in $lib_path $LIB
10319d64aeeSmrg  do
10419d64aeeSmrg    IFS=$save_IFS
10519d64aeeSmrg    if $shared && test -f "$dir/$lib.dll.lib"; then
10619d64aeeSmrg      found=yes
10719d64aeeSmrg      lib=$dir/$lib.dll.lib
10819d64aeeSmrg      break
10919d64aeeSmrg    fi
11019d64aeeSmrg    if test -f "$dir/$lib.lib"; then
11119d64aeeSmrg      found=yes
11219d64aeeSmrg      lib=$dir/$lib.lib
11319d64aeeSmrg      break
11419d64aeeSmrg    fi
11519d64aeeSmrg    if test -f "$dir/lib$lib.a"; then
11619d64aeeSmrg      found=yes
11719d64aeeSmrg      lib=$dir/lib$lib.a
11819d64aeeSmrg      break
11919d64aeeSmrg    fi
12019d64aeeSmrg  done
12119d64aeeSmrg  IFS=$save_IFS
12219d64aeeSmrg
12319d64aeeSmrg  if test "$found" != yes; then
12419d64aeeSmrg    lib=$lib.lib
12519d64aeeSmrg  fi
12619d64aeeSmrg}
12719d64aeeSmrg
12819d64aeeSmrg# func_cl_wrapper cl arg...
12919d64aeeSmrg# Adjust compile command to suit cl
13019d64aeeSmrgfunc_cl_wrapper ()
13119d64aeeSmrg{
13219d64aeeSmrg  # Assume a capable shell
13319d64aeeSmrg  lib_path=
13419d64aeeSmrg  shared=:
13519d64aeeSmrg  linker_opts=
13619d64aeeSmrg  for arg
13719d64aeeSmrg  do
13819d64aeeSmrg    if test -n "$eat"; then
13919d64aeeSmrg      eat=
14019d64aeeSmrg    else
14119d64aeeSmrg      case $1 in
14219d64aeeSmrg	-o)
14319d64aeeSmrg	  # configure might choose to run compile as 'compile cc -o foo foo.c'.
14419d64aeeSmrg	  eat=1
14519d64aeeSmrg	  case $2 in
14619d64aeeSmrg	    *.o | *.[oO][bB][jJ])
14719d64aeeSmrg	      func_file_conv "$2"
14819d64aeeSmrg	      set x "$@" -Fo"$file"
14919d64aeeSmrg	      shift
15019d64aeeSmrg	      ;;
15119d64aeeSmrg	    *)
15219d64aeeSmrg	      func_file_conv "$2"
15319d64aeeSmrg	      set x "$@" -Fe"$file"
15419d64aeeSmrg	      shift
15519d64aeeSmrg	      ;;
15619d64aeeSmrg	  esac
15719d64aeeSmrg	  ;;
15819d64aeeSmrg	-I)
15919d64aeeSmrg	  eat=1
16019d64aeeSmrg	  func_file_conv "$2" mingw
16119d64aeeSmrg	  set x "$@" -I"$file"
16219d64aeeSmrg	  shift
16319d64aeeSmrg	  ;;
16419d64aeeSmrg	-I*)
16519d64aeeSmrg	  func_file_conv "${1#-I}" mingw
16619d64aeeSmrg	  set x "$@" -I"$file"
16719d64aeeSmrg	  shift
16819d64aeeSmrg	  ;;
16919d64aeeSmrg	-l)
17019d64aeeSmrg	  eat=1
17119d64aeeSmrg	  func_cl_dashl "$2"
17219d64aeeSmrg	  set x "$@" "$lib"
17319d64aeeSmrg	  shift
17419d64aeeSmrg	  ;;
17519d64aeeSmrg	-l*)
17619d64aeeSmrg	  func_cl_dashl "${1#-l}"
17719d64aeeSmrg	  set x "$@" "$lib"
17819d64aeeSmrg	  shift
17919d64aeeSmrg	  ;;
18019d64aeeSmrg	-L)
18119d64aeeSmrg	  eat=1
18219d64aeeSmrg	  func_cl_dashL "$2"
18319d64aeeSmrg	  ;;
18419d64aeeSmrg	-L*)
18519d64aeeSmrg	  func_cl_dashL "${1#-L}"
18619d64aeeSmrg	  ;;
18719d64aeeSmrg	-static)
18819d64aeeSmrg	  shared=false
18919d64aeeSmrg	  ;;
19019d64aeeSmrg	-Wl,*)
19119d64aeeSmrg	  arg=${1#-Wl,}
19219d64aeeSmrg	  save_ifs="$IFS"; IFS=','
19319d64aeeSmrg	  for flag in $arg; do
19419d64aeeSmrg	    IFS="$save_ifs"
19519d64aeeSmrg	    linker_opts="$linker_opts $flag"
19619d64aeeSmrg	  done
19719d64aeeSmrg	  IFS="$save_ifs"
19819d64aeeSmrg	  ;;
19919d64aeeSmrg	-Xlinker)
20019d64aeeSmrg	  eat=1
20119d64aeeSmrg	  linker_opts="$linker_opts $2"
20219d64aeeSmrg	  ;;
20319d64aeeSmrg	-*)
20419d64aeeSmrg	  set x "$@" "$1"
20519d64aeeSmrg	  shift
20619d64aeeSmrg	  ;;
20719d64aeeSmrg	*.cc | *.CC | *.cxx | *.CXX | *.[cC]++)
20819d64aeeSmrg	  func_file_conv "$1"
20919d64aeeSmrg	  set x "$@" -Tp"$file"
21019d64aeeSmrg	  shift
21119d64aeeSmrg	  ;;
21219d64aeeSmrg	*.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO])
21319d64aeeSmrg	  func_file_conv "$1" mingw
21419d64aeeSmrg	  set x "$@" "$file"
21519d64aeeSmrg	  shift
21619d64aeeSmrg	  ;;
21719d64aeeSmrg	*)
21819d64aeeSmrg	  set x "$@" "$1"
21919d64aeeSmrg	  shift
22019d64aeeSmrg	  ;;
22119d64aeeSmrg      esac
22219d64aeeSmrg    fi
22319d64aeeSmrg    shift
22419d64aeeSmrg  done
22519d64aeeSmrg  if test -n "$linker_opts"; then
22619d64aeeSmrg    linker_opts="-link$linker_opts"
22719d64aeeSmrg  fi
22819d64aeeSmrg  exec "$@" $linker_opts
22919d64aeeSmrg  exit 1
23019d64aeeSmrg}
23119d64aeeSmrg
23219d64aeeSmrgeat=
23319d64aeeSmrg
23419d64aeeSmrgcase $1 in
23519d64aeeSmrg  '')
23619d64aeeSmrg     echo "$0: No command.  Try '$0 --help' for more information." 1>&2
23719d64aeeSmrg     exit 1;
23819d64aeeSmrg     ;;
23919d64aeeSmrg  -h | --h*)
24019d64aeeSmrg    cat <<\EOF
24119d64aeeSmrgUsage: compile [--help] [--version] PROGRAM [ARGS]
24219d64aeeSmrg
24319d64aeeSmrgWrapper for compilers which do not understand '-c -o'.
24419d64aeeSmrgRemove '-o dest.o' from ARGS, run PROGRAM with the remaining
24519d64aeeSmrgarguments, and rename the output as expected.
24619d64aeeSmrg
24719d64aeeSmrgIf you are trying to build a whole package this is not the
24819d64aeeSmrgright script to run: please start by reading the file 'INSTALL'.
24919d64aeeSmrg
25019d64aeeSmrgReport bugs to <bug-automake@gnu.org>.
25119d64aeeSmrgEOF
25219d64aeeSmrg    exit $?
25319d64aeeSmrg    ;;
25419d64aeeSmrg  -v | --v*)
25519d64aeeSmrg    echo "compile $scriptversion"
25619d64aeeSmrg    exit $?
25719d64aeeSmrg    ;;
258ddb28773Smrg  cl | *[/\\]cl | cl.exe | *[/\\]cl.exe | \
259ddb28773Smrg  icl | *[/\\]icl | icl.exe | *[/\\]icl.exe )
26019d64aeeSmrg    func_cl_wrapper "$@"      # Doesn't return...
26119d64aeeSmrg    ;;
26219d64aeeSmrgesac
26319d64aeeSmrg
26419d64aeeSmrgofile=
26519d64aeeSmrgcfile=
26619d64aeeSmrg
26719d64aeeSmrgfor arg
26819d64aeeSmrgdo
26919d64aeeSmrg  if test -n "$eat"; then
27019d64aeeSmrg    eat=
27119d64aeeSmrg  else
27219d64aeeSmrg    case $1 in
27319d64aeeSmrg      -o)
27419d64aeeSmrg	# configure might choose to run compile as 'compile cc -o foo foo.c'.
27519d64aeeSmrg	# So we strip '-o arg' only if arg is an object.
27619d64aeeSmrg	eat=1
27719d64aeeSmrg	case $2 in
27819d64aeeSmrg	  *.o | *.obj)
27919d64aeeSmrg	    ofile=$2
28019d64aeeSmrg	    ;;
28119d64aeeSmrg	  *)
28219d64aeeSmrg	    set x "$@" -o "$2"
28319d64aeeSmrg	    shift
28419d64aeeSmrg	    ;;
28519d64aeeSmrg	esac
28619d64aeeSmrg	;;
28719d64aeeSmrg      *.c)
28819d64aeeSmrg	cfile=$1
28919d64aeeSmrg	set x "$@" "$1"
29019d64aeeSmrg	shift
29119d64aeeSmrg	;;
29219d64aeeSmrg      *)
29319d64aeeSmrg	set x "$@" "$1"
29419d64aeeSmrg	shift
29519d64aeeSmrg	;;
29619d64aeeSmrg    esac
29719d64aeeSmrg  fi
29819d64aeeSmrg  shift
29919d64aeeSmrgdone
30019d64aeeSmrg
30119d64aeeSmrgif test -z "$ofile" || test -z "$cfile"; then
30219d64aeeSmrg  # If no '-o' option was seen then we might have been invoked from a
30319d64aeeSmrg  # pattern rule where we don't need one.  That is ok -- this is a
30419d64aeeSmrg  # normal compilation that the losing compiler can handle.  If no
30519d64aeeSmrg  # '.c' file was seen then we are probably linking.  That is also
30619d64aeeSmrg  # ok.
30719d64aeeSmrg  exec "$@"
30819d64aeeSmrgfi
30919d64aeeSmrg
31019d64aeeSmrg# Name of file we expect compiler to create.
31119d64aeeSmrgcofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'`
31219d64aeeSmrg
31319d64aeeSmrg# Create the lock directory.
31419d64aeeSmrg# Note: use '[/\\:.-]' here to ensure that we don't use the same name
31519d64aeeSmrg# that we are using for the .o file.  Also, base the name on the expected
31619d64aeeSmrg# object file name, since that is what matters with a parallel build.
31719d64aeeSmrglockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d
31819d64aeeSmrgwhile true; do
31919d64aeeSmrg  if mkdir "$lockdir" >/dev/null 2>&1; then
32019d64aeeSmrg    break
32119d64aeeSmrg  fi
32219d64aeeSmrg  sleep 1
32319d64aeeSmrgdone
32419d64aeeSmrg# FIXME: race condition here if user kills between mkdir and trap.
32519d64aeeSmrgtrap "rmdir '$lockdir'; exit 1" 1 2 15
32619d64aeeSmrg
32719d64aeeSmrg# Run the compile.
32819d64aeeSmrg"$@"
32919d64aeeSmrgret=$?
33019d64aeeSmrg
33119d64aeeSmrgif test -f "$cofile"; then
33219d64aeeSmrg  test "$cofile" = "$ofile" || mv "$cofile" "$ofile"
33319d64aeeSmrgelif test -f "${cofile}bj"; then
33419d64aeeSmrg  test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile"
33519d64aeeSmrgfi
33619d64aeeSmrg
33719d64aeeSmrgrmdir "$lockdir"
33819d64aeeSmrgexit $ret
33919d64aeeSmrg
34019d64aeeSmrg# Local Variables:
34119d64aeeSmrg# mode: shell-script
34219d64aeeSmrg# sh-indentation: 2
343ddb28773Smrg# eval: (add-hook 'before-save-hook 'time-stamp)
34419d64aeeSmrg# time-stamp-start: "scriptversion="
34519d64aeeSmrg# time-stamp-format: "%:y-%02m-%02d.%02H"
346ddb28773Smrg# time-stamp-time-zone: "UTC0"
34719d64aeeSmrg# time-stamp-end: "; # UTC"
34819d64aeeSmrg# End:
349