1#! /bin/sh 2# Wrapper for compilers which do not understand '-c -o'. 3 4scriptversion=2012-01-04.17; # UTC 5 6# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2009, 2010, 2012 Free 7# Software Foundation, Inc. 8# Written by Tom Tromey <tromey@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@gnu.org> or send patches to 30# <automake-patches@gnu.org>. 31 32nl=' 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. 37IFS=" "" $nl" 38 39file_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 Windows hosts. If the determined conversion 44# type is listed in (the comma separated) LAZY, no conversion will 45# take place. 46func_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 84func_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 195eat= 196 197case $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 204Usage: compile [--help] [--version] PROGRAM [ARGS] 205 206Wrapper for compilers which do not understand '-c -o'. 207Remove '-o dest.o' from ARGS, run PROGRAM with the remaining 208arguments, and rename the output as expected. 209 210If you are trying to build a whole package this is not the 211right script to run: please start by reading the file 'INSTALL'. 212 213Report bugs to <bug-automake@gnu.org>. 214EOF 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 ;; 224esac 225 226ofile= 227cfile= 228 229for arg 230do 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 261done 262 263if 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 "$@" 270fi 271 272# Name of file we expect compiler to create. 273cofile=`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. 279lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d 280while true; do 281 if mkdir "$lockdir" >/dev/null 2>&1; then 282 break 283 fi 284 sleep 1 285done 286# FIXME: race condition here if user kills between mkdir and trap. 287trap "rmdir '$lockdir'; exit 1" 1 2 15 288 289# Run the compile. 290"$@" 291ret=$? 292 293if test -f "$cofile"; then 294 test "$cofile" = "$ofile" || mv "$cofile" "$ofile" 295elif test -f "${cofile}bj"; then 296 test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" 297fi 298 299rmdir "$lockdir" 300exit $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