1e6d2e958Smrg#! /bin/sh
2e6d2e958Smrg# Wrapper for compilers which do not understand '-c -o'.
3e6d2e958Smrg
46ad5a0e2Smrgscriptversion=2018-03-07.03; # UTC
5e6d2e958Smrg
6a392d4f3Smrg# Copyright (C) 1999-2021 Free Software Foundation, Inc.
7e6d2e958Smrg# Written by Tom Tromey <tromey@cygnus.com>.
8e6d2e958Smrg#
9e6d2e958Smrg# This program is free software; you can redistribute it and/or modify
10e6d2e958Smrg# it under the terms of the GNU General Public License as published by
11e6d2e958Smrg# the Free Software Foundation; either version 2, or (at your option)
12e6d2e958Smrg# any later version.
13e6d2e958Smrg#
14e6d2e958Smrg# This program is distributed in the hope that it will be useful,
15e6d2e958Smrg# but WITHOUT ANY WARRANTY; without even the implied warranty of
16e6d2e958Smrg# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17e6d2e958Smrg# GNU General Public License for more details.
18e6d2e958Smrg#
19e6d2e958Smrg# You should have received a copy of the GNU General Public License
206ad5a0e2Smrg# along with this program.  If not, see <https://www.gnu.org/licenses/>.
21e6d2e958Smrg
22e6d2e958Smrg# As a special exception to the GNU General Public License, if you
23e6d2e958Smrg# distribute this file as part of a program that contains a
24e6d2e958Smrg# configuration script generated by Autoconf, you may include it under
25e6d2e958Smrg# the same distribution terms that you use for the rest of that program.
26e6d2e958Smrg
27e6d2e958Smrg# This file is maintained in Automake, please report
28e6d2e958Smrg# bugs to <bug-automake@gnu.org> or send patches to
29e6d2e958Smrg# <automake-patches@gnu.org>.
30e6d2e958Smrg
31e6d2e958Smrgnl='
32e6d2e958Smrg'
33e6d2e958Smrg
34e6d2e958Smrg# We need space, tab and new line, in precisely that order.  Quoting is
35e6d2e958Smrg# there to prevent tools from complaining about whitespace usage.
36e6d2e958SmrgIFS=" ""	$nl"
37e6d2e958Smrg
38e6d2e958Smrgfile_conv=
39e6d2e958Smrg
40e6d2e958Smrg# func_file_conv build_file lazy
41e6d2e958Smrg# Convert a $build file to $host form and store it in $file
42e6d2e958Smrg# Currently only supports Windows hosts. If the determined conversion
43e6d2e958Smrg# type is listed in (the comma separated) LAZY, no conversion will
44e6d2e958Smrg# take place.
45e6d2e958Smrgfunc_file_conv ()
46e6d2e958Smrg{
47e6d2e958Smrg  file=$1
48e6d2e958Smrg  case $file in
49e6d2e958Smrg    / | /[!/]*) # absolute file, and not a UNC file
50e6d2e958Smrg      if test -z "$file_conv"; then
51e6d2e958Smrg	# lazily determine how to convert abs files
52e6d2e958Smrg	case `uname -s` in
53e6d2e958Smrg	  MINGW*)
54e6d2e958Smrg	    file_conv=mingw
55e6d2e958Smrg	    ;;
566ad5a0e2Smrg	  CYGWIN* | MSYS*)
57e6d2e958Smrg	    file_conv=cygwin
58e6d2e958Smrg	    ;;
59e6d2e958Smrg	  *)
60e6d2e958Smrg	    file_conv=wine
61e6d2e958Smrg	    ;;
62e6d2e958Smrg	esac
63e6d2e958Smrg      fi
64e6d2e958Smrg      case $file_conv/,$2, in
65e6d2e958Smrg	*,$file_conv,*)
66e6d2e958Smrg	  ;;
67e6d2e958Smrg	mingw/*)
68e6d2e958Smrg	  file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'`
69e6d2e958Smrg	  ;;
706ad5a0e2Smrg	cygwin/* | msys/*)
71e6d2e958Smrg	  file=`cygpath -m "$file" || echo "$file"`
72e6d2e958Smrg	  ;;
73e6d2e958Smrg	wine/*)
74e6d2e958Smrg	  file=`winepath -w "$file" || echo "$file"`
75e6d2e958Smrg	  ;;
76e6d2e958Smrg      esac
77e6d2e958Smrg      ;;
78e6d2e958Smrg  esac
79e6d2e958Smrg}
80e6d2e958Smrg
81e6d2e958Smrg# func_cl_dashL linkdir
82e6d2e958Smrg# Make cl look for libraries in LINKDIR
83e6d2e958Smrgfunc_cl_dashL ()
84e6d2e958Smrg{
85e6d2e958Smrg  func_file_conv "$1"
86e6d2e958Smrg  if test -z "$lib_path"; then
87e6d2e958Smrg    lib_path=$file
88e6d2e958Smrg  else
89e6d2e958Smrg    lib_path="$lib_path;$file"
90e6d2e958Smrg  fi
91e6d2e958Smrg  linker_opts="$linker_opts -LIBPATH:$file"
92e6d2e958Smrg}
93e6d2e958Smrg
94e6d2e958Smrg# func_cl_dashl library
95e6d2e958Smrg# Do a library search-path lookup for cl
96e6d2e958Smrgfunc_cl_dashl ()
97e6d2e958Smrg{
98e6d2e958Smrg  lib=$1
99e6d2e958Smrg  found=no
100e6d2e958Smrg  save_IFS=$IFS
101e6d2e958Smrg  IFS=';'
102e6d2e958Smrg  for dir in $lib_path $LIB
103e6d2e958Smrg  do
104e6d2e958Smrg    IFS=$save_IFS
105e6d2e958Smrg    if $shared && test -f "$dir/$lib.dll.lib"; then
106e6d2e958Smrg      found=yes
107e6d2e958Smrg      lib=$dir/$lib.dll.lib
108e6d2e958Smrg      break
109e6d2e958Smrg    fi
110e6d2e958Smrg    if test -f "$dir/$lib.lib"; then
111e6d2e958Smrg      found=yes
112e6d2e958Smrg      lib=$dir/$lib.lib
113e6d2e958Smrg      break
114e6d2e958Smrg    fi
115e6d2e958Smrg    if test -f "$dir/lib$lib.a"; then
116e6d2e958Smrg      found=yes
117e6d2e958Smrg      lib=$dir/lib$lib.a
118e6d2e958Smrg      break
119e6d2e958Smrg    fi
120e6d2e958Smrg  done
121e6d2e958Smrg  IFS=$save_IFS
122e6d2e958Smrg
123e6d2e958Smrg  if test "$found" != yes; then
124e6d2e958Smrg    lib=$lib.lib
125e6d2e958Smrg  fi
126e6d2e958Smrg}
127e6d2e958Smrg
128e6d2e958Smrg# func_cl_wrapper cl arg...
129e6d2e958Smrg# Adjust compile command to suit cl
130e6d2e958Smrgfunc_cl_wrapper ()
131e6d2e958Smrg{
132e6d2e958Smrg  # Assume a capable shell
133e6d2e958Smrg  lib_path=
134e6d2e958Smrg  shared=:
135e6d2e958Smrg  linker_opts=
136e6d2e958Smrg  for arg
137e6d2e958Smrg  do
138e6d2e958Smrg    if test -n "$eat"; then
139e6d2e958Smrg      eat=
140e6d2e958Smrg    else
141e6d2e958Smrg      case $1 in
142e6d2e958Smrg	-o)
143e6d2e958Smrg	  # configure might choose to run compile as 'compile cc -o foo foo.c'.
144e6d2e958Smrg	  eat=1
145e6d2e958Smrg	  case $2 in
146e6d2e958Smrg	    *.o | *.[oO][bB][jJ])
147e6d2e958Smrg	      func_file_conv "$2"
148e6d2e958Smrg	      set x "$@" -Fo"$file"
149e6d2e958Smrg	      shift
150e6d2e958Smrg	      ;;
151e6d2e958Smrg	    *)
152e6d2e958Smrg	      func_file_conv "$2"
153e6d2e958Smrg	      set x "$@" -Fe"$file"
154e6d2e958Smrg	      shift
155e6d2e958Smrg	      ;;
156e6d2e958Smrg	  esac
157e6d2e958Smrg	  ;;
158e6d2e958Smrg	-I)
159e6d2e958Smrg	  eat=1
160e6d2e958Smrg	  func_file_conv "$2" mingw
161e6d2e958Smrg	  set x "$@" -I"$file"
162e6d2e958Smrg	  shift
163e6d2e958Smrg	  ;;
164e6d2e958Smrg	-I*)
165e6d2e958Smrg	  func_file_conv "${1#-I}" mingw
166e6d2e958Smrg	  set x "$@" -I"$file"
167e6d2e958Smrg	  shift
168e6d2e958Smrg	  ;;
169e6d2e958Smrg	-l)
170e6d2e958Smrg	  eat=1
171e6d2e958Smrg	  func_cl_dashl "$2"
172e6d2e958Smrg	  set x "$@" "$lib"
173e6d2e958Smrg	  shift
174e6d2e958Smrg	  ;;
175e6d2e958Smrg	-l*)
176e6d2e958Smrg	  func_cl_dashl "${1#-l}"
177e6d2e958Smrg	  set x "$@" "$lib"
178e6d2e958Smrg	  shift
179e6d2e958Smrg	  ;;
180e6d2e958Smrg	-L)
181e6d2e958Smrg	  eat=1
182e6d2e958Smrg	  func_cl_dashL "$2"
183e6d2e958Smrg	  ;;
184e6d2e958Smrg	-L*)
185e6d2e958Smrg	  func_cl_dashL "${1#-L}"
186e6d2e958Smrg	  ;;
187e6d2e958Smrg	-static)
188e6d2e958Smrg	  shared=false
189e6d2e958Smrg	  ;;
190e6d2e958Smrg	-Wl,*)
191e6d2e958Smrg	  arg=${1#-Wl,}
192e6d2e958Smrg	  save_ifs="$IFS"; IFS=','
193e6d2e958Smrg	  for flag in $arg; do
194e6d2e958Smrg	    IFS="$save_ifs"
195e6d2e958Smrg	    linker_opts="$linker_opts $flag"
196e6d2e958Smrg	  done
197e6d2e958Smrg	  IFS="$save_ifs"
198e6d2e958Smrg	  ;;
199e6d2e958Smrg	-Xlinker)
200e6d2e958Smrg	  eat=1
201e6d2e958Smrg	  linker_opts="$linker_opts $2"
202e6d2e958Smrg	  ;;
203e6d2e958Smrg	-*)
204e6d2e958Smrg	  set x "$@" "$1"
205e6d2e958Smrg	  shift
206e6d2e958Smrg	  ;;
207e6d2e958Smrg	*.cc | *.CC | *.cxx | *.CXX | *.[cC]++)
208e6d2e958Smrg	  func_file_conv "$1"
209e6d2e958Smrg	  set x "$@" -Tp"$file"
210e6d2e958Smrg	  shift
211e6d2e958Smrg	  ;;
212e6d2e958Smrg	*.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO])
213e6d2e958Smrg	  func_file_conv "$1" mingw
214e6d2e958Smrg	  set x "$@" "$file"
215e6d2e958Smrg	  shift
216e6d2e958Smrg	  ;;
217e6d2e958Smrg	*)
218e6d2e958Smrg	  set x "$@" "$1"
219e6d2e958Smrg	  shift
220e6d2e958Smrg	  ;;
221e6d2e958Smrg      esac
222e6d2e958Smrg    fi
223e6d2e958Smrg    shift
224e6d2e958Smrg  done
225e6d2e958Smrg  if test -n "$linker_opts"; then
226e6d2e958Smrg    linker_opts="-link$linker_opts"
227e6d2e958Smrg  fi
228e6d2e958Smrg  exec "$@" $linker_opts
229e6d2e958Smrg  exit 1
230e6d2e958Smrg}
231e6d2e958Smrg
232e6d2e958Smrgeat=
233e6d2e958Smrg
234e6d2e958Smrgcase $1 in
235e6d2e958Smrg  '')
236e6d2e958Smrg     echo "$0: No command.  Try '$0 --help' for more information." 1>&2
237e6d2e958Smrg     exit 1;
238e6d2e958Smrg     ;;
239e6d2e958Smrg  -h | --h*)
240e6d2e958Smrg    cat <<\EOF
241e6d2e958SmrgUsage: compile [--help] [--version] PROGRAM [ARGS]
242e6d2e958Smrg
243e6d2e958SmrgWrapper for compilers which do not understand '-c -o'.
244e6d2e958SmrgRemove '-o dest.o' from ARGS, run PROGRAM with the remaining
245e6d2e958Smrgarguments, and rename the output as expected.
246e6d2e958Smrg
247e6d2e958SmrgIf you are trying to build a whole package this is not the
248e6d2e958Smrgright script to run: please start by reading the file 'INSTALL'.
249e6d2e958Smrg
250e6d2e958SmrgReport bugs to <bug-automake@gnu.org>.
251e6d2e958SmrgEOF
252e6d2e958Smrg    exit $?
253e6d2e958Smrg    ;;
254e6d2e958Smrg  -v | --v*)
255e6d2e958Smrg    echo "compile $scriptversion"
256e6d2e958Smrg    exit $?
257e6d2e958Smrg    ;;
2586ad5a0e2Smrg  cl | *[/\\]cl | cl.exe | *[/\\]cl.exe | \
2596ad5a0e2Smrg  icl | *[/\\]icl | icl.exe | *[/\\]icl.exe )
260e6d2e958Smrg    func_cl_wrapper "$@"      # Doesn't return...
261e6d2e958Smrg    ;;
262e6d2e958Smrgesac
263e6d2e958Smrg
264e6d2e958Smrgofile=
265e6d2e958Smrgcfile=
266e6d2e958Smrg
267e6d2e958Smrgfor arg
268e6d2e958Smrgdo
269e6d2e958Smrg  if test -n "$eat"; then
270e6d2e958Smrg    eat=
271e6d2e958Smrg  else
272e6d2e958Smrg    case $1 in
273e6d2e958Smrg      -o)
274e6d2e958Smrg	# configure might choose to run compile as 'compile cc -o foo foo.c'.
275e6d2e958Smrg	# So we strip '-o arg' only if arg is an object.
276e6d2e958Smrg	eat=1
277e6d2e958Smrg	case $2 in
278e6d2e958Smrg	  *.o | *.obj)
279e6d2e958Smrg	    ofile=$2
280e6d2e958Smrg	    ;;
281e6d2e958Smrg	  *)
282e6d2e958Smrg	    set x "$@" -o "$2"
283e6d2e958Smrg	    shift
284e6d2e958Smrg	    ;;
285e6d2e958Smrg	esac
286e6d2e958Smrg	;;
287e6d2e958Smrg      *.c)
288e6d2e958Smrg	cfile=$1
289e6d2e958Smrg	set x "$@" "$1"
290e6d2e958Smrg	shift
291e6d2e958Smrg	;;
292e6d2e958Smrg      *)
293e6d2e958Smrg	set x "$@" "$1"
294e6d2e958Smrg	shift
295e6d2e958Smrg	;;
296e6d2e958Smrg    esac
297e6d2e958Smrg  fi
298e6d2e958Smrg  shift
299e6d2e958Smrgdone
300e6d2e958Smrg
301e6d2e958Smrgif test -z "$ofile" || test -z "$cfile"; then
302e6d2e958Smrg  # If no '-o' option was seen then we might have been invoked from a
303e6d2e958Smrg  # pattern rule where we don't need one.  That is ok -- this is a
304e6d2e958Smrg  # normal compilation that the losing compiler can handle.  If no
305e6d2e958Smrg  # '.c' file was seen then we are probably linking.  That is also
306e6d2e958Smrg  # ok.
307e6d2e958Smrg  exec "$@"
308e6d2e958Smrgfi
309e6d2e958Smrg
310e6d2e958Smrg# Name of file we expect compiler to create.
311e6d2e958Smrgcofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'`
312e6d2e958Smrg
313e6d2e958Smrg# Create the lock directory.
314e6d2e958Smrg# Note: use '[/\\:.-]' here to ensure that we don't use the same name
315e6d2e958Smrg# that we are using for the .o file.  Also, base the name on the expected
316e6d2e958Smrg# object file name, since that is what matters with a parallel build.
317e6d2e958Smrglockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d
318e6d2e958Smrgwhile true; do
319e6d2e958Smrg  if mkdir "$lockdir" >/dev/null 2>&1; then
320e6d2e958Smrg    break
321e6d2e958Smrg  fi
322e6d2e958Smrg  sleep 1
323e6d2e958Smrgdone
324e6d2e958Smrg# FIXME: race condition here if user kills between mkdir and trap.
325e6d2e958Smrgtrap "rmdir '$lockdir'; exit 1" 1 2 15
326e6d2e958Smrg
327e6d2e958Smrg# Run the compile.
328e6d2e958Smrg"$@"
329e6d2e958Smrgret=$?
330e6d2e958Smrg
331e6d2e958Smrgif test -f "$cofile"; then
332e6d2e958Smrg  test "$cofile" = "$ofile" || mv "$cofile" "$ofile"
333e6d2e958Smrgelif test -f "${cofile}bj"; then
334e6d2e958Smrg  test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile"
335e6d2e958Smrgfi
336e6d2e958Smrg
337e6d2e958Smrgrmdir "$lockdir"
338e6d2e958Smrgexit $ret
339e6d2e958Smrg
340e6d2e958Smrg# Local Variables:
341e6d2e958Smrg# mode: shell-script
342e6d2e958Smrg# sh-indentation: 2
3436ad5a0e2Smrg# eval: (add-hook 'before-save-hook 'time-stamp)
344e6d2e958Smrg# time-stamp-start: "scriptversion="
345e6d2e958Smrg# time-stamp-format: "%:y-%02m-%02d.%02H"
3466ad5a0e2Smrg# time-stamp-time-zone: "UTC0"
347e6d2e958Smrg# time-stamp-end: "; # UTC"
348e6d2e958Smrg# End:
349