compile revision ff143803
17da8b7e3Smrg#! /bin/sh 2ff143803Smrg# Wrapper for compilers which do not understand '-c -o'. 37da8b7e3Smrg 4ff143803Smrgscriptversion=2012-10-14.11; # UTC 57da8b7e3Smrg 6ff143803Smrg# Copyright (C) 1999-2014 Free Software Foundation, Inc. 77da8b7e3Smrg# Written by Tom Tromey <tromey@cygnus.com>. 87da8b7e3Smrg# 97da8b7e3Smrg# This program is free software; you can redistribute it and/or modify 107da8b7e3Smrg# it under the terms of the GNU General Public License as published by 117da8b7e3Smrg# the Free Software Foundation; either version 2, or (at your option) 127da8b7e3Smrg# any later version. 137da8b7e3Smrg# 147da8b7e3Smrg# This program is distributed in the hope that it will be useful, 157da8b7e3Smrg# but WITHOUT ANY WARRANTY; without even the implied warranty of 167da8b7e3Smrg# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 177da8b7e3Smrg# GNU General Public License for more details. 187da8b7e3Smrg# 197da8b7e3Smrg# You should have received a copy of the GNU General Public License 20ff143803Smrg# along with this program. If not, see <http://www.gnu.org/licenses/>. 217da8b7e3Smrg 227da8b7e3Smrg# As a special exception to the GNU General Public License, if you 237da8b7e3Smrg# distribute this file as part of a program that contains a 247da8b7e3Smrg# configuration script generated by Autoconf, you may include it under 257da8b7e3Smrg# the same distribution terms that you use for the rest of that program. 267da8b7e3Smrg 277da8b7e3Smrg# This file is maintained in Automake, please report 287da8b7e3Smrg# bugs to <bug-automake@gnu.org> or send patches to 297da8b7e3Smrg# <automake-patches@gnu.org>. 307da8b7e3Smrg 31ff143803Smrgnl=' 32ff143803Smrg' 33ff143803Smrg 34ff143803Smrg# We need space, tab and new line, in precisely that order. Quoting is 35ff143803Smrg# there to prevent tools from complaining about whitespace usage. 36ff143803SmrgIFS=" "" $nl" 37ff143803Smrg 38ff143803Smrgfile_conv= 39ff143803Smrg 40ff143803Smrg# func_file_conv build_file lazy 41ff143803Smrg# Convert a $build file to $host form and store it in $file 42ff143803Smrg# Currently only supports Windows hosts. If the determined conversion 43ff143803Smrg# type is listed in (the comma separated) LAZY, no conversion will 44ff143803Smrg# take place. 45ff143803Smrgfunc_file_conv () 46ff143803Smrg{ 47ff143803Smrg file=$1 48ff143803Smrg case $file in 49ff143803Smrg / | /[!/]*) # absolute file, and not a UNC file 50ff143803Smrg if test -z "$file_conv"; then 51ff143803Smrg # lazily determine how to convert abs files 52ff143803Smrg case `uname -s` in 53ff143803Smrg MINGW*) 54ff143803Smrg file_conv=mingw 55ff143803Smrg ;; 56ff143803Smrg CYGWIN*) 57ff143803Smrg file_conv=cygwin 58ff143803Smrg ;; 59ff143803Smrg *) 60ff143803Smrg file_conv=wine 61ff143803Smrg ;; 62ff143803Smrg esac 63ff143803Smrg fi 64ff143803Smrg case $file_conv/,$2, in 65ff143803Smrg *,$file_conv,*) 66ff143803Smrg ;; 67ff143803Smrg mingw/*) 68ff143803Smrg file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` 69ff143803Smrg ;; 70ff143803Smrg cygwin/*) 71ff143803Smrg file=`cygpath -m "$file" || echo "$file"` 72ff143803Smrg ;; 73ff143803Smrg wine/*) 74ff143803Smrg file=`winepath -w "$file" || echo "$file"` 75ff143803Smrg ;; 76ff143803Smrg esac 77ff143803Smrg ;; 78ff143803Smrg esac 79ff143803Smrg} 80ff143803Smrg 81ff143803Smrg# func_cl_dashL linkdir 82ff143803Smrg# Make cl look for libraries in LINKDIR 83ff143803Smrgfunc_cl_dashL () 84ff143803Smrg{ 85ff143803Smrg func_file_conv "$1" 86ff143803Smrg if test -z "$lib_path"; then 87ff143803Smrg lib_path=$file 88ff143803Smrg else 89ff143803Smrg lib_path="$lib_path;$file" 90ff143803Smrg fi 91ff143803Smrg linker_opts="$linker_opts -LIBPATH:$file" 92ff143803Smrg} 93ff143803Smrg 94ff143803Smrg# func_cl_dashl library 95ff143803Smrg# Do a library search-path lookup for cl 96ff143803Smrgfunc_cl_dashl () 97ff143803Smrg{ 98ff143803Smrg lib=$1 99ff143803Smrg found=no 100ff143803Smrg save_IFS=$IFS 101ff143803Smrg IFS=';' 102ff143803Smrg for dir in $lib_path $LIB 103ff143803Smrg do 104ff143803Smrg IFS=$save_IFS 105ff143803Smrg if $shared && test -f "$dir/$lib.dll.lib"; then 106ff143803Smrg found=yes 107ff143803Smrg lib=$dir/$lib.dll.lib 108ff143803Smrg break 109ff143803Smrg fi 110ff143803Smrg if test -f "$dir/$lib.lib"; then 111ff143803Smrg found=yes 112ff143803Smrg lib=$dir/$lib.lib 113ff143803Smrg break 114ff143803Smrg fi 115ff143803Smrg if test -f "$dir/lib$lib.a"; then 116ff143803Smrg found=yes 117ff143803Smrg lib=$dir/lib$lib.a 118ff143803Smrg break 119ff143803Smrg fi 120ff143803Smrg done 121ff143803Smrg IFS=$save_IFS 122ff143803Smrg 123ff143803Smrg if test "$found" != yes; then 124ff143803Smrg lib=$lib.lib 125ff143803Smrg fi 126ff143803Smrg} 127ff143803Smrg 128ff143803Smrg# func_cl_wrapper cl arg... 129ff143803Smrg# Adjust compile command to suit cl 130ff143803Smrgfunc_cl_wrapper () 131ff143803Smrg{ 132ff143803Smrg # Assume a capable shell 133ff143803Smrg lib_path= 134ff143803Smrg shared=: 135ff143803Smrg linker_opts= 136ff143803Smrg for arg 137ff143803Smrg do 138ff143803Smrg if test -n "$eat"; then 139ff143803Smrg eat= 140ff143803Smrg else 141ff143803Smrg case $1 in 142ff143803Smrg -o) 143ff143803Smrg # configure might choose to run compile as 'compile cc -o foo foo.c'. 144ff143803Smrg eat=1 145ff143803Smrg case $2 in 146ff143803Smrg *.o | *.[oO][bB][jJ]) 147ff143803Smrg func_file_conv "$2" 148ff143803Smrg set x "$@" -Fo"$file" 149ff143803Smrg shift 150ff143803Smrg ;; 151ff143803Smrg *) 152ff143803Smrg func_file_conv "$2" 153ff143803Smrg set x "$@" -Fe"$file" 154ff143803Smrg shift 155ff143803Smrg ;; 156ff143803Smrg esac 157ff143803Smrg ;; 158ff143803Smrg -I) 159ff143803Smrg eat=1 160ff143803Smrg func_file_conv "$2" mingw 161ff143803Smrg set x "$@" -I"$file" 162ff143803Smrg shift 163ff143803Smrg ;; 164ff143803Smrg -I*) 165ff143803Smrg func_file_conv "${1#-I}" mingw 166ff143803Smrg set x "$@" -I"$file" 167ff143803Smrg shift 168ff143803Smrg ;; 169ff143803Smrg -l) 170ff143803Smrg eat=1 171ff143803Smrg func_cl_dashl "$2" 172ff143803Smrg set x "$@" "$lib" 173ff143803Smrg shift 174ff143803Smrg ;; 175ff143803Smrg -l*) 176ff143803Smrg func_cl_dashl "${1#-l}" 177ff143803Smrg set x "$@" "$lib" 178ff143803Smrg shift 179ff143803Smrg ;; 180ff143803Smrg -L) 181ff143803Smrg eat=1 182ff143803Smrg func_cl_dashL "$2" 183ff143803Smrg ;; 184ff143803Smrg -L*) 185ff143803Smrg func_cl_dashL "${1#-L}" 186ff143803Smrg ;; 187ff143803Smrg -static) 188ff143803Smrg shared=false 189ff143803Smrg ;; 190ff143803Smrg -Wl,*) 191ff143803Smrg arg=${1#-Wl,} 192ff143803Smrg save_ifs="$IFS"; IFS=',' 193ff143803Smrg for flag in $arg; do 194ff143803Smrg IFS="$save_ifs" 195ff143803Smrg linker_opts="$linker_opts $flag" 196ff143803Smrg done 197ff143803Smrg IFS="$save_ifs" 198ff143803Smrg ;; 199ff143803Smrg -Xlinker) 200ff143803Smrg eat=1 201ff143803Smrg linker_opts="$linker_opts $2" 202ff143803Smrg ;; 203ff143803Smrg -*) 204ff143803Smrg set x "$@" "$1" 205ff143803Smrg shift 206ff143803Smrg ;; 207ff143803Smrg *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) 208ff143803Smrg func_file_conv "$1" 209ff143803Smrg set x "$@" -Tp"$file" 210ff143803Smrg shift 211ff143803Smrg ;; 212ff143803Smrg *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) 213ff143803Smrg func_file_conv "$1" mingw 214ff143803Smrg set x "$@" "$file" 215ff143803Smrg shift 216ff143803Smrg ;; 217ff143803Smrg *) 218ff143803Smrg set x "$@" "$1" 219ff143803Smrg shift 220ff143803Smrg ;; 221ff143803Smrg esac 222ff143803Smrg fi 223ff143803Smrg shift 224ff143803Smrg done 225ff143803Smrg if test -n "$linker_opts"; then 226ff143803Smrg linker_opts="-link$linker_opts" 227ff143803Smrg fi 228ff143803Smrg exec "$@" $linker_opts 229ff143803Smrg exit 1 230ff143803Smrg} 231ff143803Smrg 232ff143803Smrgeat= 233ff143803Smrg 2347da8b7e3Smrgcase $1 in 2357da8b7e3Smrg '') 236ff143803Smrg echo "$0: No command. Try '$0 --help' for more information." 1>&2 2377da8b7e3Smrg exit 1; 2387da8b7e3Smrg ;; 2397da8b7e3Smrg -h | --h*) 2407da8b7e3Smrg cat <<\EOF 2417da8b7e3SmrgUsage: compile [--help] [--version] PROGRAM [ARGS] 2427da8b7e3Smrg 243ff143803SmrgWrapper for compilers which do not understand '-c -o'. 244ff143803SmrgRemove '-o dest.o' from ARGS, run PROGRAM with the remaining 2457da8b7e3Smrgarguments, and rename the output as expected. 2467da8b7e3Smrg 2477da8b7e3SmrgIf you are trying to build a whole package this is not the 248ff143803Smrgright script to run: please start by reading the file 'INSTALL'. 2497da8b7e3Smrg 2507da8b7e3SmrgReport bugs to <bug-automake@gnu.org>. 2517da8b7e3SmrgEOF 2527da8b7e3Smrg exit $? 2537da8b7e3Smrg ;; 2547da8b7e3Smrg -v | --v*) 2557da8b7e3Smrg echo "compile $scriptversion" 2567da8b7e3Smrg exit $? 2577da8b7e3Smrg ;; 258ff143803Smrg cl | *[/\\]cl | cl.exe | *[/\\]cl.exe ) 259ff143803Smrg func_cl_wrapper "$@" # Doesn't return... 260ff143803Smrg ;; 2617da8b7e3Smrgesac 2627da8b7e3Smrg 2637da8b7e3Smrgofile= 2647da8b7e3Smrgcfile= 2657da8b7e3Smrg 2667da8b7e3Smrgfor arg 2677da8b7e3Smrgdo 2687da8b7e3Smrg if test -n "$eat"; then 2697da8b7e3Smrg eat= 2707da8b7e3Smrg else 2717da8b7e3Smrg case $1 in 2727da8b7e3Smrg -o) 273ff143803Smrg # configure might choose to run compile as 'compile cc -o foo foo.c'. 274ff143803Smrg # So we strip '-o arg' only if arg is an object. 2757da8b7e3Smrg eat=1 2767da8b7e3Smrg case $2 in 2777da8b7e3Smrg *.o | *.obj) 2787da8b7e3Smrg ofile=$2 2797da8b7e3Smrg ;; 2807da8b7e3Smrg *) 2817da8b7e3Smrg set x "$@" -o "$2" 2827da8b7e3Smrg shift 2837da8b7e3Smrg ;; 2847da8b7e3Smrg esac 2857da8b7e3Smrg ;; 2867da8b7e3Smrg *.c) 2877da8b7e3Smrg cfile=$1 2887da8b7e3Smrg set x "$@" "$1" 2897da8b7e3Smrg shift 2907da8b7e3Smrg ;; 2917da8b7e3Smrg *) 2927da8b7e3Smrg set x "$@" "$1" 2937da8b7e3Smrg shift 2947da8b7e3Smrg ;; 2957da8b7e3Smrg esac 2967da8b7e3Smrg fi 2977da8b7e3Smrg shift 2987da8b7e3Smrgdone 2997da8b7e3Smrg 3007da8b7e3Smrgif test -z "$ofile" || test -z "$cfile"; then 301ff143803Smrg # If no '-o' option was seen then we might have been invoked from a 3027da8b7e3Smrg # pattern rule where we don't need one. That is ok -- this is a 3037da8b7e3Smrg # normal compilation that the losing compiler can handle. If no 304ff143803Smrg # '.c' file was seen then we are probably linking. That is also 3057da8b7e3Smrg # ok. 3067da8b7e3Smrg exec "$@" 3077da8b7e3Smrgfi 3087da8b7e3Smrg 3097da8b7e3Smrg# Name of file we expect compiler to create. 310ff143803Smrgcofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` 3117da8b7e3Smrg 3127da8b7e3Smrg# Create the lock directory. 313ff143803Smrg# Note: use '[/\\:.-]' here to ensure that we don't use the same name 3147da8b7e3Smrg# that we are using for the .o file. Also, base the name on the expected 3157da8b7e3Smrg# object file name, since that is what matters with a parallel build. 316ff143803Smrglockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d 3177da8b7e3Smrgwhile true; do 3187da8b7e3Smrg if mkdir "$lockdir" >/dev/null 2>&1; then 3197da8b7e3Smrg break 3207da8b7e3Smrg fi 3217da8b7e3Smrg sleep 1 3227da8b7e3Smrgdone 3237da8b7e3Smrg# FIXME: race condition here if user kills between mkdir and trap. 3247da8b7e3Smrgtrap "rmdir '$lockdir'; exit 1" 1 2 15 3257da8b7e3Smrg 3267da8b7e3Smrg# Run the compile. 3277da8b7e3Smrg"$@" 3287da8b7e3Smrgret=$? 3297da8b7e3Smrg 3307da8b7e3Smrgif test -f "$cofile"; then 331ff143803Smrg test "$cofile" = "$ofile" || mv "$cofile" "$ofile" 3327da8b7e3Smrgelif test -f "${cofile}bj"; then 333ff143803Smrg test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" 3347da8b7e3Smrgfi 3357da8b7e3Smrg 3367da8b7e3Smrgrmdir "$lockdir" 3377da8b7e3Smrgexit $ret 3387da8b7e3Smrg 3397da8b7e3Smrg# Local Variables: 3407da8b7e3Smrg# mode: shell-script 3417da8b7e3Smrg# sh-indentation: 2 3427da8b7e3Smrg# eval: (add-hook 'write-file-hooks 'time-stamp) 3437da8b7e3Smrg# time-stamp-start: "scriptversion=" 3447da8b7e3Smrg# time-stamp-format: "%:y-%02m-%02d.%02H" 345ff143803Smrg# time-stamp-time-zone: "UTC" 346ff143803Smrg# time-stamp-end: "; # UTC" 3477da8b7e3Smrg# End: 348