14fee23f9Smrg#! /bin/sh 2*4d5abbe8Smrg# Wrapper for compilers which do not understand '-c -o'. 34fee23f9Smrg 4*4d5abbe8Smrgscriptversion=2012-10-14.11; # UTC 54fee23f9Smrg 6*4d5abbe8Smrg# Copyright (C) 1999-2014 Free Software Foundation, Inc. 74fee23f9Smrg# Written by Tom Tromey <tromey@cygnus.com>. 84fee23f9Smrg# 94fee23f9Smrg# This program is free software; you can redistribute it and/or modify 104fee23f9Smrg# it under the terms of the GNU General Public License as published by 114fee23f9Smrg# the Free Software Foundation; either version 2, or (at your option) 124fee23f9Smrg# any later version. 134fee23f9Smrg# 144fee23f9Smrg# This program is distributed in the hope that it will be useful, 154fee23f9Smrg# but WITHOUT ANY WARRANTY; without even the implied warranty of 164fee23f9Smrg# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 174fee23f9Smrg# GNU General Public License for more details. 184fee23f9Smrg# 194fee23f9Smrg# You should have received a copy of the GNU General Public License 204fee23f9Smrg# along with this program. If not, see <http://www.gnu.org/licenses/>. 214fee23f9Smrg 224fee23f9Smrg# As a special exception to the GNU General Public License, if you 234fee23f9Smrg# distribute this file as part of a program that contains a 244fee23f9Smrg# configuration script generated by Autoconf, you may include it under 254fee23f9Smrg# the same distribution terms that you use for the rest of that program. 264fee23f9Smrg 274fee23f9Smrg# This file is maintained in Automake, please report 284fee23f9Smrg# bugs to <bug-automake@gnu.org> or send patches to 294fee23f9Smrg# <automake-patches@gnu.org>. 304fee23f9Smrg 31*4d5abbe8Smrgnl=' 32*4d5abbe8Smrg' 33*4d5abbe8Smrg 34*4d5abbe8Smrg# We need space, tab and new line, in precisely that order. Quoting is 35*4d5abbe8Smrg# there to prevent tools from complaining about whitespace usage. 36*4d5abbe8SmrgIFS=" "" $nl" 37*4d5abbe8Smrg 38*4d5abbe8Smrgfile_conv= 39*4d5abbe8Smrg 40*4d5abbe8Smrg# func_file_conv build_file lazy 41*4d5abbe8Smrg# Convert a $build file to $host form and store it in $file 42*4d5abbe8Smrg# Currently only supports Windows hosts. If the determined conversion 43*4d5abbe8Smrg# type is listed in (the comma separated) LAZY, no conversion will 44*4d5abbe8Smrg# take place. 45*4d5abbe8Smrgfunc_file_conv () 46*4d5abbe8Smrg{ 47*4d5abbe8Smrg file=$1 48*4d5abbe8Smrg case $file in 49*4d5abbe8Smrg / | /[!/]*) # absolute file, and not a UNC file 50*4d5abbe8Smrg if test -z "$file_conv"; then 51*4d5abbe8Smrg # lazily determine how to convert abs files 52*4d5abbe8Smrg case `uname -s` in 53*4d5abbe8Smrg MINGW*) 54*4d5abbe8Smrg file_conv=mingw 55*4d5abbe8Smrg ;; 56*4d5abbe8Smrg CYGWIN*) 57*4d5abbe8Smrg file_conv=cygwin 58*4d5abbe8Smrg ;; 59*4d5abbe8Smrg *) 60*4d5abbe8Smrg file_conv=wine 61*4d5abbe8Smrg ;; 62*4d5abbe8Smrg esac 63*4d5abbe8Smrg fi 64*4d5abbe8Smrg case $file_conv/,$2, in 65*4d5abbe8Smrg *,$file_conv,*) 66*4d5abbe8Smrg ;; 67*4d5abbe8Smrg mingw/*) 68*4d5abbe8Smrg file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` 69*4d5abbe8Smrg ;; 70*4d5abbe8Smrg cygwin/*) 71*4d5abbe8Smrg file=`cygpath -m "$file" || echo "$file"` 72*4d5abbe8Smrg ;; 73*4d5abbe8Smrg wine/*) 74*4d5abbe8Smrg file=`winepath -w "$file" || echo "$file"` 75*4d5abbe8Smrg ;; 76*4d5abbe8Smrg esac 77*4d5abbe8Smrg ;; 78*4d5abbe8Smrg esac 79*4d5abbe8Smrg} 80*4d5abbe8Smrg 81*4d5abbe8Smrg# func_cl_dashL linkdir 82*4d5abbe8Smrg# Make cl look for libraries in LINKDIR 83*4d5abbe8Smrgfunc_cl_dashL () 84*4d5abbe8Smrg{ 85*4d5abbe8Smrg func_file_conv "$1" 86*4d5abbe8Smrg if test -z "$lib_path"; then 87*4d5abbe8Smrg lib_path=$file 88*4d5abbe8Smrg else 89*4d5abbe8Smrg lib_path="$lib_path;$file" 90*4d5abbe8Smrg fi 91*4d5abbe8Smrg linker_opts="$linker_opts -LIBPATH:$file" 92*4d5abbe8Smrg} 93*4d5abbe8Smrg 94*4d5abbe8Smrg# func_cl_dashl library 95*4d5abbe8Smrg# Do a library search-path lookup for cl 96*4d5abbe8Smrgfunc_cl_dashl () 97*4d5abbe8Smrg{ 98*4d5abbe8Smrg lib=$1 99*4d5abbe8Smrg found=no 100*4d5abbe8Smrg save_IFS=$IFS 101*4d5abbe8Smrg IFS=';' 102*4d5abbe8Smrg for dir in $lib_path $LIB 103*4d5abbe8Smrg do 104*4d5abbe8Smrg IFS=$save_IFS 105*4d5abbe8Smrg if $shared && test -f "$dir/$lib.dll.lib"; then 106*4d5abbe8Smrg found=yes 107*4d5abbe8Smrg lib=$dir/$lib.dll.lib 108*4d5abbe8Smrg break 109*4d5abbe8Smrg fi 110*4d5abbe8Smrg if test -f "$dir/$lib.lib"; then 111*4d5abbe8Smrg found=yes 112*4d5abbe8Smrg lib=$dir/$lib.lib 113*4d5abbe8Smrg break 114*4d5abbe8Smrg fi 115*4d5abbe8Smrg if test -f "$dir/lib$lib.a"; then 116*4d5abbe8Smrg found=yes 117*4d5abbe8Smrg lib=$dir/lib$lib.a 118*4d5abbe8Smrg break 119*4d5abbe8Smrg fi 120*4d5abbe8Smrg done 121*4d5abbe8Smrg IFS=$save_IFS 122*4d5abbe8Smrg 123*4d5abbe8Smrg if test "$found" != yes; then 124*4d5abbe8Smrg lib=$lib.lib 125*4d5abbe8Smrg fi 126*4d5abbe8Smrg} 127*4d5abbe8Smrg 128*4d5abbe8Smrg# func_cl_wrapper cl arg... 129*4d5abbe8Smrg# Adjust compile command to suit cl 130*4d5abbe8Smrgfunc_cl_wrapper () 131*4d5abbe8Smrg{ 132*4d5abbe8Smrg # Assume a capable shell 133*4d5abbe8Smrg lib_path= 134*4d5abbe8Smrg shared=: 135*4d5abbe8Smrg linker_opts= 136*4d5abbe8Smrg for arg 137*4d5abbe8Smrg do 138*4d5abbe8Smrg if test -n "$eat"; then 139*4d5abbe8Smrg eat= 140*4d5abbe8Smrg else 141*4d5abbe8Smrg case $1 in 142*4d5abbe8Smrg -o) 143*4d5abbe8Smrg # configure might choose to run compile as 'compile cc -o foo foo.c'. 144*4d5abbe8Smrg eat=1 145*4d5abbe8Smrg case $2 in 146*4d5abbe8Smrg *.o | *.[oO][bB][jJ]) 147*4d5abbe8Smrg func_file_conv "$2" 148*4d5abbe8Smrg set x "$@" -Fo"$file" 149*4d5abbe8Smrg shift 150*4d5abbe8Smrg ;; 151*4d5abbe8Smrg *) 152*4d5abbe8Smrg func_file_conv "$2" 153*4d5abbe8Smrg set x "$@" -Fe"$file" 154*4d5abbe8Smrg shift 155*4d5abbe8Smrg ;; 156*4d5abbe8Smrg esac 157*4d5abbe8Smrg ;; 158*4d5abbe8Smrg -I) 159*4d5abbe8Smrg eat=1 160*4d5abbe8Smrg func_file_conv "$2" mingw 161*4d5abbe8Smrg set x "$@" -I"$file" 162*4d5abbe8Smrg shift 163*4d5abbe8Smrg ;; 164*4d5abbe8Smrg -I*) 165*4d5abbe8Smrg func_file_conv "${1#-I}" mingw 166*4d5abbe8Smrg set x "$@" -I"$file" 167*4d5abbe8Smrg shift 168*4d5abbe8Smrg ;; 169*4d5abbe8Smrg -l) 170*4d5abbe8Smrg eat=1 171*4d5abbe8Smrg func_cl_dashl "$2" 172*4d5abbe8Smrg set x "$@" "$lib" 173*4d5abbe8Smrg shift 174*4d5abbe8Smrg ;; 175*4d5abbe8Smrg -l*) 176*4d5abbe8Smrg func_cl_dashl "${1#-l}" 177*4d5abbe8Smrg set x "$@" "$lib" 178*4d5abbe8Smrg shift 179*4d5abbe8Smrg ;; 180*4d5abbe8Smrg -L) 181*4d5abbe8Smrg eat=1 182*4d5abbe8Smrg func_cl_dashL "$2" 183*4d5abbe8Smrg ;; 184*4d5abbe8Smrg -L*) 185*4d5abbe8Smrg func_cl_dashL "${1#-L}" 186*4d5abbe8Smrg ;; 187*4d5abbe8Smrg -static) 188*4d5abbe8Smrg shared=false 189*4d5abbe8Smrg ;; 190*4d5abbe8Smrg -Wl,*) 191*4d5abbe8Smrg arg=${1#-Wl,} 192*4d5abbe8Smrg save_ifs="$IFS"; IFS=',' 193*4d5abbe8Smrg for flag in $arg; do 194*4d5abbe8Smrg IFS="$save_ifs" 195*4d5abbe8Smrg linker_opts="$linker_opts $flag" 196*4d5abbe8Smrg done 197*4d5abbe8Smrg IFS="$save_ifs" 198*4d5abbe8Smrg ;; 199*4d5abbe8Smrg -Xlinker) 200*4d5abbe8Smrg eat=1 201*4d5abbe8Smrg linker_opts="$linker_opts $2" 202*4d5abbe8Smrg ;; 203*4d5abbe8Smrg -*) 204*4d5abbe8Smrg set x "$@" "$1" 205*4d5abbe8Smrg shift 206*4d5abbe8Smrg ;; 207*4d5abbe8Smrg *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) 208*4d5abbe8Smrg func_file_conv "$1" 209*4d5abbe8Smrg set x "$@" -Tp"$file" 210*4d5abbe8Smrg shift 211*4d5abbe8Smrg ;; 212*4d5abbe8Smrg *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) 213*4d5abbe8Smrg func_file_conv "$1" mingw 214*4d5abbe8Smrg set x "$@" "$file" 215*4d5abbe8Smrg shift 216*4d5abbe8Smrg ;; 217*4d5abbe8Smrg *) 218*4d5abbe8Smrg set x "$@" "$1" 219*4d5abbe8Smrg shift 220*4d5abbe8Smrg ;; 221*4d5abbe8Smrg esac 222*4d5abbe8Smrg fi 223*4d5abbe8Smrg shift 224*4d5abbe8Smrg done 225*4d5abbe8Smrg if test -n "$linker_opts"; then 226*4d5abbe8Smrg linker_opts="-link$linker_opts" 227*4d5abbe8Smrg fi 228*4d5abbe8Smrg exec "$@" $linker_opts 229*4d5abbe8Smrg exit 1 230*4d5abbe8Smrg} 231*4d5abbe8Smrg 232*4d5abbe8Smrgeat= 233*4d5abbe8Smrg 2344fee23f9Smrgcase $1 in 2354fee23f9Smrg '') 236*4d5abbe8Smrg echo "$0: No command. Try '$0 --help' for more information." 1>&2 2374fee23f9Smrg exit 1; 2384fee23f9Smrg ;; 2394fee23f9Smrg -h | --h*) 2404fee23f9Smrg cat <<\EOF 2414fee23f9SmrgUsage: compile [--help] [--version] PROGRAM [ARGS] 2424fee23f9Smrg 243*4d5abbe8SmrgWrapper for compilers which do not understand '-c -o'. 244*4d5abbe8SmrgRemove '-o dest.o' from ARGS, run PROGRAM with the remaining 2454fee23f9Smrgarguments, and rename the output as expected. 2464fee23f9Smrg 2474fee23f9SmrgIf you are trying to build a whole package this is not the 248*4d5abbe8Smrgright script to run: please start by reading the file 'INSTALL'. 2494fee23f9Smrg 2504fee23f9SmrgReport bugs to <bug-automake@gnu.org>. 2514fee23f9SmrgEOF 2524fee23f9Smrg exit $? 2534fee23f9Smrg ;; 2544fee23f9Smrg -v | --v*) 2554fee23f9Smrg echo "compile $scriptversion" 2564fee23f9Smrg exit $? 2574fee23f9Smrg ;; 258*4d5abbe8Smrg cl | *[/\\]cl | cl.exe | *[/\\]cl.exe ) 259*4d5abbe8Smrg func_cl_wrapper "$@" # Doesn't return... 260*4d5abbe8Smrg ;; 2614fee23f9Smrgesac 2624fee23f9Smrg 2634fee23f9Smrgofile= 2644fee23f9Smrgcfile= 2654fee23f9Smrg 2664fee23f9Smrgfor arg 2674fee23f9Smrgdo 2684fee23f9Smrg if test -n "$eat"; then 2694fee23f9Smrg eat= 2704fee23f9Smrg else 2714fee23f9Smrg case $1 in 2724fee23f9Smrg -o) 273*4d5abbe8Smrg # configure might choose to run compile as 'compile cc -o foo foo.c'. 274*4d5abbe8Smrg # So we strip '-o arg' only if arg is an object. 2754fee23f9Smrg eat=1 2764fee23f9Smrg case $2 in 2774fee23f9Smrg *.o | *.obj) 2784fee23f9Smrg ofile=$2 2794fee23f9Smrg ;; 2804fee23f9Smrg *) 2814fee23f9Smrg set x "$@" -o "$2" 2824fee23f9Smrg shift 2834fee23f9Smrg ;; 2844fee23f9Smrg esac 2854fee23f9Smrg ;; 2864fee23f9Smrg *.c) 2874fee23f9Smrg cfile=$1 2884fee23f9Smrg set x "$@" "$1" 2894fee23f9Smrg shift 2904fee23f9Smrg ;; 2914fee23f9Smrg *) 2924fee23f9Smrg set x "$@" "$1" 2934fee23f9Smrg shift 2944fee23f9Smrg ;; 2954fee23f9Smrg esac 2964fee23f9Smrg fi 2974fee23f9Smrg shift 2984fee23f9Smrgdone 2994fee23f9Smrg 3004fee23f9Smrgif test -z "$ofile" || test -z "$cfile"; then 301*4d5abbe8Smrg # If no '-o' option was seen then we might have been invoked from a 3024fee23f9Smrg # pattern rule where we don't need one. That is ok -- this is a 3034fee23f9Smrg # normal compilation that the losing compiler can handle. If no 304*4d5abbe8Smrg # '.c' file was seen then we are probably linking. That is also 3054fee23f9Smrg # ok. 3064fee23f9Smrg exec "$@" 3074fee23f9Smrgfi 3084fee23f9Smrg 3094fee23f9Smrg# Name of file we expect compiler to create. 3104fee23f9Smrgcofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` 3114fee23f9Smrg 3124fee23f9Smrg# Create the lock directory. 313*4d5abbe8Smrg# Note: use '[/\\:.-]' here to ensure that we don't use the same name 3144fee23f9Smrg# that we are using for the .o file. Also, base the name on the expected 3154fee23f9Smrg# object file name, since that is what matters with a parallel build. 3164fee23f9Smrglockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d 3174fee23f9Smrgwhile true; do 3184fee23f9Smrg if mkdir "$lockdir" >/dev/null 2>&1; then 3194fee23f9Smrg break 3204fee23f9Smrg fi 3214fee23f9Smrg sleep 1 3224fee23f9Smrgdone 3234fee23f9Smrg# FIXME: race condition here if user kills between mkdir and trap. 3244fee23f9Smrgtrap "rmdir '$lockdir'; exit 1" 1 2 15 3254fee23f9Smrg 3264fee23f9Smrg# Run the compile. 3274fee23f9Smrg"$@" 3284fee23f9Smrgret=$? 3294fee23f9Smrg 3304fee23f9Smrgif test -f "$cofile"; then 331*4d5abbe8Smrg test "$cofile" = "$ofile" || mv "$cofile" "$ofile" 3324fee23f9Smrgelif test -f "${cofile}bj"; then 333*4d5abbe8Smrg test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" 3344fee23f9Smrgfi 3354fee23f9Smrg 3364fee23f9Smrgrmdir "$lockdir" 3374fee23f9Smrgexit $ret 3384fee23f9Smrg 3394fee23f9Smrg# Local Variables: 3404fee23f9Smrg# mode: shell-script 3414fee23f9Smrg# sh-indentation: 2 3424fee23f9Smrg# eval: (add-hook 'write-file-hooks 'time-stamp) 3434fee23f9Smrg# time-stamp-start: "scriptversion=" 3444fee23f9Smrg# time-stamp-format: "%:y-%02m-%02d.%02H" 3454fee23f9Smrg# time-stamp-time-zone: "UTC" 3464fee23f9Smrg# time-stamp-end: "; # UTC" 3474fee23f9Smrg# End: 348