16f03b1f6Smrg#! /bin/sh
2dcbf891fSmrg# Wrapper for compilers which do not understand '-c -o'.
36f03b1f6Smrg
4cfcf9057Smrgscriptversion=2018-03-07.03; # UTC
56f03b1f6Smrg
640613eb2Smrg# Copyright (C) 1999-2021 Free Software Foundation, Inc.
76f03b1f6Smrg# Written by Tom Tromey <tromey@cygnus.com>.
86f03b1f6Smrg#
96f03b1f6Smrg# This program is free software; you can redistribute it and/or modify
106f03b1f6Smrg# it under the terms of the GNU General Public License as published by
116f03b1f6Smrg# the Free Software Foundation; either version 2, or (at your option)
126f03b1f6Smrg# any later version.
136f03b1f6Smrg#
146f03b1f6Smrg# This program is distributed in the hope that it will be useful,
156f03b1f6Smrg# but WITHOUT ANY WARRANTY; without even the implied warranty of
166f03b1f6Smrg# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
176f03b1f6Smrg# GNU General Public License for more details.
186f03b1f6Smrg#
196f03b1f6Smrg# You should have received a copy of the GNU General Public License
20cfcf9057Smrg# along with this program.  If not, see <https://www.gnu.org/licenses/>.
216f03b1f6Smrg
226f03b1f6Smrg# As a special exception to the GNU General Public License, if you
236f03b1f6Smrg# distribute this file as part of a program that contains a
246f03b1f6Smrg# configuration script generated by Autoconf, you may include it under
256f03b1f6Smrg# the same distribution terms that you use for the rest of that program.
266f03b1f6Smrg
276f03b1f6Smrg# This file is maintained in Automake, please report
286f03b1f6Smrg# bugs to <bug-automake@gnu.org> or send patches to
296f03b1f6Smrg# <automake-patches@gnu.org>.
306f03b1f6Smrg
31dcbf891fSmrgnl='
32dcbf891fSmrg'
33dcbf891fSmrg
34dcbf891fSmrg# We need space, tab and new line, in precisely that order.  Quoting is
35dcbf891fSmrg# there to prevent tools from complaining about whitespace usage.
36dcbf891fSmrgIFS=" ""	$nl"
37dcbf891fSmrg
38dcbf891fSmrgfile_conv=
39dcbf891fSmrg
40dcbf891fSmrg# func_file_conv build_file lazy
41dcbf891fSmrg# Convert a $build file to $host form and store it in $file
42dcbf891fSmrg# Currently only supports Windows hosts. If the determined conversion
43dcbf891fSmrg# type is listed in (the comma separated) LAZY, no conversion will
44dcbf891fSmrg# take place.
45dcbf891fSmrgfunc_file_conv ()
46dcbf891fSmrg{
47dcbf891fSmrg  file=$1
48dcbf891fSmrg  case $file in
49dcbf891fSmrg    / | /[!/]*) # absolute file, and not a UNC file
50dcbf891fSmrg      if test -z "$file_conv"; then
51dcbf891fSmrg	# lazily determine how to convert abs files
52dcbf891fSmrg	case `uname -s` in
53dcbf891fSmrg	  MINGW*)
54dcbf891fSmrg	    file_conv=mingw
55dcbf891fSmrg	    ;;
5640613eb2Smrg	  CYGWIN* | MSYS*)
57dcbf891fSmrg	    file_conv=cygwin
58dcbf891fSmrg	    ;;
59dcbf891fSmrg	  *)
60dcbf891fSmrg	    file_conv=wine
61dcbf891fSmrg	    ;;
62dcbf891fSmrg	esac
63dcbf891fSmrg      fi
64dcbf891fSmrg      case $file_conv/,$2, in
65dcbf891fSmrg	*,$file_conv,*)
66dcbf891fSmrg	  ;;
67dcbf891fSmrg	mingw/*)
68dcbf891fSmrg	  file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'`
69dcbf891fSmrg	  ;;
7040613eb2Smrg	cygwin/* | msys/*)
71dcbf891fSmrg	  file=`cygpath -m "$file" || echo "$file"`
72dcbf891fSmrg	  ;;
73dcbf891fSmrg	wine/*)
74dcbf891fSmrg	  file=`winepath -w "$file" || echo "$file"`
75dcbf891fSmrg	  ;;
76dcbf891fSmrg      esac
77dcbf891fSmrg      ;;
78dcbf891fSmrg  esac
79dcbf891fSmrg}
80dcbf891fSmrg
81dcbf891fSmrg# func_cl_dashL linkdir
82dcbf891fSmrg# Make cl look for libraries in LINKDIR
83dcbf891fSmrgfunc_cl_dashL ()
84dcbf891fSmrg{
85dcbf891fSmrg  func_file_conv "$1"
86dcbf891fSmrg  if test -z "$lib_path"; then
87dcbf891fSmrg    lib_path=$file
88dcbf891fSmrg  else
89dcbf891fSmrg    lib_path="$lib_path;$file"
90dcbf891fSmrg  fi
91dcbf891fSmrg  linker_opts="$linker_opts -LIBPATH:$file"
92dcbf891fSmrg}
93dcbf891fSmrg
94dcbf891fSmrg# func_cl_dashl library
95dcbf891fSmrg# Do a library search-path lookup for cl
96dcbf891fSmrgfunc_cl_dashl ()
97dcbf891fSmrg{
98dcbf891fSmrg  lib=$1
99dcbf891fSmrg  found=no
100dcbf891fSmrg  save_IFS=$IFS
101dcbf891fSmrg  IFS=';'
102dcbf891fSmrg  for dir in $lib_path $LIB
103dcbf891fSmrg  do
104dcbf891fSmrg    IFS=$save_IFS
105dcbf891fSmrg    if $shared && test -f "$dir/$lib.dll.lib"; then
106dcbf891fSmrg      found=yes
107dcbf891fSmrg      lib=$dir/$lib.dll.lib
108dcbf891fSmrg      break
109dcbf891fSmrg    fi
110dcbf891fSmrg    if test -f "$dir/$lib.lib"; then
111dcbf891fSmrg      found=yes
112dcbf891fSmrg      lib=$dir/$lib.lib
113dcbf891fSmrg      break
114dcbf891fSmrg    fi
115dcbf891fSmrg    if test -f "$dir/lib$lib.a"; then
116dcbf891fSmrg      found=yes
117dcbf891fSmrg      lib=$dir/lib$lib.a
118dcbf891fSmrg      break
119dcbf891fSmrg    fi
120dcbf891fSmrg  done
121dcbf891fSmrg  IFS=$save_IFS
122dcbf891fSmrg
123dcbf891fSmrg  if test "$found" != yes; then
124dcbf891fSmrg    lib=$lib.lib
125dcbf891fSmrg  fi
126dcbf891fSmrg}
127dcbf891fSmrg
128dcbf891fSmrg# func_cl_wrapper cl arg...
129dcbf891fSmrg# Adjust compile command to suit cl
130dcbf891fSmrgfunc_cl_wrapper ()
131dcbf891fSmrg{
132dcbf891fSmrg  # Assume a capable shell
133dcbf891fSmrg  lib_path=
134dcbf891fSmrg  shared=:
135dcbf891fSmrg  linker_opts=
136dcbf891fSmrg  for arg
137dcbf891fSmrg  do
138dcbf891fSmrg    if test -n "$eat"; then
139dcbf891fSmrg      eat=
140dcbf891fSmrg    else
141dcbf891fSmrg      case $1 in
142dcbf891fSmrg	-o)
143dcbf891fSmrg	  # configure might choose to run compile as 'compile cc -o foo foo.c'.
144dcbf891fSmrg	  eat=1
145dcbf891fSmrg	  case $2 in
146dcbf891fSmrg	    *.o | *.[oO][bB][jJ])
147dcbf891fSmrg	      func_file_conv "$2"
148dcbf891fSmrg	      set x "$@" -Fo"$file"
149dcbf891fSmrg	      shift
150dcbf891fSmrg	      ;;
151dcbf891fSmrg	    *)
152dcbf891fSmrg	      func_file_conv "$2"
153dcbf891fSmrg	      set x "$@" -Fe"$file"
154dcbf891fSmrg	      shift
155dcbf891fSmrg	      ;;
156dcbf891fSmrg	  esac
157dcbf891fSmrg	  ;;
158dcbf891fSmrg	-I)
159dcbf891fSmrg	  eat=1
160dcbf891fSmrg	  func_file_conv "$2" mingw
161dcbf891fSmrg	  set x "$@" -I"$file"
162dcbf891fSmrg	  shift
163dcbf891fSmrg	  ;;
164dcbf891fSmrg	-I*)
165dcbf891fSmrg	  func_file_conv "${1#-I}" mingw
166dcbf891fSmrg	  set x "$@" -I"$file"
167dcbf891fSmrg	  shift
168dcbf891fSmrg	  ;;
169dcbf891fSmrg	-l)
170dcbf891fSmrg	  eat=1
171dcbf891fSmrg	  func_cl_dashl "$2"
172dcbf891fSmrg	  set x "$@" "$lib"
173dcbf891fSmrg	  shift
174dcbf891fSmrg	  ;;
175dcbf891fSmrg	-l*)
176dcbf891fSmrg	  func_cl_dashl "${1#-l}"
177dcbf891fSmrg	  set x "$@" "$lib"
178dcbf891fSmrg	  shift
179dcbf891fSmrg	  ;;
180dcbf891fSmrg	-L)
181dcbf891fSmrg	  eat=1
182dcbf891fSmrg	  func_cl_dashL "$2"
183dcbf891fSmrg	  ;;
184dcbf891fSmrg	-L*)
185dcbf891fSmrg	  func_cl_dashL "${1#-L}"
186dcbf891fSmrg	  ;;
187dcbf891fSmrg	-static)
188dcbf891fSmrg	  shared=false
189dcbf891fSmrg	  ;;
190dcbf891fSmrg	-Wl,*)
191dcbf891fSmrg	  arg=${1#-Wl,}
192dcbf891fSmrg	  save_ifs="$IFS"; IFS=','
193dcbf891fSmrg	  for flag in $arg; do
194dcbf891fSmrg	    IFS="$save_ifs"
195dcbf891fSmrg	    linker_opts="$linker_opts $flag"
196dcbf891fSmrg	  done
197dcbf891fSmrg	  IFS="$save_ifs"
198dcbf891fSmrg	  ;;
199dcbf891fSmrg	-Xlinker)
200dcbf891fSmrg	  eat=1
201dcbf891fSmrg	  linker_opts="$linker_opts $2"
202dcbf891fSmrg	  ;;
203dcbf891fSmrg	-*)
204dcbf891fSmrg	  set x "$@" "$1"
205dcbf891fSmrg	  shift
206dcbf891fSmrg	  ;;
207dcbf891fSmrg	*.cc | *.CC | *.cxx | *.CXX | *.[cC]++)
208dcbf891fSmrg	  func_file_conv "$1"
209dcbf891fSmrg	  set x "$@" -Tp"$file"
210dcbf891fSmrg	  shift
211dcbf891fSmrg	  ;;
212dcbf891fSmrg	*.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO])
213dcbf891fSmrg	  func_file_conv "$1" mingw
214dcbf891fSmrg	  set x "$@" "$file"
215dcbf891fSmrg	  shift
216dcbf891fSmrg	  ;;
217dcbf891fSmrg	*)
218dcbf891fSmrg	  set x "$@" "$1"
219dcbf891fSmrg	  shift
220dcbf891fSmrg	  ;;
221dcbf891fSmrg      esac
222dcbf891fSmrg    fi
223dcbf891fSmrg    shift
224dcbf891fSmrg  done
225dcbf891fSmrg  if test -n "$linker_opts"; then
226dcbf891fSmrg    linker_opts="-link$linker_opts"
227dcbf891fSmrg  fi
228dcbf891fSmrg  exec "$@" $linker_opts
229dcbf891fSmrg  exit 1
230dcbf891fSmrg}
231dcbf891fSmrg
232dcbf891fSmrgeat=
233dcbf891fSmrg
2346f03b1f6Smrgcase $1 in
2356f03b1f6Smrg  '')
236dcbf891fSmrg     echo "$0: No command.  Try '$0 --help' for more information." 1>&2
2376f03b1f6Smrg     exit 1;
2386f03b1f6Smrg     ;;
2396f03b1f6Smrg  -h | --h*)
2406f03b1f6Smrg    cat <<\EOF
2416f03b1f6SmrgUsage: compile [--help] [--version] PROGRAM [ARGS]
2426f03b1f6Smrg
243dcbf891fSmrgWrapper for compilers which do not understand '-c -o'.
244dcbf891fSmrgRemove '-o dest.o' from ARGS, run PROGRAM with the remaining
2456f03b1f6Smrgarguments, and rename the output as expected.
2466f03b1f6Smrg
2476f03b1f6SmrgIf you are trying to build a whole package this is not the
248dcbf891fSmrgright script to run: please start by reading the file 'INSTALL'.
2496f03b1f6Smrg
2506f03b1f6SmrgReport bugs to <bug-automake@gnu.org>.
2516f03b1f6SmrgEOF
2526f03b1f6Smrg    exit $?
2536f03b1f6Smrg    ;;
2546f03b1f6Smrg  -v | --v*)
2556f03b1f6Smrg    echo "compile $scriptversion"
2566f03b1f6Smrg    exit $?
2576f03b1f6Smrg    ;;
258cfcf9057Smrg  cl | *[/\\]cl | cl.exe | *[/\\]cl.exe | \
259cfcf9057Smrg  icl | *[/\\]icl | icl.exe | *[/\\]icl.exe )
260dcbf891fSmrg    func_cl_wrapper "$@"      # Doesn't return...
261dcbf891fSmrg    ;;
2626f03b1f6Smrgesac
2636f03b1f6Smrg
2646f03b1f6Smrgofile=
2656f03b1f6Smrgcfile=
2666f03b1f6Smrg
2676f03b1f6Smrgfor arg
2686f03b1f6Smrgdo
2696f03b1f6Smrg  if test -n "$eat"; then
2706f03b1f6Smrg    eat=
2716f03b1f6Smrg  else
2726f03b1f6Smrg    case $1 in
2736f03b1f6Smrg      -o)
274dcbf891fSmrg	# configure might choose to run compile as 'compile cc -o foo foo.c'.
275dcbf891fSmrg	# So we strip '-o arg' only if arg is an object.
2766f03b1f6Smrg	eat=1
2776f03b1f6Smrg	case $2 in
2786f03b1f6Smrg	  *.o | *.obj)
2796f03b1f6Smrg	    ofile=$2
2806f03b1f6Smrg	    ;;
2816f03b1f6Smrg	  *)
2826f03b1f6Smrg	    set x "$@" -o "$2"
2836f03b1f6Smrg	    shift
2846f03b1f6Smrg	    ;;
2856f03b1f6Smrg	esac
2866f03b1f6Smrg	;;
2876f03b1f6Smrg      *.c)
2886f03b1f6Smrg	cfile=$1
2896f03b1f6Smrg	set x "$@" "$1"
2906f03b1f6Smrg	shift
2916f03b1f6Smrg	;;
2926f03b1f6Smrg      *)
2936f03b1f6Smrg	set x "$@" "$1"
2946f03b1f6Smrg	shift
2956f03b1f6Smrg	;;
2966f03b1f6Smrg    esac
2976f03b1f6Smrg  fi
2986f03b1f6Smrg  shift
2996f03b1f6Smrgdone
3006f03b1f6Smrg
3016f03b1f6Smrgif test -z "$ofile" || test -z "$cfile"; then
302dcbf891fSmrg  # If no '-o' option was seen then we might have been invoked from a
3036f03b1f6Smrg  # pattern rule where we don't need one.  That is ok -- this is a
3046f03b1f6Smrg  # normal compilation that the losing compiler can handle.  If no
305dcbf891fSmrg  # '.c' file was seen then we are probably linking.  That is also
3066f03b1f6Smrg  # ok.
3076f03b1f6Smrg  exec "$@"
3086f03b1f6Smrgfi
3096f03b1f6Smrg
3106f03b1f6Smrg# Name of file we expect compiler to create.
311dcbf891fSmrgcofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'`
3126f03b1f6Smrg
3136f03b1f6Smrg# Create the lock directory.
314dcbf891fSmrg# Note: use '[/\\:.-]' here to ensure that we don't use the same name
3156f03b1f6Smrg# that we are using for the .o file.  Also, base the name on the expected
3166f03b1f6Smrg# object file name, since that is what matters with a parallel build.
317dcbf891fSmrglockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d
3186f03b1f6Smrgwhile true; do
3196f03b1f6Smrg  if mkdir "$lockdir" >/dev/null 2>&1; then
3206f03b1f6Smrg    break
3216f03b1f6Smrg  fi
3226f03b1f6Smrg  sleep 1
3236f03b1f6Smrgdone
3246f03b1f6Smrg# FIXME: race condition here if user kills between mkdir and trap.
3256f03b1f6Smrgtrap "rmdir '$lockdir'; exit 1" 1 2 15
3266f03b1f6Smrg
3276f03b1f6Smrg# Run the compile.
3286f03b1f6Smrg"$@"
3296f03b1f6Smrgret=$?
3306f03b1f6Smrg
3316f03b1f6Smrgif test -f "$cofile"; then
332dcbf891fSmrg  test "$cofile" = "$ofile" || mv "$cofile" "$ofile"
3336f03b1f6Smrgelif test -f "${cofile}bj"; then
334dcbf891fSmrg  test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile"
3356f03b1f6Smrgfi
3366f03b1f6Smrg
3376f03b1f6Smrgrmdir "$lockdir"
3386f03b1f6Smrgexit $ret
3396f03b1f6Smrg
3406f03b1f6Smrg# Local Variables:
3416f03b1f6Smrg# mode: shell-script
3426f03b1f6Smrg# sh-indentation: 2
343cfcf9057Smrg# eval: (add-hook 'before-save-hook 'time-stamp)
3446f03b1f6Smrg# time-stamp-start: "scriptversion="
3456f03b1f6Smrg# time-stamp-format: "%:y-%02m-%02d.%02H"
346cfcf9057Smrg# time-stamp-time-zone: "UTC0"
347dcbf891fSmrg# time-stamp-end: "; # UTC"
3486f03b1f6Smrg# End:
349