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