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