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