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