compile revision 14210e8e
114210e8eSmrg#! /bin/sh
214210e8eSmrg# Wrapper for compilers which do not understand '-c -o'.
314210e8eSmrg
414210e8eSmrgscriptversion=2012-10-14.11; # UTC
514210e8eSmrg
614210e8eSmrg# Copyright (C) 1999-2014 Free Software Foundation, Inc.
714210e8eSmrg# Written by Tom Tromey <tromey@cygnus.com>.
814210e8eSmrg#
914210e8eSmrg# This program is free software; you can redistribute it and/or modify
1014210e8eSmrg# it under the terms of the GNU General Public License as published by
1114210e8eSmrg# the Free Software Foundation; either version 2, or (at your option)
1214210e8eSmrg# any later version.
1314210e8eSmrg#
1414210e8eSmrg# This program is distributed in the hope that it will be useful,
1514210e8eSmrg# but WITHOUT ANY WARRANTY; without even the implied warranty of
1614210e8eSmrg# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1714210e8eSmrg# GNU General Public License for more details.
1814210e8eSmrg#
1914210e8eSmrg# You should have received a copy of the GNU General Public License
2014210e8eSmrg# along with this program.  If not, see <http://www.gnu.org/licenses/>.
2114210e8eSmrg
2214210e8eSmrg# As a special exception to the GNU General Public License, if you
2314210e8eSmrg# distribute this file as part of a program that contains a
2414210e8eSmrg# configuration script generated by Autoconf, you may include it under
2514210e8eSmrg# the same distribution terms that you use for the rest of that program.
2614210e8eSmrg
2714210e8eSmrg# This file is maintained in Automake, please report
2814210e8eSmrg# bugs to <bug-automake@gnu.org> or send patches to
2914210e8eSmrg# <automake-patches@gnu.org>.
3014210e8eSmrg
3114210e8eSmrgnl='
3214210e8eSmrg'
3314210e8eSmrg
3414210e8eSmrg# We need space, tab and new line, in precisely that order.  Quoting is
3514210e8eSmrg# there to prevent tools from complaining about whitespace usage.
3614210e8eSmrgIFS=" ""	$nl"
3714210e8eSmrg
3814210e8eSmrgfile_conv=
3914210e8eSmrg
4014210e8eSmrg# func_file_conv build_file lazy
4114210e8eSmrg# Convert a $build file to $host form and store it in $file
4214210e8eSmrg# Currently only supports Windows hosts. If the determined conversion
4314210e8eSmrg# type is listed in (the comma separated) LAZY, no conversion will
4414210e8eSmrg# take place.
4514210e8eSmrgfunc_file_conv ()
4614210e8eSmrg{
4714210e8eSmrg  file=$1
4814210e8eSmrg  case $file in
4914210e8eSmrg    / | /[!/]*) # absolute file, and not a UNC file
5014210e8eSmrg      if test -z "$file_conv"; then
5114210e8eSmrg	# lazily determine how to convert abs files
5214210e8eSmrg	case `uname -s` in
5314210e8eSmrg	  MINGW*)
5414210e8eSmrg	    file_conv=mingw
5514210e8eSmrg	    ;;
5614210e8eSmrg	  CYGWIN*)
5714210e8eSmrg	    file_conv=cygwin
5814210e8eSmrg	    ;;
5914210e8eSmrg	  *)
6014210e8eSmrg	    file_conv=wine
6114210e8eSmrg	    ;;
6214210e8eSmrg	esac
6314210e8eSmrg      fi
6414210e8eSmrg      case $file_conv/,$2, in
6514210e8eSmrg	*,$file_conv,*)
6614210e8eSmrg	  ;;
6714210e8eSmrg	mingw/*)
6814210e8eSmrg	  file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'`
6914210e8eSmrg	  ;;
7014210e8eSmrg	cygwin/*)
7114210e8eSmrg	  file=`cygpath -m "$file" || echo "$file"`
7214210e8eSmrg	  ;;
7314210e8eSmrg	wine/*)
7414210e8eSmrg	  file=`winepath -w "$file" || echo "$file"`
7514210e8eSmrg	  ;;
7614210e8eSmrg      esac
7714210e8eSmrg      ;;
7814210e8eSmrg  esac
7914210e8eSmrg}
8014210e8eSmrg
8114210e8eSmrg# func_cl_dashL linkdir
8214210e8eSmrg# Make cl look for libraries in LINKDIR
8314210e8eSmrgfunc_cl_dashL ()
8414210e8eSmrg{
8514210e8eSmrg  func_file_conv "$1"
8614210e8eSmrg  if test -z "$lib_path"; then
8714210e8eSmrg    lib_path=$file
8814210e8eSmrg  else
8914210e8eSmrg    lib_path="$lib_path;$file"
9014210e8eSmrg  fi
9114210e8eSmrg  linker_opts="$linker_opts -LIBPATH:$file"
9214210e8eSmrg}
9314210e8eSmrg
9414210e8eSmrg# func_cl_dashl library
9514210e8eSmrg# Do a library search-path lookup for cl
9614210e8eSmrgfunc_cl_dashl ()
9714210e8eSmrg{
9814210e8eSmrg  lib=$1
9914210e8eSmrg  found=no
10014210e8eSmrg  save_IFS=$IFS
10114210e8eSmrg  IFS=';'
10214210e8eSmrg  for dir in $lib_path $LIB
10314210e8eSmrg  do
10414210e8eSmrg    IFS=$save_IFS
10514210e8eSmrg    if $shared && test -f "$dir/$lib.dll.lib"; then
10614210e8eSmrg      found=yes
10714210e8eSmrg      lib=$dir/$lib.dll.lib
10814210e8eSmrg      break
10914210e8eSmrg    fi
11014210e8eSmrg    if test -f "$dir/$lib.lib"; then
11114210e8eSmrg      found=yes
11214210e8eSmrg      lib=$dir/$lib.lib
11314210e8eSmrg      break
11414210e8eSmrg    fi
11514210e8eSmrg    if test -f "$dir/lib$lib.a"; then
11614210e8eSmrg      found=yes
11714210e8eSmrg      lib=$dir/lib$lib.a
11814210e8eSmrg      break
11914210e8eSmrg    fi
12014210e8eSmrg  done
12114210e8eSmrg  IFS=$save_IFS
12214210e8eSmrg
12314210e8eSmrg  if test "$found" != yes; then
12414210e8eSmrg    lib=$lib.lib
12514210e8eSmrg  fi
12614210e8eSmrg}
12714210e8eSmrg
12814210e8eSmrg# func_cl_wrapper cl arg...
12914210e8eSmrg# Adjust compile command to suit cl
13014210e8eSmrgfunc_cl_wrapper ()
13114210e8eSmrg{
13214210e8eSmrg  # Assume a capable shell
13314210e8eSmrg  lib_path=
13414210e8eSmrg  shared=:
13514210e8eSmrg  linker_opts=
13614210e8eSmrg  for arg
13714210e8eSmrg  do
13814210e8eSmrg    if test -n "$eat"; then
13914210e8eSmrg      eat=
14014210e8eSmrg    else
14114210e8eSmrg      case $1 in
14214210e8eSmrg	-o)
14314210e8eSmrg	  # configure might choose to run compile as 'compile cc -o foo foo.c'.
14414210e8eSmrg	  eat=1
14514210e8eSmrg	  case $2 in
14614210e8eSmrg	    *.o | *.[oO][bB][jJ])
14714210e8eSmrg	      func_file_conv "$2"
14814210e8eSmrg	      set x "$@" -Fo"$file"
14914210e8eSmrg	      shift
15014210e8eSmrg	      ;;
15114210e8eSmrg	    *)
15214210e8eSmrg	      func_file_conv "$2"
15314210e8eSmrg	      set x "$@" -Fe"$file"
15414210e8eSmrg	      shift
15514210e8eSmrg	      ;;
15614210e8eSmrg	  esac
15714210e8eSmrg	  ;;
15814210e8eSmrg	-I)
15914210e8eSmrg	  eat=1
16014210e8eSmrg	  func_file_conv "$2" mingw
16114210e8eSmrg	  set x "$@" -I"$file"
16214210e8eSmrg	  shift
16314210e8eSmrg	  ;;
16414210e8eSmrg	-I*)
16514210e8eSmrg	  func_file_conv "${1#-I}" mingw
16614210e8eSmrg	  set x "$@" -I"$file"
16714210e8eSmrg	  shift
16814210e8eSmrg	  ;;
16914210e8eSmrg	-l)
17014210e8eSmrg	  eat=1
17114210e8eSmrg	  func_cl_dashl "$2"
17214210e8eSmrg	  set x "$@" "$lib"
17314210e8eSmrg	  shift
17414210e8eSmrg	  ;;
17514210e8eSmrg	-l*)
17614210e8eSmrg	  func_cl_dashl "${1#-l}"
17714210e8eSmrg	  set x "$@" "$lib"
17814210e8eSmrg	  shift
17914210e8eSmrg	  ;;
18014210e8eSmrg	-L)
18114210e8eSmrg	  eat=1
18214210e8eSmrg	  func_cl_dashL "$2"
18314210e8eSmrg	  ;;
18414210e8eSmrg	-L*)
18514210e8eSmrg	  func_cl_dashL "${1#-L}"
18614210e8eSmrg	  ;;
18714210e8eSmrg	-static)
18814210e8eSmrg	  shared=false
18914210e8eSmrg	  ;;
19014210e8eSmrg	-Wl,*)
19114210e8eSmrg	  arg=${1#-Wl,}
19214210e8eSmrg	  save_ifs="$IFS"; IFS=','
19314210e8eSmrg	  for flag in $arg; do
19414210e8eSmrg	    IFS="$save_ifs"
19514210e8eSmrg	    linker_opts="$linker_opts $flag"
19614210e8eSmrg	  done
19714210e8eSmrg	  IFS="$save_ifs"
19814210e8eSmrg	  ;;
19914210e8eSmrg	-Xlinker)
20014210e8eSmrg	  eat=1
20114210e8eSmrg	  linker_opts="$linker_opts $2"
20214210e8eSmrg	  ;;
20314210e8eSmrg	-*)
20414210e8eSmrg	  set x "$@" "$1"
20514210e8eSmrg	  shift
20614210e8eSmrg	  ;;
20714210e8eSmrg	*.cc | *.CC | *.cxx | *.CXX | *.[cC]++)
20814210e8eSmrg	  func_file_conv "$1"
20914210e8eSmrg	  set x "$@" -Tp"$file"
21014210e8eSmrg	  shift
21114210e8eSmrg	  ;;
21214210e8eSmrg	*.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO])
21314210e8eSmrg	  func_file_conv "$1" mingw
21414210e8eSmrg	  set x "$@" "$file"
21514210e8eSmrg	  shift
21614210e8eSmrg	  ;;
21714210e8eSmrg	*)
21814210e8eSmrg	  set x "$@" "$1"
21914210e8eSmrg	  shift
22014210e8eSmrg	  ;;
22114210e8eSmrg      esac
22214210e8eSmrg    fi
22314210e8eSmrg    shift
22414210e8eSmrg  done
22514210e8eSmrg  if test -n "$linker_opts"; then
22614210e8eSmrg    linker_opts="-link$linker_opts"
22714210e8eSmrg  fi
22814210e8eSmrg  exec "$@" $linker_opts
22914210e8eSmrg  exit 1
23014210e8eSmrg}
23114210e8eSmrg
23214210e8eSmrgeat=
23314210e8eSmrg
23414210e8eSmrgcase $1 in
23514210e8eSmrg  '')
23614210e8eSmrg     echo "$0: No command.  Try '$0 --help' for more information." 1>&2
23714210e8eSmrg     exit 1;
23814210e8eSmrg     ;;
23914210e8eSmrg  -h | --h*)
24014210e8eSmrg    cat <<\EOF
24114210e8eSmrgUsage: compile [--help] [--version] PROGRAM [ARGS]
24214210e8eSmrg
24314210e8eSmrgWrapper for compilers which do not understand '-c -o'.
24414210e8eSmrgRemove '-o dest.o' from ARGS, run PROGRAM with the remaining
24514210e8eSmrgarguments, and rename the output as expected.
24614210e8eSmrg
24714210e8eSmrgIf you are trying to build a whole package this is not the
24814210e8eSmrgright script to run: please start by reading the file 'INSTALL'.
24914210e8eSmrg
25014210e8eSmrgReport bugs to <bug-automake@gnu.org>.
25114210e8eSmrgEOF
25214210e8eSmrg    exit $?
25314210e8eSmrg    ;;
25414210e8eSmrg  -v | --v*)
25514210e8eSmrg    echo "compile $scriptversion"
25614210e8eSmrg    exit $?
25714210e8eSmrg    ;;
25814210e8eSmrg  cl | *[/\\]cl | cl.exe | *[/\\]cl.exe )
25914210e8eSmrg    func_cl_wrapper "$@"      # Doesn't return...
26014210e8eSmrg    ;;
26114210e8eSmrgesac
26214210e8eSmrg
26314210e8eSmrgofile=
26414210e8eSmrgcfile=
26514210e8eSmrg
26614210e8eSmrgfor arg
26714210e8eSmrgdo
26814210e8eSmrg  if test -n "$eat"; then
26914210e8eSmrg    eat=
27014210e8eSmrg  else
27114210e8eSmrg    case $1 in
27214210e8eSmrg      -o)
27314210e8eSmrg	# configure might choose to run compile as 'compile cc -o foo foo.c'.
27414210e8eSmrg	# So we strip '-o arg' only if arg is an object.
27514210e8eSmrg	eat=1
27614210e8eSmrg	case $2 in
27714210e8eSmrg	  *.o | *.obj)
27814210e8eSmrg	    ofile=$2
27914210e8eSmrg	    ;;
28014210e8eSmrg	  *)
28114210e8eSmrg	    set x "$@" -o "$2"
28214210e8eSmrg	    shift
28314210e8eSmrg	    ;;
28414210e8eSmrg	esac
28514210e8eSmrg	;;
28614210e8eSmrg      *.c)
28714210e8eSmrg	cfile=$1
28814210e8eSmrg	set x "$@" "$1"
28914210e8eSmrg	shift
29014210e8eSmrg	;;
29114210e8eSmrg      *)
29214210e8eSmrg	set x "$@" "$1"
29314210e8eSmrg	shift
29414210e8eSmrg	;;
29514210e8eSmrg    esac
29614210e8eSmrg  fi
29714210e8eSmrg  shift
29814210e8eSmrgdone
29914210e8eSmrg
30014210e8eSmrgif test -z "$ofile" || test -z "$cfile"; then
30114210e8eSmrg  # If no '-o' option was seen then we might have been invoked from a
30214210e8eSmrg  # pattern rule where we don't need one.  That is ok -- this is a
30314210e8eSmrg  # normal compilation that the losing compiler can handle.  If no
30414210e8eSmrg  # '.c' file was seen then we are probably linking.  That is also
30514210e8eSmrg  # ok.
30614210e8eSmrg  exec "$@"
30714210e8eSmrgfi
30814210e8eSmrg
30914210e8eSmrg# Name of file we expect compiler to create.
31014210e8eSmrgcofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'`
31114210e8eSmrg
31214210e8eSmrg# Create the lock directory.
31314210e8eSmrg# Note: use '[/\\:.-]' here to ensure that we don't use the same name
31414210e8eSmrg# that we are using for the .o file.  Also, base the name on the expected
31514210e8eSmrg# object file name, since that is what matters with a parallel build.
31614210e8eSmrglockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d
31714210e8eSmrgwhile true; do
31814210e8eSmrg  if mkdir "$lockdir" >/dev/null 2>&1; then
31914210e8eSmrg    break
32014210e8eSmrg  fi
32114210e8eSmrg  sleep 1
32214210e8eSmrgdone
32314210e8eSmrg# FIXME: race condition here if user kills between mkdir and trap.
32414210e8eSmrgtrap "rmdir '$lockdir'; exit 1" 1 2 15
32514210e8eSmrg
32614210e8eSmrg# Run the compile.
32714210e8eSmrg"$@"
32814210e8eSmrgret=$?
32914210e8eSmrg
33014210e8eSmrgif test -f "$cofile"; then
33114210e8eSmrg  test "$cofile" = "$ofile" || mv "$cofile" "$ofile"
33214210e8eSmrgelif test -f "${cofile}bj"; then
33314210e8eSmrg  test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile"
33414210e8eSmrgfi
33514210e8eSmrg
33614210e8eSmrgrmdir "$lockdir"
33714210e8eSmrgexit $ret
33814210e8eSmrg
33914210e8eSmrg# Local Variables:
34014210e8eSmrg# mode: shell-script
34114210e8eSmrg# sh-indentation: 2
34214210e8eSmrg# eval: (add-hook 'write-file-hooks 'time-stamp)
34314210e8eSmrg# time-stamp-start: "scriptversion="
34414210e8eSmrg# time-stamp-format: "%:y-%02m-%02d.%02H"
34514210e8eSmrg# time-stamp-time-zone: "UTC"
34614210e8eSmrg# time-stamp-end: "; # UTC"
34714210e8eSmrg# End:
348