1132369e0Smrg#! /bin/sh 2132369e0Smrg# Wrapper for compilers which do not understand '-c -o'. 3132369e0Smrg 48ae5c7d9Smrgscriptversion=2018-03-07.03; # UTC 5132369e0Smrg 68ae5c7d9Smrg# Copyright (C) 1999-2021 Free Software Foundation, Inc. 7132369e0Smrg# Written by Tom Tromey <tromey@cygnus.com>. 8132369e0Smrg# 9132369e0Smrg# This program is free software; you can redistribute it and/or modify 10132369e0Smrg# it under the terms of the GNU General Public License as published by 11132369e0Smrg# the Free Software Foundation; either version 2, or (at your option) 12132369e0Smrg# any later version. 13132369e0Smrg# 14132369e0Smrg# This program is distributed in the hope that it will be useful, 15132369e0Smrg# but WITHOUT ANY WARRANTY; without even the implied warranty of 16132369e0Smrg# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17132369e0Smrg# GNU General Public License for more details. 18132369e0Smrg# 19132369e0Smrg# You should have received a copy of the GNU General Public License 208ae5c7d9Smrg# along with this program. If not, see <https://www.gnu.org/licenses/>. 21132369e0Smrg 22132369e0Smrg# As a special exception to the GNU General Public License, if you 23132369e0Smrg# distribute this file as part of a program that contains a 24132369e0Smrg# configuration script generated by Autoconf, you may include it under 25132369e0Smrg# the same distribution terms that you use for the rest of that program. 26132369e0Smrg 27132369e0Smrg# This file is maintained in Automake, please report 28132369e0Smrg# bugs to <bug-automake@gnu.org> or send patches to 29132369e0Smrg# <automake-patches@gnu.org>. 30132369e0Smrg 31132369e0Smrgnl=' 32132369e0Smrg' 33132369e0Smrg 34132369e0Smrg# We need space, tab and new line, in precisely that order. Quoting is 35132369e0Smrg# there to prevent tools from complaining about whitespace usage. 36132369e0SmrgIFS=" "" $nl" 37132369e0Smrg 38132369e0Smrgfile_conv= 39132369e0Smrg 40132369e0Smrg# func_file_conv build_file lazy 41132369e0Smrg# Convert a $build file to $host form and store it in $file 42132369e0Smrg# Currently only supports Windows hosts. If the determined conversion 43132369e0Smrg# type is listed in (the comma separated) LAZY, no conversion will 44132369e0Smrg# take place. 45132369e0Smrgfunc_file_conv () 46132369e0Smrg{ 47132369e0Smrg file=$1 48132369e0Smrg case $file in 49132369e0Smrg / | /[!/]*) # absolute file, and not a UNC file 50132369e0Smrg if test -z "$file_conv"; then 51132369e0Smrg # lazily determine how to convert abs files 52132369e0Smrg case `uname -s` in 53132369e0Smrg MINGW*) 54132369e0Smrg file_conv=mingw 55132369e0Smrg ;; 568ae5c7d9Smrg CYGWIN* | MSYS*) 57132369e0Smrg file_conv=cygwin 58132369e0Smrg ;; 59132369e0Smrg *) 60132369e0Smrg file_conv=wine 61132369e0Smrg ;; 62132369e0Smrg esac 63132369e0Smrg fi 64132369e0Smrg case $file_conv/,$2, in 65132369e0Smrg *,$file_conv,*) 66132369e0Smrg ;; 67132369e0Smrg mingw/*) 68132369e0Smrg file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` 69132369e0Smrg ;; 708ae5c7d9Smrg cygwin/* | msys/*) 71132369e0Smrg file=`cygpath -m "$file" || echo "$file"` 72132369e0Smrg ;; 73132369e0Smrg wine/*) 74132369e0Smrg file=`winepath -w "$file" || echo "$file"` 75132369e0Smrg ;; 76132369e0Smrg esac 77132369e0Smrg ;; 78132369e0Smrg esac 79132369e0Smrg} 80132369e0Smrg 81132369e0Smrg# func_cl_dashL linkdir 82132369e0Smrg# Make cl look for libraries in LINKDIR 83132369e0Smrgfunc_cl_dashL () 84132369e0Smrg{ 85132369e0Smrg func_file_conv "$1" 86132369e0Smrg if test -z "$lib_path"; then 87132369e0Smrg lib_path=$file 88132369e0Smrg else 89132369e0Smrg lib_path="$lib_path;$file" 90132369e0Smrg fi 91132369e0Smrg linker_opts="$linker_opts -LIBPATH:$file" 92132369e0Smrg} 93132369e0Smrg 94132369e0Smrg# func_cl_dashl library 95132369e0Smrg# Do a library search-path lookup for cl 96132369e0Smrgfunc_cl_dashl () 97132369e0Smrg{ 98132369e0Smrg lib=$1 99132369e0Smrg found=no 100132369e0Smrg save_IFS=$IFS 101132369e0Smrg IFS=';' 102132369e0Smrg for dir in $lib_path $LIB 103132369e0Smrg do 104132369e0Smrg IFS=$save_IFS 105132369e0Smrg if $shared && test -f "$dir/$lib.dll.lib"; then 106132369e0Smrg found=yes 107132369e0Smrg lib=$dir/$lib.dll.lib 108132369e0Smrg break 109132369e0Smrg fi 110132369e0Smrg if test -f "$dir/$lib.lib"; then 111132369e0Smrg found=yes 112132369e0Smrg lib=$dir/$lib.lib 113132369e0Smrg break 114132369e0Smrg fi 115132369e0Smrg if test -f "$dir/lib$lib.a"; then 116132369e0Smrg found=yes 117132369e0Smrg lib=$dir/lib$lib.a 118132369e0Smrg break 119132369e0Smrg fi 120132369e0Smrg done 121132369e0Smrg IFS=$save_IFS 122132369e0Smrg 123132369e0Smrg if test "$found" != yes; then 124132369e0Smrg lib=$lib.lib 125132369e0Smrg fi 126132369e0Smrg} 127132369e0Smrg 128132369e0Smrg# func_cl_wrapper cl arg... 129132369e0Smrg# Adjust compile command to suit cl 130132369e0Smrgfunc_cl_wrapper () 131132369e0Smrg{ 132132369e0Smrg # Assume a capable shell 133132369e0Smrg lib_path= 134132369e0Smrg shared=: 135132369e0Smrg linker_opts= 136132369e0Smrg for arg 137132369e0Smrg do 138132369e0Smrg if test -n "$eat"; then 139132369e0Smrg eat= 140132369e0Smrg else 141132369e0Smrg case $1 in 142132369e0Smrg -o) 143132369e0Smrg # configure might choose to run compile as 'compile cc -o foo foo.c'. 144132369e0Smrg eat=1 145132369e0Smrg case $2 in 146132369e0Smrg *.o | *.[oO][bB][jJ]) 147132369e0Smrg func_file_conv "$2" 148132369e0Smrg set x "$@" -Fo"$file" 149132369e0Smrg shift 150132369e0Smrg ;; 151132369e0Smrg *) 152132369e0Smrg func_file_conv "$2" 153132369e0Smrg set x "$@" -Fe"$file" 154132369e0Smrg shift 155132369e0Smrg ;; 156132369e0Smrg esac 157132369e0Smrg ;; 158132369e0Smrg -I) 159132369e0Smrg eat=1 160132369e0Smrg func_file_conv "$2" mingw 161132369e0Smrg set x "$@" -I"$file" 162132369e0Smrg shift 163132369e0Smrg ;; 164132369e0Smrg -I*) 165132369e0Smrg func_file_conv "${1#-I}" mingw 166132369e0Smrg set x "$@" -I"$file" 167132369e0Smrg shift 168132369e0Smrg ;; 169132369e0Smrg -l) 170132369e0Smrg eat=1 171132369e0Smrg func_cl_dashl "$2" 172132369e0Smrg set x "$@" "$lib" 173132369e0Smrg shift 174132369e0Smrg ;; 175132369e0Smrg -l*) 176132369e0Smrg func_cl_dashl "${1#-l}" 177132369e0Smrg set x "$@" "$lib" 178132369e0Smrg shift 179132369e0Smrg ;; 180132369e0Smrg -L) 181132369e0Smrg eat=1 182132369e0Smrg func_cl_dashL "$2" 183132369e0Smrg ;; 184132369e0Smrg -L*) 185132369e0Smrg func_cl_dashL "${1#-L}" 186132369e0Smrg ;; 187132369e0Smrg -static) 188132369e0Smrg shared=false 189132369e0Smrg ;; 190132369e0Smrg -Wl,*) 191132369e0Smrg arg=${1#-Wl,} 192132369e0Smrg save_ifs="$IFS"; IFS=',' 193132369e0Smrg for flag in $arg; do 194132369e0Smrg IFS="$save_ifs" 195132369e0Smrg linker_opts="$linker_opts $flag" 196132369e0Smrg done 197132369e0Smrg IFS="$save_ifs" 198132369e0Smrg ;; 199132369e0Smrg -Xlinker) 200132369e0Smrg eat=1 201132369e0Smrg linker_opts="$linker_opts $2" 202132369e0Smrg ;; 203132369e0Smrg -*) 204132369e0Smrg set x "$@" "$1" 205132369e0Smrg shift 206132369e0Smrg ;; 207132369e0Smrg *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) 208132369e0Smrg func_file_conv "$1" 209132369e0Smrg set x "$@" -Tp"$file" 210132369e0Smrg shift 211132369e0Smrg ;; 212132369e0Smrg *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) 213132369e0Smrg func_file_conv "$1" mingw 214132369e0Smrg set x "$@" "$file" 215132369e0Smrg shift 216132369e0Smrg ;; 217132369e0Smrg *) 218132369e0Smrg set x "$@" "$1" 219132369e0Smrg shift 220132369e0Smrg ;; 221132369e0Smrg esac 222132369e0Smrg fi 223132369e0Smrg shift 224132369e0Smrg done 225132369e0Smrg if test -n "$linker_opts"; then 226132369e0Smrg linker_opts="-link$linker_opts" 227132369e0Smrg fi 228132369e0Smrg exec "$@" $linker_opts 229132369e0Smrg exit 1 230132369e0Smrg} 231132369e0Smrg 232132369e0Smrgeat= 233132369e0Smrg 234132369e0Smrgcase $1 in 235132369e0Smrg '') 236132369e0Smrg echo "$0: No command. Try '$0 --help' for more information." 1>&2 237132369e0Smrg exit 1; 238132369e0Smrg ;; 239132369e0Smrg -h | --h*) 240132369e0Smrg cat <<\EOF 241132369e0SmrgUsage: compile [--help] [--version] PROGRAM [ARGS] 242132369e0Smrg 243132369e0SmrgWrapper for compilers which do not understand '-c -o'. 244132369e0SmrgRemove '-o dest.o' from ARGS, run PROGRAM with the remaining 245132369e0Smrgarguments, and rename the output as expected. 246132369e0Smrg 247132369e0SmrgIf you are trying to build a whole package this is not the 248132369e0Smrgright script to run: please start by reading the file 'INSTALL'. 249132369e0Smrg 250132369e0SmrgReport bugs to <bug-automake@gnu.org>. 251132369e0SmrgEOF 252132369e0Smrg exit $? 253132369e0Smrg ;; 254132369e0Smrg -v | --v*) 255132369e0Smrg echo "compile $scriptversion" 256132369e0Smrg exit $? 257132369e0Smrg ;; 2588ae5c7d9Smrg cl | *[/\\]cl | cl.exe | *[/\\]cl.exe | \ 2598ae5c7d9Smrg icl | *[/\\]icl | icl.exe | *[/\\]icl.exe ) 260132369e0Smrg func_cl_wrapper "$@" # Doesn't return... 261132369e0Smrg ;; 262132369e0Smrgesac 263132369e0Smrg 264132369e0Smrgofile= 265132369e0Smrgcfile= 266132369e0Smrg 267132369e0Smrgfor arg 268132369e0Smrgdo 269132369e0Smrg if test -n "$eat"; then 270132369e0Smrg eat= 271132369e0Smrg else 272132369e0Smrg case $1 in 273132369e0Smrg -o) 274132369e0Smrg # configure might choose to run compile as 'compile cc -o foo foo.c'. 275132369e0Smrg # So we strip '-o arg' only if arg is an object. 276132369e0Smrg eat=1 277132369e0Smrg case $2 in 278132369e0Smrg *.o | *.obj) 279132369e0Smrg ofile=$2 280132369e0Smrg ;; 281132369e0Smrg *) 282132369e0Smrg set x "$@" -o "$2" 283132369e0Smrg shift 284132369e0Smrg ;; 285132369e0Smrg esac 286132369e0Smrg ;; 287132369e0Smrg *.c) 288132369e0Smrg cfile=$1 289132369e0Smrg set x "$@" "$1" 290132369e0Smrg shift 291132369e0Smrg ;; 292132369e0Smrg *) 293132369e0Smrg set x "$@" "$1" 294132369e0Smrg shift 295132369e0Smrg ;; 296132369e0Smrg esac 297132369e0Smrg fi 298132369e0Smrg shift 299132369e0Smrgdone 300132369e0Smrg 301132369e0Smrgif test -z "$ofile" || test -z "$cfile"; then 302132369e0Smrg # If no '-o' option was seen then we might have been invoked from a 303132369e0Smrg # pattern rule where we don't need one. That is ok -- this is a 304132369e0Smrg # normal compilation that the losing compiler can handle. If no 305132369e0Smrg # '.c' file was seen then we are probably linking. That is also 306132369e0Smrg # ok. 307132369e0Smrg exec "$@" 308132369e0Smrgfi 309132369e0Smrg 310132369e0Smrg# Name of file we expect compiler to create. 311132369e0Smrgcofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` 312132369e0Smrg 313132369e0Smrg# Create the lock directory. 314132369e0Smrg# Note: use '[/\\:.-]' here to ensure that we don't use the same name 315132369e0Smrg# that we are using for the .o file. Also, base the name on the expected 316132369e0Smrg# object file name, since that is what matters with a parallel build. 317132369e0Smrglockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d 318132369e0Smrgwhile true; do 319132369e0Smrg if mkdir "$lockdir" >/dev/null 2>&1; then 320132369e0Smrg break 321132369e0Smrg fi 322132369e0Smrg sleep 1 323132369e0Smrgdone 324132369e0Smrg# FIXME: race condition here if user kills between mkdir and trap. 325132369e0Smrgtrap "rmdir '$lockdir'; exit 1" 1 2 15 326132369e0Smrg 327132369e0Smrg# Run the compile. 328132369e0Smrg"$@" 329132369e0Smrgret=$? 330132369e0Smrg 331132369e0Smrgif test -f "$cofile"; then 332132369e0Smrg test "$cofile" = "$ofile" || mv "$cofile" "$ofile" 333132369e0Smrgelif test -f "${cofile}bj"; then 334132369e0Smrg test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" 335132369e0Smrgfi 336132369e0Smrg 337132369e0Smrgrmdir "$lockdir" 338132369e0Smrgexit $ret 339132369e0Smrg 340132369e0Smrg# Local Variables: 341132369e0Smrg# mode: shell-script 342132369e0Smrg# sh-indentation: 2 3438ae5c7d9Smrg# eval: (add-hook 'before-save-hook 'time-stamp) 344132369e0Smrg# time-stamp-start: "scriptversion=" 345132369e0Smrg# time-stamp-format: "%:y-%02m-%02d.%02H" 3468ae5c7d9Smrg# time-stamp-time-zone: "UTC0" 347132369e0Smrg# time-stamp-end: "; # UTC" 348132369e0Smrg# End: 349