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