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