compile revision 14210e8e
114210e8eSmrg#! /bin/sh 214210e8eSmrg# Wrapper for compilers which do not understand '-c -o'. 314210e8eSmrg 414210e8eSmrgscriptversion=2012-10-14.11; # UTC 514210e8eSmrg 614210e8eSmrg# Copyright (C) 1999-2014 Free Software Foundation, Inc. 714210e8eSmrg# Written by Tom Tromey <tromey@cygnus.com>. 814210e8eSmrg# 914210e8eSmrg# This program is free software; you can redistribute it and/or modify 1014210e8eSmrg# it under the terms of the GNU General Public License as published by 1114210e8eSmrg# the Free Software Foundation; either version 2, or (at your option) 1214210e8eSmrg# any later version. 1314210e8eSmrg# 1414210e8eSmrg# This program is distributed in the hope that it will be useful, 1514210e8eSmrg# but WITHOUT ANY WARRANTY; without even the implied warranty of 1614210e8eSmrg# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1714210e8eSmrg# GNU General Public License for more details. 1814210e8eSmrg# 1914210e8eSmrg# You should have received a copy of the GNU General Public License 2014210e8eSmrg# along with this program. If not, see <http://www.gnu.org/licenses/>. 2114210e8eSmrg 2214210e8eSmrg# As a special exception to the GNU General Public License, if you 2314210e8eSmrg# distribute this file as part of a program that contains a 2414210e8eSmrg# configuration script generated by Autoconf, you may include it under 2514210e8eSmrg# the same distribution terms that you use for the rest of that program. 2614210e8eSmrg 2714210e8eSmrg# This file is maintained in Automake, please report 2814210e8eSmrg# bugs to <bug-automake@gnu.org> or send patches to 2914210e8eSmrg# <automake-patches@gnu.org>. 3014210e8eSmrg 3114210e8eSmrgnl=' 3214210e8eSmrg' 3314210e8eSmrg 3414210e8eSmrg# We need space, tab and new line, in precisely that order. Quoting is 3514210e8eSmrg# there to prevent tools from complaining about whitespace usage. 3614210e8eSmrgIFS=" "" $nl" 3714210e8eSmrg 3814210e8eSmrgfile_conv= 3914210e8eSmrg 4014210e8eSmrg# func_file_conv build_file lazy 4114210e8eSmrg# Convert a $build file to $host form and store it in $file 4214210e8eSmrg# Currently only supports Windows hosts. If the determined conversion 4314210e8eSmrg# type is listed in (the comma separated) LAZY, no conversion will 4414210e8eSmrg# take place. 4514210e8eSmrgfunc_file_conv () 4614210e8eSmrg{ 4714210e8eSmrg file=$1 4814210e8eSmrg case $file in 4914210e8eSmrg / | /[!/]*) # absolute file, and not a UNC file 5014210e8eSmrg if test -z "$file_conv"; then 5114210e8eSmrg # lazily determine how to convert abs files 5214210e8eSmrg case `uname -s` in 5314210e8eSmrg MINGW*) 5414210e8eSmrg file_conv=mingw 5514210e8eSmrg ;; 5614210e8eSmrg CYGWIN*) 5714210e8eSmrg file_conv=cygwin 5814210e8eSmrg ;; 5914210e8eSmrg *) 6014210e8eSmrg file_conv=wine 6114210e8eSmrg ;; 6214210e8eSmrg esac 6314210e8eSmrg fi 6414210e8eSmrg case $file_conv/,$2, in 6514210e8eSmrg *,$file_conv,*) 6614210e8eSmrg ;; 6714210e8eSmrg mingw/*) 6814210e8eSmrg file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` 6914210e8eSmrg ;; 7014210e8eSmrg cygwin/*) 7114210e8eSmrg file=`cygpath -m "$file" || echo "$file"` 7214210e8eSmrg ;; 7314210e8eSmrg wine/*) 7414210e8eSmrg file=`winepath -w "$file" || echo "$file"` 7514210e8eSmrg ;; 7614210e8eSmrg esac 7714210e8eSmrg ;; 7814210e8eSmrg esac 7914210e8eSmrg} 8014210e8eSmrg 8114210e8eSmrg# func_cl_dashL linkdir 8214210e8eSmrg# Make cl look for libraries in LINKDIR 8314210e8eSmrgfunc_cl_dashL () 8414210e8eSmrg{ 8514210e8eSmrg func_file_conv "$1" 8614210e8eSmrg if test -z "$lib_path"; then 8714210e8eSmrg lib_path=$file 8814210e8eSmrg else 8914210e8eSmrg lib_path="$lib_path;$file" 9014210e8eSmrg fi 9114210e8eSmrg linker_opts="$linker_opts -LIBPATH:$file" 9214210e8eSmrg} 9314210e8eSmrg 9414210e8eSmrg# func_cl_dashl library 9514210e8eSmrg# Do a library search-path lookup for cl 9614210e8eSmrgfunc_cl_dashl () 9714210e8eSmrg{ 9814210e8eSmrg lib=$1 9914210e8eSmrg found=no 10014210e8eSmrg save_IFS=$IFS 10114210e8eSmrg IFS=';' 10214210e8eSmrg for dir in $lib_path $LIB 10314210e8eSmrg do 10414210e8eSmrg IFS=$save_IFS 10514210e8eSmrg if $shared && test -f "$dir/$lib.dll.lib"; then 10614210e8eSmrg found=yes 10714210e8eSmrg lib=$dir/$lib.dll.lib 10814210e8eSmrg break 10914210e8eSmrg fi 11014210e8eSmrg if test -f "$dir/$lib.lib"; then 11114210e8eSmrg found=yes 11214210e8eSmrg lib=$dir/$lib.lib 11314210e8eSmrg break 11414210e8eSmrg fi 11514210e8eSmrg if test -f "$dir/lib$lib.a"; then 11614210e8eSmrg found=yes 11714210e8eSmrg lib=$dir/lib$lib.a 11814210e8eSmrg break 11914210e8eSmrg fi 12014210e8eSmrg done 12114210e8eSmrg IFS=$save_IFS 12214210e8eSmrg 12314210e8eSmrg if test "$found" != yes; then 12414210e8eSmrg lib=$lib.lib 12514210e8eSmrg fi 12614210e8eSmrg} 12714210e8eSmrg 12814210e8eSmrg# func_cl_wrapper cl arg... 12914210e8eSmrg# Adjust compile command to suit cl 13014210e8eSmrgfunc_cl_wrapper () 13114210e8eSmrg{ 13214210e8eSmrg # Assume a capable shell 13314210e8eSmrg lib_path= 13414210e8eSmrg shared=: 13514210e8eSmrg linker_opts= 13614210e8eSmrg for arg 13714210e8eSmrg do 13814210e8eSmrg if test -n "$eat"; then 13914210e8eSmrg eat= 14014210e8eSmrg else 14114210e8eSmrg case $1 in 14214210e8eSmrg -o) 14314210e8eSmrg # configure might choose to run compile as 'compile cc -o foo foo.c'. 14414210e8eSmrg eat=1 14514210e8eSmrg case $2 in 14614210e8eSmrg *.o | *.[oO][bB][jJ]) 14714210e8eSmrg func_file_conv "$2" 14814210e8eSmrg set x "$@" -Fo"$file" 14914210e8eSmrg shift 15014210e8eSmrg ;; 15114210e8eSmrg *) 15214210e8eSmrg func_file_conv "$2" 15314210e8eSmrg set x "$@" -Fe"$file" 15414210e8eSmrg shift 15514210e8eSmrg ;; 15614210e8eSmrg esac 15714210e8eSmrg ;; 15814210e8eSmrg -I) 15914210e8eSmrg eat=1 16014210e8eSmrg func_file_conv "$2" mingw 16114210e8eSmrg set x "$@" -I"$file" 16214210e8eSmrg shift 16314210e8eSmrg ;; 16414210e8eSmrg -I*) 16514210e8eSmrg func_file_conv "${1#-I}" mingw 16614210e8eSmrg set x "$@" -I"$file" 16714210e8eSmrg shift 16814210e8eSmrg ;; 16914210e8eSmrg -l) 17014210e8eSmrg eat=1 17114210e8eSmrg func_cl_dashl "$2" 17214210e8eSmrg set x "$@" "$lib" 17314210e8eSmrg shift 17414210e8eSmrg ;; 17514210e8eSmrg -l*) 17614210e8eSmrg func_cl_dashl "${1#-l}" 17714210e8eSmrg set x "$@" "$lib" 17814210e8eSmrg shift 17914210e8eSmrg ;; 18014210e8eSmrg -L) 18114210e8eSmrg eat=1 18214210e8eSmrg func_cl_dashL "$2" 18314210e8eSmrg ;; 18414210e8eSmrg -L*) 18514210e8eSmrg func_cl_dashL "${1#-L}" 18614210e8eSmrg ;; 18714210e8eSmrg -static) 18814210e8eSmrg shared=false 18914210e8eSmrg ;; 19014210e8eSmrg -Wl,*) 19114210e8eSmrg arg=${1#-Wl,} 19214210e8eSmrg save_ifs="$IFS"; IFS=',' 19314210e8eSmrg for flag in $arg; do 19414210e8eSmrg IFS="$save_ifs" 19514210e8eSmrg linker_opts="$linker_opts $flag" 19614210e8eSmrg done 19714210e8eSmrg IFS="$save_ifs" 19814210e8eSmrg ;; 19914210e8eSmrg -Xlinker) 20014210e8eSmrg eat=1 20114210e8eSmrg linker_opts="$linker_opts $2" 20214210e8eSmrg ;; 20314210e8eSmrg -*) 20414210e8eSmrg set x "$@" "$1" 20514210e8eSmrg shift 20614210e8eSmrg ;; 20714210e8eSmrg *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) 20814210e8eSmrg func_file_conv "$1" 20914210e8eSmrg set x "$@" -Tp"$file" 21014210e8eSmrg shift 21114210e8eSmrg ;; 21214210e8eSmrg *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) 21314210e8eSmrg func_file_conv "$1" mingw 21414210e8eSmrg set x "$@" "$file" 21514210e8eSmrg shift 21614210e8eSmrg ;; 21714210e8eSmrg *) 21814210e8eSmrg set x "$@" "$1" 21914210e8eSmrg shift 22014210e8eSmrg ;; 22114210e8eSmrg esac 22214210e8eSmrg fi 22314210e8eSmrg shift 22414210e8eSmrg done 22514210e8eSmrg if test -n "$linker_opts"; then 22614210e8eSmrg linker_opts="-link$linker_opts" 22714210e8eSmrg fi 22814210e8eSmrg exec "$@" $linker_opts 22914210e8eSmrg exit 1 23014210e8eSmrg} 23114210e8eSmrg 23214210e8eSmrgeat= 23314210e8eSmrg 23414210e8eSmrgcase $1 in 23514210e8eSmrg '') 23614210e8eSmrg echo "$0: No command. Try '$0 --help' for more information." 1>&2 23714210e8eSmrg exit 1; 23814210e8eSmrg ;; 23914210e8eSmrg -h | --h*) 24014210e8eSmrg cat <<\EOF 24114210e8eSmrgUsage: compile [--help] [--version] PROGRAM [ARGS] 24214210e8eSmrg 24314210e8eSmrgWrapper for compilers which do not understand '-c -o'. 24414210e8eSmrgRemove '-o dest.o' from ARGS, run PROGRAM with the remaining 24514210e8eSmrgarguments, and rename the output as expected. 24614210e8eSmrg 24714210e8eSmrgIf you are trying to build a whole package this is not the 24814210e8eSmrgright script to run: please start by reading the file 'INSTALL'. 24914210e8eSmrg 25014210e8eSmrgReport bugs to <bug-automake@gnu.org>. 25114210e8eSmrgEOF 25214210e8eSmrg exit $? 25314210e8eSmrg ;; 25414210e8eSmrg -v | --v*) 25514210e8eSmrg echo "compile $scriptversion" 25614210e8eSmrg exit $? 25714210e8eSmrg ;; 25814210e8eSmrg cl | *[/\\]cl | cl.exe | *[/\\]cl.exe ) 25914210e8eSmrg func_cl_wrapper "$@" # Doesn't return... 26014210e8eSmrg ;; 26114210e8eSmrgesac 26214210e8eSmrg 26314210e8eSmrgofile= 26414210e8eSmrgcfile= 26514210e8eSmrg 26614210e8eSmrgfor arg 26714210e8eSmrgdo 26814210e8eSmrg if test -n "$eat"; then 26914210e8eSmrg eat= 27014210e8eSmrg else 27114210e8eSmrg case $1 in 27214210e8eSmrg -o) 27314210e8eSmrg # configure might choose to run compile as 'compile cc -o foo foo.c'. 27414210e8eSmrg # So we strip '-o arg' only if arg is an object. 27514210e8eSmrg eat=1 27614210e8eSmrg case $2 in 27714210e8eSmrg *.o | *.obj) 27814210e8eSmrg ofile=$2 27914210e8eSmrg ;; 28014210e8eSmrg *) 28114210e8eSmrg set x "$@" -o "$2" 28214210e8eSmrg shift 28314210e8eSmrg ;; 28414210e8eSmrg esac 28514210e8eSmrg ;; 28614210e8eSmrg *.c) 28714210e8eSmrg cfile=$1 28814210e8eSmrg set x "$@" "$1" 28914210e8eSmrg shift 29014210e8eSmrg ;; 29114210e8eSmrg *) 29214210e8eSmrg set x "$@" "$1" 29314210e8eSmrg shift 29414210e8eSmrg ;; 29514210e8eSmrg esac 29614210e8eSmrg fi 29714210e8eSmrg shift 29814210e8eSmrgdone 29914210e8eSmrg 30014210e8eSmrgif test -z "$ofile" || test -z "$cfile"; then 30114210e8eSmrg # If no '-o' option was seen then we might have been invoked from a 30214210e8eSmrg # pattern rule where we don't need one. That is ok -- this is a 30314210e8eSmrg # normal compilation that the losing compiler can handle. If no 30414210e8eSmrg # '.c' file was seen then we are probably linking. That is also 30514210e8eSmrg # ok. 30614210e8eSmrg exec "$@" 30714210e8eSmrgfi 30814210e8eSmrg 30914210e8eSmrg# Name of file we expect compiler to create. 31014210e8eSmrgcofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` 31114210e8eSmrg 31214210e8eSmrg# Create the lock directory. 31314210e8eSmrg# Note: use '[/\\:.-]' here to ensure that we don't use the same name 31414210e8eSmrg# that we are using for the .o file. Also, base the name on the expected 31514210e8eSmrg# object file name, since that is what matters with a parallel build. 31614210e8eSmrglockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d 31714210e8eSmrgwhile true; do 31814210e8eSmrg if mkdir "$lockdir" >/dev/null 2>&1; then 31914210e8eSmrg break 32014210e8eSmrg fi 32114210e8eSmrg sleep 1 32214210e8eSmrgdone 32314210e8eSmrg# FIXME: race condition here if user kills between mkdir and trap. 32414210e8eSmrgtrap "rmdir '$lockdir'; exit 1" 1 2 15 32514210e8eSmrg 32614210e8eSmrg# Run the compile. 32714210e8eSmrg"$@" 32814210e8eSmrgret=$? 32914210e8eSmrg 33014210e8eSmrgif test -f "$cofile"; then 33114210e8eSmrg test "$cofile" = "$ofile" || mv "$cofile" "$ofile" 33214210e8eSmrgelif test -f "${cofile}bj"; then 33314210e8eSmrg test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" 33414210e8eSmrgfi 33514210e8eSmrg 33614210e8eSmrgrmdir "$lockdir" 33714210e8eSmrgexit $ret 33814210e8eSmrg 33914210e8eSmrg# Local Variables: 34014210e8eSmrg# mode: shell-script 34114210e8eSmrg# sh-indentation: 2 34214210e8eSmrg# eval: (add-hook 'write-file-hooks 'time-stamp) 34314210e8eSmrg# time-stamp-start: "scriptversion=" 34414210e8eSmrg# time-stamp-format: "%:y-%02m-%02d.%02H" 34514210e8eSmrg# time-stamp-time-zone: "UTC" 34614210e8eSmrg# time-stamp-end: "; # UTC" 34714210e8eSmrg# End: 348