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