195903e71Smrg#! /bin/sh 295903e71Smrg# Wrapper for compilers which do not understand '-c -o'. 395903e71Smrg 4efb46889Smrgscriptversion=2018-03-07.03; # UTC 595903e71Smrg 6efb46889Smrg# Copyright (C) 1999-2021 Free Software Foundation, Inc. 795903e71Smrg# Written by Tom Tromey <tromey@cygnus.com>. 895903e71Smrg# 995903e71Smrg# This program is free software; you can redistribute it and/or modify 1095903e71Smrg# it under the terms of the GNU General Public License as published by 1195903e71Smrg# the Free Software Foundation; either version 2, or (at your option) 1295903e71Smrg# any later version. 1395903e71Smrg# 1495903e71Smrg# This program is distributed in the hope that it will be useful, 1595903e71Smrg# but WITHOUT ANY WARRANTY; without even the implied warranty of 1695903e71Smrg# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1795903e71Smrg# GNU General Public License for more details. 1895903e71Smrg# 1995903e71Smrg# You should have received a copy of the GNU General Public License 20efb46889Smrg# along with this program. If not, see <https://www.gnu.org/licenses/>. 2195903e71Smrg 2295903e71Smrg# As a special exception to the GNU General Public License, if you 2395903e71Smrg# distribute this file as part of a program that contains a 2495903e71Smrg# configuration script generated by Autoconf, you may include it under 2595903e71Smrg# the same distribution terms that you use for the rest of that program. 2695903e71Smrg 2795903e71Smrg# This file is maintained in Automake, please report 2895903e71Smrg# bugs to <bug-automake@gnu.org> or send patches to 2995903e71Smrg# <automake-patches@gnu.org>. 3095903e71Smrg 3195903e71Smrgnl=' 3295903e71Smrg' 3395903e71Smrg 3495903e71Smrg# We need space, tab and new line, in precisely that order. Quoting is 3595903e71Smrg# there to prevent tools from complaining about whitespace usage. 3695903e71SmrgIFS=" "" $nl" 3795903e71Smrg 3895903e71Smrgfile_conv= 3995903e71Smrg 4095903e71Smrg# func_file_conv build_file lazy 4195903e71Smrg# Convert a $build file to $host form and store it in $file 4295903e71Smrg# Currently only supports Windows hosts. If the determined conversion 4395903e71Smrg# type is listed in (the comma separated) LAZY, no conversion will 4495903e71Smrg# take place. 4595903e71Smrgfunc_file_conv () 4695903e71Smrg{ 4795903e71Smrg file=$1 4895903e71Smrg case $file in 4995903e71Smrg / | /[!/]*) # absolute file, and not a UNC file 5095903e71Smrg if test -z "$file_conv"; then 5195903e71Smrg # lazily determine how to convert abs files 5295903e71Smrg case `uname -s` in 5395903e71Smrg MINGW*) 5495903e71Smrg file_conv=mingw 5595903e71Smrg ;; 56efb46889Smrg CYGWIN* | MSYS*) 5795903e71Smrg file_conv=cygwin 5895903e71Smrg ;; 5995903e71Smrg *) 6095903e71Smrg file_conv=wine 6195903e71Smrg ;; 6295903e71Smrg esac 6395903e71Smrg fi 6495903e71Smrg case $file_conv/,$2, in 6595903e71Smrg *,$file_conv,*) 6695903e71Smrg ;; 6795903e71Smrg mingw/*) 6895903e71Smrg file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` 6995903e71Smrg ;; 70efb46889Smrg cygwin/* | msys/*) 7195903e71Smrg file=`cygpath -m "$file" || echo "$file"` 7295903e71Smrg ;; 7395903e71Smrg wine/*) 7495903e71Smrg file=`winepath -w "$file" || echo "$file"` 7595903e71Smrg ;; 7695903e71Smrg esac 7795903e71Smrg ;; 7895903e71Smrg esac 7995903e71Smrg} 8095903e71Smrg 8195903e71Smrg# func_cl_dashL linkdir 8295903e71Smrg# Make cl look for libraries in LINKDIR 8395903e71Smrgfunc_cl_dashL () 8495903e71Smrg{ 8595903e71Smrg func_file_conv "$1" 8695903e71Smrg if test -z "$lib_path"; then 8795903e71Smrg lib_path=$file 8895903e71Smrg else 8995903e71Smrg lib_path="$lib_path;$file" 9095903e71Smrg fi 9195903e71Smrg linker_opts="$linker_opts -LIBPATH:$file" 9295903e71Smrg} 9395903e71Smrg 9495903e71Smrg# func_cl_dashl library 9595903e71Smrg# Do a library search-path lookup for cl 9695903e71Smrgfunc_cl_dashl () 9795903e71Smrg{ 9895903e71Smrg lib=$1 9995903e71Smrg found=no 10095903e71Smrg save_IFS=$IFS 10195903e71Smrg IFS=';' 10295903e71Smrg for dir in $lib_path $LIB 10395903e71Smrg do 10495903e71Smrg IFS=$save_IFS 10595903e71Smrg if $shared && test -f "$dir/$lib.dll.lib"; then 10695903e71Smrg found=yes 10795903e71Smrg lib=$dir/$lib.dll.lib 10895903e71Smrg break 10995903e71Smrg fi 11095903e71Smrg if test -f "$dir/$lib.lib"; then 11195903e71Smrg found=yes 11295903e71Smrg lib=$dir/$lib.lib 11395903e71Smrg break 11495903e71Smrg fi 11595903e71Smrg if test -f "$dir/lib$lib.a"; then 11695903e71Smrg found=yes 11795903e71Smrg lib=$dir/lib$lib.a 11895903e71Smrg break 11995903e71Smrg fi 12095903e71Smrg done 12195903e71Smrg IFS=$save_IFS 12295903e71Smrg 12395903e71Smrg if test "$found" != yes; then 12495903e71Smrg lib=$lib.lib 12595903e71Smrg fi 12695903e71Smrg} 12795903e71Smrg 12895903e71Smrg# func_cl_wrapper cl arg... 12995903e71Smrg# Adjust compile command to suit cl 13095903e71Smrgfunc_cl_wrapper () 13195903e71Smrg{ 13295903e71Smrg # Assume a capable shell 13395903e71Smrg lib_path= 13495903e71Smrg shared=: 13595903e71Smrg linker_opts= 13695903e71Smrg for arg 13795903e71Smrg do 13895903e71Smrg if test -n "$eat"; then 13995903e71Smrg eat= 14095903e71Smrg else 14195903e71Smrg case $1 in 14295903e71Smrg -o) 14395903e71Smrg # configure might choose to run compile as 'compile cc -o foo foo.c'. 14495903e71Smrg eat=1 14595903e71Smrg case $2 in 14695903e71Smrg *.o | *.[oO][bB][jJ]) 14795903e71Smrg func_file_conv "$2" 14895903e71Smrg set x "$@" -Fo"$file" 14995903e71Smrg shift 15095903e71Smrg ;; 15195903e71Smrg *) 15295903e71Smrg func_file_conv "$2" 15395903e71Smrg set x "$@" -Fe"$file" 15495903e71Smrg shift 15595903e71Smrg ;; 15695903e71Smrg esac 15795903e71Smrg ;; 15895903e71Smrg -I) 15995903e71Smrg eat=1 16095903e71Smrg func_file_conv "$2" mingw 16195903e71Smrg set x "$@" -I"$file" 16295903e71Smrg shift 16395903e71Smrg ;; 16495903e71Smrg -I*) 16595903e71Smrg func_file_conv "${1#-I}" mingw 16695903e71Smrg set x "$@" -I"$file" 16795903e71Smrg shift 16895903e71Smrg ;; 16995903e71Smrg -l) 17095903e71Smrg eat=1 17195903e71Smrg func_cl_dashl "$2" 17295903e71Smrg set x "$@" "$lib" 17395903e71Smrg shift 17495903e71Smrg ;; 17595903e71Smrg -l*) 17695903e71Smrg func_cl_dashl "${1#-l}" 17795903e71Smrg set x "$@" "$lib" 17895903e71Smrg shift 17995903e71Smrg ;; 18095903e71Smrg -L) 18195903e71Smrg eat=1 18295903e71Smrg func_cl_dashL "$2" 18395903e71Smrg ;; 18495903e71Smrg -L*) 18595903e71Smrg func_cl_dashL "${1#-L}" 18695903e71Smrg ;; 18795903e71Smrg -static) 18895903e71Smrg shared=false 18995903e71Smrg ;; 19095903e71Smrg -Wl,*) 19195903e71Smrg arg=${1#-Wl,} 19295903e71Smrg save_ifs="$IFS"; IFS=',' 19395903e71Smrg for flag in $arg; do 19495903e71Smrg IFS="$save_ifs" 19595903e71Smrg linker_opts="$linker_opts $flag" 19695903e71Smrg done 19795903e71Smrg IFS="$save_ifs" 19895903e71Smrg ;; 19995903e71Smrg -Xlinker) 20095903e71Smrg eat=1 20195903e71Smrg linker_opts="$linker_opts $2" 20295903e71Smrg ;; 20395903e71Smrg -*) 20495903e71Smrg set x "$@" "$1" 20595903e71Smrg shift 20695903e71Smrg ;; 20795903e71Smrg *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) 20895903e71Smrg func_file_conv "$1" 20995903e71Smrg set x "$@" -Tp"$file" 21095903e71Smrg shift 21195903e71Smrg ;; 21295903e71Smrg *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) 21395903e71Smrg func_file_conv "$1" mingw 21495903e71Smrg set x "$@" "$file" 21595903e71Smrg shift 21695903e71Smrg ;; 21795903e71Smrg *) 21895903e71Smrg set x "$@" "$1" 21995903e71Smrg shift 22095903e71Smrg ;; 22195903e71Smrg esac 22295903e71Smrg fi 22395903e71Smrg shift 22495903e71Smrg done 22595903e71Smrg if test -n "$linker_opts"; then 22695903e71Smrg linker_opts="-link$linker_opts" 22795903e71Smrg fi 22895903e71Smrg exec "$@" $linker_opts 22995903e71Smrg exit 1 23095903e71Smrg} 23195903e71Smrg 23295903e71Smrgeat= 23395903e71Smrg 23495903e71Smrgcase $1 in 23595903e71Smrg '') 23695903e71Smrg echo "$0: No command. Try '$0 --help' for more information." 1>&2 23795903e71Smrg exit 1; 23895903e71Smrg ;; 23995903e71Smrg -h | --h*) 24095903e71Smrg cat <<\EOF 24195903e71SmrgUsage: compile [--help] [--version] PROGRAM [ARGS] 24295903e71Smrg 24395903e71SmrgWrapper for compilers which do not understand '-c -o'. 24495903e71SmrgRemove '-o dest.o' from ARGS, run PROGRAM with the remaining 24595903e71Smrgarguments, and rename the output as expected. 24695903e71Smrg 24795903e71SmrgIf you are trying to build a whole package this is not the 24895903e71Smrgright script to run: please start by reading the file 'INSTALL'. 24995903e71Smrg 25095903e71SmrgReport bugs to <bug-automake@gnu.org>. 25195903e71SmrgEOF 25295903e71Smrg exit $? 25395903e71Smrg ;; 25495903e71Smrg -v | --v*) 25595903e71Smrg echo "compile $scriptversion" 25695903e71Smrg exit $? 25795903e71Smrg ;; 258efb46889Smrg cl | *[/\\]cl | cl.exe | *[/\\]cl.exe | \ 259efb46889Smrg icl | *[/\\]icl | icl.exe | *[/\\]icl.exe ) 26095903e71Smrg func_cl_wrapper "$@" # Doesn't return... 26195903e71Smrg ;; 26295903e71Smrgesac 26395903e71Smrg 26495903e71Smrgofile= 26595903e71Smrgcfile= 26695903e71Smrg 26795903e71Smrgfor arg 26895903e71Smrgdo 26995903e71Smrg if test -n "$eat"; then 27095903e71Smrg eat= 27195903e71Smrg else 27295903e71Smrg case $1 in 27395903e71Smrg -o) 27495903e71Smrg # configure might choose to run compile as 'compile cc -o foo foo.c'. 27595903e71Smrg # So we strip '-o arg' only if arg is an object. 27695903e71Smrg eat=1 27795903e71Smrg case $2 in 27895903e71Smrg *.o | *.obj) 27995903e71Smrg ofile=$2 28095903e71Smrg ;; 28195903e71Smrg *) 28295903e71Smrg set x "$@" -o "$2" 28395903e71Smrg shift 28495903e71Smrg ;; 28595903e71Smrg esac 28695903e71Smrg ;; 28795903e71Smrg *.c) 28895903e71Smrg cfile=$1 28995903e71Smrg set x "$@" "$1" 29095903e71Smrg shift 29195903e71Smrg ;; 29295903e71Smrg *) 29395903e71Smrg set x "$@" "$1" 29495903e71Smrg shift 29595903e71Smrg ;; 29695903e71Smrg esac 29795903e71Smrg fi 29895903e71Smrg shift 29995903e71Smrgdone 30095903e71Smrg 30195903e71Smrgif test -z "$ofile" || test -z "$cfile"; then 30295903e71Smrg # If no '-o' option was seen then we might have been invoked from a 30395903e71Smrg # pattern rule where we don't need one. That is ok -- this is a 30495903e71Smrg # normal compilation that the losing compiler can handle. If no 30595903e71Smrg # '.c' file was seen then we are probably linking. That is also 30695903e71Smrg # ok. 30795903e71Smrg exec "$@" 30895903e71Smrgfi 30995903e71Smrg 31095903e71Smrg# Name of file we expect compiler to create. 31195903e71Smrgcofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` 31295903e71Smrg 31395903e71Smrg# Create the lock directory. 31495903e71Smrg# Note: use '[/\\:.-]' here to ensure that we don't use the same name 31595903e71Smrg# that we are using for the .o file. Also, base the name on the expected 31695903e71Smrg# object file name, since that is what matters with a parallel build. 31795903e71Smrglockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d 31895903e71Smrgwhile true; do 31995903e71Smrg if mkdir "$lockdir" >/dev/null 2>&1; then 32095903e71Smrg break 32195903e71Smrg fi 32295903e71Smrg sleep 1 32395903e71Smrgdone 32495903e71Smrg# FIXME: race condition here if user kills between mkdir and trap. 32595903e71Smrgtrap "rmdir '$lockdir'; exit 1" 1 2 15 32695903e71Smrg 32795903e71Smrg# Run the compile. 32895903e71Smrg"$@" 32995903e71Smrgret=$? 33095903e71Smrg 33195903e71Smrgif test -f "$cofile"; then 33295903e71Smrg test "$cofile" = "$ofile" || mv "$cofile" "$ofile" 33395903e71Smrgelif test -f "${cofile}bj"; then 33495903e71Smrg test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" 33595903e71Smrgfi 33695903e71Smrg 33795903e71Smrgrmdir "$lockdir" 33895903e71Smrgexit $ret 33995903e71Smrg 34095903e71Smrg# Local Variables: 34195903e71Smrg# mode: shell-script 34295903e71Smrg# sh-indentation: 2 343efb46889Smrg# eval: (add-hook 'before-save-hook 'time-stamp) 34495903e71Smrg# time-stamp-start: "scriptversion=" 34595903e71Smrg# time-stamp-format: "%:y-%02m-%02d.%02H" 346efb46889Smrg# time-stamp-time-zone: "UTC0" 34795903e71Smrg# time-stamp-end: "; # UTC" 34895903e71Smrg# End: 349