15dfecf96Smrg#! /bin/sh
21c4d503eSmrg# Wrapper for compilers which do not understand '-c -o'.
35dfecf96Smrg
4f3dfb571Smrgscriptversion=2018-03-07.03; # UTC
55dfecf96Smrg
6f3dfb571Smrg# Copyright (C) 1999-2021 Free Software Foundation, Inc.
75dfecf96Smrg# Written by Tom Tromey <tromey@cygnus.com>.
85dfecf96Smrg#
95dfecf96Smrg# This program is free software; you can redistribute it and/or modify
105dfecf96Smrg# it under the terms of the GNU General Public License as published by
115dfecf96Smrg# the Free Software Foundation; either version 2, or (at your option)
125dfecf96Smrg# any later version.
135dfecf96Smrg#
145dfecf96Smrg# This program is distributed in the hope that it will be useful,
155dfecf96Smrg# but WITHOUT ANY WARRANTY; without even the implied warranty of
165dfecf96Smrg# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
175dfecf96Smrg# GNU General Public License for more details.
185dfecf96Smrg#
195dfecf96Smrg# You should have received a copy of the GNU General Public License
20f3dfb571Smrg# along with this program.  If not, see <https://www.gnu.org/licenses/>.
215dfecf96Smrg
225dfecf96Smrg# As a special exception to the GNU General Public License, if you
235dfecf96Smrg# distribute this file as part of a program that contains a
245dfecf96Smrg# configuration script generated by Autoconf, you may include it under
255dfecf96Smrg# the same distribution terms that you use for the rest of that program.
265dfecf96Smrg
275dfecf96Smrg# This file is maintained in Automake, please report
285dfecf96Smrg# bugs to <bug-automake@gnu.org> or send patches to
295dfecf96Smrg# <automake-patches@gnu.org>.
305dfecf96Smrg
3131de2854Smrgnl='
3231de2854Smrg'
3331de2854Smrg
3431de2854Smrg# We need space, tab and new line, in precisely that order.  Quoting is
3531de2854Smrg# there to prevent tools from complaining about whitespace usage.
3631de2854SmrgIFS=" ""	$nl"
3731de2854Smrg
3831de2854Smrgfile_conv=
3931de2854Smrg
4031de2854Smrg# func_file_conv build_file lazy
4131de2854Smrg# Convert a $build file to $host form and store it in $file
421c4d503eSmrg# Currently only supports Windows hosts. If the determined conversion
4331de2854Smrg# type is listed in (the comma separated) LAZY, no conversion will
4431de2854Smrg# take place.
4531de2854Smrgfunc_file_conv ()
4631de2854Smrg{
4731de2854Smrg  file=$1
4831de2854Smrg  case $file in
4931de2854Smrg    / | /[!/]*) # absolute file, and not a UNC file
5031de2854Smrg      if test -z "$file_conv"; then
5131de2854Smrg	# lazily determine how to convert abs files
5231de2854Smrg	case `uname -s` in
5331de2854Smrg	  MINGW*)
5431de2854Smrg	    file_conv=mingw
5531de2854Smrg	    ;;
56f3dfb571Smrg	  CYGWIN* | MSYS*)
5731de2854Smrg	    file_conv=cygwin
5831de2854Smrg	    ;;
5931de2854Smrg	  *)
6031de2854Smrg	    file_conv=wine
6131de2854Smrg	    ;;
6231de2854Smrg	esac
6331de2854Smrg      fi
6431de2854Smrg      case $file_conv/,$2, in
6531de2854Smrg	*,$file_conv,*)
6631de2854Smrg	  ;;
6731de2854Smrg	mingw/*)
6831de2854Smrg	  file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'`
6931de2854Smrg	  ;;
70f3dfb571Smrg	cygwin/* | msys/*)
7131de2854Smrg	  file=`cygpath -m "$file" || echo "$file"`
7231de2854Smrg	  ;;
7331de2854Smrg	wine/*)
7431de2854Smrg	  file=`winepath -w "$file" || echo "$file"`
7531de2854Smrg	  ;;
7631de2854Smrg      esac
7731de2854Smrg      ;;
7831de2854Smrg  esac
7931de2854Smrg}
8031de2854Smrg
811c4d503eSmrg# func_cl_dashL linkdir
821c4d503eSmrg# Make cl look for libraries in LINKDIR
831c4d503eSmrgfunc_cl_dashL ()
841c4d503eSmrg{
851c4d503eSmrg  func_file_conv "$1"
861c4d503eSmrg  if test -z "$lib_path"; then
871c4d503eSmrg    lib_path=$file
881c4d503eSmrg  else
891c4d503eSmrg    lib_path="$lib_path;$file"
901c4d503eSmrg  fi
911c4d503eSmrg  linker_opts="$linker_opts -LIBPATH:$file"
921c4d503eSmrg}
931c4d503eSmrg
941c4d503eSmrg# func_cl_dashl library
951c4d503eSmrg# Do a library search-path lookup for cl
961c4d503eSmrgfunc_cl_dashl ()
971c4d503eSmrg{
981c4d503eSmrg  lib=$1
991c4d503eSmrg  found=no
1001c4d503eSmrg  save_IFS=$IFS
1011c4d503eSmrg  IFS=';'
1021c4d503eSmrg  for dir in $lib_path $LIB
1031c4d503eSmrg  do
1041c4d503eSmrg    IFS=$save_IFS
1051c4d503eSmrg    if $shared && test -f "$dir/$lib.dll.lib"; then
1061c4d503eSmrg      found=yes
1071c4d503eSmrg      lib=$dir/$lib.dll.lib
1081c4d503eSmrg      break
1091c4d503eSmrg    fi
1101c4d503eSmrg    if test -f "$dir/$lib.lib"; then
1111c4d503eSmrg      found=yes
1121c4d503eSmrg      lib=$dir/$lib.lib
1131c4d503eSmrg      break
1141c4d503eSmrg    fi
1151c4d503eSmrg    if test -f "$dir/lib$lib.a"; then
1161c4d503eSmrg      found=yes
1171c4d503eSmrg      lib=$dir/lib$lib.a
1181c4d503eSmrg      break
1191c4d503eSmrg    fi
1201c4d503eSmrg  done
1211c4d503eSmrg  IFS=$save_IFS
1221c4d503eSmrg
1231c4d503eSmrg  if test "$found" != yes; then
1241c4d503eSmrg    lib=$lib.lib
1251c4d503eSmrg  fi
1261c4d503eSmrg}
1271c4d503eSmrg
12831de2854Smrg# func_cl_wrapper cl arg...
12931de2854Smrg# Adjust compile command to suit cl
13031de2854Smrgfunc_cl_wrapper ()
13131de2854Smrg{
13231de2854Smrg  # Assume a capable shell
13331de2854Smrg  lib_path=
13431de2854Smrg  shared=:
13531de2854Smrg  linker_opts=
13631de2854Smrg  for arg
13731de2854Smrg  do
13831de2854Smrg    if test -n "$eat"; then
13931de2854Smrg      eat=
14031de2854Smrg    else
14131de2854Smrg      case $1 in
14231de2854Smrg	-o)
1431c4d503eSmrg	  # configure might choose to run compile as 'compile cc -o foo foo.c'.
14431de2854Smrg	  eat=1
14531de2854Smrg	  case $2 in
14631de2854Smrg	    *.o | *.[oO][bB][jJ])
14731de2854Smrg	      func_file_conv "$2"
14831de2854Smrg	      set x "$@" -Fo"$file"
14931de2854Smrg	      shift
15031de2854Smrg	      ;;
15131de2854Smrg	    *)
15231de2854Smrg	      func_file_conv "$2"
15331de2854Smrg	      set x "$@" -Fe"$file"
15431de2854Smrg	      shift
15531de2854Smrg	      ;;
15631de2854Smrg	  esac
15731de2854Smrg	  ;;
1581c4d503eSmrg	-I)
1591c4d503eSmrg	  eat=1
1601c4d503eSmrg	  func_file_conv "$2" mingw
1611c4d503eSmrg	  set x "$@" -I"$file"
1621c4d503eSmrg	  shift
1631c4d503eSmrg	  ;;
16431de2854Smrg	-I*)
16531de2854Smrg	  func_file_conv "${1#-I}" mingw
16631de2854Smrg	  set x "$@" -I"$file"
16731de2854Smrg	  shift
16831de2854Smrg	  ;;
1691c4d503eSmrg	-l)
1701c4d503eSmrg	  eat=1
1711c4d503eSmrg	  func_cl_dashl "$2"
1721c4d503eSmrg	  set x "$@" "$lib"
1731c4d503eSmrg	  shift
1741c4d503eSmrg	  ;;
17531de2854Smrg	-l*)
1761c4d503eSmrg	  func_cl_dashl "${1#-l}"
1771c4d503eSmrg	  set x "$@" "$lib"
17831de2854Smrg	  shift
17931de2854Smrg	  ;;
1801c4d503eSmrg	-L)
1811c4d503eSmrg	  eat=1
1821c4d503eSmrg	  func_cl_dashL "$2"
1831c4d503eSmrg	  ;;
18431de2854Smrg	-L*)
1851c4d503eSmrg	  func_cl_dashL "${1#-L}"
18631de2854Smrg	  ;;
18731de2854Smrg	-static)
18831de2854Smrg	  shared=false
18931de2854Smrg	  ;;
19031de2854Smrg	-Wl,*)
19131de2854Smrg	  arg=${1#-Wl,}
19231de2854Smrg	  save_ifs="$IFS"; IFS=','
19331de2854Smrg	  for flag in $arg; do
19431de2854Smrg	    IFS="$save_ifs"
19531de2854Smrg	    linker_opts="$linker_opts $flag"
19631de2854Smrg	  done
19731de2854Smrg	  IFS="$save_ifs"
19831de2854Smrg	  ;;
19931de2854Smrg	-Xlinker)
20031de2854Smrg	  eat=1
20131de2854Smrg	  linker_opts="$linker_opts $2"
20231de2854Smrg	  ;;
20331de2854Smrg	-*)
20431de2854Smrg	  set x "$@" "$1"
20531de2854Smrg	  shift
20631de2854Smrg	  ;;
20731de2854Smrg	*.cc | *.CC | *.cxx | *.CXX | *.[cC]++)
20831de2854Smrg	  func_file_conv "$1"
20931de2854Smrg	  set x "$@" -Tp"$file"
21031de2854Smrg	  shift
21131de2854Smrg	  ;;
21231de2854Smrg	*.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO])
21331de2854Smrg	  func_file_conv "$1" mingw
21431de2854Smrg	  set x "$@" "$file"
21531de2854Smrg	  shift
21631de2854Smrg	  ;;
21731de2854Smrg	*)
21831de2854Smrg	  set x "$@" "$1"
21931de2854Smrg	  shift
22031de2854Smrg	  ;;
22131de2854Smrg      esac
22231de2854Smrg    fi
22331de2854Smrg    shift
22431de2854Smrg  done
22531de2854Smrg  if test -n "$linker_opts"; then
22631de2854Smrg    linker_opts="-link$linker_opts"
22731de2854Smrg  fi
22831de2854Smrg  exec "$@" $linker_opts
22931de2854Smrg  exit 1
23031de2854Smrg}
23131de2854Smrg
23231de2854Smrgeat=
23331de2854Smrg
2345dfecf96Smrgcase $1 in
2355dfecf96Smrg  '')
2361c4d503eSmrg     echo "$0: No command.  Try '$0 --help' for more information." 1>&2
2375dfecf96Smrg     exit 1;
2385dfecf96Smrg     ;;
2395dfecf96Smrg  -h | --h*)
2405dfecf96Smrg    cat <<\EOF
2415dfecf96SmrgUsage: compile [--help] [--version] PROGRAM [ARGS]
2425dfecf96Smrg
2431c4d503eSmrgWrapper for compilers which do not understand '-c -o'.
2441c4d503eSmrgRemove '-o dest.o' from ARGS, run PROGRAM with the remaining
2455dfecf96Smrgarguments, and rename the output as expected.
2465dfecf96Smrg
2475dfecf96SmrgIf you are trying to build a whole package this is not the
2481c4d503eSmrgright script to run: please start by reading the file 'INSTALL'.
2495dfecf96Smrg
2505dfecf96SmrgReport bugs to <bug-automake@gnu.org>.
2515dfecf96SmrgEOF
2525dfecf96Smrg    exit $?
2535dfecf96Smrg    ;;
2545dfecf96Smrg  -v | --v*)
2555dfecf96Smrg    echo "compile $scriptversion"
2565dfecf96Smrg    exit $?
2575dfecf96Smrg    ;;
258f3dfb571Smrg  cl | *[/\\]cl | cl.exe | *[/\\]cl.exe | \
259f3dfb571Smrg  icl | *[/\\]icl | icl.exe | *[/\\]icl.exe )
26031de2854Smrg    func_cl_wrapper "$@"      # Doesn't return...
26131de2854Smrg    ;;
2625dfecf96Smrgesac
2635dfecf96Smrg
2645dfecf96Smrgofile=
2655dfecf96Smrgcfile=
2665dfecf96Smrg
2675dfecf96Smrgfor arg
2685dfecf96Smrgdo
2695dfecf96Smrg  if test -n "$eat"; then
2705dfecf96Smrg    eat=
2715dfecf96Smrg  else
2725dfecf96Smrg    case $1 in
2735dfecf96Smrg      -o)
2741c4d503eSmrg	# configure might choose to run compile as 'compile cc -o foo foo.c'.
2751c4d503eSmrg	# So we strip '-o arg' only if arg is an object.
2765dfecf96Smrg	eat=1
2775dfecf96Smrg	case $2 in
2785dfecf96Smrg	  *.o | *.obj)
2795dfecf96Smrg	    ofile=$2
2805dfecf96Smrg	    ;;
2815dfecf96Smrg	  *)
2825dfecf96Smrg	    set x "$@" -o "$2"
2835dfecf96Smrg	    shift
2845dfecf96Smrg	    ;;
2855dfecf96Smrg	esac
2865dfecf96Smrg	;;
2875dfecf96Smrg      *.c)
2885dfecf96Smrg	cfile=$1
2895dfecf96Smrg	set x "$@" "$1"
2905dfecf96Smrg	shift
2915dfecf96Smrg	;;
2925dfecf96Smrg      *)
2935dfecf96Smrg	set x "$@" "$1"
2945dfecf96Smrg	shift
2955dfecf96Smrg	;;
2965dfecf96Smrg    esac
2975dfecf96Smrg  fi
2985dfecf96Smrg  shift
2995dfecf96Smrgdone
3005dfecf96Smrg
3015dfecf96Smrgif test -z "$ofile" || test -z "$cfile"; then
3021c4d503eSmrg  # If no '-o' option was seen then we might have been invoked from a
3035dfecf96Smrg  # pattern rule where we don't need one.  That is ok -- this is a
3045dfecf96Smrg  # normal compilation that the losing compiler can handle.  If no
3051c4d503eSmrg  # '.c' file was seen then we are probably linking.  That is also
3065dfecf96Smrg  # ok.
3075dfecf96Smrg  exec "$@"
3085dfecf96Smrgfi
3095dfecf96Smrg
3105dfecf96Smrg# Name of file we expect compiler to create.
311c05e22d7Smrgcofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'`
3125dfecf96Smrg
3135dfecf96Smrg# Create the lock directory.
3141c4d503eSmrg# Note: use '[/\\:.-]' here to ensure that we don't use the same name
3155dfecf96Smrg# that we are using for the .o file.  Also, base the name on the expected
3165dfecf96Smrg# object file name, since that is what matters with a parallel build.
317c05e22d7Smrglockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d
3185dfecf96Smrgwhile true; do
3195dfecf96Smrg  if mkdir "$lockdir" >/dev/null 2>&1; then
3205dfecf96Smrg    break
3215dfecf96Smrg  fi
3225dfecf96Smrg  sleep 1
3235dfecf96Smrgdone
3245dfecf96Smrg# FIXME: race condition here if user kills between mkdir and trap.
3255dfecf96Smrgtrap "rmdir '$lockdir'; exit 1" 1 2 15
3265dfecf96Smrg
3275dfecf96Smrg# Run the compile.
3285dfecf96Smrg"$@"
3295dfecf96Smrgret=$?
3305dfecf96Smrg
3315dfecf96Smrgif test -f "$cofile"; then
332c05e22d7Smrg  test "$cofile" = "$ofile" || mv "$cofile" "$ofile"
3335dfecf96Smrgelif test -f "${cofile}bj"; then
334c05e22d7Smrg  test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile"
3355dfecf96Smrgfi
3365dfecf96Smrg
3375dfecf96Smrgrmdir "$lockdir"
3385dfecf96Smrgexit $ret
3395dfecf96Smrg
3405dfecf96Smrg# Local Variables:
3415dfecf96Smrg# mode: shell-script
3425dfecf96Smrg# sh-indentation: 2
343f3dfb571Smrg# eval: (add-hook 'before-save-hook 'time-stamp)
3445dfecf96Smrg# time-stamp-start: "scriptversion="
3455dfecf96Smrg# time-stamp-format: "%:y-%02m-%02d.%02H"
346f3dfb571Smrg# time-stamp-time-zone: "UTC0"
347c05e22d7Smrg# time-stamp-end: "; # UTC"
3485dfecf96Smrg# End:
349