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