1428d7b3dSmrg#! /bin/sh
2428d7b3dSmrg# Wrapper for compilers which do not understand '-c -o'.
3428d7b3dSmrg
4428d7b3dSmrgscriptversion=2012-10-14.11; # UTC
5428d7b3dSmrg
6428d7b3dSmrg# Copyright (C) 1999-2013 Free Software Foundation, Inc.
7428d7b3dSmrg# Written by Tom Tromey <tromey@cygnus.com>.
8428d7b3dSmrg#
9428d7b3dSmrg# This program is free software; you can redistribute it and/or modify
10428d7b3dSmrg# it under the terms of the GNU General Public License as published by
11428d7b3dSmrg# the Free Software Foundation; either version 2, or (at your option)
12428d7b3dSmrg# any later version.
13428d7b3dSmrg#
14428d7b3dSmrg# This program is distributed in the hope that it will be useful,
15428d7b3dSmrg# but WITHOUT ANY WARRANTY; without even the implied warranty of
16428d7b3dSmrg# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17428d7b3dSmrg# GNU General Public License for more details.
18428d7b3dSmrg#
19428d7b3dSmrg# You should have received a copy of the GNU General Public License
20428d7b3dSmrg# along with this program.  If not, see <http://www.gnu.org/licenses/>.
21428d7b3dSmrg
22428d7b3dSmrg# As a special exception to the GNU General Public License, if you
23428d7b3dSmrg# distribute this file as part of a program that contains a
24428d7b3dSmrg# configuration script generated by Autoconf, you may include it under
25428d7b3dSmrg# the same distribution terms that you use for the rest of that program.
26428d7b3dSmrg
27428d7b3dSmrg# This file is maintained in Automake, please report
28428d7b3dSmrg# bugs to <bug-automake@gnu.org> or send patches to
29428d7b3dSmrg# <automake-patches@gnu.org>.
30428d7b3dSmrg
31428d7b3dSmrgnl='
32428d7b3dSmrg'
33428d7b3dSmrg
34428d7b3dSmrg# We need space, tab and new line, in precisely that order.  Quoting is
35428d7b3dSmrg# there to prevent tools from complaining about whitespace usage.
36428d7b3dSmrgIFS=" ""	$nl"
37428d7b3dSmrg
38428d7b3dSmrgfile_conv=
39428d7b3dSmrg
40428d7b3dSmrg# func_file_conv build_file lazy
41428d7b3dSmrg# Convert a $build file to $host form and store it in $file
42428d7b3dSmrg# Currently only supports Windows hosts. If the determined conversion
43428d7b3dSmrg# type is listed in (the comma separated) LAZY, no conversion will
44428d7b3dSmrg# take place.
45428d7b3dSmrgfunc_file_conv ()
46428d7b3dSmrg{
47428d7b3dSmrg  file=$1
48428d7b3dSmrg  case $file in
49428d7b3dSmrg    / | /[!/]*) # absolute file, and not a UNC file
50428d7b3dSmrg      if test -z "$file_conv"; then
51428d7b3dSmrg	# lazily determine how to convert abs files
52428d7b3dSmrg	case `uname -s` in
53428d7b3dSmrg	  MINGW*)
54428d7b3dSmrg	    file_conv=mingw
55428d7b3dSmrg	    ;;
56428d7b3dSmrg	  CYGWIN*)
57428d7b3dSmrg	    file_conv=cygwin
58428d7b3dSmrg	    ;;
59428d7b3dSmrg	  *)
60428d7b3dSmrg	    file_conv=wine
61428d7b3dSmrg	    ;;
62428d7b3dSmrg	esac
63428d7b3dSmrg      fi
64428d7b3dSmrg      case $file_conv/,$2, in
65428d7b3dSmrg	*,$file_conv,*)
66428d7b3dSmrg	  ;;
67428d7b3dSmrg	mingw/*)
68428d7b3dSmrg	  file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'`
69428d7b3dSmrg	  ;;
70428d7b3dSmrg	cygwin/*)
71428d7b3dSmrg	  file=`cygpath -m "$file" || echo "$file"`
72428d7b3dSmrg	  ;;
73428d7b3dSmrg	wine/*)
74428d7b3dSmrg	  file=`winepath -w "$file" || echo "$file"`
75428d7b3dSmrg	  ;;
76428d7b3dSmrg      esac
77428d7b3dSmrg      ;;
78428d7b3dSmrg  esac
79428d7b3dSmrg}
80428d7b3dSmrg
81428d7b3dSmrg# func_cl_dashL linkdir
82428d7b3dSmrg# Make cl look for libraries in LINKDIR
83428d7b3dSmrgfunc_cl_dashL ()
84428d7b3dSmrg{
85428d7b3dSmrg  func_file_conv "$1"
86428d7b3dSmrg  if test -z "$lib_path"; then
87428d7b3dSmrg    lib_path=$file
88428d7b3dSmrg  else
89428d7b3dSmrg    lib_path="$lib_path;$file"
90428d7b3dSmrg  fi
91428d7b3dSmrg  linker_opts="$linker_opts -LIBPATH:$file"
92428d7b3dSmrg}
93428d7b3dSmrg
94428d7b3dSmrg# func_cl_dashl library
95428d7b3dSmrg# Do a library search-path lookup for cl
96428d7b3dSmrgfunc_cl_dashl ()
97428d7b3dSmrg{
98428d7b3dSmrg  lib=$1
99428d7b3dSmrg  found=no
100428d7b3dSmrg  save_IFS=$IFS
101428d7b3dSmrg  IFS=';'
102428d7b3dSmrg  for dir in $lib_path $LIB
103428d7b3dSmrg  do
104428d7b3dSmrg    IFS=$save_IFS
105428d7b3dSmrg    if $shared && test -f "$dir/$lib.dll.lib"; then
106428d7b3dSmrg      found=yes
107428d7b3dSmrg      lib=$dir/$lib.dll.lib
108428d7b3dSmrg      break
109428d7b3dSmrg    fi
110428d7b3dSmrg    if test -f "$dir/$lib.lib"; then
111428d7b3dSmrg      found=yes
112428d7b3dSmrg      lib=$dir/$lib.lib
113428d7b3dSmrg      break
114428d7b3dSmrg    fi
115428d7b3dSmrg    if test -f "$dir/lib$lib.a"; then
116428d7b3dSmrg      found=yes
117428d7b3dSmrg      lib=$dir/lib$lib.a
118428d7b3dSmrg      break
119428d7b3dSmrg    fi
120428d7b3dSmrg  done
121428d7b3dSmrg  IFS=$save_IFS
122428d7b3dSmrg
123428d7b3dSmrg  if test "$found" != yes; then
124428d7b3dSmrg    lib=$lib.lib
125428d7b3dSmrg  fi
126428d7b3dSmrg}
127428d7b3dSmrg
128428d7b3dSmrg# func_cl_wrapper cl arg...
129428d7b3dSmrg# Adjust compile command to suit cl
130428d7b3dSmrgfunc_cl_wrapper ()
131428d7b3dSmrg{
132428d7b3dSmrg  # Assume a capable shell
133428d7b3dSmrg  lib_path=
134428d7b3dSmrg  shared=:
135428d7b3dSmrg  linker_opts=
136428d7b3dSmrg  for arg
137428d7b3dSmrg  do
138428d7b3dSmrg    if test -n "$eat"; then
139428d7b3dSmrg      eat=
140428d7b3dSmrg    else
141428d7b3dSmrg      case $1 in
142428d7b3dSmrg	-o)
143428d7b3dSmrg	  # configure might choose to run compile as 'compile cc -o foo foo.c'.
144428d7b3dSmrg	  eat=1
145428d7b3dSmrg	  case $2 in
146428d7b3dSmrg	    *.o | *.[oO][bB][jJ])
147428d7b3dSmrg	      func_file_conv "$2"
148428d7b3dSmrg	      set x "$@" -Fo"$file"
149428d7b3dSmrg	      shift
150428d7b3dSmrg	      ;;
151428d7b3dSmrg	    *)
152428d7b3dSmrg	      func_file_conv "$2"
153428d7b3dSmrg	      set x "$@" -Fe"$file"
154428d7b3dSmrg	      shift
155428d7b3dSmrg	      ;;
156428d7b3dSmrg	  esac
157428d7b3dSmrg	  ;;
158428d7b3dSmrg	-I)
159428d7b3dSmrg	  eat=1
160428d7b3dSmrg	  func_file_conv "$2" mingw
161428d7b3dSmrg	  set x "$@" -I"$file"
162428d7b3dSmrg	  shift
163428d7b3dSmrg	  ;;
164428d7b3dSmrg	-I*)
165428d7b3dSmrg	  func_file_conv "${1#-I}" mingw
166428d7b3dSmrg	  set x "$@" -I"$file"
167428d7b3dSmrg	  shift
168428d7b3dSmrg	  ;;
169428d7b3dSmrg	-l)
170428d7b3dSmrg	  eat=1
171428d7b3dSmrg	  func_cl_dashl "$2"
172428d7b3dSmrg	  set x "$@" "$lib"
173428d7b3dSmrg	  shift
174428d7b3dSmrg	  ;;
175428d7b3dSmrg	-l*)
176428d7b3dSmrg	  func_cl_dashl "${1#-l}"
177428d7b3dSmrg	  set x "$@" "$lib"
178428d7b3dSmrg	  shift
179428d7b3dSmrg	  ;;
180428d7b3dSmrg	-L)
181428d7b3dSmrg	  eat=1
182428d7b3dSmrg	  func_cl_dashL "$2"
183428d7b3dSmrg	  ;;
184428d7b3dSmrg	-L*)
185428d7b3dSmrg	  func_cl_dashL "${1#-L}"
186428d7b3dSmrg	  ;;
187428d7b3dSmrg	-static)
188428d7b3dSmrg	  shared=false
189428d7b3dSmrg	  ;;
190428d7b3dSmrg	-Wl,*)
191428d7b3dSmrg	  arg=${1#-Wl,}
192428d7b3dSmrg	  save_ifs="$IFS"; IFS=','
193428d7b3dSmrg	  for flag in $arg; do
194428d7b3dSmrg	    IFS="$save_ifs"
195428d7b3dSmrg	    linker_opts="$linker_opts $flag"
196428d7b3dSmrg	  done
197428d7b3dSmrg	  IFS="$save_ifs"
198428d7b3dSmrg	  ;;
199428d7b3dSmrg	-Xlinker)
200428d7b3dSmrg	  eat=1
201428d7b3dSmrg	  linker_opts="$linker_opts $2"
202428d7b3dSmrg	  ;;
203428d7b3dSmrg	-*)
204428d7b3dSmrg	  set x "$@" "$1"
205428d7b3dSmrg	  shift
206428d7b3dSmrg	  ;;
207428d7b3dSmrg	*.cc | *.CC | *.cxx | *.CXX | *.[cC]++)
208428d7b3dSmrg	  func_file_conv "$1"
209428d7b3dSmrg	  set x "$@" -Tp"$file"
210428d7b3dSmrg	  shift
211428d7b3dSmrg	  ;;
212428d7b3dSmrg	*.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO])
213428d7b3dSmrg	  func_file_conv "$1" mingw
214428d7b3dSmrg	  set x "$@" "$file"
215428d7b3dSmrg	  shift
216428d7b3dSmrg	  ;;
217428d7b3dSmrg	*)
218428d7b3dSmrg	  set x "$@" "$1"
219428d7b3dSmrg	  shift
220428d7b3dSmrg	  ;;
221428d7b3dSmrg      esac
222428d7b3dSmrg    fi
223428d7b3dSmrg    shift
224428d7b3dSmrg  done
225428d7b3dSmrg  if test -n "$linker_opts"; then
226428d7b3dSmrg    linker_opts="-link$linker_opts"
227428d7b3dSmrg  fi
228428d7b3dSmrg  exec "$@" $linker_opts
229428d7b3dSmrg  exit 1
230428d7b3dSmrg}
231428d7b3dSmrg
232428d7b3dSmrgeat=
233428d7b3dSmrg
234428d7b3dSmrgcase $1 in
235428d7b3dSmrg  '')
236428d7b3dSmrg     echo "$0: No command.  Try '$0 --help' for more information." 1>&2
237428d7b3dSmrg     exit 1;
238428d7b3dSmrg     ;;
239428d7b3dSmrg  -h | --h*)
240428d7b3dSmrg    cat <<\EOF
241428d7b3dSmrgUsage: compile [--help] [--version] PROGRAM [ARGS]
242428d7b3dSmrg
243428d7b3dSmrgWrapper for compilers which do not understand '-c -o'.
244428d7b3dSmrgRemove '-o dest.o' from ARGS, run PROGRAM with the remaining
245428d7b3dSmrgarguments, and rename the output as expected.
246428d7b3dSmrg
247428d7b3dSmrgIf you are trying to build a whole package this is not the
248428d7b3dSmrgright script to run: please start by reading the file 'INSTALL'.
249428d7b3dSmrg
250428d7b3dSmrgReport bugs to <bug-automake@gnu.org>.
251428d7b3dSmrgEOF
252428d7b3dSmrg    exit $?
253428d7b3dSmrg    ;;
254428d7b3dSmrg  -v | --v*)
255428d7b3dSmrg    echo "compile $scriptversion"
256428d7b3dSmrg    exit $?
257428d7b3dSmrg    ;;
258428d7b3dSmrg  cl | *[/\\]cl | cl.exe | *[/\\]cl.exe )
259428d7b3dSmrg    func_cl_wrapper "$@"      # Doesn't return...
260428d7b3dSmrg    ;;
261428d7b3dSmrgesac
262428d7b3dSmrg
263428d7b3dSmrgofile=
264428d7b3dSmrgcfile=
265428d7b3dSmrg
266428d7b3dSmrgfor arg
267428d7b3dSmrgdo
268428d7b3dSmrg  if test -n "$eat"; then
269428d7b3dSmrg    eat=
270428d7b3dSmrg  else
271428d7b3dSmrg    case $1 in
272428d7b3dSmrg      -o)
273428d7b3dSmrg	# configure might choose to run compile as 'compile cc -o foo foo.c'.
274428d7b3dSmrg	# So we strip '-o arg' only if arg is an object.
275428d7b3dSmrg	eat=1
276428d7b3dSmrg	case $2 in
277428d7b3dSmrg	  *.o | *.obj)
278428d7b3dSmrg	    ofile=$2
279428d7b3dSmrg	    ;;
280428d7b3dSmrg	  *)
281428d7b3dSmrg	    set x "$@" -o "$2"
282428d7b3dSmrg	    shift
283428d7b3dSmrg	    ;;
284428d7b3dSmrg	esac
285428d7b3dSmrg	;;
286428d7b3dSmrg      *.c)
287428d7b3dSmrg	cfile=$1
288428d7b3dSmrg	set x "$@" "$1"
289428d7b3dSmrg	shift
290428d7b3dSmrg	;;
291428d7b3dSmrg      *)
292428d7b3dSmrg	set x "$@" "$1"
293428d7b3dSmrg	shift
294428d7b3dSmrg	;;
295428d7b3dSmrg    esac
296428d7b3dSmrg  fi
297428d7b3dSmrg  shift
298428d7b3dSmrgdone
299428d7b3dSmrg
300428d7b3dSmrgif test -z "$ofile" || test -z "$cfile"; then
301428d7b3dSmrg  # If no '-o' option was seen then we might have been invoked from a
302428d7b3dSmrg  # pattern rule where we don't need one.  That is ok -- this is a
303428d7b3dSmrg  # normal compilation that the losing compiler can handle.  If no
304428d7b3dSmrg  # '.c' file was seen then we are probably linking.  That is also
305428d7b3dSmrg  # ok.
306428d7b3dSmrg  exec "$@"
307428d7b3dSmrgfi
308428d7b3dSmrg
309428d7b3dSmrg# Name of file we expect compiler to create.
310428d7b3dSmrgcofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'`
311428d7b3dSmrg
312428d7b3dSmrg# Create the lock directory.
313428d7b3dSmrg# Note: use '[/\\:.-]' here to ensure that we don't use the same name
314428d7b3dSmrg# that we are using for the .o file.  Also, base the name on the expected
315428d7b3dSmrg# object file name, since that is what matters with a parallel build.
316428d7b3dSmrglockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d
317428d7b3dSmrgwhile true; do
318428d7b3dSmrg  if mkdir "$lockdir" >/dev/null 2>&1; then
319428d7b3dSmrg    break
320428d7b3dSmrg  fi
321428d7b3dSmrg  sleep 1
322428d7b3dSmrgdone
323428d7b3dSmrg# FIXME: race condition here if user kills between mkdir and trap.
324428d7b3dSmrgtrap "rmdir '$lockdir'; exit 1" 1 2 15
325428d7b3dSmrg
326428d7b3dSmrg# Run the compile.
327428d7b3dSmrg"$@"
328428d7b3dSmrgret=$?
329428d7b3dSmrg
330428d7b3dSmrgif test -f "$cofile"; then
331428d7b3dSmrg  test "$cofile" = "$ofile" || mv "$cofile" "$ofile"
332428d7b3dSmrgelif test -f "${cofile}bj"; then
333428d7b3dSmrg  test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile"
334428d7b3dSmrgfi
335428d7b3dSmrg
336428d7b3dSmrgrmdir "$lockdir"
337428d7b3dSmrgexit $ret
338428d7b3dSmrg
339428d7b3dSmrg# Local Variables:
340428d7b3dSmrg# mode: shell-script
341428d7b3dSmrg# sh-indentation: 2
342428d7b3dSmrg# eval: (add-hook 'write-file-hooks 'time-stamp)
343428d7b3dSmrg# time-stamp-start: "scriptversion="
344428d7b3dSmrg# time-stamp-format: "%:y-%02m-%02d.%02H"
345428d7b3dSmrg# time-stamp-time-zone: "UTC"
346428d7b3dSmrg# time-stamp-end: "; # UTC"
347428d7b3dSmrg# End:
348