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