15c30ecadSmrg#! /bin/sh
25c30ecadSmrg# Wrapper for compilers which do not understand '-c -o'.
35c30ecadSmrg
45c30ecadSmrgscriptversion=2018-03-07.03; # UTC
55c30ecadSmrg
65c30ecadSmrg# Copyright (C) 1999-2021 Free Software Foundation, Inc.
75c30ecadSmrg# Written by Tom Tromey <tromey@cygnus.com>.
85c30ecadSmrg#
95c30ecadSmrg# This program is free software; you can redistribute it and/or modify
105c30ecadSmrg# it under the terms of the GNU General Public License as published by
115c30ecadSmrg# the Free Software Foundation; either version 2, or (at your option)
125c30ecadSmrg# any later version.
135c30ecadSmrg#
145c30ecadSmrg# This program is distributed in the hope that it will be useful,
155c30ecadSmrg# but WITHOUT ANY WARRANTY; without even the implied warranty of
165c30ecadSmrg# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
175c30ecadSmrg# GNU General Public License for more details.
185c30ecadSmrg#
195c30ecadSmrg# You should have received a copy of the GNU General Public License
205c30ecadSmrg# along with this program.  If not, see <https://www.gnu.org/licenses/>.
215c30ecadSmrg
225c30ecadSmrg# As a special exception to the GNU General Public License, if you
235c30ecadSmrg# distribute this file as part of a program that contains a
245c30ecadSmrg# configuration script generated by Autoconf, you may include it under
255c30ecadSmrg# the same distribution terms that you use for the rest of that program.
265c30ecadSmrg
275c30ecadSmrg# This file is maintained in Automake, please report
285c30ecadSmrg# bugs to <bug-automake@gnu.org> or send patches to
295c30ecadSmrg# <automake-patches@gnu.org>.
305c30ecadSmrg
315c30ecadSmrgnl='
325c30ecadSmrg'
335c30ecadSmrg
345c30ecadSmrg# We need space, tab and new line, in precisely that order.  Quoting is
355c30ecadSmrg# there to prevent tools from complaining about whitespace usage.
365c30ecadSmrgIFS=" ""	$nl"
375c30ecadSmrg
385c30ecadSmrgfile_conv=
395c30ecadSmrg
405c30ecadSmrg# func_file_conv build_file lazy
415c30ecadSmrg# Convert a $build file to $host form and store it in $file
425c30ecadSmrg# Currently only supports Windows hosts. If the determined conversion
435c30ecadSmrg# type is listed in (the comma separated) LAZY, no conversion will
445c30ecadSmrg# take place.
455c30ecadSmrgfunc_file_conv ()
465c30ecadSmrg{
475c30ecadSmrg  file=$1
485c30ecadSmrg  case $file in
495c30ecadSmrg    / | /[!/]*) # absolute file, and not a UNC file
505c30ecadSmrg      if test -z "$file_conv"; then
515c30ecadSmrg	# lazily determine how to convert abs files
525c30ecadSmrg	case `uname -s` in
535c30ecadSmrg	  MINGW*)
545c30ecadSmrg	    file_conv=mingw
555c30ecadSmrg	    ;;
565c30ecadSmrg	  CYGWIN* | MSYS*)
575c30ecadSmrg	    file_conv=cygwin
585c30ecadSmrg	    ;;
595c30ecadSmrg	  *)
605c30ecadSmrg	    file_conv=wine
615c30ecadSmrg	    ;;
625c30ecadSmrg	esac
635c30ecadSmrg      fi
645c30ecadSmrg      case $file_conv/,$2, in
655c30ecadSmrg	*,$file_conv,*)
665c30ecadSmrg	  ;;
675c30ecadSmrg	mingw/*)
685c30ecadSmrg	  file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'`
695c30ecadSmrg	  ;;
705c30ecadSmrg	cygwin/* | msys/*)
715c30ecadSmrg	  file=`cygpath -m "$file" || echo "$file"`
725c30ecadSmrg	  ;;
735c30ecadSmrg	wine/*)
745c30ecadSmrg	  file=`winepath -w "$file" || echo "$file"`
755c30ecadSmrg	  ;;
765c30ecadSmrg      esac
775c30ecadSmrg      ;;
785c30ecadSmrg  esac
795c30ecadSmrg}
805c30ecadSmrg
815c30ecadSmrg# func_cl_dashL linkdir
825c30ecadSmrg# Make cl look for libraries in LINKDIR
835c30ecadSmrgfunc_cl_dashL ()
845c30ecadSmrg{
855c30ecadSmrg  func_file_conv "$1"
865c30ecadSmrg  if test -z "$lib_path"; then
875c30ecadSmrg    lib_path=$file
885c30ecadSmrg  else
895c30ecadSmrg    lib_path="$lib_path;$file"
905c30ecadSmrg  fi
915c30ecadSmrg  linker_opts="$linker_opts -LIBPATH:$file"
925c30ecadSmrg}
935c30ecadSmrg
945c30ecadSmrg# func_cl_dashl library
955c30ecadSmrg# Do a library search-path lookup for cl
965c30ecadSmrgfunc_cl_dashl ()
975c30ecadSmrg{
985c30ecadSmrg  lib=$1
995c30ecadSmrg  found=no
1005c30ecadSmrg  save_IFS=$IFS
1015c30ecadSmrg  IFS=';'
1025c30ecadSmrg  for dir in $lib_path $LIB
1035c30ecadSmrg  do
1045c30ecadSmrg    IFS=$save_IFS
1055c30ecadSmrg    if $shared && test -f "$dir/$lib.dll.lib"; then
1065c30ecadSmrg      found=yes
1075c30ecadSmrg      lib=$dir/$lib.dll.lib
1085c30ecadSmrg      break
1095c30ecadSmrg    fi
1105c30ecadSmrg    if test -f "$dir/$lib.lib"; then
1115c30ecadSmrg      found=yes
1125c30ecadSmrg      lib=$dir/$lib.lib
1135c30ecadSmrg      break
1145c30ecadSmrg    fi
1155c30ecadSmrg    if test -f "$dir/lib$lib.a"; then
1165c30ecadSmrg      found=yes
1175c30ecadSmrg      lib=$dir/lib$lib.a
1185c30ecadSmrg      break
1195c30ecadSmrg    fi
1205c30ecadSmrg  done
1215c30ecadSmrg  IFS=$save_IFS
1225c30ecadSmrg
1235c30ecadSmrg  if test "$found" != yes; then
1245c30ecadSmrg    lib=$lib.lib
1255c30ecadSmrg  fi
1265c30ecadSmrg}
1275c30ecadSmrg
1285c30ecadSmrg# func_cl_wrapper cl arg...
1295c30ecadSmrg# Adjust compile command to suit cl
1305c30ecadSmrgfunc_cl_wrapper ()
1315c30ecadSmrg{
1325c30ecadSmrg  # Assume a capable shell
1335c30ecadSmrg  lib_path=
1345c30ecadSmrg  shared=:
1355c30ecadSmrg  linker_opts=
1365c30ecadSmrg  for arg
1375c30ecadSmrg  do
1385c30ecadSmrg    if test -n "$eat"; then
1395c30ecadSmrg      eat=
1405c30ecadSmrg    else
1415c30ecadSmrg      case $1 in
1425c30ecadSmrg	-o)
1435c30ecadSmrg	  # configure might choose to run compile as 'compile cc -o foo foo.c'.
1445c30ecadSmrg	  eat=1
1455c30ecadSmrg	  case $2 in
1465c30ecadSmrg	    *.o | *.[oO][bB][jJ])
1475c30ecadSmrg	      func_file_conv "$2"
1485c30ecadSmrg	      set x "$@" -Fo"$file"
1495c30ecadSmrg	      shift
1505c30ecadSmrg	      ;;
1515c30ecadSmrg	    *)
1525c30ecadSmrg	      func_file_conv "$2"
1535c30ecadSmrg	      set x "$@" -Fe"$file"
1545c30ecadSmrg	      shift
1555c30ecadSmrg	      ;;
1565c30ecadSmrg	  esac
1575c30ecadSmrg	  ;;
1585c30ecadSmrg	-I)
1595c30ecadSmrg	  eat=1
1605c30ecadSmrg	  func_file_conv "$2" mingw
1615c30ecadSmrg	  set x "$@" -I"$file"
1625c30ecadSmrg	  shift
1635c30ecadSmrg	  ;;
1645c30ecadSmrg	-I*)
1655c30ecadSmrg	  func_file_conv "${1#-I}" mingw
1665c30ecadSmrg	  set x "$@" -I"$file"
1675c30ecadSmrg	  shift
1685c30ecadSmrg	  ;;
1695c30ecadSmrg	-l)
1705c30ecadSmrg	  eat=1
1715c30ecadSmrg	  func_cl_dashl "$2"
1725c30ecadSmrg	  set x "$@" "$lib"
1735c30ecadSmrg	  shift
1745c30ecadSmrg	  ;;
1755c30ecadSmrg	-l*)
1765c30ecadSmrg	  func_cl_dashl "${1#-l}"
1775c30ecadSmrg	  set x "$@" "$lib"
1785c30ecadSmrg	  shift
1795c30ecadSmrg	  ;;
1805c30ecadSmrg	-L)
1815c30ecadSmrg	  eat=1
1825c30ecadSmrg	  func_cl_dashL "$2"
1835c30ecadSmrg	  ;;
1845c30ecadSmrg	-L*)
1855c30ecadSmrg	  func_cl_dashL "${1#-L}"
1865c30ecadSmrg	  ;;
1875c30ecadSmrg	-static)
1885c30ecadSmrg	  shared=false
1895c30ecadSmrg	  ;;
1905c30ecadSmrg	-Wl,*)
1915c30ecadSmrg	  arg=${1#-Wl,}
1925c30ecadSmrg	  save_ifs="$IFS"; IFS=','
1935c30ecadSmrg	  for flag in $arg; do
1945c30ecadSmrg	    IFS="$save_ifs"
1955c30ecadSmrg	    linker_opts="$linker_opts $flag"
1965c30ecadSmrg	  done
1975c30ecadSmrg	  IFS="$save_ifs"
1985c30ecadSmrg	  ;;
1995c30ecadSmrg	-Xlinker)
2005c30ecadSmrg	  eat=1
2015c30ecadSmrg	  linker_opts="$linker_opts $2"
2025c30ecadSmrg	  ;;
2035c30ecadSmrg	-*)
2045c30ecadSmrg	  set x "$@" "$1"
2055c30ecadSmrg	  shift
2065c30ecadSmrg	  ;;
2075c30ecadSmrg	*.cc | *.CC | *.cxx | *.CXX | *.[cC]++)
2085c30ecadSmrg	  func_file_conv "$1"
2095c30ecadSmrg	  set x "$@" -Tp"$file"
2105c30ecadSmrg	  shift
2115c30ecadSmrg	  ;;
2125c30ecadSmrg	*.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO])
2135c30ecadSmrg	  func_file_conv "$1" mingw
2145c30ecadSmrg	  set x "$@" "$file"
2155c30ecadSmrg	  shift
2165c30ecadSmrg	  ;;
2175c30ecadSmrg	*)
2185c30ecadSmrg	  set x "$@" "$1"
2195c30ecadSmrg	  shift
2205c30ecadSmrg	  ;;
2215c30ecadSmrg      esac
2225c30ecadSmrg    fi
2235c30ecadSmrg    shift
2245c30ecadSmrg  done
2255c30ecadSmrg  if test -n "$linker_opts"; then
2265c30ecadSmrg    linker_opts="-link$linker_opts"
2275c30ecadSmrg  fi
2285c30ecadSmrg  exec "$@" $linker_opts
2295c30ecadSmrg  exit 1
2305c30ecadSmrg}
2315c30ecadSmrg
2325c30ecadSmrgeat=
2335c30ecadSmrg
2345c30ecadSmrgcase $1 in
2355c30ecadSmrg  '')
2365c30ecadSmrg     echo "$0: No command.  Try '$0 --help' for more information." 1>&2
2375c30ecadSmrg     exit 1;
2385c30ecadSmrg     ;;
2395c30ecadSmrg  -h | --h*)
2405c30ecadSmrg    cat <<\EOF
2415c30ecadSmrgUsage: compile [--help] [--version] PROGRAM [ARGS]
2425c30ecadSmrg
2435c30ecadSmrgWrapper for compilers which do not understand '-c -o'.
2445c30ecadSmrgRemove '-o dest.o' from ARGS, run PROGRAM with the remaining
2455c30ecadSmrgarguments, and rename the output as expected.
2465c30ecadSmrg
2475c30ecadSmrgIf you are trying to build a whole package this is not the
2485c30ecadSmrgright script to run: please start by reading the file 'INSTALL'.
2495c30ecadSmrg
2505c30ecadSmrgReport bugs to <bug-automake@gnu.org>.
2515c30ecadSmrgEOF
2525c30ecadSmrg    exit $?
2535c30ecadSmrg    ;;
2545c30ecadSmrg  -v | --v*)
2555c30ecadSmrg    echo "compile $scriptversion"
2565c30ecadSmrg    exit $?
2575c30ecadSmrg    ;;
2585c30ecadSmrg  cl | *[/\\]cl | cl.exe | *[/\\]cl.exe | \
2595c30ecadSmrg  icl | *[/\\]icl | icl.exe | *[/\\]icl.exe )
2605c30ecadSmrg    func_cl_wrapper "$@"      # Doesn't return...
2615c30ecadSmrg    ;;
2625c30ecadSmrgesac
2635c30ecadSmrg
2645c30ecadSmrgofile=
2655c30ecadSmrgcfile=
2665c30ecadSmrg
2675c30ecadSmrgfor arg
2685c30ecadSmrgdo
2695c30ecadSmrg  if test -n "$eat"; then
2705c30ecadSmrg    eat=
2715c30ecadSmrg  else
2725c30ecadSmrg    case $1 in
2735c30ecadSmrg      -o)
2745c30ecadSmrg	# configure might choose to run compile as 'compile cc -o foo foo.c'.
2755c30ecadSmrg	# So we strip '-o arg' only if arg is an object.
2765c30ecadSmrg	eat=1
2775c30ecadSmrg	case $2 in
2785c30ecadSmrg	  *.o | *.obj)
2795c30ecadSmrg	    ofile=$2
2805c30ecadSmrg	    ;;
2815c30ecadSmrg	  *)
2825c30ecadSmrg	    set x "$@" -o "$2"
2835c30ecadSmrg	    shift
2845c30ecadSmrg	    ;;
2855c30ecadSmrg	esac
2865c30ecadSmrg	;;
2875c30ecadSmrg      *.c)
2885c30ecadSmrg	cfile=$1
2895c30ecadSmrg	set x "$@" "$1"
2905c30ecadSmrg	shift
2915c30ecadSmrg	;;
2925c30ecadSmrg      *)
2935c30ecadSmrg	set x "$@" "$1"
2945c30ecadSmrg	shift
2955c30ecadSmrg	;;
2965c30ecadSmrg    esac
2975c30ecadSmrg  fi
2985c30ecadSmrg  shift
2995c30ecadSmrgdone
3005c30ecadSmrg
3015c30ecadSmrgif test -z "$ofile" || test -z "$cfile"; then
3025c30ecadSmrg  # If no '-o' option was seen then we might have been invoked from a
3035c30ecadSmrg  # pattern rule where we don't need one.  That is ok -- this is a
3045c30ecadSmrg  # normal compilation that the losing compiler can handle.  If no
3055c30ecadSmrg  # '.c' file was seen then we are probably linking.  That is also
3065c30ecadSmrg  # ok.
3075c30ecadSmrg  exec "$@"
3085c30ecadSmrgfi
3095c30ecadSmrg
3105c30ecadSmrg# Name of file we expect compiler to create.
3115c30ecadSmrgcofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'`
3125c30ecadSmrg
3135c30ecadSmrg# Create the lock directory.
3145c30ecadSmrg# Note: use '[/\\:.-]' here to ensure that we don't use the same name
3155c30ecadSmrg# that we are using for the .o file.  Also, base the name on the expected
3165c30ecadSmrg# object file name, since that is what matters with a parallel build.
3175c30ecadSmrglockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d
3185c30ecadSmrgwhile true; do
3195c30ecadSmrg  if mkdir "$lockdir" >/dev/null 2>&1; then
3205c30ecadSmrg    break
3215c30ecadSmrg  fi
3225c30ecadSmrg  sleep 1
3235c30ecadSmrgdone
3245c30ecadSmrg# FIXME: race condition here if user kills between mkdir and trap.
3255c30ecadSmrgtrap "rmdir '$lockdir'; exit 1" 1 2 15
3265c30ecadSmrg
3275c30ecadSmrg# Run the compile.
3285c30ecadSmrg"$@"
3295c30ecadSmrgret=$?
3305c30ecadSmrg
3315c30ecadSmrgif test -f "$cofile"; then
3325c30ecadSmrg  test "$cofile" = "$ofile" || mv "$cofile" "$ofile"
3335c30ecadSmrgelif test -f "${cofile}bj"; then
3345c30ecadSmrg  test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile"
3355c30ecadSmrgfi
3365c30ecadSmrg
3375c30ecadSmrgrmdir "$lockdir"
3385c30ecadSmrgexit $ret
3395c30ecadSmrg
3405c30ecadSmrg# Local Variables:
3415c30ecadSmrg# mode: shell-script
3425c30ecadSmrg# sh-indentation: 2
3435c30ecadSmrg# eval: (add-hook 'before-save-hook 'time-stamp)
3445c30ecadSmrg# time-stamp-start: "scriptversion="
3455c30ecadSmrg# time-stamp-format: "%:y-%02m-%02d.%02H"
3465c30ecadSmrg# time-stamp-time-zone: "UTC0"
3475c30ecadSmrg# time-stamp-end: "; # UTC"
3485c30ecadSmrg# End:
349