15c30ecadSmrg#! /bin/sh 25c30ecadSmrg# Wrapper for compilers which do not understand '-c -o'. 35c30ecadSmrg 45c30ecadSmrgscriptversion=2018-03-07.03; # UTC 55c30ecadSmrg 65c30ecadSmrg# Copyright (C) 1999-2021 Free Software Foundation, Inc. 75c30ecadSmrg# Written by Tom Tromey <tromey@cygnus.com>. 85c30ecadSmrg# 95c30ecadSmrg# This program is free software; you can redistribute it and/or modify 105c30ecadSmrg# it under the terms of the GNU General Public License as published by 115c30ecadSmrg# the Free Software Foundation; either version 2, or (at your option) 125c30ecadSmrg# any later version. 135c30ecadSmrg# 145c30ecadSmrg# This program is distributed in the hope that it will be useful, 155c30ecadSmrg# but WITHOUT ANY WARRANTY; without even the implied warranty of 165c30ecadSmrg# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 175c30ecadSmrg# GNU General Public License for more details. 185c30ecadSmrg# 195c30ecadSmrg# You should have received a copy of the GNU General Public License 205c30ecadSmrg# along with this program. If not, see <https://www.gnu.org/licenses/>. 215c30ecadSmrg 225c30ecadSmrg# As a special exception to the GNU General Public License, if you 235c30ecadSmrg# distribute this file as part of a program that contains a 245c30ecadSmrg# configuration script generated by Autoconf, you may include it under 255c30ecadSmrg# the same distribution terms that you use for the rest of that program. 265c30ecadSmrg 275c30ecadSmrg# This file is maintained in Automake, please report 285c30ecadSmrg# bugs to <bug-automake@gnu.org> or send patches to 295c30ecadSmrg# <automake-patches@gnu.org>. 305c30ecadSmrg 315c30ecadSmrgnl=' 325c30ecadSmrg' 335c30ecadSmrg 345c30ecadSmrg# We need space, tab and new line, in precisely that order. Quoting is 355c30ecadSmrg# there to prevent tools from complaining about whitespace usage. 365c30ecadSmrgIFS=" "" $nl" 375c30ecadSmrg 385c30ecadSmrgfile_conv= 395c30ecadSmrg 405c30ecadSmrg# func_file_conv build_file lazy 415c30ecadSmrg# Convert a $build file to $host form and store it in $file 425c30ecadSmrg# Currently only supports Windows hosts. If the determined conversion 435c30ecadSmrg# type is listed in (the comma separated) LAZY, no conversion will 445c30ecadSmrg# take place. 455c30ecadSmrgfunc_file_conv () 465c30ecadSmrg{ 475c30ecadSmrg file=$1 485c30ecadSmrg case $file in 495c30ecadSmrg / | /[!/]*) # absolute file, and not a UNC file 505c30ecadSmrg if test -z "$file_conv"; then 515c30ecadSmrg # lazily determine how to convert abs files 525c30ecadSmrg case `uname -s` in 535c30ecadSmrg MINGW*) 545c30ecadSmrg file_conv=mingw 555c30ecadSmrg ;; 565c30ecadSmrg CYGWIN* | MSYS*) 575c30ecadSmrg file_conv=cygwin 585c30ecadSmrg ;; 595c30ecadSmrg *) 605c30ecadSmrg file_conv=wine 615c30ecadSmrg ;; 625c30ecadSmrg esac 635c30ecadSmrg fi 645c30ecadSmrg case $file_conv/,$2, in 655c30ecadSmrg *,$file_conv,*) 665c30ecadSmrg ;; 675c30ecadSmrg mingw/*) 685c30ecadSmrg file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` 695c30ecadSmrg ;; 705c30ecadSmrg cygwin/* | msys/*) 715c30ecadSmrg file=`cygpath -m "$file" || echo "$file"` 725c30ecadSmrg ;; 735c30ecadSmrg wine/*) 745c30ecadSmrg file=`winepath -w "$file" || echo "$file"` 755c30ecadSmrg ;; 765c30ecadSmrg esac 775c30ecadSmrg ;; 785c30ecadSmrg esac 795c30ecadSmrg} 805c30ecadSmrg 815c30ecadSmrg# func_cl_dashL linkdir 825c30ecadSmrg# Make cl look for libraries in LINKDIR 835c30ecadSmrgfunc_cl_dashL () 845c30ecadSmrg{ 855c30ecadSmrg func_file_conv "$1" 865c30ecadSmrg if test -z "$lib_path"; then 875c30ecadSmrg lib_path=$file 885c30ecadSmrg else 895c30ecadSmrg lib_path="$lib_path;$file" 905c30ecadSmrg fi 915c30ecadSmrg linker_opts="$linker_opts -LIBPATH:$file" 925c30ecadSmrg} 935c30ecadSmrg 945c30ecadSmrg# func_cl_dashl library 955c30ecadSmrg# Do a library search-path lookup for cl 965c30ecadSmrgfunc_cl_dashl () 975c30ecadSmrg{ 985c30ecadSmrg lib=$1 995c30ecadSmrg found=no 1005c30ecadSmrg save_IFS=$IFS 1015c30ecadSmrg IFS=';' 1025c30ecadSmrg for dir in $lib_path $LIB 1035c30ecadSmrg do 1045c30ecadSmrg IFS=$save_IFS 1055c30ecadSmrg if $shared && test -f "$dir/$lib.dll.lib"; then 1065c30ecadSmrg found=yes 1075c30ecadSmrg lib=$dir/$lib.dll.lib 1085c30ecadSmrg break 1095c30ecadSmrg fi 1105c30ecadSmrg if test -f "$dir/$lib.lib"; then 1115c30ecadSmrg found=yes 1125c30ecadSmrg lib=$dir/$lib.lib 1135c30ecadSmrg break 1145c30ecadSmrg fi 1155c30ecadSmrg if test -f "$dir/lib$lib.a"; then 1165c30ecadSmrg found=yes 1175c30ecadSmrg lib=$dir/lib$lib.a 1185c30ecadSmrg break 1195c30ecadSmrg fi 1205c30ecadSmrg done 1215c30ecadSmrg IFS=$save_IFS 1225c30ecadSmrg 1235c30ecadSmrg if test "$found" != yes; then 1245c30ecadSmrg lib=$lib.lib 1255c30ecadSmrg fi 1265c30ecadSmrg} 1275c30ecadSmrg 1285c30ecadSmrg# func_cl_wrapper cl arg... 1295c30ecadSmrg# Adjust compile command to suit cl 1305c30ecadSmrgfunc_cl_wrapper () 1315c30ecadSmrg{ 1325c30ecadSmrg # Assume a capable shell 1335c30ecadSmrg lib_path= 1345c30ecadSmrg shared=: 1355c30ecadSmrg linker_opts= 1365c30ecadSmrg for arg 1375c30ecadSmrg do 1385c30ecadSmrg if test -n "$eat"; then 1395c30ecadSmrg eat= 1405c30ecadSmrg else 1415c30ecadSmrg case $1 in 1425c30ecadSmrg -o) 1435c30ecadSmrg # configure might choose to run compile as 'compile cc -o foo foo.c'. 1445c30ecadSmrg eat=1 1455c30ecadSmrg case $2 in 1465c30ecadSmrg *.o | *.[oO][bB][jJ]) 1475c30ecadSmrg func_file_conv "$2" 1485c30ecadSmrg set x "$@" -Fo"$file" 1495c30ecadSmrg shift 1505c30ecadSmrg ;; 1515c30ecadSmrg *) 1525c30ecadSmrg func_file_conv "$2" 1535c30ecadSmrg set x "$@" -Fe"$file" 1545c30ecadSmrg shift 1555c30ecadSmrg ;; 1565c30ecadSmrg esac 1575c30ecadSmrg ;; 1585c30ecadSmrg -I) 1595c30ecadSmrg eat=1 1605c30ecadSmrg func_file_conv "$2" mingw 1615c30ecadSmrg set x "$@" -I"$file" 1625c30ecadSmrg shift 1635c30ecadSmrg ;; 1645c30ecadSmrg -I*) 1655c30ecadSmrg func_file_conv "${1#-I}" mingw 1665c30ecadSmrg set x "$@" -I"$file" 1675c30ecadSmrg shift 1685c30ecadSmrg ;; 1695c30ecadSmrg -l) 1705c30ecadSmrg eat=1 1715c30ecadSmrg func_cl_dashl "$2" 1725c30ecadSmrg set x "$@" "$lib" 1735c30ecadSmrg shift 1745c30ecadSmrg ;; 1755c30ecadSmrg -l*) 1765c30ecadSmrg func_cl_dashl "${1#-l}" 1775c30ecadSmrg set x "$@" "$lib" 1785c30ecadSmrg shift 1795c30ecadSmrg ;; 1805c30ecadSmrg -L) 1815c30ecadSmrg eat=1 1825c30ecadSmrg func_cl_dashL "$2" 1835c30ecadSmrg ;; 1845c30ecadSmrg -L*) 1855c30ecadSmrg func_cl_dashL "${1#-L}" 1865c30ecadSmrg ;; 1875c30ecadSmrg -static) 1885c30ecadSmrg shared=false 1895c30ecadSmrg ;; 1905c30ecadSmrg -Wl,*) 1915c30ecadSmrg arg=${1#-Wl,} 1925c30ecadSmrg save_ifs="$IFS"; IFS=',' 1935c30ecadSmrg for flag in $arg; do 1945c30ecadSmrg IFS="$save_ifs" 1955c30ecadSmrg linker_opts="$linker_opts $flag" 1965c30ecadSmrg done 1975c30ecadSmrg IFS="$save_ifs" 1985c30ecadSmrg ;; 1995c30ecadSmrg -Xlinker) 2005c30ecadSmrg eat=1 2015c30ecadSmrg linker_opts="$linker_opts $2" 2025c30ecadSmrg ;; 2035c30ecadSmrg -*) 2045c30ecadSmrg set x "$@" "$1" 2055c30ecadSmrg shift 2065c30ecadSmrg ;; 2075c30ecadSmrg *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) 2085c30ecadSmrg func_file_conv "$1" 2095c30ecadSmrg set x "$@" -Tp"$file" 2105c30ecadSmrg shift 2115c30ecadSmrg ;; 2125c30ecadSmrg *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) 2135c30ecadSmrg func_file_conv "$1" mingw 2145c30ecadSmrg set x "$@" "$file" 2155c30ecadSmrg shift 2165c30ecadSmrg ;; 2175c30ecadSmrg *) 2185c30ecadSmrg set x "$@" "$1" 2195c30ecadSmrg shift 2205c30ecadSmrg ;; 2215c30ecadSmrg esac 2225c30ecadSmrg fi 2235c30ecadSmrg shift 2245c30ecadSmrg done 2255c30ecadSmrg if test -n "$linker_opts"; then 2265c30ecadSmrg linker_opts="-link$linker_opts" 2275c30ecadSmrg fi 2285c30ecadSmrg exec "$@" $linker_opts 2295c30ecadSmrg exit 1 2305c30ecadSmrg} 2315c30ecadSmrg 2325c30ecadSmrgeat= 2335c30ecadSmrg 2345c30ecadSmrgcase $1 in 2355c30ecadSmrg '') 2365c30ecadSmrg echo "$0: No command. Try '$0 --help' for more information." 1>&2 2375c30ecadSmrg exit 1; 2385c30ecadSmrg ;; 2395c30ecadSmrg -h | --h*) 2405c30ecadSmrg cat <<\EOF 2415c30ecadSmrgUsage: compile [--help] [--version] PROGRAM [ARGS] 2425c30ecadSmrg 2435c30ecadSmrgWrapper for compilers which do not understand '-c -o'. 2445c30ecadSmrgRemove '-o dest.o' from ARGS, run PROGRAM with the remaining 2455c30ecadSmrgarguments, and rename the output as expected. 2465c30ecadSmrg 2475c30ecadSmrgIf you are trying to build a whole package this is not the 2485c30ecadSmrgright script to run: please start by reading the file 'INSTALL'. 2495c30ecadSmrg 2505c30ecadSmrgReport bugs to <bug-automake@gnu.org>. 2515c30ecadSmrgEOF 2525c30ecadSmrg exit $? 2535c30ecadSmrg ;; 2545c30ecadSmrg -v | --v*) 2555c30ecadSmrg echo "compile $scriptversion" 2565c30ecadSmrg exit $? 2575c30ecadSmrg ;; 2585c30ecadSmrg cl | *[/\\]cl | cl.exe | *[/\\]cl.exe | \ 2595c30ecadSmrg icl | *[/\\]icl | icl.exe | *[/\\]icl.exe ) 2605c30ecadSmrg func_cl_wrapper "$@" # Doesn't return... 2615c30ecadSmrg ;; 2625c30ecadSmrgesac 2635c30ecadSmrg 2645c30ecadSmrgofile= 2655c30ecadSmrgcfile= 2665c30ecadSmrg 2675c30ecadSmrgfor arg 2685c30ecadSmrgdo 2695c30ecadSmrg if test -n "$eat"; then 2705c30ecadSmrg eat= 2715c30ecadSmrg else 2725c30ecadSmrg case $1 in 2735c30ecadSmrg -o) 2745c30ecadSmrg # configure might choose to run compile as 'compile cc -o foo foo.c'. 2755c30ecadSmrg # So we strip '-o arg' only if arg is an object. 2765c30ecadSmrg eat=1 2775c30ecadSmrg case $2 in 2785c30ecadSmrg *.o | *.obj) 2795c30ecadSmrg ofile=$2 2805c30ecadSmrg ;; 2815c30ecadSmrg *) 2825c30ecadSmrg set x "$@" -o "$2" 2835c30ecadSmrg shift 2845c30ecadSmrg ;; 2855c30ecadSmrg esac 2865c30ecadSmrg ;; 2875c30ecadSmrg *.c) 2885c30ecadSmrg cfile=$1 2895c30ecadSmrg set x "$@" "$1" 2905c30ecadSmrg shift 2915c30ecadSmrg ;; 2925c30ecadSmrg *) 2935c30ecadSmrg set x "$@" "$1" 2945c30ecadSmrg shift 2955c30ecadSmrg ;; 2965c30ecadSmrg esac 2975c30ecadSmrg fi 2985c30ecadSmrg shift 2995c30ecadSmrgdone 3005c30ecadSmrg 3015c30ecadSmrgif test -z "$ofile" || test -z "$cfile"; then 3025c30ecadSmrg # If no '-o' option was seen then we might have been invoked from a 3035c30ecadSmrg # pattern rule where we don't need one. That is ok -- this is a 3045c30ecadSmrg # normal compilation that the losing compiler can handle. If no 3055c30ecadSmrg # '.c' file was seen then we are probably linking. That is also 3065c30ecadSmrg # ok. 3075c30ecadSmrg exec "$@" 3085c30ecadSmrgfi 3095c30ecadSmrg 3105c30ecadSmrg# Name of file we expect compiler to create. 3115c30ecadSmrgcofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` 3125c30ecadSmrg 3135c30ecadSmrg# Create the lock directory. 3145c30ecadSmrg# Note: use '[/\\:.-]' here to ensure that we don't use the same name 3155c30ecadSmrg# that we are using for the .o file. Also, base the name on the expected 3165c30ecadSmrg# object file name, since that is what matters with a parallel build. 3175c30ecadSmrglockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d 3185c30ecadSmrgwhile true; do 3195c30ecadSmrg if mkdir "$lockdir" >/dev/null 2>&1; then 3205c30ecadSmrg break 3215c30ecadSmrg fi 3225c30ecadSmrg sleep 1 3235c30ecadSmrgdone 3245c30ecadSmrg# FIXME: race condition here if user kills between mkdir and trap. 3255c30ecadSmrgtrap "rmdir '$lockdir'; exit 1" 1 2 15 3265c30ecadSmrg 3275c30ecadSmrg# Run the compile. 3285c30ecadSmrg"$@" 3295c30ecadSmrgret=$? 3305c30ecadSmrg 3315c30ecadSmrgif test -f "$cofile"; then 3325c30ecadSmrg test "$cofile" = "$ofile" || mv "$cofile" "$ofile" 3335c30ecadSmrgelif test -f "${cofile}bj"; then 3345c30ecadSmrg test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" 3355c30ecadSmrgfi 3365c30ecadSmrg 3375c30ecadSmrgrmdir "$lockdir" 3385c30ecadSmrgexit $ret 3395c30ecadSmrg 3405c30ecadSmrg# Local Variables: 3415c30ecadSmrg# mode: shell-script 3425c30ecadSmrg# sh-indentation: 2 3435c30ecadSmrg# eval: (add-hook 'before-save-hook 'time-stamp) 3445c30ecadSmrg# time-stamp-start: "scriptversion=" 3455c30ecadSmrg# time-stamp-format: "%:y-%02m-%02d.%02H" 3465c30ecadSmrg# time-stamp-time-zone: "UTC0" 3475c30ecadSmrg# time-stamp-end: "; # UTC" 3485c30ecadSmrg# End: 349