1132369e0Smrg#! /bin/sh
2132369e0Smrg# Wrapper for compilers which do not understand '-c -o'.
3132369e0Smrg
48ae5c7d9Smrgscriptversion=2018-03-07.03; # UTC
5132369e0Smrg
68ae5c7d9Smrg# Copyright (C) 1999-2021 Free Software Foundation, Inc.
7132369e0Smrg# Written by Tom Tromey <tromey@cygnus.com>.
8132369e0Smrg#
9132369e0Smrg# This program is free software; you can redistribute it and/or modify
10132369e0Smrg# it under the terms of the GNU General Public License as published by
11132369e0Smrg# the Free Software Foundation; either version 2, or (at your option)
12132369e0Smrg# any later version.
13132369e0Smrg#
14132369e0Smrg# This program is distributed in the hope that it will be useful,
15132369e0Smrg# but WITHOUT ANY WARRANTY; without even the implied warranty of
16132369e0Smrg# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17132369e0Smrg# GNU General Public License for more details.
18132369e0Smrg#
19132369e0Smrg# You should have received a copy of the GNU General Public License
208ae5c7d9Smrg# along with this program.  If not, see <https://www.gnu.org/licenses/>.
21132369e0Smrg
22132369e0Smrg# As a special exception to the GNU General Public License, if you
23132369e0Smrg# distribute this file as part of a program that contains a
24132369e0Smrg# configuration script generated by Autoconf, you may include it under
25132369e0Smrg# the same distribution terms that you use for the rest of that program.
26132369e0Smrg
27132369e0Smrg# This file is maintained in Automake, please report
28132369e0Smrg# bugs to <bug-automake@gnu.org> or send patches to
29132369e0Smrg# <automake-patches@gnu.org>.
30132369e0Smrg
31132369e0Smrgnl='
32132369e0Smrg'
33132369e0Smrg
34132369e0Smrg# We need space, tab and new line, in precisely that order.  Quoting is
35132369e0Smrg# there to prevent tools from complaining about whitespace usage.
36132369e0SmrgIFS=" ""	$nl"
37132369e0Smrg
38132369e0Smrgfile_conv=
39132369e0Smrg
40132369e0Smrg# func_file_conv build_file lazy
41132369e0Smrg# Convert a $build file to $host form and store it in $file
42132369e0Smrg# Currently only supports Windows hosts. If the determined conversion
43132369e0Smrg# type is listed in (the comma separated) LAZY, no conversion will
44132369e0Smrg# take place.
45132369e0Smrgfunc_file_conv ()
46132369e0Smrg{
47132369e0Smrg  file=$1
48132369e0Smrg  case $file in
49132369e0Smrg    / | /[!/]*) # absolute file, and not a UNC file
50132369e0Smrg      if test -z "$file_conv"; then
51132369e0Smrg	# lazily determine how to convert abs files
52132369e0Smrg	case `uname -s` in
53132369e0Smrg	  MINGW*)
54132369e0Smrg	    file_conv=mingw
55132369e0Smrg	    ;;
568ae5c7d9Smrg	  CYGWIN* | MSYS*)
57132369e0Smrg	    file_conv=cygwin
58132369e0Smrg	    ;;
59132369e0Smrg	  *)
60132369e0Smrg	    file_conv=wine
61132369e0Smrg	    ;;
62132369e0Smrg	esac
63132369e0Smrg      fi
64132369e0Smrg      case $file_conv/,$2, in
65132369e0Smrg	*,$file_conv,*)
66132369e0Smrg	  ;;
67132369e0Smrg	mingw/*)
68132369e0Smrg	  file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'`
69132369e0Smrg	  ;;
708ae5c7d9Smrg	cygwin/* | msys/*)
71132369e0Smrg	  file=`cygpath -m "$file" || echo "$file"`
72132369e0Smrg	  ;;
73132369e0Smrg	wine/*)
74132369e0Smrg	  file=`winepath -w "$file" || echo "$file"`
75132369e0Smrg	  ;;
76132369e0Smrg      esac
77132369e0Smrg      ;;
78132369e0Smrg  esac
79132369e0Smrg}
80132369e0Smrg
81132369e0Smrg# func_cl_dashL linkdir
82132369e0Smrg# Make cl look for libraries in LINKDIR
83132369e0Smrgfunc_cl_dashL ()
84132369e0Smrg{
85132369e0Smrg  func_file_conv "$1"
86132369e0Smrg  if test -z "$lib_path"; then
87132369e0Smrg    lib_path=$file
88132369e0Smrg  else
89132369e0Smrg    lib_path="$lib_path;$file"
90132369e0Smrg  fi
91132369e0Smrg  linker_opts="$linker_opts -LIBPATH:$file"
92132369e0Smrg}
93132369e0Smrg
94132369e0Smrg# func_cl_dashl library
95132369e0Smrg# Do a library search-path lookup for cl
96132369e0Smrgfunc_cl_dashl ()
97132369e0Smrg{
98132369e0Smrg  lib=$1
99132369e0Smrg  found=no
100132369e0Smrg  save_IFS=$IFS
101132369e0Smrg  IFS=';'
102132369e0Smrg  for dir in $lib_path $LIB
103132369e0Smrg  do
104132369e0Smrg    IFS=$save_IFS
105132369e0Smrg    if $shared && test -f "$dir/$lib.dll.lib"; then
106132369e0Smrg      found=yes
107132369e0Smrg      lib=$dir/$lib.dll.lib
108132369e0Smrg      break
109132369e0Smrg    fi
110132369e0Smrg    if test -f "$dir/$lib.lib"; then
111132369e0Smrg      found=yes
112132369e0Smrg      lib=$dir/$lib.lib
113132369e0Smrg      break
114132369e0Smrg    fi
115132369e0Smrg    if test -f "$dir/lib$lib.a"; then
116132369e0Smrg      found=yes
117132369e0Smrg      lib=$dir/lib$lib.a
118132369e0Smrg      break
119132369e0Smrg    fi
120132369e0Smrg  done
121132369e0Smrg  IFS=$save_IFS
122132369e0Smrg
123132369e0Smrg  if test "$found" != yes; then
124132369e0Smrg    lib=$lib.lib
125132369e0Smrg  fi
126132369e0Smrg}
127132369e0Smrg
128132369e0Smrg# func_cl_wrapper cl arg...
129132369e0Smrg# Adjust compile command to suit cl
130132369e0Smrgfunc_cl_wrapper ()
131132369e0Smrg{
132132369e0Smrg  # Assume a capable shell
133132369e0Smrg  lib_path=
134132369e0Smrg  shared=:
135132369e0Smrg  linker_opts=
136132369e0Smrg  for arg
137132369e0Smrg  do
138132369e0Smrg    if test -n "$eat"; then
139132369e0Smrg      eat=
140132369e0Smrg    else
141132369e0Smrg      case $1 in
142132369e0Smrg	-o)
143132369e0Smrg	  # configure might choose to run compile as 'compile cc -o foo foo.c'.
144132369e0Smrg	  eat=1
145132369e0Smrg	  case $2 in
146132369e0Smrg	    *.o | *.[oO][bB][jJ])
147132369e0Smrg	      func_file_conv "$2"
148132369e0Smrg	      set x "$@" -Fo"$file"
149132369e0Smrg	      shift
150132369e0Smrg	      ;;
151132369e0Smrg	    *)
152132369e0Smrg	      func_file_conv "$2"
153132369e0Smrg	      set x "$@" -Fe"$file"
154132369e0Smrg	      shift
155132369e0Smrg	      ;;
156132369e0Smrg	  esac
157132369e0Smrg	  ;;
158132369e0Smrg	-I)
159132369e0Smrg	  eat=1
160132369e0Smrg	  func_file_conv "$2" mingw
161132369e0Smrg	  set x "$@" -I"$file"
162132369e0Smrg	  shift
163132369e0Smrg	  ;;
164132369e0Smrg	-I*)
165132369e0Smrg	  func_file_conv "${1#-I}" mingw
166132369e0Smrg	  set x "$@" -I"$file"
167132369e0Smrg	  shift
168132369e0Smrg	  ;;
169132369e0Smrg	-l)
170132369e0Smrg	  eat=1
171132369e0Smrg	  func_cl_dashl "$2"
172132369e0Smrg	  set x "$@" "$lib"
173132369e0Smrg	  shift
174132369e0Smrg	  ;;
175132369e0Smrg	-l*)
176132369e0Smrg	  func_cl_dashl "${1#-l}"
177132369e0Smrg	  set x "$@" "$lib"
178132369e0Smrg	  shift
179132369e0Smrg	  ;;
180132369e0Smrg	-L)
181132369e0Smrg	  eat=1
182132369e0Smrg	  func_cl_dashL "$2"
183132369e0Smrg	  ;;
184132369e0Smrg	-L*)
185132369e0Smrg	  func_cl_dashL "${1#-L}"
186132369e0Smrg	  ;;
187132369e0Smrg	-static)
188132369e0Smrg	  shared=false
189132369e0Smrg	  ;;
190132369e0Smrg	-Wl,*)
191132369e0Smrg	  arg=${1#-Wl,}
192132369e0Smrg	  save_ifs="$IFS"; IFS=','
193132369e0Smrg	  for flag in $arg; do
194132369e0Smrg	    IFS="$save_ifs"
195132369e0Smrg	    linker_opts="$linker_opts $flag"
196132369e0Smrg	  done
197132369e0Smrg	  IFS="$save_ifs"
198132369e0Smrg	  ;;
199132369e0Smrg	-Xlinker)
200132369e0Smrg	  eat=1
201132369e0Smrg	  linker_opts="$linker_opts $2"
202132369e0Smrg	  ;;
203132369e0Smrg	-*)
204132369e0Smrg	  set x "$@" "$1"
205132369e0Smrg	  shift
206132369e0Smrg	  ;;
207132369e0Smrg	*.cc | *.CC | *.cxx | *.CXX | *.[cC]++)
208132369e0Smrg	  func_file_conv "$1"
209132369e0Smrg	  set x "$@" -Tp"$file"
210132369e0Smrg	  shift
211132369e0Smrg	  ;;
212132369e0Smrg	*.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO])
213132369e0Smrg	  func_file_conv "$1" mingw
214132369e0Smrg	  set x "$@" "$file"
215132369e0Smrg	  shift
216132369e0Smrg	  ;;
217132369e0Smrg	*)
218132369e0Smrg	  set x "$@" "$1"
219132369e0Smrg	  shift
220132369e0Smrg	  ;;
221132369e0Smrg      esac
222132369e0Smrg    fi
223132369e0Smrg    shift
224132369e0Smrg  done
225132369e0Smrg  if test -n "$linker_opts"; then
226132369e0Smrg    linker_opts="-link$linker_opts"
227132369e0Smrg  fi
228132369e0Smrg  exec "$@" $linker_opts
229132369e0Smrg  exit 1
230132369e0Smrg}
231132369e0Smrg
232132369e0Smrgeat=
233132369e0Smrg
234132369e0Smrgcase $1 in
235132369e0Smrg  '')
236132369e0Smrg     echo "$0: No command.  Try '$0 --help' for more information." 1>&2
237132369e0Smrg     exit 1;
238132369e0Smrg     ;;
239132369e0Smrg  -h | --h*)
240132369e0Smrg    cat <<\EOF
241132369e0SmrgUsage: compile [--help] [--version] PROGRAM [ARGS]
242132369e0Smrg
243132369e0SmrgWrapper for compilers which do not understand '-c -o'.
244132369e0SmrgRemove '-o dest.o' from ARGS, run PROGRAM with the remaining
245132369e0Smrgarguments, and rename the output as expected.
246132369e0Smrg
247132369e0SmrgIf you are trying to build a whole package this is not the
248132369e0Smrgright script to run: please start by reading the file 'INSTALL'.
249132369e0Smrg
250132369e0SmrgReport bugs to <bug-automake@gnu.org>.
251132369e0SmrgEOF
252132369e0Smrg    exit $?
253132369e0Smrg    ;;
254132369e0Smrg  -v | --v*)
255132369e0Smrg    echo "compile $scriptversion"
256132369e0Smrg    exit $?
257132369e0Smrg    ;;
2588ae5c7d9Smrg  cl | *[/\\]cl | cl.exe | *[/\\]cl.exe | \
2598ae5c7d9Smrg  icl | *[/\\]icl | icl.exe | *[/\\]icl.exe )
260132369e0Smrg    func_cl_wrapper "$@"      # Doesn't return...
261132369e0Smrg    ;;
262132369e0Smrgesac
263132369e0Smrg
264132369e0Smrgofile=
265132369e0Smrgcfile=
266132369e0Smrg
267132369e0Smrgfor arg
268132369e0Smrgdo
269132369e0Smrg  if test -n "$eat"; then
270132369e0Smrg    eat=
271132369e0Smrg  else
272132369e0Smrg    case $1 in
273132369e0Smrg      -o)
274132369e0Smrg	# configure might choose to run compile as 'compile cc -o foo foo.c'.
275132369e0Smrg	# So we strip '-o arg' only if arg is an object.
276132369e0Smrg	eat=1
277132369e0Smrg	case $2 in
278132369e0Smrg	  *.o | *.obj)
279132369e0Smrg	    ofile=$2
280132369e0Smrg	    ;;
281132369e0Smrg	  *)
282132369e0Smrg	    set x "$@" -o "$2"
283132369e0Smrg	    shift
284132369e0Smrg	    ;;
285132369e0Smrg	esac
286132369e0Smrg	;;
287132369e0Smrg      *.c)
288132369e0Smrg	cfile=$1
289132369e0Smrg	set x "$@" "$1"
290132369e0Smrg	shift
291132369e0Smrg	;;
292132369e0Smrg      *)
293132369e0Smrg	set x "$@" "$1"
294132369e0Smrg	shift
295132369e0Smrg	;;
296132369e0Smrg    esac
297132369e0Smrg  fi
298132369e0Smrg  shift
299132369e0Smrgdone
300132369e0Smrg
301132369e0Smrgif test -z "$ofile" || test -z "$cfile"; then
302132369e0Smrg  # If no '-o' option was seen then we might have been invoked from a
303132369e0Smrg  # pattern rule where we don't need one.  That is ok -- this is a
304132369e0Smrg  # normal compilation that the losing compiler can handle.  If no
305132369e0Smrg  # '.c' file was seen then we are probably linking.  That is also
306132369e0Smrg  # ok.
307132369e0Smrg  exec "$@"
308132369e0Smrgfi
309132369e0Smrg
310132369e0Smrg# Name of file we expect compiler to create.
311132369e0Smrgcofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'`
312132369e0Smrg
313132369e0Smrg# Create the lock directory.
314132369e0Smrg# Note: use '[/\\:.-]' here to ensure that we don't use the same name
315132369e0Smrg# that we are using for the .o file.  Also, base the name on the expected
316132369e0Smrg# object file name, since that is what matters with a parallel build.
317132369e0Smrglockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d
318132369e0Smrgwhile true; do
319132369e0Smrg  if mkdir "$lockdir" >/dev/null 2>&1; then
320132369e0Smrg    break
321132369e0Smrg  fi
322132369e0Smrg  sleep 1
323132369e0Smrgdone
324132369e0Smrg# FIXME: race condition here if user kills between mkdir and trap.
325132369e0Smrgtrap "rmdir '$lockdir'; exit 1" 1 2 15
326132369e0Smrg
327132369e0Smrg# Run the compile.
328132369e0Smrg"$@"
329132369e0Smrgret=$?
330132369e0Smrg
331132369e0Smrgif test -f "$cofile"; then
332132369e0Smrg  test "$cofile" = "$ofile" || mv "$cofile" "$ofile"
333132369e0Smrgelif test -f "${cofile}bj"; then
334132369e0Smrg  test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile"
335132369e0Smrgfi
336132369e0Smrg
337132369e0Smrgrmdir "$lockdir"
338132369e0Smrgexit $ret
339132369e0Smrg
340132369e0Smrg# Local Variables:
341132369e0Smrg# mode: shell-script
342132369e0Smrg# sh-indentation: 2
3438ae5c7d9Smrg# eval: (add-hook 'before-save-hook 'time-stamp)
344132369e0Smrg# time-stamp-start: "scriptversion="
345132369e0Smrg# time-stamp-format: "%:y-%02m-%02d.%02H"
3468ae5c7d9Smrg# time-stamp-time-zone: "UTC0"
347132369e0Smrg# time-stamp-end: "; # UTC"
348132369e0Smrg# End:
349