compile revision dfac8f13
1533545b5Smrg#! /bin/sh
2533545b5Smrg# Wrapper for compilers which do not understand '-c -o'.
3533545b5Smrg
4dfac8f13Smrgscriptversion=2024-06-19.01; # UTC
5533545b5Smrg
6dfac8f13Smrg# Copyright (C) 1999-2024 Free Software Foundation, Inc.
7533545b5Smrg# Written by Tom Tromey <tromey@cygnus.com>.
8533545b5Smrg#
9533545b5Smrg# This program is free software; you can redistribute it and/or modify
10533545b5Smrg# it under the terms of the GNU General Public License as published by
11533545b5Smrg# the Free Software Foundation; either version 2, or (at your option)
12533545b5Smrg# any later version.
13533545b5Smrg#
14533545b5Smrg# This program is distributed in the hope that it will be useful,
15533545b5Smrg# but WITHOUT ANY WARRANTY; without even the implied warranty of
16533545b5Smrg# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17533545b5Smrg# GNU General Public License for more details.
18533545b5Smrg#
19533545b5Smrg# You should have received a copy of the GNU General Public License
20c9e4df9bSmrg# along with this program.  If not, see <https://www.gnu.org/licenses/>.
21533545b5Smrg
22533545b5Smrg# As a special exception to the GNU General Public License, if you
23533545b5Smrg# distribute this file as part of a program that contains a
24533545b5Smrg# configuration script generated by Autoconf, you may include it under
25533545b5Smrg# the same distribution terms that you use for the rest of that program.
26533545b5Smrg
27533545b5Smrg# This file is maintained in Automake, please report
28533545b5Smrg# bugs to <bug-automake@gnu.org> or send patches to
29533545b5Smrg# <automake-patches@gnu.org>.
30533545b5Smrg
31533545b5Smrgnl='
32533545b5Smrg'
33533545b5Smrg
34533545b5Smrg# We need space, tab and new line, in precisely that order.  Quoting is
35533545b5Smrg# there to prevent tools from complaining about whitespace usage.
36533545b5SmrgIFS=" ""	$nl"
37533545b5Smrg
38533545b5Smrgfile_conv=
39533545b5Smrg
40533545b5Smrg# func_file_conv build_file lazy
41533545b5Smrg# Convert a $build file to $host form and store it in $file
42533545b5Smrg# Currently only supports Windows hosts. If the determined conversion
43533545b5Smrg# type is listed in (the comma separated) LAZY, no conversion will
44533545b5Smrg# take place.
45533545b5Smrgfunc_file_conv ()
46533545b5Smrg{
47533545b5Smrg  file=$1
48533545b5Smrg  case $file in
49533545b5Smrg    / | /[!/]*) # absolute file, and not a UNC file
50533545b5Smrg      if test -z "$file_conv"; then
51533545b5Smrg	# lazily determine how to convert abs files
52533545b5Smrg	case `uname -s` in
53533545b5Smrg	  MINGW*)
54533545b5Smrg	    file_conv=mingw
55533545b5Smrg	    ;;
56c9e4df9bSmrg	  CYGWIN* | MSYS*)
57533545b5Smrg	    file_conv=cygwin
58533545b5Smrg	    ;;
59533545b5Smrg	  *)
60533545b5Smrg	    file_conv=wine
61533545b5Smrg	    ;;
62533545b5Smrg	esac
63533545b5Smrg      fi
64533545b5Smrg      case $file_conv/,$2, in
65533545b5Smrg	*,$file_conv,*)
66533545b5Smrg	  ;;
67533545b5Smrg	mingw/*)
68533545b5Smrg	  file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'`
69533545b5Smrg	  ;;
70c9e4df9bSmrg	cygwin/* | msys/*)
71533545b5Smrg	  file=`cygpath -m "$file" || echo "$file"`
72533545b5Smrg	  ;;
73533545b5Smrg	wine/*)
74533545b5Smrg	  file=`winepath -w "$file" || echo "$file"`
75533545b5Smrg	  ;;
76533545b5Smrg      esac
77533545b5Smrg      ;;
78533545b5Smrg  esac
79533545b5Smrg}
80533545b5Smrg
81533545b5Smrg# func_cl_dashL linkdir
82533545b5Smrg# Make cl look for libraries in LINKDIR
83533545b5Smrgfunc_cl_dashL ()
84533545b5Smrg{
85533545b5Smrg  func_file_conv "$1"
86533545b5Smrg  if test -z "$lib_path"; then
87533545b5Smrg    lib_path=$file
88533545b5Smrg  else
89533545b5Smrg    lib_path="$lib_path;$file"
90533545b5Smrg  fi
91533545b5Smrg  linker_opts="$linker_opts -LIBPATH:$file"
92533545b5Smrg}
93533545b5Smrg
94533545b5Smrg# func_cl_dashl library
95533545b5Smrg# Do a library search-path lookup for cl
96533545b5Smrgfunc_cl_dashl ()
97533545b5Smrg{
98533545b5Smrg  lib=$1
99533545b5Smrg  found=no
100533545b5Smrg  save_IFS=$IFS
101533545b5Smrg  IFS=';'
102533545b5Smrg  for dir in $lib_path $LIB
103533545b5Smrg  do
104533545b5Smrg    IFS=$save_IFS
105533545b5Smrg    if $shared && test -f "$dir/$lib.dll.lib"; then
106533545b5Smrg      found=yes
107533545b5Smrg      lib=$dir/$lib.dll.lib
108533545b5Smrg      break
109533545b5Smrg    fi
110533545b5Smrg    if test -f "$dir/$lib.lib"; then
111533545b5Smrg      found=yes
112533545b5Smrg      lib=$dir/$lib.lib
113533545b5Smrg      break
114533545b5Smrg    fi
115533545b5Smrg    if test -f "$dir/lib$lib.a"; then
116533545b5Smrg      found=yes
117533545b5Smrg      lib=$dir/lib$lib.a
118533545b5Smrg      break
119533545b5Smrg    fi
120533545b5Smrg  done
121533545b5Smrg  IFS=$save_IFS
122533545b5Smrg
123533545b5Smrg  if test "$found" != yes; then
124533545b5Smrg    lib=$lib.lib
125533545b5Smrg  fi
126533545b5Smrg}
127533545b5Smrg
128533545b5Smrg# func_cl_wrapper cl arg...
129533545b5Smrg# Adjust compile command to suit cl
130533545b5Smrgfunc_cl_wrapper ()
131533545b5Smrg{
132533545b5Smrg  # Assume a capable shell
133533545b5Smrg  lib_path=
134533545b5Smrg  shared=:
135533545b5Smrg  linker_opts=
136533545b5Smrg  for arg
137533545b5Smrg  do
138533545b5Smrg    if test -n "$eat"; then
139533545b5Smrg      eat=
140533545b5Smrg    else
141533545b5Smrg      case $1 in
142533545b5Smrg	-o)
143533545b5Smrg	  # configure might choose to run compile as 'compile cc -o foo foo.c'.
144533545b5Smrg	  eat=1
145533545b5Smrg	  case $2 in
146dfac8f13Smrg	    *.o | *.lo | *.[oO][bB][jJ])
147533545b5Smrg	      func_file_conv "$2"
148533545b5Smrg	      set x "$@" -Fo"$file"
149533545b5Smrg	      shift
150533545b5Smrg	      ;;
151533545b5Smrg	    *)
152533545b5Smrg	      func_file_conv "$2"
153533545b5Smrg	      set x "$@" -Fe"$file"
154533545b5Smrg	      shift
155533545b5Smrg	      ;;
156533545b5Smrg	  esac
157533545b5Smrg	  ;;
158533545b5Smrg	-I)
159533545b5Smrg	  eat=1
160533545b5Smrg	  func_file_conv "$2" mingw
161533545b5Smrg	  set x "$@" -I"$file"
162533545b5Smrg	  shift
163533545b5Smrg	  ;;
164533545b5Smrg	-I*)
165533545b5Smrg	  func_file_conv "${1#-I}" mingw
166533545b5Smrg	  set x "$@" -I"$file"
167533545b5Smrg	  shift
168533545b5Smrg	  ;;
169533545b5Smrg	-l)
170533545b5Smrg	  eat=1
171533545b5Smrg	  func_cl_dashl "$2"
172533545b5Smrg	  set x "$@" "$lib"
173533545b5Smrg	  shift
174533545b5Smrg	  ;;
175533545b5Smrg	-l*)
176533545b5Smrg	  func_cl_dashl "${1#-l}"
177533545b5Smrg	  set x "$@" "$lib"
178533545b5Smrg	  shift
179533545b5Smrg	  ;;
180533545b5Smrg	-L)
181533545b5Smrg	  eat=1
182533545b5Smrg	  func_cl_dashL "$2"
183533545b5Smrg	  ;;
184533545b5Smrg	-L*)
185533545b5Smrg	  func_cl_dashL "${1#-L}"
186533545b5Smrg	  ;;
187533545b5Smrg	-static)
188533545b5Smrg	  shared=false
189533545b5Smrg	  ;;
190533545b5Smrg	-Wl,*)
191533545b5Smrg	  arg=${1#-Wl,}
192533545b5Smrg	  save_ifs="$IFS"; IFS=','
193533545b5Smrg	  for flag in $arg; do
194533545b5Smrg	    IFS="$save_ifs"
195533545b5Smrg	    linker_opts="$linker_opts $flag"
196533545b5Smrg	  done
197533545b5Smrg	  IFS="$save_ifs"
198533545b5Smrg	  ;;
199533545b5Smrg	-Xlinker)
200533545b5Smrg	  eat=1
201533545b5Smrg	  linker_opts="$linker_opts $2"
202533545b5Smrg	  ;;
203533545b5Smrg	-*)
204533545b5Smrg	  set x "$@" "$1"
205533545b5Smrg	  shift
206533545b5Smrg	  ;;
207533545b5Smrg	*.cc | *.CC | *.cxx | *.CXX | *.[cC]++)
208533545b5Smrg	  func_file_conv "$1"
209533545b5Smrg	  set x "$@" -Tp"$file"
210533545b5Smrg	  shift
211533545b5Smrg	  ;;
212533545b5Smrg	*.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO])
213533545b5Smrg	  func_file_conv "$1" mingw
214533545b5Smrg	  set x "$@" "$file"
215533545b5Smrg	  shift
216533545b5Smrg	  ;;
217533545b5Smrg	*)
218533545b5Smrg	  set x "$@" "$1"
219533545b5Smrg	  shift
220533545b5Smrg	  ;;
221533545b5Smrg      esac
222533545b5Smrg    fi
223533545b5Smrg    shift
224533545b5Smrg  done
225533545b5Smrg  if test -n "$linker_opts"; then
226533545b5Smrg    linker_opts="-link$linker_opts"
227533545b5Smrg  fi
228533545b5Smrg  exec "$@" $linker_opts
229533545b5Smrg  exit 1
230533545b5Smrg}
231533545b5Smrg
232533545b5Smrgeat=
233533545b5Smrg
234533545b5Smrgcase $1 in
235533545b5Smrg  '')
236533545b5Smrg     echo "$0: No command.  Try '$0 --help' for more information." 1>&2
237533545b5Smrg     exit 1;
238533545b5Smrg     ;;
239533545b5Smrg  -h | --h*)
240533545b5Smrg    cat <<\EOF
241533545b5SmrgUsage: compile [--help] [--version] PROGRAM [ARGS]
242533545b5Smrg
243533545b5SmrgWrapper for compilers which do not understand '-c -o'.
244533545b5SmrgRemove '-o dest.o' from ARGS, run PROGRAM with the remaining
245533545b5Smrgarguments, and rename the output as expected.
246533545b5Smrg
247533545b5SmrgIf you are trying to build a whole package this is not the
248533545b5Smrgright script to run: please start by reading the file 'INSTALL'.
249533545b5Smrg
250533545b5SmrgReport bugs to <bug-automake@gnu.org>.
251dfac8f13SmrgGNU Automake home page: <https://www.gnu.org/software/automake/>.
252dfac8f13SmrgGeneral help using GNU software: <https://www.gnu.org/gethelp/>.
253533545b5SmrgEOF
254533545b5Smrg    exit $?
255533545b5Smrg    ;;
256533545b5Smrg  -v | --v*)
257dfac8f13Smrg    echo "compile (GNU Automake) $scriptversion"
258533545b5Smrg    exit $?
259533545b5Smrg    ;;
260c9e4df9bSmrg  cl | *[/\\]cl | cl.exe | *[/\\]cl.exe | \
261dfac8f13Smrg  clang-cl | *[/\\]clang-cl | clang-cl.exe | *[/\\]clang-cl.exe | \
262c9e4df9bSmrg  icl | *[/\\]icl | icl.exe | *[/\\]icl.exe )
263533545b5Smrg    func_cl_wrapper "$@"      # Doesn't return...
264533545b5Smrg    ;;
265533545b5Smrgesac
266533545b5Smrg
267533545b5Smrgofile=
268533545b5Smrgcfile=
269533545b5Smrg
270533545b5Smrgfor arg
271533545b5Smrgdo
272533545b5Smrg  if test -n "$eat"; then
273533545b5Smrg    eat=
274533545b5Smrg  else
275533545b5Smrg    case $1 in
276533545b5Smrg      -o)
277533545b5Smrg	# configure might choose to run compile as 'compile cc -o foo foo.c'.
278533545b5Smrg	# So we strip '-o arg' only if arg is an object.
279533545b5Smrg	eat=1
280533545b5Smrg	case $2 in
281533545b5Smrg	  *.o | *.obj)
282533545b5Smrg	    ofile=$2
283533545b5Smrg	    ;;
284533545b5Smrg	  *)
285533545b5Smrg	    set x "$@" -o "$2"
286533545b5Smrg	    shift
287533545b5Smrg	    ;;
288533545b5Smrg	esac
289533545b5Smrg	;;
290533545b5Smrg      *.c)
291533545b5Smrg	cfile=$1
292533545b5Smrg	set x "$@" "$1"
293533545b5Smrg	shift
294533545b5Smrg	;;
295533545b5Smrg      *)
296533545b5Smrg	set x "$@" "$1"
297533545b5Smrg	shift
298533545b5Smrg	;;
299533545b5Smrg    esac
300533545b5Smrg  fi
301533545b5Smrg  shift
302533545b5Smrgdone
303533545b5Smrg
304533545b5Smrgif test -z "$ofile" || test -z "$cfile"; then
305533545b5Smrg  # If no '-o' option was seen then we might have been invoked from a
306533545b5Smrg  # pattern rule where we don't need one.  That is ok -- this is a
307533545b5Smrg  # normal compilation that the losing compiler can handle.  If no
308533545b5Smrg  # '.c' file was seen then we are probably linking.  That is also
309533545b5Smrg  # ok.
310533545b5Smrg  exec "$@"
311533545b5Smrgfi
312533545b5Smrg
313533545b5Smrg# Name of file we expect compiler to create.
314533545b5Smrgcofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'`
315533545b5Smrg
316533545b5Smrg# Create the lock directory.
317533545b5Smrg# Note: use '[/\\:.-]' here to ensure that we don't use the same name
318533545b5Smrg# that we are using for the .o file.  Also, base the name on the expected
319533545b5Smrg# object file name, since that is what matters with a parallel build.
320533545b5Smrglockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d
321533545b5Smrgwhile true; do
322533545b5Smrg  if mkdir "$lockdir" >/dev/null 2>&1; then
323533545b5Smrg    break
324533545b5Smrg  fi
325533545b5Smrg  sleep 1
326533545b5Smrgdone
327533545b5Smrg# FIXME: race condition here if user kills between mkdir and trap.
328533545b5Smrgtrap "rmdir '$lockdir'; exit 1" 1 2 15
329533545b5Smrg
330533545b5Smrg# Run the compile.
331533545b5Smrg"$@"
332533545b5Smrgret=$?
333533545b5Smrg
334533545b5Smrgif test -f "$cofile"; then
335533545b5Smrg  test "$cofile" = "$ofile" || mv "$cofile" "$ofile"
336533545b5Smrgelif test -f "${cofile}bj"; then
337533545b5Smrg  test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile"
338533545b5Smrgfi
339533545b5Smrg
340533545b5Smrgrmdir "$lockdir"
341533545b5Smrgexit $ret
342533545b5Smrg
343533545b5Smrg# Local Variables:
344533545b5Smrg# mode: shell-script
345533545b5Smrg# sh-indentation: 2
346c9e4df9bSmrg# eval: (add-hook 'before-save-hook 'time-stamp)
347533545b5Smrg# time-stamp-start: "scriptversion="
348533545b5Smrg# time-stamp-format: "%:y-%02m-%02d.%02H"
349c9e4df9bSmrg# time-stamp-time-zone: "UTC0"
350533545b5Smrg# time-stamp-end: "; # UTC"
351533545b5Smrg# End:
352