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