compile revision 25dbecb6
11f27ce9aSmrg#! /bin/sh
225dbecb6Smrg# Wrapper for compilers which do not understand '-c -o'.
31f27ce9aSmrg
425dbecb6Smrgscriptversion=2018-03-07.03; # UTC
51f27ce9aSmrg
625dbecb6Smrg# Copyright (C) 1999-2021 Free Software Foundation, Inc.
71f27ce9aSmrg# Written by Tom Tromey <tromey@cygnus.com>.
81f27ce9aSmrg#
91f27ce9aSmrg# This program is free software; you can redistribute it and/or modify
101f27ce9aSmrg# it under the terms of the GNU General Public License as published by
111f27ce9aSmrg# the Free Software Foundation; either version 2, or (at your option)
121f27ce9aSmrg# any later version.
131f27ce9aSmrg#
141f27ce9aSmrg# This program is distributed in the hope that it will be useful,
151f27ce9aSmrg# but WITHOUT ANY WARRANTY; without even the implied warranty of
161f27ce9aSmrg# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
171f27ce9aSmrg# GNU General Public License for more details.
181f27ce9aSmrg#
191f27ce9aSmrg# You should have received a copy of the GNU General Public License
2025dbecb6Smrg# along with this program.  If not, see <https://www.gnu.org/licenses/>.
211f27ce9aSmrg
221f27ce9aSmrg# As a special exception to the GNU General Public License, if you
231f27ce9aSmrg# distribute this file as part of a program that contains a
241f27ce9aSmrg# configuration script generated by Autoconf, you may include it under
251f27ce9aSmrg# the same distribution terms that you use for the rest of that program.
261f27ce9aSmrg
271f27ce9aSmrg# This file is maintained in Automake, please report
281f27ce9aSmrg# bugs to <bug-automake@gnu.org> or send patches to
291f27ce9aSmrg# <automake-patches@gnu.org>.
301f27ce9aSmrg
3125dbecb6Smrgnl='
3225dbecb6Smrg'
3325dbecb6Smrg
3425dbecb6Smrg# We need space, tab and new line, in precisely that order.  Quoting is
3525dbecb6Smrg# there to prevent tools from complaining about whitespace usage.
3625dbecb6SmrgIFS=" ""	$nl"
3725dbecb6Smrg
3825dbecb6Smrgfile_conv=
3925dbecb6Smrg
4025dbecb6Smrg# func_file_conv build_file lazy
4125dbecb6Smrg# Convert a $build file to $host form and store it in $file
4225dbecb6Smrg# Currently only supports Windows hosts. If the determined conversion
4325dbecb6Smrg# type is listed in (the comma separated) LAZY, no conversion will
4425dbecb6Smrg# take place.
4525dbecb6Smrgfunc_file_conv ()
4625dbecb6Smrg{
4725dbecb6Smrg  file=$1
4825dbecb6Smrg  case $file in
4925dbecb6Smrg    / | /[!/]*) # absolute file, and not a UNC file
5025dbecb6Smrg      if test -z "$file_conv"; then
5125dbecb6Smrg	# lazily determine how to convert abs files
5225dbecb6Smrg	case `uname -s` in
5325dbecb6Smrg	  MINGW*)
5425dbecb6Smrg	    file_conv=mingw
5525dbecb6Smrg	    ;;
5625dbecb6Smrg	  CYGWIN* | MSYS*)
5725dbecb6Smrg	    file_conv=cygwin
5825dbecb6Smrg	    ;;
5925dbecb6Smrg	  *)
6025dbecb6Smrg	    file_conv=wine
6125dbecb6Smrg	    ;;
6225dbecb6Smrg	esac
6325dbecb6Smrg      fi
6425dbecb6Smrg      case $file_conv/,$2, in
6525dbecb6Smrg	*,$file_conv,*)
6625dbecb6Smrg	  ;;
6725dbecb6Smrg	mingw/*)
6825dbecb6Smrg	  file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'`
6925dbecb6Smrg	  ;;
7025dbecb6Smrg	cygwin/* | msys/*)
7125dbecb6Smrg	  file=`cygpath -m "$file" || echo "$file"`
7225dbecb6Smrg	  ;;
7325dbecb6Smrg	wine/*)
7425dbecb6Smrg	  file=`winepath -w "$file" || echo "$file"`
7525dbecb6Smrg	  ;;
7625dbecb6Smrg      esac
7725dbecb6Smrg      ;;
7825dbecb6Smrg  esac
7925dbecb6Smrg}
8025dbecb6Smrg
8125dbecb6Smrg# func_cl_dashL linkdir
8225dbecb6Smrg# Make cl look for libraries in LINKDIR
8325dbecb6Smrgfunc_cl_dashL ()
8425dbecb6Smrg{
8525dbecb6Smrg  func_file_conv "$1"
8625dbecb6Smrg  if test -z "$lib_path"; then
8725dbecb6Smrg    lib_path=$file
8825dbecb6Smrg  else
8925dbecb6Smrg    lib_path="$lib_path;$file"
9025dbecb6Smrg  fi
9125dbecb6Smrg  linker_opts="$linker_opts -LIBPATH:$file"
9225dbecb6Smrg}
9325dbecb6Smrg
9425dbecb6Smrg# func_cl_dashl library
9525dbecb6Smrg# Do a library search-path lookup for cl
9625dbecb6Smrgfunc_cl_dashl ()
9725dbecb6Smrg{
9825dbecb6Smrg  lib=$1
9925dbecb6Smrg  found=no
10025dbecb6Smrg  save_IFS=$IFS
10125dbecb6Smrg  IFS=';'
10225dbecb6Smrg  for dir in $lib_path $LIB
10325dbecb6Smrg  do
10425dbecb6Smrg    IFS=$save_IFS
10525dbecb6Smrg    if $shared && test -f "$dir/$lib.dll.lib"; then
10625dbecb6Smrg      found=yes
10725dbecb6Smrg      lib=$dir/$lib.dll.lib
10825dbecb6Smrg      break
10925dbecb6Smrg    fi
11025dbecb6Smrg    if test -f "$dir/$lib.lib"; then
11125dbecb6Smrg      found=yes
11225dbecb6Smrg      lib=$dir/$lib.lib
11325dbecb6Smrg      break
11425dbecb6Smrg    fi
11525dbecb6Smrg    if test -f "$dir/lib$lib.a"; then
11625dbecb6Smrg      found=yes
11725dbecb6Smrg      lib=$dir/lib$lib.a
11825dbecb6Smrg      break
11925dbecb6Smrg    fi
12025dbecb6Smrg  done
12125dbecb6Smrg  IFS=$save_IFS
12225dbecb6Smrg
12325dbecb6Smrg  if test "$found" != yes; then
12425dbecb6Smrg    lib=$lib.lib
12525dbecb6Smrg  fi
12625dbecb6Smrg}
12725dbecb6Smrg
12825dbecb6Smrg# func_cl_wrapper cl arg...
12925dbecb6Smrg# Adjust compile command to suit cl
13025dbecb6Smrgfunc_cl_wrapper ()
13125dbecb6Smrg{
13225dbecb6Smrg  # Assume a capable shell
13325dbecb6Smrg  lib_path=
13425dbecb6Smrg  shared=:
13525dbecb6Smrg  linker_opts=
13625dbecb6Smrg  for arg
13725dbecb6Smrg  do
13825dbecb6Smrg    if test -n "$eat"; then
13925dbecb6Smrg      eat=
14025dbecb6Smrg    else
14125dbecb6Smrg      case $1 in
14225dbecb6Smrg	-o)
14325dbecb6Smrg	  # configure might choose to run compile as 'compile cc -o foo foo.c'.
14425dbecb6Smrg	  eat=1
14525dbecb6Smrg	  case $2 in
14625dbecb6Smrg	    *.o | *.[oO][bB][jJ])
14725dbecb6Smrg	      func_file_conv "$2"
14825dbecb6Smrg	      set x "$@" -Fo"$file"
14925dbecb6Smrg	      shift
15025dbecb6Smrg	      ;;
15125dbecb6Smrg	    *)
15225dbecb6Smrg	      func_file_conv "$2"
15325dbecb6Smrg	      set x "$@" -Fe"$file"
15425dbecb6Smrg	      shift
15525dbecb6Smrg	      ;;
15625dbecb6Smrg	  esac
15725dbecb6Smrg	  ;;
15825dbecb6Smrg	-I)
15925dbecb6Smrg	  eat=1
16025dbecb6Smrg	  func_file_conv "$2" mingw
16125dbecb6Smrg	  set x "$@" -I"$file"
16225dbecb6Smrg	  shift
16325dbecb6Smrg	  ;;
16425dbecb6Smrg	-I*)
16525dbecb6Smrg	  func_file_conv "${1#-I}" mingw
16625dbecb6Smrg	  set x "$@" -I"$file"
16725dbecb6Smrg	  shift
16825dbecb6Smrg	  ;;
16925dbecb6Smrg	-l)
17025dbecb6Smrg	  eat=1
17125dbecb6Smrg	  func_cl_dashl "$2"
17225dbecb6Smrg	  set x "$@" "$lib"
17325dbecb6Smrg	  shift
17425dbecb6Smrg	  ;;
17525dbecb6Smrg	-l*)
17625dbecb6Smrg	  func_cl_dashl "${1#-l}"
17725dbecb6Smrg	  set x "$@" "$lib"
17825dbecb6Smrg	  shift
17925dbecb6Smrg	  ;;
18025dbecb6Smrg	-L)
18125dbecb6Smrg	  eat=1
18225dbecb6Smrg	  func_cl_dashL "$2"
18325dbecb6Smrg	  ;;
18425dbecb6Smrg	-L*)
18525dbecb6Smrg	  func_cl_dashL "${1#-L}"
18625dbecb6Smrg	  ;;
18725dbecb6Smrg	-static)
18825dbecb6Smrg	  shared=false
18925dbecb6Smrg	  ;;
19025dbecb6Smrg	-Wl,*)
19125dbecb6Smrg	  arg=${1#-Wl,}
19225dbecb6Smrg	  save_ifs="$IFS"; IFS=','
19325dbecb6Smrg	  for flag in $arg; do
19425dbecb6Smrg	    IFS="$save_ifs"
19525dbecb6Smrg	    linker_opts="$linker_opts $flag"
19625dbecb6Smrg	  done
19725dbecb6Smrg	  IFS="$save_ifs"
19825dbecb6Smrg	  ;;
19925dbecb6Smrg	-Xlinker)
20025dbecb6Smrg	  eat=1
20125dbecb6Smrg	  linker_opts="$linker_opts $2"
20225dbecb6Smrg	  ;;
20325dbecb6Smrg	-*)
20425dbecb6Smrg	  set x "$@" "$1"
20525dbecb6Smrg	  shift
20625dbecb6Smrg	  ;;
20725dbecb6Smrg	*.cc | *.CC | *.cxx | *.CXX | *.[cC]++)
20825dbecb6Smrg	  func_file_conv "$1"
20925dbecb6Smrg	  set x "$@" -Tp"$file"
21025dbecb6Smrg	  shift
21125dbecb6Smrg	  ;;
21225dbecb6Smrg	*.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO])
21325dbecb6Smrg	  func_file_conv "$1" mingw
21425dbecb6Smrg	  set x "$@" "$file"
21525dbecb6Smrg	  shift
21625dbecb6Smrg	  ;;
21725dbecb6Smrg	*)
21825dbecb6Smrg	  set x "$@" "$1"
21925dbecb6Smrg	  shift
22025dbecb6Smrg	  ;;
22125dbecb6Smrg      esac
22225dbecb6Smrg    fi
22325dbecb6Smrg    shift
22425dbecb6Smrg  done
22525dbecb6Smrg  if test -n "$linker_opts"; then
22625dbecb6Smrg    linker_opts="-link$linker_opts"
22725dbecb6Smrg  fi
22825dbecb6Smrg  exec "$@" $linker_opts
22925dbecb6Smrg  exit 1
23025dbecb6Smrg}
23125dbecb6Smrg
23225dbecb6Smrgeat=
23325dbecb6Smrg
2341f27ce9aSmrgcase $1 in
2351f27ce9aSmrg  '')
23625dbecb6Smrg     echo "$0: No command.  Try '$0 --help' for more information." 1>&2
2371f27ce9aSmrg     exit 1;
2381f27ce9aSmrg     ;;
2391f27ce9aSmrg  -h | --h*)
2401f27ce9aSmrg    cat <<\EOF
2411f27ce9aSmrgUsage: compile [--help] [--version] PROGRAM [ARGS]
2421f27ce9aSmrg
24325dbecb6SmrgWrapper for compilers which do not understand '-c -o'.
24425dbecb6SmrgRemove '-o dest.o' from ARGS, run PROGRAM with the remaining
2451f27ce9aSmrgarguments, and rename the output as expected.
2461f27ce9aSmrg
2471f27ce9aSmrgIf you are trying to build a whole package this is not the
24825dbecb6Smrgright script to run: please start by reading the file 'INSTALL'.
2491f27ce9aSmrg
2501f27ce9aSmrgReport bugs to <bug-automake@gnu.org>.
2511f27ce9aSmrgEOF
2521f27ce9aSmrg    exit $?
2531f27ce9aSmrg    ;;
2541f27ce9aSmrg  -v | --v*)
2551f27ce9aSmrg    echo "compile $scriptversion"
2561f27ce9aSmrg    exit $?
2571f27ce9aSmrg    ;;
25825dbecb6Smrg  cl | *[/\\]cl | cl.exe | *[/\\]cl.exe | \
25925dbecb6Smrg  icl | *[/\\]icl | icl.exe | *[/\\]icl.exe )
26025dbecb6Smrg    func_cl_wrapper "$@"      # Doesn't return...
26125dbecb6Smrg    ;;
2621f27ce9aSmrgesac
2631f27ce9aSmrg
2641f27ce9aSmrgofile=
2651f27ce9aSmrgcfile=
2661f27ce9aSmrg
2671f27ce9aSmrgfor arg
2681f27ce9aSmrgdo
2691f27ce9aSmrg  if test -n "$eat"; then
2701f27ce9aSmrg    eat=
2711f27ce9aSmrg  else
2721f27ce9aSmrg    case $1 in
2731f27ce9aSmrg      -o)
27425dbecb6Smrg	# configure might choose to run compile as 'compile cc -o foo foo.c'.
27525dbecb6Smrg	# So we strip '-o arg' only if arg is an object.
2761f27ce9aSmrg	eat=1
2771f27ce9aSmrg	case $2 in
2781f27ce9aSmrg	  *.o | *.obj)
2791f27ce9aSmrg	    ofile=$2
2801f27ce9aSmrg	    ;;
2811f27ce9aSmrg	  *)
2821f27ce9aSmrg	    set x "$@" -o "$2"
2831f27ce9aSmrg	    shift
2841f27ce9aSmrg	    ;;
2851f27ce9aSmrg	esac
2861f27ce9aSmrg	;;
2871f27ce9aSmrg      *.c)
2881f27ce9aSmrg	cfile=$1
2891f27ce9aSmrg	set x "$@" "$1"
2901f27ce9aSmrg	shift
2911f27ce9aSmrg	;;
2921f27ce9aSmrg      *)
2931f27ce9aSmrg	set x "$@" "$1"
2941f27ce9aSmrg	shift
2951f27ce9aSmrg	;;
2961f27ce9aSmrg    esac
2971f27ce9aSmrg  fi
2981f27ce9aSmrg  shift
2991f27ce9aSmrgdone
3001f27ce9aSmrg
3011f27ce9aSmrgif test -z "$ofile" || test -z "$cfile"; then
30225dbecb6Smrg  # If no '-o' option was seen then we might have been invoked from a
3031f27ce9aSmrg  # pattern rule where we don't need one.  That is ok -- this is a
3041f27ce9aSmrg  # normal compilation that the losing compiler can handle.  If no
30525dbecb6Smrg  # '.c' file was seen then we are probably linking.  That is also
3061f27ce9aSmrg  # ok.
3071f27ce9aSmrg  exec "$@"
3081f27ce9aSmrgfi
3091f27ce9aSmrg
3101f27ce9aSmrg# Name of file we expect compiler to create.
31125dbecb6Smrgcofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'`
3121f27ce9aSmrg
3131f27ce9aSmrg# Create the lock directory.
31425dbecb6Smrg# Note: use '[/\\:.-]' here to ensure that we don't use the same name
3151f27ce9aSmrg# that we are using for the .o file.  Also, base the name on the expected
3161f27ce9aSmrg# object file name, since that is what matters with a parallel build.
31725dbecb6Smrglockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d
3181f27ce9aSmrgwhile true; do
3191f27ce9aSmrg  if mkdir "$lockdir" >/dev/null 2>&1; then
3201f27ce9aSmrg    break
3211f27ce9aSmrg  fi
3221f27ce9aSmrg  sleep 1
3231f27ce9aSmrgdone
3241f27ce9aSmrg# FIXME: race condition here if user kills between mkdir and trap.
3251f27ce9aSmrgtrap "rmdir '$lockdir'; exit 1" 1 2 15
3261f27ce9aSmrg
3271f27ce9aSmrg# Run the compile.
3281f27ce9aSmrg"$@"
3291f27ce9aSmrgret=$?
3301f27ce9aSmrg
3311f27ce9aSmrgif test -f "$cofile"; then
33225dbecb6Smrg  test "$cofile" = "$ofile" || mv "$cofile" "$ofile"
3331f27ce9aSmrgelif test -f "${cofile}bj"; then
33425dbecb6Smrg  test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile"
3351f27ce9aSmrgfi
3361f27ce9aSmrg
3371f27ce9aSmrgrmdir "$lockdir"
3381f27ce9aSmrgexit $ret
3391f27ce9aSmrg
3401f27ce9aSmrg# Local Variables:
3411f27ce9aSmrg# mode: shell-script
3421f27ce9aSmrg# sh-indentation: 2
34325dbecb6Smrg# eval: (add-hook 'before-save-hook 'time-stamp)
3441f27ce9aSmrg# time-stamp-start: "scriptversion="
3451f27ce9aSmrg# time-stamp-format: "%:y-%02m-%02d.%02H"
34625dbecb6Smrg# time-stamp-time-zone: "UTC0"
34725dbecb6Smrg# time-stamp-end: "; # UTC"
3481f27ce9aSmrg# End:
349