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