1876ff6feSmrg#! /bin/sh 2d41660beSmrg# Wrapper for compilers which do not understand '-c -o'. 3876ff6feSmrg 4d41660beSmrgscriptversion=2016-01-11.22; # UTC 5876ff6feSmrg 6d41660beSmrg# Copyright (C) 1999-2017 Free Software Foundation, Inc. 7876ff6feSmrg# Written by Tom Tromey <tromey@cygnus.com>. 8876ff6feSmrg# 9876ff6feSmrg# This program is free software; you can redistribute it and/or modify 10876ff6feSmrg# it under the terms of the GNU General Public License as published by 11876ff6feSmrg# the Free Software Foundation; either version 2, or (at your option) 12876ff6feSmrg# any later version. 13876ff6feSmrg# 14876ff6feSmrg# This program is distributed in the hope that it will be useful, 15876ff6feSmrg# but WITHOUT ANY WARRANTY; without even the implied warranty of 16876ff6feSmrg# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17876ff6feSmrg# GNU General Public License for more details. 18876ff6feSmrg# 19876ff6feSmrg# You should have received a copy of the GNU General Public License 20d41660beSmrg# along with this program. If not, see <http://www.gnu.org/licenses/>. 21876ff6feSmrg 22876ff6feSmrg# As a special exception to the GNU General Public License, if you 23876ff6feSmrg# distribute this file as part of a program that contains a 24876ff6feSmrg# configuration script generated by Autoconf, you may include it under 25876ff6feSmrg# the same distribution terms that you use for the rest of that program. 26876ff6feSmrg 27876ff6feSmrg# This file is maintained in Automake, please report 28876ff6feSmrg# bugs to <bug-automake@gnu.org> or send patches to 29876ff6feSmrg# <automake-patches@gnu.org>. 30876ff6feSmrg 31d41660beSmrgnl=' 32d41660beSmrg' 33d41660beSmrg 34d41660beSmrg# We need space, tab and new line, in precisely that order. Quoting is 35d41660beSmrg# there to prevent tools from complaining about whitespace usage. 36d41660beSmrgIFS=" "" $nl" 37d41660beSmrg 38d41660beSmrgfile_conv= 39d41660beSmrg 40d41660beSmrg# func_file_conv build_file lazy 41d41660beSmrg# Convert a $build file to $host form and store it in $file 42d41660beSmrg# Currently only supports Windows hosts. If the determined conversion 43d41660beSmrg# type is listed in (the comma separated) LAZY, no conversion will 44d41660beSmrg# take place. 45d41660beSmrgfunc_file_conv () 46d41660beSmrg{ 47d41660beSmrg file=$1 48d41660beSmrg case $file in 49d41660beSmrg / | /[!/]*) # absolute file, and not a UNC file 50d41660beSmrg if test -z "$file_conv"; then 51d41660beSmrg # lazily determine how to convert abs files 52d41660beSmrg case `uname -s` in 53d41660beSmrg MINGW*) 54d41660beSmrg file_conv=mingw 55d41660beSmrg ;; 56d41660beSmrg CYGWIN*) 57d41660beSmrg file_conv=cygwin 58d41660beSmrg ;; 59d41660beSmrg *) 60d41660beSmrg file_conv=wine 61d41660beSmrg ;; 62d41660beSmrg esac 63d41660beSmrg fi 64d41660beSmrg case $file_conv/,$2, in 65d41660beSmrg *,$file_conv,*) 66d41660beSmrg ;; 67d41660beSmrg mingw/*) 68d41660beSmrg file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` 69d41660beSmrg ;; 70d41660beSmrg cygwin/*) 71d41660beSmrg file=`cygpath -m "$file" || echo "$file"` 72d41660beSmrg ;; 73d41660beSmrg wine/*) 74d41660beSmrg file=`winepath -w "$file" || echo "$file"` 75d41660beSmrg ;; 76d41660beSmrg esac 77d41660beSmrg ;; 78d41660beSmrg esac 79d41660beSmrg} 80d41660beSmrg 81d41660beSmrg# func_cl_dashL linkdir 82d41660beSmrg# Make cl look for libraries in LINKDIR 83d41660beSmrgfunc_cl_dashL () 84d41660beSmrg{ 85d41660beSmrg func_file_conv "$1" 86d41660beSmrg if test -z "$lib_path"; then 87d41660beSmrg lib_path=$file 88d41660beSmrg else 89d41660beSmrg lib_path="$lib_path;$file" 90d41660beSmrg fi 91d41660beSmrg linker_opts="$linker_opts -LIBPATH:$file" 92d41660beSmrg} 93d41660beSmrg 94d41660beSmrg# func_cl_dashl library 95d41660beSmrg# Do a library search-path lookup for cl 96d41660beSmrgfunc_cl_dashl () 97d41660beSmrg{ 98d41660beSmrg lib=$1 99d41660beSmrg found=no 100d41660beSmrg save_IFS=$IFS 101d41660beSmrg IFS=';' 102d41660beSmrg for dir in $lib_path $LIB 103d41660beSmrg do 104d41660beSmrg IFS=$save_IFS 105d41660beSmrg if $shared && test -f "$dir/$lib.dll.lib"; then 106d41660beSmrg found=yes 107d41660beSmrg lib=$dir/$lib.dll.lib 108d41660beSmrg break 109d41660beSmrg fi 110d41660beSmrg if test -f "$dir/$lib.lib"; then 111d41660beSmrg found=yes 112d41660beSmrg lib=$dir/$lib.lib 113d41660beSmrg break 114d41660beSmrg fi 115d41660beSmrg if test -f "$dir/lib$lib.a"; then 116d41660beSmrg found=yes 117d41660beSmrg lib=$dir/lib$lib.a 118d41660beSmrg break 119d41660beSmrg fi 120d41660beSmrg done 121d41660beSmrg IFS=$save_IFS 122d41660beSmrg 123d41660beSmrg if test "$found" != yes; then 124d41660beSmrg lib=$lib.lib 125d41660beSmrg fi 126d41660beSmrg} 127d41660beSmrg 128d41660beSmrg# func_cl_wrapper cl arg... 129d41660beSmrg# Adjust compile command to suit cl 130d41660beSmrgfunc_cl_wrapper () 131d41660beSmrg{ 132d41660beSmrg # Assume a capable shell 133d41660beSmrg lib_path= 134d41660beSmrg shared=: 135d41660beSmrg linker_opts= 136d41660beSmrg for arg 137d41660beSmrg do 138d41660beSmrg if test -n "$eat"; then 139d41660beSmrg eat= 140d41660beSmrg else 141d41660beSmrg case $1 in 142d41660beSmrg -o) 143d41660beSmrg # configure might choose to run compile as 'compile cc -o foo foo.c'. 144d41660beSmrg eat=1 145d41660beSmrg case $2 in 146d41660beSmrg *.o | *.[oO][bB][jJ]) 147d41660beSmrg func_file_conv "$2" 148d41660beSmrg set x "$@" -Fo"$file" 149d41660beSmrg shift 150d41660beSmrg ;; 151d41660beSmrg *) 152d41660beSmrg func_file_conv "$2" 153d41660beSmrg set x "$@" -Fe"$file" 154d41660beSmrg shift 155d41660beSmrg ;; 156d41660beSmrg esac 157d41660beSmrg ;; 158d41660beSmrg -I) 159d41660beSmrg eat=1 160d41660beSmrg func_file_conv "$2" mingw 161d41660beSmrg set x "$@" -I"$file" 162d41660beSmrg shift 163d41660beSmrg ;; 164d41660beSmrg -I*) 165d41660beSmrg func_file_conv "${1#-I}" mingw 166d41660beSmrg set x "$@" -I"$file" 167d41660beSmrg shift 168d41660beSmrg ;; 169d41660beSmrg -l) 170d41660beSmrg eat=1 171d41660beSmrg func_cl_dashl "$2" 172d41660beSmrg set x "$@" "$lib" 173d41660beSmrg shift 174d41660beSmrg ;; 175d41660beSmrg -l*) 176d41660beSmrg func_cl_dashl "${1#-l}" 177d41660beSmrg set x "$@" "$lib" 178d41660beSmrg shift 179d41660beSmrg ;; 180d41660beSmrg -L) 181d41660beSmrg eat=1 182d41660beSmrg func_cl_dashL "$2" 183d41660beSmrg ;; 184d41660beSmrg -L*) 185d41660beSmrg func_cl_dashL "${1#-L}" 186d41660beSmrg ;; 187d41660beSmrg -static) 188d41660beSmrg shared=false 189d41660beSmrg ;; 190d41660beSmrg -Wl,*) 191d41660beSmrg arg=${1#-Wl,} 192d41660beSmrg save_ifs="$IFS"; IFS=',' 193d41660beSmrg for flag in $arg; do 194d41660beSmrg IFS="$save_ifs" 195d41660beSmrg linker_opts="$linker_opts $flag" 196d41660beSmrg done 197d41660beSmrg IFS="$save_ifs" 198d41660beSmrg ;; 199d41660beSmrg -Xlinker) 200d41660beSmrg eat=1 201d41660beSmrg linker_opts="$linker_opts $2" 202d41660beSmrg ;; 203d41660beSmrg -*) 204d41660beSmrg set x "$@" "$1" 205d41660beSmrg shift 206d41660beSmrg ;; 207d41660beSmrg *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) 208d41660beSmrg func_file_conv "$1" 209d41660beSmrg set x "$@" -Tp"$file" 210d41660beSmrg shift 211d41660beSmrg ;; 212d41660beSmrg *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) 213d41660beSmrg func_file_conv "$1" mingw 214d41660beSmrg set x "$@" "$file" 215d41660beSmrg shift 216d41660beSmrg ;; 217d41660beSmrg *) 218d41660beSmrg set x "$@" "$1" 219d41660beSmrg shift 220d41660beSmrg ;; 221d41660beSmrg esac 222d41660beSmrg fi 223d41660beSmrg shift 224d41660beSmrg done 225d41660beSmrg if test -n "$linker_opts"; then 226d41660beSmrg linker_opts="-link$linker_opts" 227d41660beSmrg fi 228d41660beSmrg exec "$@" $linker_opts 229d41660beSmrg exit 1 230d41660beSmrg} 231d41660beSmrg 232d41660beSmrgeat= 233d41660beSmrg 234876ff6feSmrgcase $1 in 235876ff6feSmrg '') 236d41660beSmrg echo "$0: No command. Try '$0 --help' for more information." 1>&2 237876ff6feSmrg exit 1; 238876ff6feSmrg ;; 239876ff6feSmrg -h | --h*) 240876ff6feSmrg cat <<\EOF 241876ff6feSmrgUsage: compile [--help] [--version] PROGRAM [ARGS] 242876ff6feSmrg 243d41660beSmrgWrapper for compilers which do not understand '-c -o'. 244d41660beSmrgRemove '-o dest.o' from ARGS, run PROGRAM with the remaining 245876ff6feSmrgarguments, and rename the output as expected. 246876ff6feSmrg 247876ff6feSmrgIf you are trying to build a whole package this is not the 248d41660beSmrgright script to run: please start by reading the file 'INSTALL'. 249876ff6feSmrg 250876ff6feSmrgReport bugs to <bug-automake@gnu.org>. 251876ff6feSmrgEOF 252876ff6feSmrg exit $? 253876ff6feSmrg ;; 254876ff6feSmrg -v | --v*) 255876ff6feSmrg echo "compile $scriptversion" 256876ff6feSmrg exit $? 257876ff6feSmrg ;; 258d41660beSmrg cl | *[/\\]cl | cl.exe | *[/\\]cl.exe | \ 259d41660beSmrg icl | *[/\\]icl | icl.exe | *[/\\]icl.exe ) 260d41660beSmrg func_cl_wrapper "$@" # Doesn't return... 261d41660beSmrg ;; 262876ff6feSmrgesac 263876ff6feSmrg 264876ff6feSmrgofile= 265876ff6feSmrgcfile= 266876ff6feSmrg 267876ff6feSmrgfor arg 268876ff6feSmrgdo 269876ff6feSmrg if test -n "$eat"; then 270876ff6feSmrg eat= 271876ff6feSmrg else 272876ff6feSmrg case $1 in 273876ff6feSmrg -o) 274d41660beSmrg # configure might choose to run compile as 'compile cc -o foo foo.c'. 275d41660beSmrg # So we strip '-o arg' only if arg is an object. 276876ff6feSmrg eat=1 277876ff6feSmrg case $2 in 278876ff6feSmrg *.o | *.obj) 279876ff6feSmrg ofile=$2 280876ff6feSmrg ;; 281876ff6feSmrg *) 282876ff6feSmrg set x "$@" -o "$2" 283876ff6feSmrg shift 284876ff6feSmrg ;; 285876ff6feSmrg esac 286876ff6feSmrg ;; 287876ff6feSmrg *.c) 288876ff6feSmrg cfile=$1 289876ff6feSmrg set x "$@" "$1" 290876ff6feSmrg shift 291876ff6feSmrg ;; 292876ff6feSmrg *) 293876ff6feSmrg set x "$@" "$1" 294876ff6feSmrg shift 295876ff6feSmrg ;; 296876ff6feSmrg esac 297876ff6feSmrg fi 298876ff6feSmrg shift 299876ff6feSmrgdone 300876ff6feSmrg 301876ff6feSmrgif test -z "$ofile" || test -z "$cfile"; then 302d41660beSmrg # If no '-o' option was seen then we might have been invoked from a 303876ff6feSmrg # pattern rule where we don't need one. That is ok -- this is a 304876ff6feSmrg # normal compilation that the losing compiler can handle. If no 305d41660beSmrg # '.c' file was seen then we are probably linking. That is also 306876ff6feSmrg # ok. 307876ff6feSmrg exec "$@" 308876ff6feSmrgfi 309876ff6feSmrg 310876ff6feSmrg# Name of file we expect compiler to create. 311d41660beSmrgcofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` 312876ff6feSmrg 313876ff6feSmrg# Create the lock directory. 314d41660beSmrg# Note: use '[/\\:.-]' here to ensure that we don't use the same name 315876ff6feSmrg# that we are using for the .o file. Also, base the name on the expected 316876ff6feSmrg# object file name, since that is what matters with a parallel build. 317d41660beSmrglockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d 318876ff6feSmrgwhile true; do 319876ff6feSmrg if mkdir "$lockdir" >/dev/null 2>&1; then 320876ff6feSmrg break 321876ff6feSmrg fi 322876ff6feSmrg sleep 1 323876ff6feSmrgdone 324876ff6feSmrg# FIXME: race condition here if user kills between mkdir and trap. 325876ff6feSmrgtrap "rmdir '$lockdir'; exit 1" 1 2 15 326876ff6feSmrg 327876ff6feSmrg# Run the compile. 328876ff6feSmrg"$@" 329876ff6feSmrgret=$? 330876ff6feSmrg 331876ff6feSmrgif test -f "$cofile"; then 332d41660beSmrg test "$cofile" = "$ofile" || mv "$cofile" "$ofile" 333876ff6feSmrgelif test -f "${cofile}bj"; then 334d41660beSmrg test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" 335876ff6feSmrgfi 336876ff6feSmrg 337876ff6feSmrgrmdir "$lockdir" 338876ff6feSmrgexit $ret 339876ff6feSmrg 340876ff6feSmrg# Local Variables: 341876ff6feSmrg# mode: shell-script 342876ff6feSmrg# sh-indentation: 2 343876ff6feSmrg# eval: (add-hook 'write-file-hooks 'time-stamp) 344876ff6feSmrg# time-stamp-start: "scriptversion=" 345876ff6feSmrg# time-stamp-format: "%:y-%02m-%02d.%02H" 346d41660beSmrg# time-stamp-time-zone: "UTC0" 347d41660beSmrg# time-stamp-end: "; # UTC" 348876ff6feSmrg# End: 349