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