15dfecf96Smrg#! /bin/sh 21c4d503eSmrg# Wrapper for compilers which do not understand '-c -o'. 35dfecf96Smrg 4f3dfb571Smrgscriptversion=2018-03-07.03; # UTC 55dfecf96Smrg 6f3dfb571Smrg# Copyright (C) 1999-2021 Free Software Foundation, Inc. 75dfecf96Smrg# Written by Tom Tromey <tromey@cygnus.com>. 85dfecf96Smrg# 95dfecf96Smrg# This program is free software; you can redistribute it and/or modify 105dfecf96Smrg# it under the terms of the GNU General Public License as published by 115dfecf96Smrg# the Free Software Foundation; either version 2, or (at your option) 125dfecf96Smrg# any later version. 135dfecf96Smrg# 145dfecf96Smrg# This program is distributed in the hope that it will be useful, 155dfecf96Smrg# but WITHOUT ANY WARRANTY; without even the implied warranty of 165dfecf96Smrg# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 175dfecf96Smrg# GNU General Public License for more details. 185dfecf96Smrg# 195dfecf96Smrg# You should have received a copy of the GNU General Public License 20f3dfb571Smrg# along with this program. If not, see <https://www.gnu.org/licenses/>. 215dfecf96Smrg 225dfecf96Smrg# As a special exception to the GNU General Public License, if you 235dfecf96Smrg# distribute this file as part of a program that contains a 245dfecf96Smrg# configuration script generated by Autoconf, you may include it under 255dfecf96Smrg# the same distribution terms that you use for the rest of that program. 265dfecf96Smrg 275dfecf96Smrg# This file is maintained in Automake, please report 285dfecf96Smrg# bugs to <bug-automake@gnu.org> or send patches to 295dfecf96Smrg# <automake-patches@gnu.org>. 305dfecf96Smrg 3131de2854Smrgnl=' 3231de2854Smrg' 3331de2854Smrg 3431de2854Smrg# We need space, tab and new line, in precisely that order. Quoting is 3531de2854Smrg# there to prevent tools from complaining about whitespace usage. 3631de2854SmrgIFS=" "" $nl" 3731de2854Smrg 3831de2854Smrgfile_conv= 3931de2854Smrg 4031de2854Smrg# func_file_conv build_file lazy 4131de2854Smrg# Convert a $build file to $host form and store it in $file 421c4d503eSmrg# Currently only supports Windows hosts. If the determined conversion 4331de2854Smrg# type is listed in (the comma separated) LAZY, no conversion will 4431de2854Smrg# take place. 4531de2854Smrgfunc_file_conv () 4631de2854Smrg{ 4731de2854Smrg file=$1 4831de2854Smrg case $file in 4931de2854Smrg / | /[!/]*) # absolute file, and not a UNC file 5031de2854Smrg if test -z "$file_conv"; then 5131de2854Smrg # lazily determine how to convert abs files 5231de2854Smrg case `uname -s` in 5331de2854Smrg MINGW*) 5431de2854Smrg file_conv=mingw 5531de2854Smrg ;; 56f3dfb571Smrg CYGWIN* | MSYS*) 5731de2854Smrg file_conv=cygwin 5831de2854Smrg ;; 5931de2854Smrg *) 6031de2854Smrg file_conv=wine 6131de2854Smrg ;; 6231de2854Smrg esac 6331de2854Smrg fi 6431de2854Smrg case $file_conv/,$2, in 6531de2854Smrg *,$file_conv,*) 6631de2854Smrg ;; 6731de2854Smrg mingw/*) 6831de2854Smrg file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` 6931de2854Smrg ;; 70f3dfb571Smrg cygwin/* | msys/*) 7131de2854Smrg file=`cygpath -m "$file" || echo "$file"` 7231de2854Smrg ;; 7331de2854Smrg wine/*) 7431de2854Smrg file=`winepath -w "$file" || echo "$file"` 7531de2854Smrg ;; 7631de2854Smrg esac 7731de2854Smrg ;; 7831de2854Smrg esac 7931de2854Smrg} 8031de2854Smrg 811c4d503eSmrg# func_cl_dashL linkdir 821c4d503eSmrg# Make cl look for libraries in LINKDIR 831c4d503eSmrgfunc_cl_dashL () 841c4d503eSmrg{ 851c4d503eSmrg func_file_conv "$1" 861c4d503eSmrg if test -z "$lib_path"; then 871c4d503eSmrg lib_path=$file 881c4d503eSmrg else 891c4d503eSmrg lib_path="$lib_path;$file" 901c4d503eSmrg fi 911c4d503eSmrg linker_opts="$linker_opts -LIBPATH:$file" 921c4d503eSmrg} 931c4d503eSmrg 941c4d503eSmrg# func_cl_dashl library 951c4d503eSmrg# Do a library search-path lookup for cl 961c4d503eSmrgfunc_cl_dashl () 971c4d503eSmrg{ 981c4d503eSmrg lib=$1 991c4d503eSmrg found=no 1001c4d503eSmrg save_IFS=$IFS 1011c4d503eSmrg IFS=';' 1021c4d503eSmrg for dir in $lib_path $LIB 1031c4d503eSmrg do 1041c4d503eSmrg IFS=$save_IFS 1051c4d503eSmrg if $shared && test -f "$dir/$lib.dll.lib"; then 1061c4d503eSmrg found=yes 1071c4d503eSmrg lib=$dir/$lib.dll.lib 1081c4d503eSmrg break 1091c4d503eSmrg fi 1101c4d503eSmrg if test -f "$dir/$lib.lib"; then 1111c4d503eSmrg found=yes 1121c4d503eSmrg lib=$dir/$lib.lib 1131c4d503eSmrg break 1141c4d503eSmrg fi 1151c4d503eSmrg if test -f "$dir/lib$lib.a"; then 1161c4d503eSmrg found=yes 1171c4d503eSmrg lib=$dir/lib$lib.a 1181c4d503eSmrg break 1191c4d503eSmrg fi 1201c4d503eSmrg done 1211c4d503eSmrg IFS=$save_IFS 1221c4d503eSmrg 1231c4d503eSmrg if test "$found" != yes; then 1241c4d503eSmrg lib=$lib.lib 1251c4d503eSmrg fi 1261c4d503eSmrg} 1271c4d503eSmrg 12831de2854Smrg# func_cl_wrapper cl arg... 12931de2854Smrg# Adjust compile command to suit cl 13031de2854Smrgfunc_cl_wrapper () 13131de2854Smrg{ 13231de2854Smrg # Assume a capable shell 13331de2854Smrg lib_path= 13431de2854Smrg shared=: 13531de2854Smrg linker_opts= 13631de2854Smrg for arg 13731de2854Smrg do 13831de2854Smrg if test -n "$eat"; then 13931de2854Smrg eat= 14031de2854Smrg else 14131de2854Smrg case $1 in 14231de2854Smrg -o) 1431c4d503eSmrg # configure might choose to run compile as 'compile cc -o foo foo.c'. 14431de2854Smrg eat=1 14531de2854Smrg case $2 in 14631de2854Smrg *.o | *.[oO][bB][jJ]) 14731de2854Smrg func_file_conv "$2" 14831de2854Smrg set x "$@" -Fo"$file" 14931de2854Smrg shift 15031de2854Smrg ;; 15131de2854Smrg *) 15231de2854Smrg func_file_conv "$2" 15331de2854Smrg set x "$@" -Fe"$file" 15431de2854Smrg shift 15531de2854Smrg ;; 15631de2854Smrg esac 15731de2854Smrg ;; 1581c4d503eSmrg -I) 1591c4d503eSmrg eat=1 1601c4d503eSmrg func_file_conv "$2" mingw 1611c4d503eSmrg set x "$@" -I"$file" 1621c4d503eSmrg shift 1631c4d503eSmrg ;; 16431de2854Smrg -I*) 16531de2854Smrg func_file_conv "${1#-I}" mingw 16631de2854Smrg set x "$@" -I"$file" 16731de2854Smrg shift 16831de2854Smrg ;; 1691c4d503eSmrg -l) 1701c4d503eSmrg eat=1 1711c4d503eSmrg func_cl_dashl "$2" 1721c4d503eSmrg set x "$@" "$lib" 1731c4d503eSmrg shift 1741c4d503eSmrg ;; 17531de2854Smrg -l*) 1761c4d503eSmrg func_cl_dashl "${1#-l}" 1771c4d503eSmrg set x "$@" "$lib" 17831de2854Smrg shift 17931de2854Smrg ;; 1801c4d503eSmrg -L) 1811c4d503eSmrg eat=1 1821c4d503eSmrg func_cl_dashL "$2" 1831c4d503eSmrg ;; 18431de2854Smrg -L*) 1851c4d503eSmrg func_cl_dashL "${1#-L}" 18631de2854Smrg ;; 18731de2854Smrg -static) 18831de2854Smrg shared=false 18931de2854Smrg ;; 19031de2854Smrg -Wl,*) 19131de2854Smrg arg=${1#-Wl,} 19231de2854Smrg save_ifs="$IFS"; IFS=',' 19331de2854Smrg for flag in $arg; do 19431de2854Smrg IFS="$save_ifs" 19531de2854Smrg linker_opts="$linker_opts $flag" 19631de2854Smrg done 19731de2854Smrg IFS="$save_ifs" 19831de2854Smrg ;; 19931de2854Smrg -Xlinker) 20031de2854Smrg eat=1 20131de2854Smrg linker_opts="$linker_opts $2" 20231de2854Smrg ;; 20331de2854Smrg -*) 20431de2854Smrg set x "$@" "$1" 20531de2854Smrg shift 20631de2854Smrg ;; 20731de2854Smrg *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) 20831de2854Smrg func_file_conv "$1" 20931de2854Smrg set x "$@" -Tp"$file" 21031de2854Smrg shift 21131de2854Smrg ;; 21231de2854Smrg *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) 21331de2854Smrg func_file_conv "$1" mingw 21431de2854Smrg set x "$@" "$file" 21531de2854Smrg shift 21631de2854Smrg ;; 21731de2854Smrg *) 21831de2854Smrg set x "$@" "$1" 21931de2854Smrg shift 22031de2854Smrg ;; 22131de2854Smrg esac 22231de2854Smrg fi 22331de2854Smrg shift 22431de2854Smrg done 22531de2854Smrg if test -n "$linker_opts"; then 22631de2854Smrg linker_opts="-link$linker_opts" 22731de2854Smrg fi 22831de2854Smrg exec "$@" $linker_opts 22931de2854Smrg exit 1 23031de2854Smrg} 23131de2854Smrg 23231de2854Smrgeat= 23331de2854Smrg 2345dfecf96Smrgcase $1 in 2355dfecf96Smrg '') 2361c4d503eSmrg echo "$0: No command. Try '$0 --help' for more information." 1>&2 2375dfecf96Smrg exit 1; 2385dfecf96Smrg ;; 2395dfecf96Smrg -h | --h*) 2405dfecf96Smrg cat <<\EOF 2415dfecf96SmrgUsage: compile [--help] [--version] PROGRAM [ARGS] 2425dfecf96Smrg 2431c4d503eSmrgWrapper for compilers which do not understand '-c -o'. 2441c4d503eSmrgRemove '-o dest.o' from ARGS, run PROGRAM with the remaining 2455dfecf96Smrgarguments, and rename the output as expected. 2465dfecf96Smrg 2475dfecf96SmrgIf you are trying to build a whole package this is not the 2481c4d503eSmrgright script to run: please start by reading the file 'INSTALL'. 2495dfecf96Smrg 2505dfecf96SmrgReport bugs to <bug-automake@gnu.org>. 2515dfecf96SmrgEOF 2525dfecf96Smrg exit $? 2535dfecf96Smrg ;; 2545dfecf96Smrg -v | --v*) 2555dfecf96Smrg echo "compile $scriptversion" 2565dfecf96Smrg exit $? 2575dfecf96Smrg ;; 258f3dfb571Smrg cl | *[/\\]cl | cl.exe | *[/\\]cl.exe | \ 259f3dfb571Smrg icl | *[/\\]icl | icl.exe | *[/\\]icl.exe ) 26031de2854Smrg func_cl_wrapper "$@" # Doesn't return... 26131de2854Smrg ;; 2625dfecf96Smrgesac 2635dfecf96Smrg 2645dfecf96Smrgofile= 2655dfecf96Smrgcfile= 2665dfecf96Smrg 2675dfecf96Smrgfor arg 2685dfecf96Smrgdo 2695dfecf96Smrg if test -n "$eat"; then 2705dfecf96Smrg eat= 2715dfecf96Smrg else 2725dfecf96Smrg case $1 in 2735dfecf96Smrg -o) 2741c4d503eSmrg # configure might choose to run compile as 'compile cc -o foo foo.c'. 2751c4d503eSmrg # So we strip '-o arg' only if arg is an object. 2765dfecf96Smrg eat=1 2775dfecf96Smrg case $2 in 2785dfecf96Smrg *.o | *.obj) 2795dfecf96Smrg ofile=$2 2805dfecf96Smrg ;; 2815dfecf96Smrg *) 2825dfecf96Smrg set x "$@" -o "$2" 2835dfecf96Smrg shift 2845dfecf96Smrg ;; 2855dfecf96Smrg esac 2865dfecf96Smrg ;; 2875dfecf96Smrg *.c) 2885dfecf96Smrg cfile=$1 2895dfecf96Smrg set x "$@" "$1" 2905dfecf96Smrg shift 2915dfecf96Smrg ;; 2925dfecf96Smrg *) 2935dfecf96Smrg set x "$@" "$1" 2945dfecf96Smrg shift 2955dfecf96Smrg ;; 2965dfecf96Smrg esac 2975dfecf96Smrg fi 2985dfecf96Smrg shift 2995dfecf96Smrgdone 3005dfecf96Smrg 3015dfecf96Smrgif test -z "$ofile" || test -z "$cfile"; then 3021c4d503eSmrg # If no '-o' option was seen then we might have been invoked from a 3035dfecf96Smrg # pattern rule where we don't need one. That is ok -- this is a 3045dfecf96Smrg # normal compilation that the losing compiler can handle. If no 3051c4d503eSmrg # '.c' file was seen then we are probably linking. That is also 3065dfecf96Smrg # ok. 3075dfecf96Smrg exec "$@" 3085dfecf96Smrgfi 3095dfecf96Smrg 3105dfecf96Smrg# Name of file we expect compiler to create. 311c05e22d7Smrgcofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` 3125dfecf96Smrg 3135dfecf96Smrg# Create the lock directory. 3141c4d503eSmrg# Note: use '[/\\:.-]' here to ensure that we don't use the same name 3155dfecf96Smrg# that we are using for the .o file. Also, base the name on the expected 3165dfecf96Smrg# object file name, since that is what matters with a parallel build. 317c05e22d7Smrglockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d 3185dfecf96Smrgwhile true; do 3195dfecf96Smrg if mkdir "$lockdir" >/dev/null 2>&1; then 3205dfecf96Smrg break 3215dfecf96Smrg fi 3225dfecf96Smrg sleep 1 3235dfecf96Smrgdone 3245dfecf96Smrg# FIXME: race condition here if user kills between mkdir and trap. 3255dfecf96Smrgtrap "rmdir '$lockdir'; exit 1" 1 2 15 3265dfecf96Smrg 3275dfecf96Smrg# Run the compile. 3285dfecf96Smrg"$@" 3295dfecf96Smrgret=$? 3305dfecf96Smrg 3315dfecf96Smrgif test -f "$cofile"; then 332c05e22d7Smrg test "$cofile" = "$ofile" || mv "$cofile" "$ofile" 3335dfecf96Smrgelif test -f "${cofile}bj"; then 334c05e22d7Smrg test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" 3355dfecf96Smrgfi 3365dfecf96Smrg 3375dfecf96Smrgrmdir "$lockdir" 3385dfecf96Smrgexit $ret 3395dfecf96Smrg 3405dfecf96Smrg# Local Variables: 3415dfecf96Smrg# mode: shell-script 3425dfecf96Smrg# sh-indentation: 2 343f3dfb571Smrg# eval: (add-hook 'before-save-hook 'time-stamp) 3445dfecf96Smrg# time-stamp-start: "scriptversion=" 3455dfecf96Smrg# time-stamp-format: "%:y-%02m-%02d.%02H" 346f3dfb571Smrg# time-stamp-time-zone: "UTC0" 347c05e22d7Smrg# time-stamp-end: "; # UTC" 3485dfecf96Smrg# End: 349