1 #! /bin/sh 2 # Wrapper for compilers which do not understand '-c -o'. 3 4 scriptversion=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 (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 Windows 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@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