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