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