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