1428d7b3dSmrg#! /bin/sh 2428d7b3dSmrg# Wrapper for compilers which do not understand '-c -o'. 3428d7b3dSmrg 4428d7b3dSmrgscriptversion=2012-10-14.11; # UTC 5428d7b3dSmrg 6428d7b3dSmrg# Copyright (C) 1999-2013 Free Software Foundation, Inc. 7428d7b3dSmrg# Written by Tom Tromey <tromey@cygnus.com>. 8428d7b3dSmrg# 9428d7b3dSmrg# This program is free software; you can redistribute it and/or modify 10428d7b3dSmrg# it under the terms of the GNU General Public License as published by 11428d7b3dSmrg# the Free Software Foundation; either version 2, or (at your option) 12428d7b3dSmrg# any later version. 13428d7b3dSmrg# 14428d7b3dSmrg# This program is distributed in the hope that it will be useful, 15428d7b3dSmrg# but WITHOUT ANY WARRANTY; without even the implied warranty of 16428d7b3dSmrg# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17428d7b3dSmrg# GNU General Public License for more details. 18428d7b3dSmrg# 19428d7b3dSmrg# You should have received a copy of the GNU General Public License 20428d7b3dSmrg# along with this program. If not, see <http://www.gnu.org/licenses/>. 21428d7b3dSmrg 22428d7b3dSmrg# As a special exception to the GNU General Public License, if you 23428d7b3dSmrg# distribute this file as part of a program that contains a 24428d7b3dSmrg# configuration script generated by Autoconf, you may include it under 25428d7b3dSmrg# the same distribution terms that you use for the rest of that program. 26428d7b3dSmrg 27428d7b3dSmrg# This file is maintained in Automake, please report 28428d7b3dSmrg# bugs to <bug-automake@gnu.org> or send patches to 29428d7b3dSmrg# <automake-patches@gnu.org>. 30428d7b3dSmrg 31428d7b3dSmrgnl=' 32428d7b3dSmrg' 33428d7b3dSmrg 34428d7b3dSmrg# We need space, tab and new line, in precisely that order. Quoting is 35428d7b3dSmrg# there to prevent tools from complaining about whitespace usage. 36428d7b3dSmrgIFS=" "" $nl" 37428d7b3dSmrg 38428d7b3dSmrgfile_conv= 39428d7b3dSmrg 40428d7b3dSmrg# func_file_conv build_file lazy 41428d7b3dSmrg# Convert a $build file to $host form and store it in $file 42428d7b3dSmrg# Currently only supports Windows hosts. If the determined conversion 43428d7b3dSmrg# type is listed in (the comma separated) LAZY, no conversion will 44428d7b3dSmrg# take place. 45428d7b3dSmrgfunc_file_conv () 46428d7b3dSmrg{ 47428d7b3dSmrg file=$1 48428d7b3dSmrg case $file in 49428d7b3dSmrg / | /[!/]*) # absolute file, and not a UNC file 50428d7b3dSmrg if test -z "$file_conv"; then 51428d7b3dSmrg # lazily determine how to convert abs files 52428d7b3dSmrg case `uname -s` in 53428d7b3dSmrg MINGW*) 54428d7b3dSmrg file_conv=mingw 55428d7b3dSmrg ;; 56428d7b3dSmrg CYGWIN*) 57428d7b3dSmrg file_conv=cygwin 58428d7b3dSmrg ;; 59428d7b3dSmrg *) 60428d7b3dSmrg file_conv=wine 61428d7b3dSmrg ;; 62428d7b3dSmrg esac 63428d7b3dSmrg fi 64428d7b3dSmrg case $file_conv/,$2, in 65428d7b3dSmrg *,$file_conv,*) 66428d7b3dSmrg ;; 67428d7b3dSmrg mingw/*) 68428d7b3dSmrg file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` 69428d7b3dSmrg ;; 70428d7b3dSmrg cygwin/*) 71428d7b3dSmrg file=`cygpath -m "$file" || echo "$file"` 72428d7b3dSmrg ;; 73428d7b3dSmrg wine/*) 74428d7b3dSmrg file=`winepath -w "$file" || echo "$file"` 75428d7b3dSmrg ;; 76428d7b3dSmrg esac 77428d7b3dSmrg ;; 78428d7b3dSmrg esac 79428d7b3dSmrg} 80428d7b3dSmrg 81428d7b3dSmrg# func_cl_dashL linkdir 82428d7b3dSmrg# Make cl look for libraries in LINKDIR 83428d7b3dSmrgfunc_cl_dashL () 84428d7b3dSmrg{ 85428d7b3dSmrg func_file_conv "$1" 86428d7b3dSmrg if test -z "$lib_path"; then 87428d7b3dSmrg lib_path=$file 88428d7b3dSmrg else 89428d7b3dSmrg lib_path="$lib_path;$file" 90428d7b3dSmrg fi 91428d7b3dSmrg linker_opts="$linker_opts -LIBPATH:$file" 92428d7b3dSmrg} 93428d7b3dSmrg 94428d7b3dSmrg# func_cl_dashl library 95428d7b3dSmrg# Do a library search-path lookup for cl 96428d7b3dSmrgfunc_cl_dashl () 97428d7b3dSmrg{ 98428d7b3dSmrg lib=$1 99428d7b3dSmrg found=no 100428d7b3dSmrg save_IFS=$IFS 101428d7b3dSmrg IFS=';' 102428d7b3dSmrg for dir in $lib_path $LIB 103428d7b3dSmrg do 104428d7b3dSmrg IFS=$save_IFS 105428d7b3dSmrg if $shared && test -f "$dir/$lib.dll.lib"; then 106428d7b3dSmrg found=yes 107428d7b3dSmrg lib=$dir/$lib.dll.lib 108428d7b3dSmrg break 109428d7b3dSmrg fi 110428d7b3dSmrg if test -f "$dir/$lib.lib"; then 111428d7b3dSmrg found=yes 112428d7b3dSmrg lib=$dir/$lib.lib 113428d7b3dSmrg break 114428d7b3dSmrg fi 115428d7b3dSmrg if test -f "$dir/lib$lib.a"; then 116428d7b3dSmrg found=yes 117428d7b3dSmrg lib=$dir/lib$lib.a 118428d7b3dSmrg break 119428d7b3dSmrg fi 120428d7b3dSmrg done 121428d7b3dSmrg IFS=$save_IFS 122428d7b3dSmrg 123428d7b3dSmrg if test "$found" != yes; then 124428d7b3dSmrg lib=$lib.lib 125428d7b3dSmrg fi 126428d7b3dSmrg} 127428d7b3dSmrg 128428d7b3dSmrg# func_cl_wrapper cl arg... 129428d7b3dSmrg# Adjust compile command to suit cl 130428d7b3dSmrgfunc_cl_wrapper () 131428d7b3dSmrg{ 132428d7b3dSmrg # Assume a capable shell 133428d7b3dSmrg lib_path= 134428d7b3dSmrg shared=: 135428d7b3dSmrg linker_opts= 136428d7b3dSmrg for arg 137428d7b3dSmrg do 138428d7b3dSmrg if test -n "$eat"; then 139428d7b3dSmrg eat= 140428d7b3dSmrg else 141428d7b3dSmrg case $1 in 142428d7b3dSmrg -o) 143428d7b3dSmrg # configure might choose to run compile as 'compile cc -o foo foo.c'. 144428d7b3dSmrg eat=1 145428d7b3dSmrg case $2 in 146428d7b3dSmrg *.o | *.[oO][bB][jJ]) 147428d7b3dSmrg func_file_conv "$2" 148428d7b3dSmrg set x "$@" -Fo"$file" 149428d7b3dSmrg shift 150428d7b3dSmrg ;; 151428d7b3dSmrg *) 152428d7b3dSmrg func_file_conv "$2" 153428d7b3dSmrg set x "$@" -Fe"$file" 154428d7b3dSmrg shift 155428d7b3dSmrg ;; 156428d7b3dSmrg esac 157428d7b3dSmrg ;; 158428d7b3dSmrg -I) 159428d7b3dSmrg eat=1 160428d7b3dSmrg func_file_conv "$2" mingw 161428d7b3dSmrg set x "$@" -I"$file" 162428d7b3dSmrg shift 163428d7b3dSmrg ;; 164428d7b3dSmrg -I*) 165428d7b3dSmrg func_file_conv "${1#-I}" mingw 166428d7b3dSmrg set x "$@" -I"$file" 167428d7b3dSmrg shift 168428d7b3dSmrg ;; 169428d7b3dSmrg -l) 170428d7b3dSmrg eat=1 171428d7b3dSmrg func_cl_dashl "$2" 172428d7b3dSmrg set x "$@" "$lib" 173428d7b3dSmrg shift 174428d7b3dSmrg ;; 175428d7b3dSmrg -l*) 176428d7b3dSmrg func_cl_dashl "${1#-l}" 177428d7b3dSmrg set x "$@" "$lib" 178428d7b3dSmrg shift 179428d7b3dSmrg ;; 180428d7b3dSmrg -L) 181428d7b3dSmrg eat=1 182428d7b3dSmrg func_cl_dashL "$2" 183428d7b3dSmrg ;; 184428d7b3dSmrg -L*) 185428d7b3dSmrg func_cl_dashL "${1#-L}" 186428d7b3dSmrg ;; 187428d7b3dSmrg -static) 188428d7b3dSmrg shared=false 189428d7b3dSmrg ;; 190428d7b3dSmrg -Wl,*) 191428d7b3dSmrg arg=${1#-Wl,} 192428d7b3dSmrg save_ifs="$IFS"; IFS=',' 193428d7b3dSmrg for flag in $arg; do 194428d7b3dSmrg IFS="$save_ifs" 195428d7b3dSmrg linker_opts="$linker_opts $flag" 196428d7b3dSmrg done 197428d7b3dSmrg IFS="$save_ifs" 198428d7b3dSmrg ;; 199428d7b3dSmrg -Xlinker) 200428d7b3dSmrg eat=1 201428d7b3dSmrg linker_opts="$linker_opts $2" 202428d7b3dSmrg ;; 203428d7b3dSmrg -*) 204428d7b3dSmrg set x "$@" "$1" 205428d7b3dSmrg shift 206428d7b3dSmrg ;; 207428d7b3dSmrg *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) 208428d7b3dSmrg func_file_conv "$1" 209428d7b3dSmrg set x "$@" -Tp"$file" 210428d7b3dSmrg shift 211428d7b3dSmrg ;; 212428d7b3dSmrg *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) 213428d7b3dSmrg func_file_conv "$1" mingw 214428d7b3dSmrg set x "$@" "$file" 215428d7b3dSmrg shift 216428d7b3dSmrg ;; 217428d7b3dSmrg *) 218428d7b3dSmrg set x "$@" "$1" 219428d7b3dSmrg shift 220428d7b3dSmrg ;; 221428d7b3dSmrg esac 222428d7b3dSmrg fi 223428d7b3dSmrg shift 224428d7b3dSmrg done 225428d7b3dSmrg if test -n "$linker_opts"; then 226428d7b3dSmrg linker_opts="-link$linker_opts" 227428d7b3dSmrg fi 228428d7b3dSmrg exec "$@" $linker_opts 229428d7b3dSmrg exit 1 230428d7b3dSmrg} 231428d7b3dSmrg 232428d7b3dSmrgeat= 233428d7b3dSmrg 234428d7b3dSmrgcase $1 in 235428d7b3dSmrg '') 236428d7b3dSmrg echo "$0: No command. Try '$0 --help' for more information." 1>&2 237428d7b3dSmrg exit 1; 238428d7b3dSmrg ;; 239428d7b3dSmrg -h | --h*) 240428d7b3dSmrg cat <<\EOF 241428d7b3dSmrgUsage: compile [--help] [--version] PROGRAM [ARGS] 242428d7b3dSmrg 243428d7b3dSmrgWrapper for compilers which do not understand '-c -o'. 244428d7b3dSmrgRemove '-o dest.o' from ARGS, run PROGRAM with the remaining 245428d7b3dSmrgarguments, and rename the output as expected. 246428d7b3dSmrg 247428d7b3dSmrgIf you are trying to build a whole package this is not the 248428d7b3dSmrgright script to run: please start by reading the file 'INSTALL'. 249428d7b3dSmrg 250428d7b3dSmrgReport bugs to <bug-automake@gnu.org>. 251428d7b3dSmrgEOF 252428d7b3dSmrg exit $? 253428d7b3dSmrg ;; 254428d7b3dSmrg -v | --v*) 255428d7b3dSmrg echo "compile $scriptversion" 256428d7b3dSmrg exit $? 257428d7b3dSmrg ;; 258428d7b3dSmrg cl | *[/\\]cl | cl.exe | *[/\\]cl.exe ) 259428d7b3dSmrg func_cl_wrapper "$@" # Doesn't return... 260428d7b3dSmrg ;; 261428d7b3dSmrgesac 262428d7b3dSmrg 263428d7b3dSmrgofile= 264428d7b3dSmrgcfile= 265428d7b3dSmrg 266428d7b3dSmrgfor arg 267428d7b3dSmrgdo 268428d7b3dSmrg if test -n "$eat"; then 269428d7b3dSmrg eat= 270428d7b3dSmrg else 271428d7b3dSmrg case $1 in 272428d7b3dSmrg -o) 273428d7b3dSmrg # configure might choose to run compile as 'compile cc -o foo foo.c'. 274428d7b3dSmrg # So we strip '-o arg' only if arg is an object. 275428d7b3dSmrg eat=1 276428d7b3dSmrg case $2 in 277428d7b3dSmrg *.o | *.obj) 278428d7b3dSmrg ofile=$2 279428d7b3dSmrg ;; 280428d7b3dSmrg *) 281428d7b3dSmrg set x "$@" -o "$2" 282428d7b3dSmrg shift 283428d7b3dSmrg ;; 284428d7b3dSmrg esac 285428d7b3dSmrg ;; 286428d7b3dSmrg *.c) 287428d7b3dSmrg cfile=$1 288428d7b3dSmrg set x "$@" "$1" 289428d7b3dSmrg shift 290428d7b3dSmrg ;; 291428d7b3dSmrg *) 292428d7b3dSmrg set x "$@" "$1" 293428d7b3dSmrg shift 294428d7b3dSmrg ;; 295428d7b3dSmrg esac 296428d7b3dSmrg fi 297428d7b3dSmrg shift 298428d7b3dSmrgdone 299428d7b3dSmrg 300428d7b3dSmrgif test -z "$ofile" || test -z "$cfile"; then 301428d7b3dSmrg # If no '-o' option was seen then we might have been invoked from a 302428d7b3dSmrg # pattern rule where we don't need one. That is ok -- this is a 303428d7b3dSmrg # normal compilation that the losing compiler can handle. If no 304428d7b3dSmrg # '.c' file was seen then we are probably linking. That is also 305428d7b3dSmrg # ok. 306428d7b3dSmrg exec "$@" 307428d7b3dSmrgfi 308428d7b3dSmrg 309428d7b3dSmrg# Name of file we expect compiler to create. 310428d7b3dSmrgcofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` 311428d7b3dSmrg 312428d7b3dSmrg# Create the lock directory. 313428d7b3dSmrg# Note: use '[/\\:.-]' here to ensure that we don't use the same name 314428d7b3dSmrg# that we are using for the .o file. Also, base the name on the expected 315428d7b3dSmrg# object file name, since that is what matters with a parallel build. 316428d7b3dSmrglockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d 317428d7b3dSmrgwhile true; do 318428d7b3dSmrg if mkdir "$lockdir" >/dev/null 2>&1; then 319428d7b3dSmrg break 320428d7b3dSmrg fi 321428d7b3dSmrg sleep 1 322428d7b3dSmrgdone 323428d7b3dSmrg# FIXME: race condition here if user kills between mkdir and trap. 324428d7b3dSmrgtrap "rmdir '$lockdir'; exit 1" 1 2 15 325428d7b3dSmrg 326428d7b3dSmrg# Run the compile. 327428d7b3dSmrg"$@" 328428d7b3dSmrgret=$? 329428d7b3dSmrg 330428d7b3dSmrgif test -f "$cofile"; then 331428d7b3dSmrg test "$cofile" = "$ofile" || mv "$cofile" "$ofile" 332428d7b3dSmrgelif test -f "${cofile}bj"; then 333428d7b3dSmrg test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" 334428d7b3dSmrgfi 335428d7b3dSmrg 336428d7b3dSmrgrmdir "$lockdir" 337428d7b3dSmrgexit $ret 338428d7b3dSmrg 339428d7b3dSmrg# Local Variables: 340428d7b3dSmrg# mode: shell-script 341428d7b3dSmrg# sh-indentation: 2 342428d7b3dSmrg# eval: (add-hook 'write-file-hooks 'time-stamp) 343428d7b3dSmrg# time-stamp-start: "scriptversion=" 344428d7b3dSmrg# time-stamp-format: "%:y-%02m-%02d.%02H" 345428d7b3dSmrg# time-stamp-time-zone: "UTC" 346428d7b3dSmrg# time-stamp-end: "; # UTC" 347428d7b3dSmrg# End: 348