13653852eSmrg#! /bin/sh 23653852eSmrg# Wrapper for compilers which do not understand '-c -o'. 33653852eSmrg 45903e163Smrgscriptversion=2018-03-07.03; # UTC 53653852eSmrg 65903e163Smrg# Copyright (C) 1999-2021 Free Software Foundation, Inc. 73653852eSmrg# Written by Tom Tromey <tromey@cygnus.com>. 83653852eSmrg# 93653852eSmrg# This program is free software; you can redistribute it and/or modify 103653852eSmrg# it under the terms of the GNU General Public License as published by 113653852eSmrg# the Free Software Foundation; either version 2, or (at your option) 123653852eSmrg# any later version. 133653852eSmrg# 143653852eSmrg# This program is distributed in the hope that it will be useful, 153653852eSmrg# but WITHOUT ANY WARRANTY; without even the implied warranty of 163653852eSmrg# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 173653852eSmrg# GNU General Public License for more details. 183653852eSmrg# 193653852eSmrg# You should have received a copy of the GNU General Public License 205903e163Smrg# along with this program. If not, see <https://www.gnu.org/licenses/>. 213653852eSmrg 223653852eSmrg# As a special exception to the GNU General Public License, if you 233653852eSmrg# distribute this file as part of a program that contains a 243653852eSmrg# configuration script generated by Autoconf, you may include it under 253653852eSmrg# the same distribution terms that you use for the rest of that program. 263653852eSmrg 273653852eSmrg# This file is maintained in Automake, please report 283653852eSmrg# bugs to <bug-automake@gnu.org> or send patches to 293653852eSmrg# <automake-patches@gnu.org>. 303653852eSmrg 313653852eSmrgnl=' 323653852eSmrg' 333653852eSmrg 343653852eSmrg# We need space, tab and new line, in precisely that order. Quoting is 353653852eSmrg# there to prevent tools from complaining about whitespace usage. 363653852eSmrgIFS=" "" $nl" 373653852eSmrg 383653852eSmrgfile_conv= 393653852eSmrg 403653852eSmrg# func_file_conv build_file lazy 413653852eSmrg# Convert a $build file to $host form and store it in $file 423653852eSmrg# Currently only supports Windows hosts. If the determined conversion 433653852eSmrg# type is listed in (the comma separated) LAZY, no conversion will 443653852eSmrg# take place. 453653852eSmrgfunc_file_conv () 463653852eSmrg{ 473653852eSmrg file=$1 483653852eSmrg case $file in 493653852eSmrg / | /[!/]*) # absolute file, and not a UNC file 503653852eSmrg if test -z "$file_conv"; then 513653852eSmrg # lazily determine how to convert abs files 523653852eSmrg case `uname -s` in 533653852eSmrg MINGW*) 543653852eSmrg file_conv=mingw 553653852eSmrg ;; 565903e163Smrg CYGWIN* | MSYS*) 573653852eSmrg file_conv=cygwin 583653852eSmrg ;; 593653852eSmrg *) 603653852eSmrg file_conv=wine 613653852eSmrg ;; 623653852eSmrg esac 633653852eSmrg fi 643653852eSmrg case $file_conv/,$2, in 653653852eSmrg *,$file_conv,*) 663653852eSmrg ;; 673653852eSmrg mingw/*) 683653852eSmrg file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` 693653852eSmrg ;; 705903e163Smrg cygwin/* | msys/*) 713653852eSmrg file=`cygpath -m "$file" || echo "$file"` 723653852eSmrg ;; 733653852eSmrg wine/*) 743653852eSmrg file=`winepath -w "$file" || echo "$file"` 753653852eSmrg ;; 763653852eSmrg esac 773653852eSmrg ;; 783653852eSmrg esac 793653852eSmrg} 803653852eSmrg 813653852eSmrg# func_cl_dashL linkdir 823653852eSmrg# Make cl look for libraries in LINKDIR 833653852eSmrgfunc_cl_dashL () 843653852eSmrg{ 853653852eSmrg func_file_conv "$1" 863653852eSmrg if test -z "$lib_path"; then 873653852eSmrg lib_path=$file 883653852eSmrg else 893653852eSmrg lib_path="$lib_path;$file" 903653852eSmrg fi 913653852eSmrg linker_opts="$linker_opts -LIBPATH:$file" 923653852eSmrg} 933653852eSmrg 943653852eSmrg# func_cl_dashl library 953653852eSmrg# Do a library search-path lookup for cl 963653852eSmrgfunc_cl_dashl () 973653852eSmrg{ 983653852eSmrg lib=$1 993653852eSmrg found=no 1003653852eSmrg save_IFS=$IFS 1013653852eSmrg IFS=';' 1023653852eSmrg for dir in $lib_path $LIB 1033653852eSmrg do 1043653852eSmrg IFS=$save_IFS 1053653852eSmrg if $shared && test -f "$dir/$lib.dll.lib"; then 1063653852eSmrg found=yes 1073653852eSmrg lib=$dir/$lib.dll.lib 1083653852eSmrg break 1093653852eSmrg fi 1103653852eSmrg if test -f "$dir/$lib.lib"; then 1113653852eSmrg found=yes 1123653852eSmrg lib=$dir/$lib.lib 1133653852eSmrg break 1143653852eSmrg fi 1153653852eSmrg if test -f "$dir/lib$lib.a"; then 1163653852eSmrg found=yes 1173653852eSmrg lib=$dir/lib$lib.a 1183653852eSmrg break 1193653852eSmrg fi 1203653852eSmrg done 1213653852eSmrg IFS=$save_IFS 1223653852eSmrg 1233653852eSmrg if test "$found" != yes; then 1243653852eSmrg lib=$lib.lib 1253653852eSmrg fi 1263653852eSmrg} 1273653852eSmrg 1283653852eSmrg# func_cl_wrapper cl arg... 1293653852eSmrg# Adjust compile command to suit cl 1303653852eSmrgfunc_cl_wrapper () 1313653852eSmrg{ 1323653852eSmrg # Assume a capable shell 1333653852eSmrg lib_path= 1343653852eSmrg shared=: 1353653852eSmrg linker_opts= 1363653852eSmrg for arg 1373653852eSmrg do 1383653852eSmrg if test -n "$eat"; then 1393653852eSmrg eat= 1403653852eSmrg else 1413653852eSmrg case $1 in 1423653852eSmrg -o) 1433653852eSmrg # configure might choose to run compile as 'compile cc -o foo foo.c'. 1443653852eSmrg eat=1 1453653852eSmrg case $2 in 1463653852eSmrg *.o | *.[oO][bB][jJ]) 1473653852eSmrg func_file_conv "$2" 1483653852eSmrg set x "$@" -Fo"$file" 1493653852eSmrg shift 1503653852eSmrg ;; 1513653852eSmrg *) 1523653852eSmrg func_file_conv "$2" 1533653852eSmrg set x "$@" -Fe"$file" 1543653852eSmrg shift 1553653852eSmrg ;; 1563653852eSmrg esac 1573653852eSmrg ;; 1583653852eSmrg -I) 1593653852eSmrg eat=1 1603653852eSmrg func_file_conv "$2" mingw 1613653852eSmrg set x "$@" -I"$file" 1623653852eSmrg shift 1633653852eSmrg ;; 1643653852eSmrg -I*) 1653653852eSmrg func_file_conv "${1#-I}" mingw 1663653852eSmrg set x "$@" -I"$file" 1673653852eSmrg shift 1683653852eSmrg ;; 1693653852eSmrg -l) 1703653852eSmrg eat=1 1713653852eSmrg func_cl_dashl "$2" 1723653852eSmrg set x "$@" "$lib" 1733653852eSmrg shift 1743653852eSmrg ;; 1753653852eSmrg -l*) 1763653852eSmrg func_cl_dashl "${1#-l}" 1773653852eSmrg set x "$@" "$lib" 1783653852eSmrg shift 1793653852eSmrg ;; 1803653852eSmrg -L) 1813653852eSmrg eat=1 1823653852eSmrg func_cl_dashL "$2" 1833653852eSmrg ;; 1843653852eSmrg -L*) 1853653852eSmrg func_cl_dashL "${1#-L}" 1863653852eSmrg ;; 1873653852eSmrg -static) 1883653852eSmrg shared=false 1893653852eSmrg ;; 1903653852eSmrg -Wl,*) 1913653852eSmrg arg=${1#-Wl,} 1923653852eSmrg save_ifs="$IFS"; IFS=',' 1933653852eSmrg for flag in $arg; do 1943653852eSmrg IFS="$save_ifs" 1953653852eSmrg linker_opts="$linker_opts $flag" 1963653852eSmrg done 1973653852eSmrg IFS="$save_ifs" 1983653852eSmrg ;; 1993653852eSmrg -Xlinker) 2003653852eSmrg eat=1 2013653852eSmrg linker_opts="$linker_opts $2" 2023653852eSmrg ;; 2033653852eSmrg -*) 2043653852eSmrg set x "$@" "$1" 2053653852eSmrg shift 2063653852eSmrg ;; 2073653852eSmrg *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) 2083653852eSmrg func_file_conv "$1" 2093653852eSmrg set x "$@" -Tp"$file" 2103653852eSmrg shift 2113653852eSmrg ;; 2123653852eSmrg *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) 2133653852eSmrg func_file_conv "$1" mingw 2143653852eSmrg set x "$@" "$file" 2153653852eSmrg shift 2163653852eSmrg ;; 2173653852eSmrg *) 2183653852eSmrg set x "$@" "$1" 2193653852eSmrg shift 2203653852eSmrg ;; 2213653852eSmrg esac 2223653852eSmrg fi 2233653852eSmrg shift 2243653852eSmrg done 2253653852eSmrg if test -n "$linker_opts"; then 2263653852eSmrg linker_opts="-link$linker_opts" 2273653852eSmrg fi 2283653852eSmrg exec "$@" $linker_opts 2293653852eSmrg exit 1 2303653852eSmrg} 2313653852eSmrg 2323653852eSmrgeat= 2333653852eSmrg 2343653852eSmrgcase $1 in 2353653852eSmrg '') 2363653852eSmrg echo "$0: No command. Try '$0 --help' for more information." 1>&2 2373653852eSmrg exit 1; 2383653852eSmrg ;; 2393653852eSmrg -h | --h*) 2403653852eSmrg cat <<\EOF 2413653852eSmrgUsage: compile [--help] [--version] PROGRAM [ARGS] 2423653852eSmrg 2433653852eSmrgWrapper for compilers which do not understand '-c -o'. 2443653852eSmrgRemove '-o dest.o' from ARGS, run PROGRAM with the remaining 2453653852eSmrgarguments, and rename the output as expected. 2463653852eSmrg 2473653852eSmrgIf you are trying to build a whole package this is not the 2483653852eSmrgright script to run: please start by reading the file 'INSTALL'. 2493653852eSmrg 2503653852eSmrgReport bugs to <bug-automake@gnu.org>. 2513653852eSmrgEOF 2523653852eSmrg exit $? 2533653852eSmrg ;; 2543653852eSmrg -v | --v*) 2553653852eSmrg echo "compile $scriptversion" 2563653852eSmrg exit $? 2573653852eSmrg ;; 2585903e163Smrg cl | *[/\\]cl | cl.exe | *[/\\]cl.exe | \ 2595903e163Smrg icl | *[/\\]icl | icl.exe | *[/\\]icl.exe ) 2603653852eSmrg func_cl_wrapper "$@" # Doesn't return... 2613653852eSmrg ;; 2623653852eSmrgesac 2633653852eSmrg 2643653852eSmrgofile= 2653653852eSmrgcfile= 2663653852eSmrg 2673653852eSmrgfor arg 2683653852eSmrgdo 2693653852eSmrg if test -n "$eat"; then 2703653852eSmrg eat= 2713653852eSmrg else 2723653852eSmrg case $1 in 2733653852eSmrg -o) 2743653852eSmrg # configure might choose to run compile as 'compile cc -o foo foo.c'. 2753653852eSmrg # So we strip '-o arg' only if arg is an object. 2763653852eSmrg eat=1 2773653852eSmrg case $2 in 2783653852eSmrg *.o | *.obj) 2793653852eSmrg ofile=$2 2803653852eSmrg ;; 2813653852eSmrg *) 2823653852eSmrg set x "$@" -o "$2" 2833653852eSmrg shift 2843653852eSmrg ;; 2853653852eSmrg esac 2863653852eSmrg ;; 2873653852eSmrg *.c) 2883653852eSmrg cfile=$1 2893653852eSmrg set x "$@" "$1" 2903653852eSmrg shift 2913653852eSmrg ;; 2923653852eSmrg *) 2933653852eSmrg set x "$@" "$1" 2943653852eSmrg shift 2953653852eSmrg ;; 2963653852eSmrg esac 2973653852eSmrg fi 2983653852eSmrg shift 2993653852eSmrgdone 3003653852eSmrg 3013653852eSmrgif test -z "$ofile" || test -z "$cfile"; then 3023653852eSmrg # If no '-o' option was seen then we might have been invoked from a 3033653852eSmrg # pattern rule where we don't need one. That is ok -- this is a 3043653852eSmrg # normal compilation that the losing compiler can handle. If no 3053653852eSmrg # '.c' file was seen then we are probably linking. That is also 3063653852eSmrg # ok. 3073653852eSmrg exec "$@" 3083653852eSmrgfi 3093653852eSmrg 3103653852eSmrg# Name of file we expect compiler to create. 3113653852eSmrgcofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` 3123653852eSmrg 3133653852eSmrg# Create the lock directory. 3143653852eSmrg# Note: use '[/\\:.-]' here to ensure that we don't use the same name 3153653852eSmrg# that we are using for the .o file. Also, base the name on the expected 3163653852eSmrg# object file name, since that is what matters with a parallel build. 3173653852eSmrglockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d 3183653852eSmrgwhile true; do 3193653852eSmrg if mkdir "$lockdir" >/dev/null 2>&1; then 3203653852eSmrg break 3213653852eSmrg fi 3223653852eSmrg sleep 1 3233653852eSmrgdone 3243653852eSmrg# FIXME: race condition here if user kills between mkdir and trap. 3253653852eSmrgtrap "rmdir '$lockdir'; exit 1" 1 2 15 3263653852eSmrg 3273653852eSmrg# Run the compile. 3283653852eSmrg"$@" 3293653852eSmrgret=$? 3303653852eSmrg 3313653852eSmrgif test -f "$cofile"; then 3323653852eSmrg test "$cofile" = "$ofile" || mv "$cofile" "$ofile" 3333653852eSmrgelif test -f "${cofile}bj"; then 3343653852eSmrg test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" 3353653852eSmrgfi 3363653852eSmrg 3373653852eSmrgrmdir "$lockdir" 3383653852eSmrgexit $ret 3393653852eSmrg 3403653852eSmrg# Local Variables: 3413653852eSmrg# mode: shell-script 3423653852eSmrg# sh-indentation: 2 3435903e163Smrg# eval: (add-hook 'before-save-hook 'time-stamp) 3443653852eSmrg# time-stamp-start: "scriptversion=" 3453653852eSmrg# time-stamp-format: "%:y-%02m-%02d.%02H" 3465903e163Smrg# time-stamp-time-zone: "UTC0" 3473653852eSmrg# time-stamp-end: "; # UTC" 3483653852eSmrg# End: 349