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