104007ebaSmrg#! /bin/sh 204007ebaSmrg# Wrapper for compilers which do not understand '-c -o'. 304007ebaSmrg 405cf1079Smrgscriptversion=2018-03-07.03; # UTC 504007ebaSmrg 679d5fcd7Smrg# Copyright (C) 1999-2021 Free Software Foundation, Inc. 704007ebaSmrg# Written by Tom Tromey <tromey@cygnus.com>. 804007ebaSmrg# 904007ebaSmrg# This program is free software; you can redistribute it and/or modify 1004007ebaSmrg# it under the terms of the GNU General Public License as published by 1104007ebaSmrg# the Free Software Foundation; either version 2, or (at your option) 1204007ebaSmrg# any later version. 1304007ebaSmrg# 1404007ebaSmrg# This program is distributed in the hope that it will be useful, 1504007ebaSmrg# but WITHOUT ANY WARRANTY; without even the implied warranty of 1604007ebaSmrg# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1704007ebaSmrg# GNU General Public License for more details. 1804007ebaSmrg# 1904007ebaSmrg# You should have received a copy of the GNU General Public License 2005cf1079Smrg# along with this program. If not, see <https://www.gnu.org/licenses/>. 2104007ebaSmrg 2204007ebaSmrg# As a special exception to the GNU General Public License, if you 2304007ebaSmrg# distribute this file as part of a program that contains a 2404007ebaSmrg# configuration script generated by Autoconf, you may include it under 2504007ebaSmrg# the same distribution terms that you use for the rest of that program. 2604007ebaSmrg 2704007ebaSmrg# This file is maintained in Automake, please report 2804007ebaSmrg# bugs to <bug-automake@gnu.org> or send patches to 2904007ebaSmrg# <automake-patches@gnu.org>. 3004007ebaSmrg 3104007ebaSmrgnl=' 3204007ebaSmrg' 3304007ebaSmrg 3404007ebaSmrg# We need space, tab and new line, in precisely that order. Quoting is 3504007ebaSmrg# there to prevent tools from complaining about whitespace usage. 3604007ebaSmrgIFS=" "" $nl" 3704007ebaSmrg 3804007ebaSmrgfile_conv= 3904007ebaSmrg 4004007ebaSmrg# func_file_conv build_file lazy 4104007ebaSmrg# Convert a $build file to $host form and store it in $file 4204007ebaSmrg# Currently only supports Windows hosts. If the determined conversion 4304007ebaSmrg# type is listed in (the comma separated) LAZY, no conversion will 4404007ebaSmrg# take place. 4504007ebaSmrgfunc_file_conv () 4604007ebaSmrg{ 4704007ebaSmrg file=$1 4804007ebaSmrg case $file in 4904007ebaSmrg / | /[!/]*) # absolute file, and not a UNC file 5004007ebaSmrg if test -z "$file_conv"; then 5104007ebaSmrg # lazily determine how to convert abs files 5204007ebaSmrg case `uname -s` in 5304007ebaSmrg MINGW*) 5404007ebaSmrg file_conv=mingw 5504007ebaSmrg ;; 5679d5fcd7Smrg CYGWIN* | MSYS*) 5704007ebaSmrg file_conv=cygwin 5804007ebaSmrg ;; 5904007ebaSmrg *) 6004007ebaSmrg file_conv=wine 6104007ebaSmrg ;; 6204007ebaSmrg esac 6304007ebaSmrg fi 6404007ebaSmrg case $file_conv/,$2, in 6504007ebaSmrg *,$file_conv,*) 6604007ebaSmrg ;; 6704007ebaSmrg mingw/*) 6804007ebaSmrg file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` 6904007ebaSmrg ;; 7079d5fcd7Smrg cygwin/* | msys/*) 7104007ebaSmrg file=`cygpath -m "$file" || echo "$file"` 7204007ebaSmrg ;; 7304007ebaSmrg wine/*) 7404007ebaSmrg file=`winepath -w "$file" || echo "$file"` 7504007ebaSmrg ;; 7604007ebaSmrg esac 7704007ebaSmrg ;; 7804007ebaSmrg esac 7904007ebaSmrg} 8004007ebaSmrg 8104007ebaSmrg# func_cl_dashL linkdir 8204007ebaSmrg# Make cl look for libraries in LINKDIR 8304007ebaSmrgfunc_cl_dashL () 8404007ebaSmrg{ 8504007ebaSmrg func_file_conv "$1" 8604007ebaSmrg if test -z "$lib_path"; then 8704007ebaSmrg lib_path=$file 8804007ebaSmrg else 8904007ebaSmrg lib_path="$lib_path;$file" 9004007ebaSmrg fi 9104007ebaSmrg linker_opts="$linker_opts -LIBPATH:$file" 9204007ebaSmrg} 9304007ebaSmrg 9404007ebaSmrg# func_cl_dashl library 9504007ebaSmrg# Do a library search-path lookup for cl 9604007ebaSmrgfunc_cl_dashl () 9704007ebaSmrg{ 9804007ebaSmrg lib=$1 9904007ebaSmrg found=no 10004007ebaSmrg save_IFS=$IFS 10104007ebaSmrg IFS=';' 10204007ebaSmrg for dir in $lib_path $LIB 10304007ebaSmrg do 10404007ebaSmrg IFS=$save_IFS 10504007ebaSmrg if $shared && test -f "$dir/$lib.dll.lib"; then 10604007ebaSmrg found=yes 10704007ebaSmrg lib=$dir/$lib.dll.lib 10804007ebaSmrg break 10904007ebaSmrg fi 11004007ebaSmrg if test -f "$dir/$lib.lib"; then 11104007ebaSmrg found=yes 11204007ebaSmrg lib=$dir/$lib.lib 11304007ebaSmrg break 11404007ebaSmrg fi 11504007ebaSmrg if test -f "$dir/lib$lib.a"; then 11604007ebaSmrg found=yes 11704007ebaSmrg lib=$dir/lib$lib.a 11804007ebaSmrg break 11904007ebaSmrg fi 12004007ebaSmrg done 12104007ebaSmrg IFS=$save_IFS 12204007ebaSmrg 12304007ebaSmrg if test "$found" != yes; then 12404007ebaSmrg lib=$lib.lib 12504007ebaSmrg fi 12604007ebaSmrg} 12704007ebaSmrg 12804007ebaSmrg# func_cl_wrapper cl arg... 12904007ebaSmrg# Adjust compile command to suit cl 13004007ebaSmrgfunc_cl_wrapper () 13104007ebaSmrg{ 13204007ebaSmrg # Assume a capable shell 13304007ebaSmrg lib_path= 13404007ebaSmrg shared=: 13504007ebaSmrg linker_opts= 13604007ebaSmrg for arg 13704007ebaSmrg do 13804007ebaSmrg if test -n "$eat"; then 13904007ebaSmrg eat= 14004007ebaSmrg else 14104007ebaSmrg case $1 in 14204007ebaSmrg -o) 14304007ebaSmrg # configure might choose to run compile as 'compile cc -o foo foo.c'. 14404007ebaSmrg eat=1 14504007ebaSmrg case $2 in 14604007ebaSmrg *.o | *.[oO][bB][jJ]) 14704007ebaSmrg func_file_conv "$2" 14804007ebaSmrg set x "$@" -Fo"$file" 14904007ebaSmrg shift 15004007ebaSmrg ;; 15104007ebaSmrg *) 15204007ebaSmrg func_file_conv "$2" 15304007ebaSmrg set x "$@" -Fe"$file" 15404007ebaSmrg shift 15504007ebaSmrg ;; 15604007ebaSmrg esac 15704007ebaSmrg ;; 15804007ebaSmrg -I) 15904007ebaSmrg eat=1 16004007ebaSmrg func_file_conv "$2" mingw 16104007ebaSmrg set x "$@" -I"$file" 16204007ebaSmrg shift 16304007ebaSmrg ;; 16404007ebaSmrg -I*) 16504007ebaSmrg func_file_conv "${1#-I}" mingw 16604007ebaSmrg set x "$@" -I"$file" 16704007ebaSmrg shift 16804007ebaSmrg ;; 16904007ebaSmrg -l) 17004007ebaSmrg eat=1 17104007ebaSmrg func_cl_dashl "$2" 17204007ebaSmrg set x "$@" "$lib" 17304007ebaSmrg shift 17404007ebaSmrg ;; 17504007ebaSmrg -l*) 17604007ebaSmrg func_cl_dashl "${1#-l}" 17704007ebaSmrg set x "$@" "$lib" 17804007ebaSmrg shift 17904007ebaSmrg ;; 18004007ebaSmrg -L) 18104007ebaSmrg eat=1 18204007ebaSmrg func_cl_dashL "$2" 18304007ebaSmrg ;; 18404007ebaSmrg -L*) 18504007ebaSmrg func_cl_dashL "${1#-L}" 18604007ebaSmrg ;; 18704007ebaSmrg -static) 18804007ebaSmrg shared=false 18904007ebaSmrg ;; 19004007ebaSmrg -Wl,*) 19104007ebaSmrg arg=${1#-Wl,} 19204007ebaSmrg save_ifs="$IFS"; IFS=',' 19304007ebaSmrg for flag in $arg; do 19404007ebaSmrg IFS="$save_ifs" 19504007ebaSmrg linker_opts="$linker_opts $flag" 19604007ebaSmrg done 19704007ebaSmrg IFS="$save_ifs" 19804007ebaSmrg ;; 19904007ebaSmrg -Xlinker) 20004007ebaSmrg eat=1 20104007ebaSmrg linker_opts="$linker_opts $2" 20204007ebaSmrg ;; 20304007ebaSmrg -*) 20404007ebaSmrg set x "$@" "$1" 20504007ebaSmrg shift 20604007ebaSmrg ;; 20704007ebaSmrg *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) 20804007ebaSmrg func_file_conv "$1" 20904007ebaSmrg set x "$@" -Tp"$file" 21004007ebaSmrg shift 21104007ebaSmrg ;; 21204007ebaSmrg *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) 21304007ebaSmrg func_file_conv "$1" mingw 21404007ebaSmrg set x "$@" "$file" 21504007ebaSmrg shift 21604007ebaSmrg ;; 21704007ebaSmrg *) 21804007ebaSmrg set x "$@" "$1" 21904007ebaSmrg shift 22004007ebaSmrg ;; 22104007ebaSmrg esac 22204007ebaSmrg fi 22304007ebaSmrg shift 22404007ebaSmrg done 22504007ebaSmrg if test -n "$linker_opts"; then 22604007ebaSmrg linker_opts="-link$linker_opts" 22704007ebaSmrg fi 22804007ebaSmrg exec "$@" $linker_opts 22904007ebaSmrg exit 1 23004007ebaSmrg} 23104007ebaSmrg 23204007ebaSmrgeat= 23304007ebaSmrg 23404007ebaSmrgcase $1 in 23504007ebaSmrg '') 23604007ebaSmrg echo "$0: No command. Try '$0 --help' for more information." 1>&2 23704007ebaSmrg exit 1; 23804007ebaSmrg ;; 23904007ebaSmrg -h | --h*) 24004007ebaSmrg cat <<\EOF 24104007ebaSmrgUsage: compile [--help] [--version] PROGRAM [ARGS] 24204007ebaSmrg 24304007ebaSmrgWrapper for compilers which do not understand '-c -o'. 24404007ebaSmrgRemove '-o dest.o' from ARGS, run PROGRAM with the remaining 24504007ebaSmrgarguments, and rename the output as expected. 24604007ebaSmrg 24704007ebaSmrgIf you are trying to build a whole package this is not the 24804007ebaSmrgright script to run: please start by reading the file 'INSTALL'. 24904007ebaSmrg 25004007ebaSmrgReport bugs to <bug-automake@gnu.org>. 25104007ebaSmrgEOF 25204007ebaSmrg exit $? 25304007ebaSmrg ;; 25404007ebaSmrg -v | --v*) 25504007ebaSmrg echo "compile $scriptversion" 25604007ebaSmrg exit $? 25704007ebaSmrg ;; 25805cf1079Smrg cl | *[/\\]cl | cl.exe | *[/\\]cl.exe | \ 25905cf1079Smrg icl | *[/\\]icl | icl.exe | *[/\\]icl.exe ) 26004007ebaSmrg func_cl_wrapper "$@" # Doesn't return... 26104007ebaSmrg ;; 26204007ebaSmrgesac 26304007ebaSmrg 26404007ebaSmrgofile= 26504007ebaSmrgcfile= 26604007ebaSmrg 26704007ebaSmrgfor arg 26804007ebaSmrgdo 26904007ebaSmrg if test -n "$eat"; then 27004007ebaSmrg eat= 27104007ebaSmrg else 27204007ebaSmrg case $1 in 27304007ebaSmrg -o) 27404007ebaSmrg # configure might choose to run compile as 'compile cc -o foo foo.c'. 27504007ebaSmrg # So we strip '-o arg' only if arg is an object. 27604007ebaSmrg eat=1 27704007ebaSmrg case $2 in 27804007ebaSmrg *.o | *.obj) 27904007ebaSmrg ofile=$2 28004007ebaSmrg ;; 28104007ebaSmrg *) 28204007ebaSmrg set x "$@" -o "$2" 28304007ebaSmrg shift 28404007ebaSmrg ;; 28504007ebaSmrg esac 28604007ebaSmrg ;; 28704007ebaSmrg *.c) 28804007ebaSmrg cfile=$1 28904007ebaSmrg set x "$@" "$1" 29004007ebaSmrg shift 29104007ebaSmrg ;; 29204007ebaSmrg *) 29304007ebaSmrg set x "$@" "$1" 29404007ebaSmrg shift 29504007ebaSmrg ;; 29604007ebaSmrg esac 29704007ebaSmrg fi 29804007ebaSmrg shift 29904007ebaSmrgdone 30004007ebaSmrg 30104007ebaSmrgif test -z "$ofile" || test -z "$cfile"; then 30204007ebaSmrg # If no '-o' option was seen then we might have been invoked from a 30304007ebaSmrg # pattern rule where we don't need one. That is ok -- this is a 30404007ebaSmrg # normal compilation that the losing compiler can handle. If no 30504007ebaSmrg # '.c' file was seen then we are probably linking. That is also 30604007ebaSmrg # ok. 30704007ebaSmrg exec "$@" 30804007ebaSmrgfi 30904007ebaSmrg 31004007ebaSmrg# Name of file we expect compiler to create. 31104007ebaSmrgcofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` 31204007ebaSmrg 31304007ebaSmrg# Create the lock directory. 31404007ebaSmrg# Note: use '[/\\:.-]' here to ensure that we don't use the same name 31504007ebaSmrg# that we are using for the .o file. Also, base the name on the expected 31604007ebaSmrg# object file name, since that is what matters with a parallel build. 31704007ebaSmrglockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d 31804007ebaSmrgwhile true; do 31904007ebaSmrg if mkdir "$lockdir" >/dev/null 2>&1; then 32004007ebaSmrg break 32104007ebaSmrg fi 32204007ebaSmrg sleep 1 32304007ebaSmrgdone 32404007ebaSmrg# FIXME: race condition here if user kills between mkdir and trap. 32504007ebaSmrgtrap "rmdir '$lockdir'; exit 1" 1 2 15 32604007ebaSmrg 32704007ebaSmrg# Run the compile. 32804007ebaSmrg"$@" 32904007ebaSmrgret=$? 33004007ebaSmrg 33104007ebaSmrgif test -f "$cofile"; then 33204007ebaSmrg test "$cofile" = "$ofile" || mv "$cofile" "$ofile" 33304007ebaSmrgelif test -f "${cofile}bj"; then 33404007ebaSmrg test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" 33504007ebaSmrgfi 33604007ebaSmrg 33704007ebaSmrgrmdir "$lockdir" 33804007ebaSmrgexit $ret 33904007ebaSmrg 34004007ebaSmrg# Local Variables: 34104007ebaSmrg# mode: shell-script 34204007ebaSmrg# sh-indentation: 2 34305cf1079Smrg# eval: (add-hook 'before-save-hook 'time-stamp) 34404007ebaSmrg# time-stamp-start: "scriptversion=" 34504007ebaSmrg# time-stamp-format: "%:y-%02m-%02d.%02H" 34605cf1079Smrg# time-stamp-time-zone: "UTC0" 34704007ebaSmrg# time-stamp-end: "; # UTC" 34804007ebaSmrg# End: 349