19586ba5aSmrg#! /bin/sh 29586ba5aSmrg# Wrapper for compilers which do not understand '-c -o'. 39586ba5aSmrg 40814a2baSmrgscriptversion=2018-03-07.03; # UTC 59586ba5aSmrg 60814a2baSmrg# Copyright (C) 1999-2021 Free Software Foundation, Inc. 79586ba5aSmrg# Written by Tom Tromey <tromey@cygnus.com>. 89586ba5aSmrg# 99586ba5aSmrg# This program is free software; you can redistribute it and/or modify 109586ba5aSmrg# it under the terms of the GNU General Public License as published by 119586ba5aSmrg# the Free Software Foundation; either version 2, or (at your option) 129586ba5aSmrg# any later version. 139586ba5aSmrg# 149586ba5aSmrg# This program is distributed in the hope that it will be useful, 159586ba5aSmrg# but WITHOUT ANY WARRANTY; without even the implied warranty of 169586ba5aSmrg# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 179586ba5aSmrg# GNU General Public License for more details. 189586ba5aSmrg# 199586ba5aSmrg# You should have received a copy of the GNU General Public License 200814a2baSmrg# along with this program. If not, see <https://www.gnu.org/licenses/>. 219586ba5aSmrg 229586ba5aSmrg# As a special exception to the GNU General Public License, if you 239586ba5aSmrg# distribute this file as part of a program that contains a 249586ba5aSmrg# configuration script generated by Autoconf, you may include it under 259586ba5aSmrg# the same distribution terms that you use for the rest of that program. 269586ba5aSmrg 279586ba5aSmrg# This file is maintained in Automake, please report 289586ba5aSmrg# bugs to <bug-automake@gnu.org> or send patches to 299586ba5aSmrg# <automake-patches@gnu.org>. 309586ba5aSmrg 319586ba5aSmrgnl=' 329586ba5aSmrg' 339586ba5aSmrg 349586ba5aSmrg# We need space, tab and new line, in precisely that order. Quoting is 359586ba5aSmrg# there to prevent tools from complaining about whitespace usage. 369586ba5aSmrgIFS=" "" $nl" 379586ba5aSmrg 389586ba5aSmrgfile_conv= 399586ba5aSmrg 409586ba5aSmrg# func_file_conv build_file lazy 419586ba5aSmrg# Convert a $build file to $host form and store it in $file 429586ba5aSmrg# Currently only supports Windows hosts. If the determined conversion 439586ba5aSmrg# type is listed in (the comma separated) LAZY, no conversion will 449586ba5aSmrg# take place. 459586ba5aSmrgfunc_file_conv () 469586ba5aSmrg{ 479586ba5aSmrg file=$1 489586ba5aSmrg case $file in 499586ba5aSmrg / | /[!/]*) # absolute file, and not a UNC file 509586ba5aSmrg if test -z "$file_conv"; then 519586ba5aSmrg # lazily determine how to convert abs files 529586ba5aSmrg case `uname -s` in 539586ba5aSmrg MINGW*) 549586ba5aSmrg file_conv=mingw 559586ba5aSmrg ;; 560814a2baSmrg CYGWIN* | MSYS*) 579586ba5aSmrg file_conv=cygwin 589586ba5aSmrg ;; 599586ba5aSmrg *) 609586ba5aSmrg file_conv=wine 619586ba5aSmrg ;; 629586ba5aSmrg esac 639586ba5aSmrg fi 649586ba5aSmrg case $file_conv/,$2, in 659586ba5aSmrg *,$file_conv,*) 669586ba5aSmrg ;; 679586ba5aSmrg mingw/*) 689586ba5aSmrg file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` 699586ba5aSmrg ;; 700814a2baSmrg cygwin/* | msys/*) 719586ba5aSmrg file=`cygpath -m "$file" || echo "$file"` 729586ba5aSmrg ;; 739586ba5aSmrg wine/*) 749586ba5aSmrg file=`winepath -w "$file" || echo "$file"` 759586ba5aSmrg ;; 769586ba5aSmrg esac 779586ba5aSmrg ;; 789586ba5aSmrg esac 799586ba5aSmrg} 809586ba5aSmrg 819586ba5aSmrg# func_cl_dashL linkdir 829586ba5aSmrg# Make cl look for libraries in LINKDIR 839586ba5aSmrgfunc_cl_dashL () 849586ba5aSmrg{ 859586ba5aSmrg func_file_conv "$1" 869586ba5aSmrg if test -z "$lib_path"; then 879586ba5aSmrg lib_path=$file 889586ba5aSmrg else 899586ba5aSmrg lib_path="$lib_path;$file" 909586ba5aSmrg fi 919586ba5aSmrg linker_opts="$linker_opts -LIBPATH:$file" 929586ba5aSmrg} 939586ba5aSmrg 949586ba5aSmrg# func_cl_dashl library 959586ba5aSmrg# Do a library search-path lookup for cl 969586ba5aSmrgfunc_cl_dashl () 979586ba5aSmrg{ 989586ba5aSmrg lib=$1 999586ba5aSmrg found=no 1009586ba5aSmrg save_IFS=$IFS 1019586ba5aSmrg IFS=';' 1029586ba5aSmrg for dir in $lib_path $LIB 1039586ba5aSmrg do 1049586ba5aSmrg IFS=$save_IFS 1059586ba5aSmrg if $shared && test -f "$dir/$lib.dll.lib"; then 1069586ba5aSmrg found=yes 1079586ba5aSmrg lib=$dir/$lib.dll.lib 1089586ba5aSmrg break 1099586ba5aSmrg fi 1109586ba5aSmrg if test -f "$dir/$lib.lib"; then 1119586ba5aSmrg found=yes 1129586ba5aSmrg lib=$dir/$lib.lib 1139586ba5aSmrg break 1149586ba5aSmrg fi 1159586ba5aSmrg if test -f "$dir/lib$lib.a"; then 1169586ba5aSmrg found=yes 1179586ba5aSmrg lib=$dir/lib$lib.a 1189586ba5aSmrg break 1199586ba5aSmrg fi 1209586ba5aSmrg done 1219586ba5aSmrg IFS=$save_IFS 1229586ba5aSmrg 1239586ba5aSmrg if test "$found" != yes; then 1249586ba5aSmrg lib=$lib.lib 1259586ba5aSmrg fi 1269586ba5aSmrg} 1279586ba5aSmrg 1289586ba5aSmrg# func_cl_wrapper cl arg... 1299586ba5aSmrg# Adjust compile command to suit cl 1309586ba5aSmrgfunc_cl_wrapper () 1319586ba5aSmrg{ 1329586ba5aSmrg # Assume a capable shell 1339586ba5aSmrg lib_path= 1349586ba5aSmrg shared=: 1359586ba5aSmrg linker_opts= 1369586ba5aSmrg for arg 1379586ba5aSmrg do 1389586ba5aSmrg if test -n "$eat"; then 1399586ba5aSmrg eat= 1409586ba5aSmrg else 1419586ba5aSmrg case $1 in 1429586ba5aSmrg -o) 1439586ba5aSmrg # configure might choose to run compile as 'compile cc -o foo foo.c'. 1449586ba5aSmrg eat=1 1459586ba5aSmrg case $2 in 1469586ba5aSmrg *.o | *.[oO][bB][jJ]) 1479586ba5aSmrg func_file_conv "$2" 1489586ba5aSmrg set x "$@" -Fo"$file" 1499586ba5aSmrg shift 1509586ba5aSmrg ;; 1519586ba5aSmrg *) 1529586ba5aSmrg func_file_conv "$2" 1539586ba5aSmrg set x "$@" -Fe"$file" 1549586ba5aSmrg shift 1559586ba5aSmrg ;; 1569586ba5aSmrg esac 1579586ba5aSmrg ;; 1589586ba5aSmrg -I) 1599586ba5aSmrg eat=1 1609586ba5aSmrg func_file_conv "$2" mingw 1619586ba5aSmrg set x "$@" -I"$file" 1629586ba5aSmrg shift 1639586ba5aSmrg ;; 1649586ba5aSmrg -I*) 1659586ba5aSmrg func_file_conv "${1#-I}" mingw 1669586ba5aSmrg set x "$@" -I"$file" 1679586ba5aSmrg shift 1689586ba5aSmrg ;; 1699586ba5aSmrg -l) 1709586ba5aSmrg eat=1 1719586ba5aSmrg func_cl_dashl "$2" 1729586ba5aSmrg set x "$@" "$lib" 1739586ba5aSmrg shift 1749586ba5aSmrg ;; 1759586ba5aSmrg -l*) 1769586ba5aSmrg func_cl_dashl "${1#-l}" 1779586ba5aSmrg set x "$@" "$lib" 1789586ba5aSmrg shift 1799586ba5aSmrg ;; 1809586ba5aSmrg -L) 1819586ba5aSmrg eat=1 1829586ba5aSmrg func_cl_dashL "$2" 1839586ba5aSmrg ;; 1849586ba5aSmrg -L*) 1859586ba5aSmrg func_cl_dashL "${1#-L}" 1869586ba5aSmrg ;; 1879586ba5aSmrg -static) 1889586ba5aSmrg shared=false 1899586ba5aSmrg ;; 1909586ba5aSmrg -Wl,*) 1919586ba5aSmrg arg=${1#-Wl,} 1929586ba5aSmrg save_ifs="$IFS"; IFS=',' 1939586ba5aSmrg for flag in $arg; do 1949586ba5aSmrg IFS="$save_ifs" 1959586ba5aSmrg linker_opts="$linker_opts $flag" 1969586ba5aSmrg done 1979586ba5aSmrg IFS="$save_ifs" 1989586ba5aSmrg ;; 1999586ba5aSmrg -Xlinker) 2009586ba5aSmrg eat=1 2019586ba5aSmrg linker_opts="$linker_opts $2" 2029586ba5aSmrg ;; 2039586ba5aSmrg -*) 2049586ba5aSmrg set x "$@" "$1" 2059586ba5aSmrg shift 2069586ba5aSmrg ;; 2079586ba5aSmrg *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) 2089586ba5aSmrg func_file_conv "$1" 2099586ba5aSmrg set x "$@" -Tp"$file" 2109586ba5aSmrg shift 2119586ba5aSmrg ;; 2129586ba5aSmrg *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) 2139586ba5aSmrg func_file_conv "$1" mingw 2149586ba5aSmrg set x "$@" "$file" 2159586ba5aSmrg shift 2169586ba5aSmrg ;; 2179586ba5aSmrg *) 2189586ba5aSmrg set x "$@" "$1" 2199586ba5aSmrg shift 2209586ba5aSmrg ;; 2219586ba5aSmrg esac 2229586ba5aSmrg fi 2239586ba5aSmrg shift 2249586ba5aSmrg done 2259586ba5aSmrg if test -n "$linker_opts"; then 2269586ba5aSmrg linker_opts="-link$linker_opts" 2279586ba5aSmrg fi 2289586ba5aSmrg exec "$@" $linker_opts 2299586ba5aSmrg exit 1 2309586ba5aSmrg} 2319586ba5aSmrg 2329586ba5aSmrgeat= 2339586ba5aSmrg 2349586ba5aSmrgcase $1 in 2359586ba5aSmrg '') 2369586ba5aSmrg echo "$0: No command. Try '$0 --help' for more information." 1>&2 2379586ba5aSmrg exit 1; 2389586ba5aSmrg ;; 2399586ba5aSmrg -h | --h*) 2409586ba5aSmrg cat <<\EOF 2419586ba5aSmrgUsage: compile [--help] [--version] PROGRAM [ARGS] 2429586ba5aSmrg 2439586ba5aSmrgWrapper for compilers which do not understand '-c -o'. 2449586ba5aSmrgRemove '-o dest.o' from ARGS, run PROGRAM with the remaining 2459586ba5aSmrgarguments, and rename the output as expected. 2469586ba5aSmrg 2479586ba5aSmrgIf you are trying to build a whole package this is not the 2489586ba5aSmrgright script to run: please start by reading the file 'INSTALL'. 2499586ba5aSmrg 2509586ba5aSmrgReport bugs to <bug-automake@gnu.org>. 2519586ba5aSmrgEOF 2529586ba5aSmrg exit $? 2539586ba5aSmrg ;; 2549586ba5aSmrg -v | --v*) 2559586ba5aSmrg echo "compile $scriptversion" 2569586ba5aSmrg exit $? 2579586ba5aSmrg ;; 2580814a2baSmrg cl | *[/\\]cl | cl.exe | *[/\\]cl.exe | \ 2590814a2baSmrg icl | *[/\\]icl | icl.exe | *[/\\]icl.exe ) 2609586ba5aSmrg func_cl_wrapper "$@" # Doesn't return... 2619586ba5aSmrg ;; 2629586ba5aSmrgesac 2639586ba5aSmrg 2649586ba5aSmrgofile= 2659586ba5aSmrgcfile= 2669586ba5aSmrg 2679586ba5aSmrgfor arg 2689586ba5aSmrgdo 2699586ba5aSmrg if test -n "$eat"; then 2709586ba5aSmrg eat= 2719586ba5aSmrg else 2729586ba5aSmrg case $1 in 2739586ba5aSmrg -o) 2749586ba5aSmrg # configure might choose to run compile as 'compile cc -o foo foo.c'. 2759586ba5aSmrg # So we strip '-o arg' only if arg is an object. 2769586ba5aSmrg eat=1 2779586ba5aSmrg case $2 in 2789586ba5aSmrg *.o | *.obj) 2799586ba5aSmrg ofile=$2 2809586ba5aSmrg ;; 2819586ba5aSmrg *) 2829586ba5aSmrg set x "$@" -o "$2" 2839586ba5aSmrg shift 2849586ba5aSmrg ;; 2859586ba5aSmrg esac 2869586ba5aSmrg ;; 2879586ba5aSmrg *.c) 2889586ba5aSmrg cfile=$1 2899586ba5aSmrg set x "$@" "$1" 2909586ba5aSmrg shift 2919586ba5aSmrg ;; 2929586ba5aSmrg *) 2939586ba5aSmrg set x "$@" "$1" 2949586ba5aSmrg shift 2959586ba5aSmrg ;; 2969586ba5aSmrg esac 2979586ba5aSmrg fi 2989586ba5aSmrg shift 2999586ba5aSmrgdone 3009586ba5aSmrg 3019586ba5aSmrgif test -z "$ofile" || test -z "$cfile"; then 3029586ba5aSmrg # If no '-o' option was seen then we might have been invoked from a 3039586ba5aSmrg # pattern rule where we don't need one. That is ok -- this is a 3049586ba5aSmrg # normal compilation that the losing compiler can handle. If no 3059586ba5aSmrg # '.c' file was seen then we are probably linking. That is also 3069586ba5aSmrg # ok. 3079586ba5aSmrg exec "$@" 3089586ba5aSmrgfi 3099586ba5aSmrg 3109586ba5aSmrg# Name of file we expect compiler to create. 3119586ba5aSmrgcofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` 3129586ba5aSmrg 3139586ba5aSmrg# Create the lock directory. 3149586ba5aSmrg# Note: use '[/\\:.-]' here to ensure that we don't use the same name 3159586ba5aSmrg# that we are using for the .o file. Also, base the name on the expected 3169586ba5aSmrg# object file name, since that is what matters with a parallel build. 3179586ba5aSmrglockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d 3189586ba5aSmrgwhile true; do 3199586ba5aSmrg if mkdir "$lockdir" >/dev/null 2>&1; then 3209586ba5aSmrg break 3219586ba5aSmrg fi 3229586ba5aSmrg sleep 1 3239586ba5aSmrgdone 3249586ba5aSmrg# FIXME: race condition here if user kills between mkdir and trap. 3259586ba5aSmrgtrap "rmdir '$lockdir'; exit 1" 1 2 15 3269586ba5aSmrg 3279586ba5aSmrg# Run the compile. 3289586ba5aSmrg"$@" 3299586ba5aSmrgret=$? 3309586ba5aSmrg 3319586ba5aSmrgif test -f "$cofile"; then 3329586ba5aSmrg test "$cofile" = "$ofile" || mv "$cofile" "$ofile" 3339586ba5aSmrgelif test -f "${cofile}bj"; then 3349586ba5aSmrg test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" 3359586ba5aSmrgfi 3369586ba5aSmrg 3379586ba5aSmrgrmdir "$lockdir" 3389586ba5aSmrgexit $ret 3399586ba5aSmrg 3409586ba5aSmrg# Local Variables: 3419586ba5aSmrg# mode: shell-script 3429586ba5aSmrg# sh-indentation: 2 3430814a2baSmrg# eval: (add-hook 'before-save-hook 'time-stamp) 3449586ba5aSmrg# time-stamp-start: "scriptversion=" 3459586ba5aSmrg# time-stamp-format: "%:y-%02m-%02d.%02H" 3460814a2baSmrg# time-stamp-time-zone: "UTC0" 3479586ba5aSmrg# time-stamp-end: "; # UTC" 3489586ba5aSmrg# End: 349