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