119d64aeeSmrg#! /bin/sh 219d64aeeSmrg# Wrapper for compilers which do not understand '-c -o'. 319d64aeeSmrg 4ddb28773Smrgscriptversion=2018-03-07.03; # UTC 519d64aeeSmrg 6ddb28773Smrg# Copyright (C) 1999-2021 Free Software Foundation, Inc. 719d64aeeSmrg# Written by Tom Tromey <tromey@cygnus.com>. 819d64aeeSmrg# 919d64aeeSmrg# This program is free software; you can redistribute it and/or modify 1019d64aeeSmrg# it under the terms of the GNU General Public License as published by 1119d64aeeSmrg# the Free Software Foundation; either version 2, or (at your option) 1219d64aeeSmrg# any later version. 1319d64aeeSmrg# 1419d64aeeSmrg# This program is distributed in the hope that it will be useful, 1519d64aeeSmrg# but WITHOUT ANY WARRANTY; without even the implied warranty of 1619d64aeeSmrg# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1719d64aeeSmrg# GNU General Public License for more details. 1819d64aeeSmrg# 1919d64aeeSmrg# You should have received a copy of the GNU General Public License 20ddb28773Smrg# along with this program. If not, see <https://www.gnu.org/licenses/>. 2119d64aeeSmrg 2219d64aeeSmrg# As a special exception to the GNU General Public License, if you 2319d64aeeSmrg# distribute this file as part of a program that contains a 2419d64aeeSmrg# configuration script generated by Autoconf, you may include it under 2519d64aeeSmrg# the same distribution terms that you use for the rest of that program. 2619d64aeeSmrg 2719d64aeeSmrg# This file is maintained in Automake, please report 2819d64aeeSmrg# bugs to <bug-automake@gnu.org> or send patches to 2919d64aeeSmrg# <automake-patches@gnu.org>. 3019d64aeeSmrg 3119d64aeeSmrgnl=' 3219d64aeeSmrg' 3319d64aeeSmrg 3419d64aeeSmrg# We need space, tab and new line, in precisely that order. Quoting is 3519d64aeeSmrg# there to prevent tools from complaining about whitespace usage. 3619d64aeeSmrgIFS=" "" $nl" 3719d64aeeSmrg 3819d64aeeSmrgfile_conv= 3919d64aeeSmrg 4019d64aeeSmrg# func_file_conv build_file lazy 4119d64aeeSmrg# Convert a $build file to $host form and store it in $file 4219d64aeeSmrg# Currently only supports Windows hosts. If the determined conversion 4319d64aeeSmrg# type is listed in (the comma separated) LAZY, no conversion will 4419d64aeeSmrg# take place. 4519d64aeeSmrgfunc_file_conv () 4619d64aeeSmrg{ 4719d64aeeSmrg file=$1 4819d64aeeSmrg case $file in 4919d64aeeSmrg / | /[!/]*) # absolute file, and not a UNC file 5019d64aeeSmrg if test -z "$file_conv"; then 5119d64aeeSmrg # lazily determine how to convert abs files 5219d64aeeSmrg case `uname -s` in 5319d64aeeSmrg MINGW*) 5419d64aeeSmrg file_conv=mingw 5519d64aeeSmrg ;; 56ddb28773Smrg CYGWIN* | MSYS*) 5719d64aeeSmrg file_conv=cygwin 5819d64aeeSmrg ;; 5919d64aeeSmrg *) 6019d64aeeSmrg file_conv=wine 6119d64aeeSmrg ;; 6219d64aeeSmrg esac 6319d64aeeSmrg fi 6419d64aeeSmrg case $file_conv/,$2, in 6519d64aeeSmrg *,$file_conv,*) 6619d64aeeSmrg ;; 6719d64aeeSmrg mingw/*) 6819d64aeeSmrg file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` 6919d64aeeSmrg ;; 70ddb28773Smrg cygwin/* | msys/*) 7119d64aeeSmrg file=`cygpath -m "$file" || echo "$file"` 7219d64aeeSmrg ;; 7319d64aeeSmrg wine/*) 7419d64aeeSmrg file=`winepath -w "$file" || echo "$file"` 7519d64aeeSmrg ;; 7619d64aeeSmrg esac 7719d64aeeSmrg ;; 7819d64aeeSmrg esac 7919d64aeeSmrg} 8019d64aeeSmrg 8119d64aeeSmrg# func_cl_dashL linkdir 8219d64aeeSmrg# Make cl look for libraries in LINKDIR 8319d64aeeSmrgfunc_cl_dashL () 8419d64aeeSmrg{ 8519d64aeeSmrg func_file_conv "$1" 8619d64aeeSmrg if test -z "$lib_path"; then 8719d64aeeSmrg lib_path=$file 8819d64aeeSmrg else 8919d64aeeSmrg lib_path="$lib_path;$file" 9019d64aeeSmrg fi 9119d64aeeSmrg linker_opts="$linker_opts -LIBPATH:$file" 9219d64aeeSmrg} 9319d64aeeSmrg 9419d64aeeSmrg# func_cl_dashl library 9519d64aeeSmrg# Do a library search-path lookup for cl 9619d64aeeSmrgfunc_cl_dashl () 9719d64aeeSmrg{ 9819d64aeeSmrg lib=$1 9919d64aeeSmrg found=no 10019d64aeeSmrg save_IFS=$IFS 10119d64aeeSmrg IFS=';' 10219d64aeeSmrg for dir in $lib_path $LIB 10319d64aeeSmrg do 10419d64aeeSmrg IFS=$save_IFS 10519d64aeeSmrg if $shared && test -f "$dir/$lib.dll.lib"; then 10619d64aeeSmrg found=yes 10719d64aeeSmrg lib=$dir/$lib.dll.lib 10819d64aeeSmrg break 10919d64aeeSmrg fi 11019d64aeeSmrg if test -f "$dir/$lib.lib"; then 11119d64aeeSmrg found=yes 11219d64aeeSmrg lib=$dir/$lib.lib 11319d64aeeSmrg break 11419d64aeeSmrg fi 11519d64aeeSmrg if test -f "$dir/lib$lib.a"; then 11619d64aeeSmrg found=yes 11719d64aeeSmrg lib=$dir/lib$lib.a 11819d64aeeSmrg break 11919d64aeeSmrg fi 12019d64aeeSmrg done 12119d64aeeSmrg IFS=$save_IFS 12219d64aeeSmrg 12319d64aeeSmrg if test "$found" != yes; then 12419d64aeeSmrg lib=$lib.lib 12519d64aeeSmrg fi 12619d64aeeSmrg} 12719d64aeeSmrg 12819d64aeeSmrg# func_cl_wrapper cl arg... 12919d64aeeSmrg# Adjust compile command to suit cl 13019d64aeeSmrgfunc_cl_wrapper () 13119d64aeeSmrg{ 13219d64aeeSmrg # Assume a capable shell 13319d64aeeSmrg lib_path= 13419d64aeeSmrg shared=: 13519d64aeeSmrg linker_opts= 13619d64aeeSmrg for arg 13719d64aeeSmrg do 13819d64aeeSmrg if test -n "$eat"; then 13919d64aeeSmrg eat= 14019d64aeeSmrg else 14119d64aeeSmrg case $1 in 14219d64aeeSmrg -o) 14319d64aeeSmrg # configure might choose to run compile as 'compile cc -o foo foo.c'. 14419d64aeeSmrg eat=1 14519d64aeeSmrg case $2 in 14619d64aeeSmrg *.o | *.[oO][bB][jJ]) 14719d64aeeSmrg func_file_conv "$2" 14819d64aeeSmrg set x "$@" -Fo"$file" 14919d64aeeSmrg shift 15019d64aeeSmrg ;; 15119d64aeeSmrg *) 15219d64aeeSmrg func_file_conv "$2" 15319d64aeeSmrg set x "$@" -Fe"$file" 15419d64aeeSmrg shift 15519d64aeeSmrg ;; 15619d64aeeSmrg esac 15719d64aeeSmrg ;; 15819d64aeeSmrg -I) 15919d64aeeSmrg eat=1 16019d64aeeSmrg func_file_conv "$2" mingw 16119d64aeeSmrg set x "$@" -I"$file" 16219d64aeeSmrg shift 16319d64aeeSmrg ;; 16419d64aeeSmrg -I*) 16519d64aeeSmrg func_file_conv "${1#-I}" mingw 16619d64aeeSmrg set x "$@" -I"$file" 16719d64aeeSmrg shift 16819d64aeeSmrg ;; 16919d64aeeSmrg -l) 17019d64aeeSmrg eat=1 17119d64aeeSmrg func_cl_dashl "$2" 17219d64aeeSmrg set x "$@" "$lib" 17319d64aeeSmrg shift 17419d64aeeSmrg ;; 17519d64aeeSmrg -l*) 17619d64aeeSmrg func_cl_dashl "${1#-l}" 17719d64aeeSmrg set x "$@" "$lib" 17819d64aeeSmrg shift 17919d64aeeSmrg ;; 18019d64aeeSmrg -L) 18119d64aeeSmrg eat=1 18219d64aeeSmrg func_cl_dashL "$2" 18319d64aeeSmrg ;; 18419d64aeeSmrg -L*) 18519d64aeeSmrg func_cl_dashL "${1#-L}" 18619d64aeeSmrg ;; 18719d64aeeSmrg -static) 18819d64aeeSmrg shared=false 18919d64aeeSmrg ;; 19019d64aeeSmrg -Wl,*) 19119d64aeeSmrg arg=${1#-Wl,} 19219d64aeeSmrg save_ifs="$IFS"; IFS=',' 19319d64aeeSmrg for flag in $arg; do 19419d64aeeSmrg IFS="$save_ifs" 19519d64aeeSmrg linker_opts="$linker_opts $flag" 19619d64aeeSmrg done 19719d64aeeSmrg IFS="$save_ifs" 19819d64aeeSmrg ;; 19919d64aeeSmrg -Xlinker) 20019d64aeeSmrg eat=1 20119d64aeeSmrg linker_opts="$linker_opts $2" 20219d64aeeSmrg ;; 20319d64aeeSmrg -*) 20419d64aeeSmrg set x "$@" "$1" 20519d64aeeSmrg shift 20619d64aeeSmrg ;; 20719d64aeeSmrg *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) 20819d64aeeSmrg func_file_conv "$1" 20919d64aeeSmrg set x "$@" -Tp"$file" 21019d64aeeSmrg shift 21119d64aeeSmrg ;; 21219d64aeeSmrg *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) 21319d64aeeSmrg func_file_conv "$1" mingw 21419d64aeeSmrg set x "$@" "$file" 21519d64aeeSmrg shift 21619d64aeeSmrg ;; 21719d64aeeSmrg *) 21819d64aeeSmrg set x "$@" "$1" 21919d64aeeSmrg shift 22019d64aeeSmrg ;; 22119d64aeeSmrg esac 22219d64aeeSmrg fi 22319d64aeeSmrg shift 22419d64aeeSmrg done 22519d64aeeSmrg if test -n "$linker_opts"; then 22619d64aeeSmrg linker_opts="-link$linker_opts" 22719d64aeeSmrg fi 22819d64aeeSmrg exec "$@" $linker_opts 22919d64aeeSmrg exit 1 23019d64aeeSmrg} 23119d64aeeSmrg 23219d64aeeSmrgeat= 23319d64aeeSmrg 23419d64aeeSmrgcase $1 in 23519d64aeeSmrg '') 23619d64aeeSmrg echo "$0: No command. Try '$0 --help' for more information." 1>&2 23719d64aeeSmrg exit 1; 23819d64aeeSmrg ;; 23919d64aeeSmrg -h | --h*) 24019d64aeeSmrg cat <<\EOF 24119d64aeeSmrgUsage: compile [--help] [--version] PROGRAM [ARGS] 24219d64aeeSmrg 24319d64aeeSmrgWrapper for compilers which do not understand '-c -o'. 24419d64aeeSmrgRemove '-o dest.o' from ARGS, run PROGRAM with the remaining 24519d64aeeSmrgarguments, and rename the output as expected. 24619d64aeeSmrg 24719d64aeeSmrgIf you are trying to build a whole package this is not the 24819d64aeeSmrgright script to run: please start by reading the file 'INSTALL'. 24919d64aeeSmrg 25019d64aeeSmrgReport bugs to <bug-automake@gnu.org>. 25119d64aeeSmrgEOF 25219d64aeeSmrg exit $? 25319d64aeeSmrg ;; 25419d64aeeSmrg -v | --v*) 25519d64aeeSmrg echo "compile $scriptversion" 25619d64aeeSmrg exit $? 25719d64aeeSmrg ;; 258ddb28773Smrg cl | *[/\\]cl | cl.exe | *[/\\]cl.exe | \ 259ddb28773Smrg icl | *[/\\]icl | icl.exe | *[/\\]icl.exe ) 26019d64aeeSmrg func_cl_wrapper "$@" # Doesn't return... 26119d64aeeSmrg ;; 26219d64aeeSmrgesac 26319d64aeeSmrg 26419d64aeeSmrgofile= 26519d64aeeSmrgcfile= 26619d64aeeSmrg 26719d64aeeSmrgfor arg 26819d64aeeSmrgdo 26919d64aeeSmrg if test -n "$eat"; then 27019d64aeeSmrg eat= 27119d64aeeSmrg else 27219d64aeeSmrg case $1 in 27319d64aeeSmrg -o) 27419d64aeeSmrg # configure might choose to run compile as 'compile cc -o foo foo.c'. 27519d64aeeSmrg # So we strip '-o arg' only if arg is an object. 27619d64aeeSmrg eat=1 27719d64aeeSmrg case $2 in 27819d64aeeSmrg *.o | *.obj) 27919d64aeeSmrg ofile=$2 28019d64aeeSmrg ;; 28119d64aeeSmrg *) 28219d64aeeSmrg set x "$@" -o "$2" 28319d64aeeSmrg shift 28419d64aeeSmrg ;; 28519d64aeeSmrg esac 28619d64aeeSmrg ;; 28719d64aeeSmrg *.c) 28819d64aeeSmrg cfile=$1 28919d64aeeSmrg set x "$@" "$1" 29019d64aeeSmrg shift 29119d64aeeSmrg ;; 29219d64aeeSmrg *) 29319d64aeeSmrg set x "$@" "$1" 29419d64aeeSmrg shift 29519d64aeeSmrg ;; 29619d64aeeSmrg esac 29719d64aeeSmrg fi 29819d64aeeSmrg shift 29919d64aeeSmrgdone 30019d64aeeSmrg 30119d64aeeSmrgif test -z "$ofile" || test -z "$cfile"; then 30219d64aeeSmrg # If no '-o' option was seen then we might have been invoked from a 30319d64aeeSmrg # pattern rule where we don't need one. That is ok -- this is a 30419d64aeeSmrg # normal compilation that the losing compiler can handle. If no 30519d64aeeSmrg # '.c' file was seen then we are probably linking. That is also 30619d64aeeSmrg # ok. 30719d64aeeSmrg exec "$@" 30819d64aeeSmrgfi 30919d64aeeSmrg 31019d64aeeSmrg# Name of file we expect compiler to create. 31119d64aeeSmrgcofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` 31219d64aeeSmrg 31319d64aeeSmrg# Create the lock directory. 31419d64aeeSmrg# Note: use '[/\\:.-]' here to ensure that we don't use the same name 31519d64aeeSmrg# that we are using for the .o file. Also, base the name on the expected 31619d64aeeSmrg# object file name, since that is what matters with a parallel build. 31719d64aeeSmrglockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d 31819d64aeeSmrgwhile true; do 31919d64aeeSmrg if mkdir "$lockdir" >/dev/null 2>&1; then 32019d64aeeSmrg break 32119d64aeeSmrg fi 32219d64aeeSmrg sleep 1 32319d64aeeSmrgdone 32419d64aeeSmrg# FIXME: race condition here if user kills between mkdir and trap. 32519d64aeeSmrgtrap "rmdir '$lockdir'; exit 1" 1 2 15 32619d64aeeSmrg 32719d64aeeSmrg# Run the compile. 32819d64aeeSmrg"$@" 32919d64aeeSmrgret=$? 33019d64aeeSmrg 33119d64aeeSmrgif test -f "$cofile"; then 33219d64aeeSmrg test "$cofile" = "$ofile" || mv "$cofile" "$ofile" 33319d64aeeSmrgelif test -f "${cofile}bj"; then 33419d64aeeSmrg test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" 33519d64aeeSmrgfi 33619d64aeeSmrg 33719d64aeeSmrgrmdir "$lockdir" 33819d64aeeSmrgexit $ret 33919d64aeeSmrg 34019d64aeeSmrg# Local Variables: 34119d64aeeSmrg# mode: shell-script 34219d64aeeSmrg# sh-indentation: 2 343ddb28773Smrg# eval: (add-hook 'before-save-hook 'time-stamp) 34419d64aeeSmrg# time-stamp-start: "scriptversion=" 34519d64aeeSmrg# time-stamp-format: "%:y-%02m-%02d.%02H" 346ddb28773Smrg# time-stamp-time-zone: "UTC0" 34719d64aeeSmrg# time-stamp-end: "; # UTC" 34819d64aeeSmrg# End: 349