17322289dSmrg#! /bin/sh 27322289dSmrg# Wrapper for compilers which do not understand '-c -o'. 37322289dSmrg 422663e35Smrgscriptversion=2018-03-07.03; # UTC 57322289dSmrg 622663e35Smrg# Copyright (C) 1999-2021 Free Software Foundation, Inc. 77322289dSmrg# Written by Tom Tromey <tromey@cygnus.com>. 87322289dSmrg# 97322289dSmrg# This program is free software; you can redistribute it and/or modify 107322289dSmrg# it under the terms of the GNU General Public License as published by 117322289dSmrg# the Free Software Foundation; either version 2, or (at your option) 127322289dSmrg# any later version. 137322289dSmrg# 147322289dSmrg# This program is distributed in the hope that it will be useful, 157322289dSmrg# but WITHOUT ANY WARRANTY; without even the implied warranty of 167322289dSmrg# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 177322289dSmrg# GNU General Public License for more details. 187322289dSmrg# 197322289dSmrg# You should have received a copy of the GNU General Public License 2022663e35Smrg# along with this program. If not, see <https://www.gnu.org/licenses/>. 217322289dSmrg 227322289dSmrg# As a special exception to the GNU General Public License, if you 237322289dSmrg# distribute this file as part of a program that contains a 247322289dSmrg# configuration script generated by Autoconf, you may include it under 257322289dSmrg# the same distribution terms that you use for the rest of that program. 267322289dSmrg 277322289dSmrg# This file is maintained in Automake, please report 287322289dSmrg# bugs to <bug-automake@gnu.org> or send patches to 297322289dSmrg# <automake-patches@gnu.org>. 307322289dSmrg 317322289dSmrgnl=' 327322289dSmrg' 337322289dSmrg 347322289dSmrg# We need space, tab and new line, in precisely that order. Quoting is 357322289dSmrg# there to prevent tools from complaining about whitespace usage. 367322289dSmrgIFS=" "" $nl" 377322289dSmrg 387322289dSmrgfile_conv= 397322289dSmrg 407322289dSmrg# func_file_conv build_file lazy 417322289dSmrg# Convert a $build file to $host form and store it in $file 427322289dSmrg# Currently only supports Windows hosts. If the determined conversion 437322289dSmrg# type is listed in (the comma separated) LAZY, no conversion will 447322289dSmrg# take place. 457322289dSmrgfunc_file_conv () 467322289dSmrg{ 477322289dSmrg file=$1 487322289dSmrg case $file in 497322289dSmrg / | /[!/]*) # absolute file, and not a UNC file 507322289dSmrg if test -z "$file_conv"; then 517322289dSmrg # lazily determine how to convert abs files 527322289dSmrg case `uname -s` in 537322289dSmrg MINGW*) 547322289dSmrg file_conv=mingw 557322289dSmrg ;; 5622663e35Smrg CYGWIN* | MSYS*) 577322289dSmrg file_conv=cygwin 587322289dSmrg ;; 597322289dSmrg *) 607322289dSmrg file_conv=wine 617322289dSmrg ;; 627322289dSmrg esac 637322289dSmrg fi 647322289dSmrg case $file_conv/,$2, in 657322289dSmrg *,$file_conv,*) 667322289dSmrg ;; 677322289dSmrg mingw/*) 687322289dSmrg file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` 697322289dSmrg ;; 7022663e35Smrg cygwin/* | msys/*) 717322289dSmrg file=`cygpath -m "$file" || echo "$file"` 727322289dSmrg ;; 737322289dSmrg wine/*) 747322289dSmrg file=`winepath -w "$file" || echo "$file"` 757322289dSmrg ;; 767322289dSmrg esac 777322289dSmrg ;; 787322289dSmrg esac 797322289dSmrg} 807322289dSmrg 817322289dSmrg# func_cl_dashL linkdir 827322289dSmrg# Make cl look for libraries in LINKDIR 837322289dSmrgfunc_cl_dashL () 847322289dSmrg{ 857322289dSmrg func_file_conv "$1" 867322289dSmrg if test -z "$lib_path"; then 877322289dSmrg lib_path=$file 887322289dSmrg else 897322289dSmrg lib_path="$lib_path;$file" 907322289dSmrg fi 917322289dSmrg linker_opts="$linker_opts -LIBPATH:$file" 927322289dSmrg} 937322289dSmrg 947322289dSmrg# func_cl_dashl library 957322289dSmrg# Do a library search-path lookup for cl 967322289dSmrgfunc_cl_dashl () 977322289dSmrg{ 987322289dSmrg lib=$1 997322289dSmrg found=no 1007322289dSmrg save_IFS=$IFS 1017322289dSmrg IFS=';' 1027322289dSmrg for dir in $lib_path $LIB 1037322289dSmrg do 1047322289dSmrg IFS=$save_IFS 1057322289dSmrg if $shared && test -f "$dir/$lib.dll.lib"; then 1067322289dSmrg found=yes 1077322289dSmrg lib=$dir/$lib.dll.lib 1087322289dSmrg break 1097322289dSmrg fi 1107322289dSmrg if test -f "$dir/$lib.lib"; then 1117322289dSmrg found=yes 1127322289dSmrg lib=$dir/$lib.lib 1137322289dSmrg break 1147322289dSmrg fi 1157322289dSmrg if test -f "$dir/lib$lib.a"; then 1167322289dSmrg found=yes 1177322289dSmrg lib=$dir/lib$lib.a 1187322289dSmrg break 1197322289dSmrg fi 1207322289dSmrg done 1217322289dSmrg IFS=$save_IFS 1227322289dSmrg 1237322289dSmrg if test "$found" != yes; then 1247322289dSmrg lib=$lib.lib 1257322289dSmrg fi 1267322289dSmrg} 1277322289dSmrg 1287322289dSmrg# func_cl_wrapper cl arg... 1297322289dSmrg# Adjust compile command to suit cl 1307322289dSmrgfunc_cl_wrapper () 1317322289dSmrg{ 1327322289dSmrg # Assume a capable shell 1337322289dSmrg lib_path= 1347322289dSmrg shared=: 1357322289dSmrg linker_opts= 1367322289dSmrg for arg 1377322289dSmrg do 1387322289dSmrg if test -n "$eat"; then 1397322289dSmrg eat= 1407322289dSmrg else 1417322289dSmrg case $1 in 1427322289dSmrg -o) 1437322289dSmrg # configure might choose to run compile as 'compile cc -o foo foo.c'. 1447322289dSmrg eat=1 1457322289dSmrg case $2 in 1467322289dSmrg *.o | *.[oO][bB][jJ]) 1477322289dSmrg func_file_conv "$2" 1487322289dSmrg set x "$@" -Fo"$file" 1497322289dSmrg shift 1507322289dSmrg ;; 1517322289dSmrg *) 1527322289dSmrg func_file_conv "$2" 1537322289dSmrg set x "$@" -Fe"$file" 1547322289dSmrg shift 1557322289dSmrg ;; 1567322289dSmrg esac 1577322289dSmrg ;; 1587322289dSmrg -I) 1597322289dSmrg eat=1 1607322289dSmrg func_file_conv "$2" mingw 1617322289dSmrg set x "$@" -I"$file" 1627322289dSmrg shift 1637322289dSmrg ;; 1647322289dSmrg -I*) 1657322289dSmrg func_file_conv "${1#-I}" mingw 1667322289dSmrg set x "$@" -I"$file" 1677322289dSmrg shift 1687322289dSmrg ;; 1697322289dSmrg -l) 1707322289dSmrg eat=1 1717322289dSmrg func_cl_dashl "$2" 1727322289dSmrg set x "$@" "$lib" 1737322289dSmrg shift 1747322289dSmrg ;; 1757322289dSmrg -l*) 1767322289dSmrg func_cl_dashl "${1#-l}" 1777322289dSmrg set x "$@" "$lib" 1787322289dSmrg shift 1797322289dSmrg ;; 1807322289dSmrg -L) 1817322289dSmrg eat=1 1827322289dSmrg func_cl_dashL "$2" 1837322289dSmrg ;; 1847322289dSmrg -L*) 1857322289dSmrg func_cl_dashL "${1#-L}" 1867322289dSmrg ;; 1877322289dSmrg -static) 1887322289dSmrg shared=false 1897322289dSmrg ;; 1907322289dSmrg -Wl,*) 1917322289dSmrg arg=${1#-Wl,} 1927322289dSmrg save_ifs="$IFS"; IFS=',' 1937322289dSmrg for flag in $arg; do 1947322289dSmrg IFS="$save_ifs" 1957322289dSmrg linker_opts="$linker_opts $flag" 1967322289dSmrg done 1977322289dSmrg IFS="$save_ifs" 1987322289dSmrg ;; 1997322289dSmrg -Xlinker) 2007322289dSmrg eat=1 2017322289dSmrg linker_opts="$linker_opts $2" 2027322289dSmrg ;; 2037322289dSmrg -*) 2047322289dSmrg set x "$@" "$1" 2057322289dSmrg shift 2067322289dSmrg ;; 2077322289dSmrg *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) 2087322289dSmrg func_file_conv "$1" 2097322289dSmrg set x "$@" -Tp"$file" 2107322289dSmrg shift 2117322289dSmrg ;; 2127322289dSmrg *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) 2137322289dSmrg func_file_conv "$1" mingw 2147322289dSmrg set x "$@" "$file" 2157322289dSmrg shift 2167322289dSmrg ;; 2177322289dSmrg *) 2187322289dSmrg set x "$@" "$1" 2197322289dSmrg shift 2207322289dSmrg ;; 2217322289dSmrg esac 2227322289dSmrg fi 2237322289dSmrg shift 2247322289dSmrg done 2257322289dSmrg if test -n "$linker_opts"; then 2267322289dSmrg linker_opts="-link$linker_opts" 2277322289dSmrg fi 2287322289dSmrg exec "$@" $linker_opts 2297322289dSmrg exit 1 2307322289dSmrg} 2317322289dSmrg 2327322289dSmrgeat= 2337322289dSmrg 2347322289dSmrgcase $1 in 2357322289dSmrg '') 2367322289dSmrg echo "$0: No command. Try '$0 --help' for more information." 1>&2 2377322289dSmrg exit 1; 2387322289dSmrg ;; 2397322289dSmrg -h | --h*) 2407322289dSmrg cat <<\EOF 2417322289dSmrgUsage: compile [--help] [--version] PROGRAM [ARGS] 2427322289dSmrg 2437322289dSmrgWrapper for compilers which do not understand '-c -o'. 2447322289dSmrgRemove '-o dest.o' from ARGS, run PROGRAM with the remaining 2457322289dSmrgarguments, and rename the output as expected. 2467322289dSmrg 2477322289dSmrgIf you are trying to build a whole package this is not the 2487322289dSmrgright script to run: please start by reading the file 'INSTALL'. 2497322289dSmrg 2507322289dSmrgReport bugs to <bug-automake@gnu.org>. 2517322289dSmrgEOF 2527322289dSmrg exit $? 2537322289dSmrg ;; 2547322289dSmrg -v | --v*) 2557322289dSmrg echo "compile $scriptversion" 2567322289dSmrg exit $? 2577322289dSmrg ;; 25822663e35Smrg cl | *[/\\]cl | cl.exe | *[/\\]cl.exe | \ 25922663e35Smrg icl | *[/\\]icl | icl.exe | *[/\\]icl.exe ) 2607322289dSmrg func_cl_wrapper "$@" # Doesn't return... 2617322289dSmrg ;; 2627322289dSmrgesac 2637322289dSmrg 2647322289dSmrgofile= 2657322289dSmrgcfile= 2667322289dSmrg 2677322289dSmrgfor arg 2687322289dSmrgdo 2697322289dSmrg if test -n "$eat"; then 2707322289dSmrg eat= 2717322289dSmrg else 2727322289dSmrg case $1 in 2737322289dSmrg -o) 2747322289dSmrg # configure might choose to run compile as 'compile cc -o foo foo.c'. 2757322289dSmrg # So we strip '-o arg' only if arg is an object. 2767322289dSmrg eat=1 2777322289dSmrg case $2 in 2787322289dSmrg *.o | *.obj) 2797322289dSmrg ofile=$2 2807322289dSmrg ;; 2817322289dSmrg *) 2827322289dSmrg set x "$@" -o "$2" 2837322289dSmrg shift 2847322289dSmrg ;; 2857322289dSmrg esac 2867322289dSmrg ;; 2877322289dSmrg *.c) 2887322289dSmrg cfile=$1 2897322289dSmrg set x "$@" "$1" 2907322289dSmrg shift 2917322289dSmrg ;; 2927322289dSmrg *) 2937322289dSmrg set x "$@" "$1" 2947322289dSmrg shift 2957322289dSmrg ;; 2967322289dSmrg esac 2977322289dSmrg fi 2987322289dSmrg shift 2997322289dSmrgdone 3007322289dSmrg 3017322289dSmrgif test -z "$ofile" || test -z "$cfile"; then 3027322289dSmrg # If no '-o' option was seen then we might have been invoked from a 3037322289dSmrg # pattern rule where we don't need one. That is ok -- this is a 3047322289dSmrg # normal compilation that the losing compiler can handle. If no 3057322289dSmrg # '.c' file was seen then we are probably linking. That is also 3067322289dSmrg # ok. 3077322289dSmrg exec "$@" 3087322289dSmrgfi 3097322289dSmrg 3107322289dSmrg# Name of file we expect compiler to create. 3117322289dSmrgcofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` 3127322289dSmrg 3137322289dSmrg# Create the lock directory. 3147322289dSmrg# Note: use '[/\\:.-]' here to ensure that we don't use the same name 3157322289dSmrg# that we are using for the .o file. Also, base the name on the expected 3167322289dSmrg# object file name, since that is what matters with a parallel build. 3177322289dSmrglockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d 3187322289dSmrgwhile true; do 3197322289dSmrg if mkdir "$lockdir" >/dev/null 2>&1; then 3207322289dSmrg break 3217322289dSmrg fi 3227322289dSmrg sleep 1 3237322289dSmrgdone 3247322289dSmrg# FIXME: race condition here if user kills between mkdir and trap. 3257322289dSmrgtrap "rmdir '$lockdir'; exit 1" 1 2 15 3267322289dSmrg 3277322289dSmrg# Run the compile. 3287322289dSmrg"$@" 3297322289dSmrgret=$? 3307322289dSmrg 3317322289dSmrgif test -f "$cofile"; then 3327322289dSmrg test "$cofile" = "$ofile" || mv "$cofile" "$ofile" 3337322289dSmrgelif test -f "${cofile}bj"; then 3347322289dSmrg test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" 3357322289dSmrgfi 3367322289dSmrg 3377322289dSmrgrmdir "$lockdir" 3387322289dSmrgexit $ret 3397322289dSmrg 3407322289dSmrg# Local Variables: 3417322289dSmrg# mode: shell-script 3427322289dSmrg# sh-indentation: 2 34322663e35Smrg# eval: (add-hook 'before-save-hook 'time-stamp) 3447322289dSmrg# time-stamp-start: "scriptversion=" 3457322289dSmrg# time-stamp-format: "%:y-%02m-%02d.%02H" 34622663e35Smrg# time-stamp-time-zone: "UTC0" 3477322289dSmrg# time-stamp-end: "; # UTC" 3487322289dSmrg# End: 349