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