128a8b562SDavid E. O'Brien#! /bin/sh 2b6cee71dSXin LI# Wrapper for compilers which do not understand '-c -o'. 328a8b562SDavid E. O'Brien 4d38c30c0SXin LIscriptversion=2018-03-07.03; # UTC 528a8b562SDavid E. O'Brien 6*a2dfb722SXin LI# Copyright (C) 1999-2021 Free Software Foundation, Inc. 728a8b562SDavid E. O'Brien# Written by Tom Tromey <tromey@cygnus.com>. 828a8b562SDavid E. O'Brien# 928a8b562SDavid E. O'Brien# This program is free software; you can redistribute it and/or modify 1028a8b562SDavid E. O'Brien# it under the terms of the GNU General Public License as published by 1128a8b562SDavid E. O'Brien# the Free Software Foundation; either version 2, or (at your option) 1228a8b562SDavid E. O'Brien# any later version. 1328a8b562SDavid E. O'Brien# 1428a8b562SDavid E. O'Brien# This program is distributed in the hope that it will be useful, 1528a8b562SDavid E. O'Brien# but WITHOUT ANY WARRANTY; without even the implied warranty of 1628a8b562SDavid E. O'Brien# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1728a8b562SDavid E. O'Brien# GNU General Public License for more details. 1828a8b562SDavid E. O'Brien# 1928a8b562SDavid E. O'Brien# You should have received a copy of the GNU General Public License 20d38c30c0SXin LI# along with this program. If not, see <https://www.gnu.org/licenses/>. 2128a8b562SDavid E. O'Brien 2228a8b562SDavid E. O'Brien# As a special exception to the GNU General Public License, if you 2328a8b562SDavid E. O'Brien# distribute this file as part of a program that contains a 2428a8b562SDavid E. O'Brien# configuration script generated by Autoconf, you may include it under 2528a8b562SDavid E. O'Brien# the same distribution terms that you use for the rest of that program. 2628a8b562SDavid E. O'Brien 2728a8b562SDavid E. O'Brien# This file is maintained in Automake, please report 2828a8b562SDavid E. O'Brien# bugs to <bug-automake@gnu.org> or send patches to 2928a8b562SDavid E. O'Brien# <automake-patches@gnu.org>. 3028a8b562SDavid E. O'Brien 31b6cee71dSXin LInl=' 32b6cee71dSXin LI' 33b6cee71dSXin LI 34b6cee71dSXin LI# We need space, tab and new line, in precisely that order. Quoting is 35b6cee71dSXin LI# there to prevent tools from complaining about whitespace usage. 36b6cee71dSXin LIIFS=" "" $nl" 37b6cee71dSXin LI 38b6cee71dSXin LIfile_conv= 39b6cee71dSXin LI 40b6cee71dSXin LI# func_file_conv build_file lazy 41b6cee71dSXin LI# Convert a $build file to $host form and store it in $file 42b6cee71dSXin LI# Currently only supports Windows hosts. If the determined conversion 43b6cee71dSXin LI# type is listed in (the comma separated) LAZY, no conversion will 44b6cee71dSXin LI# take place. 45b6cee71dSXin LIfunc_file_conv () 46b6cee71dSXin LI{ 47b6cee71dSXin LI file=$1 48b6cee71dSXin LI case $file in 49b6cee71dSXin LI / | /[!/]*) # absolute file, and not a UNC file 50b6cee71dSXin LI if test -z "$file_conv"; then 51b6cee71dSXin LI # lazily determine how to convert abs files 52b6cee71dSXin LI case `uname -s` in 53b6cee71dSXin LI MINGW*) 54b6cee71dSXin LI file_conv=mingw 55b6cee71dSXin LI ;; 56*a2dfb722SXin LI CYGWIN* | MSYS*) 57b6cee71dSXin LI file_conv=cygwin 58b6cee71dSXin LI ;; 59b6cee71dSXin LI *) 60b6cee71dSXin LI file_conv=wine 61b6cee71dSXin LI ;; 62b6cee71dSXin LI esac 63b6cee71dSXin LI fi 64b6cee71dSXin LI case $file_conv/,$2, in 65b6cee71dSXin LI *,$file_conv,*) 66b6cee71dSXin LI ;; 67b6cee71dSXin LI mingw/*) 68b6cee71dSXin LI file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` 69b6cee71dSXin LI ;; 70*a2dfb722SXin LI cygwin/* | msys/*) 71b6cee71dSXin LI file=`cygpath -m "$file" || echo "$file"` 72b6cee71dSXin LI ;; 73b6cee71dSXin LI wine/*) 74b6cee71dSXin LI file=`winepath -w "$file" || echo "$file"` 75b6cee71dSXin LI ;; 76b6cee71dSXin LI esac 77b6cee71dSXin LI ;; 78b6cee71dSXin LI esac 79b6cee71dSXin LI} 80b6cee71dSXin LI 81b6cee71dSXin LI# func_cl_dashL linkdir 82b6cee71dSXin LI# Make cl look for libraries in LINKDIR 83b6cee71dSXin LIfunc_cl_dashL () 84b6cee71dSXin LI{ 85b6cee71dSXin LI func_file_conv "$1" 86b6cee71dSXin LI if test -z "$lib_path"; then 87b6cee71dSXin LI lib_path=$file 88b6cee71dSXin LI else 89b6cee71dSXin LI lib_path="$lib_path;$file" 90b6cee71dSXin LI fi 91b6cee71dSXin LI linker_opts="$linker_opts -LIBPATH:$file" 92b6cee71dSXin LI} 93b6cee71dSXin LI 94b6cee71dSXin LI# func_cl_dashl library 95b6cee71dSXin LI# Do a library search-path lookup for cl 96b6cee71dSXin LIfunc_cl_dashl () 97b6cee71dSXin LI{ 98b6cee71dSXin LI lib=$1 99b6cee71dSXin LI found=no 100b6cee71dSXin LI save_IFS=$IFS 101b6cee71dSXin LI IFS=';' 102b6cee71dSXin LI for dir in $lib_path $LIB 103b6cee71dSXin LI do 104b6cee71dSXin LI IFS=$save_IFS 105b6cee71dSXin LI if $shared && test -f "$dir/$lib.dll.lib"; then 106b6cee71dSXin LI found=yes 107b6cee71dSXin LI lib=$dir/$lib.dll.lib 108b6cee71dSXin LI break 109b6cee71dSXin LI fi 110b6cee71dSXin LI if test -f "$dir/$lib.lib"; then 111b6cee71dSXin LI found=yes 112b6cee71dSXin LI lib=$dir/$lib.lib 113b6cee71dSXin LI break 114b6cee71dSXin LI fi 115b6cee71dSXin LI if test -f "$dir/lib$lib.a"; then 116b6cee71dSXin LI found=yes 117b6cee71dSXin LI lib=$dir/lib$lib.a 118b6cee71dSXin LI break 119b6cee71dSXin LI fi 120b6cee71dSXin LI done 121b6cee71dSXin LI IFS=$save_IFS 122b6cee71dSXin LI 123b6cee71dSXin LI if test "$found" != yes; then 124b6cee71dSXin LI lib=$lib.lib 125b6cee71dSXin LI fi 126b6cee71dSXin LI} 127b6cee71dSXin LI 128b6cee71dSXin LI# func_cl_wrapper cl arg... 129b6cee71dSXin LI# Adjust compile command to suit cl 130b6cee71dSXin LIfunc_cl_wrapper () 131b6cee71dSXin LI{ 132b6cee71dSXin LI # Assume a capable shell 133b6cee71dSXin LI lib_path= 134b6cee71dSXin LI shared=: 135b6cee71dSXin LI linker_opts= 136b6cee71dSXin LI for arg 137b6cee71dSXin LI do 138b6cee71dSXin LI if test -n "$eat"; then 139b6cee71dSXin LI eat= 140b6cee71dSXin LI else 141b6cee71dSXin LI case $1 in 142b6cee71dSXin LI -o) 143b6cee71dSXin LI # configure might choose to run compile as 'compile cc -o foo foo.c'. 144b6cee71dSXin LI eat=1 145b6cee71dSXin LI case $2 in 146b6cee71dSXin LI *.o | *.[oO][bB][jJ]) 147b6cee71dSXin LI func_file_conv "$2" 148b6cee71dSXin LI set x "$@" -Fo"$file" 149b6cee71dSXin LI shift 150b6cee71dSXin LI ;; 151b6cee71dSXin LI *) 152b6cee71dSXin LI func_file_conv "$2" 153b6cee71dSXin LI set x "$@" -Fe"$file" 154b6cee71dSXin LI shift 155b6cee71dSXin LI ;; 156b6cee71dSXin LI esac 157b6cee71dSXin LI ;; 158b6cee71dSXin LI -I) 159b6cee71dSXin LI eat=1 160b6cee71dSXin LI func_file_conv "$2" mingw 161b6cee71dSXin LI set x "$@" -I"$file" 162b6cee71dSXin LI shift 163b6cee71dSXin LI ;; 164b6cee71dSXin LI -I*) 165b6cee71dSXin LI func_file_conv "${1#-I}" mingw 166b6cee71dSXin LI set x "$@" -I"$file" 167b6cee71dSXin LI shift 168b6cee71dSXin LI ;; 169b6cee71dSXin LI -l) 170b6cee71dSXin LI eat=1 171b6cee71dSXin LI func_cl_dashl "$2" 172b6cee71dSXin LI set x "$@" "$lib" 173b6cee71dSXin LI shift 174b6cee71dSXin LI ;; 175b6cee71dSXin LI -l*) 176b6cee71dSXin LI func_cl_dashl "${1#-l}" 177b6cee71dSXin LI set x "$@" "$lib" 178b6cee71dSXin LI shift 179b6cee71dSXin LI ;; 180b6cee71dSXin LI -L) 181b6cee71dSXin LI eat=1 182b6cee71dSXin LI func_cl_dashL "$2" 183b6cee71dSXin LI ;; 184b6cee71dSXin LI -L*) 185b6cee71dSXin LI func_cl_dashL "${1#-L}" 186b6cee71dSXin LI ;; 187b6cee71dSXin LI -static) 188b6cee71dSXin LI shared=false 189b6cee71dSXin LI ;; 190b6cee71dSXin LI -Wl,*) 191b6cee71dSXin LI arg=${1#-Wl,} 192b6cee71dSXin LI save_ifs="$IFS"; IFS=',' 193b6cee71dSXin LI for flag in $arg; do 194b6cee71dSXin LI IFS="$save_ifs" 195b6cee71dSXin LI linker_opts="$linker_opts $flag" 196b6cee71dSXin LI done 197b6cee71dSXin LI IFS="$save_ifs" 198b6cee71dSXin LI ;; 199b6cee71dSXin LI -Xlinker) 200b6cee71dSXin LI eat=1 201b6cee71dSXin LI linker_opts="$linker_opts $2" 202b6cee71dSXin LI ;; 203b6cee71dSXin LI -*) 204b6cee71dSXin LI set x "$@" "$1" 205b6cee71dSXin LI shift 206b6cee71dSXin LI ;; 207b6cee71dSXin LI *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) 208b6cee71dSXin LI func_file_conv "$1" 209b6cee71dSXin LI set x "$@" -Tp"$file" 210b6cee71dSXin LI shift 211b6cee71dSXin LI ;; 212b6cee71dSXin LI *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) 213b6cee71dSXin LI func_file_conv "$1" mingw 214b6cee71dSXin LI set x "$@" "$file" 215b6cee71dSXin LI shift 216b6cee71dSXin LI ;; 217b6cee71dSXin LI *) 218b6cee71dSXin LI set x "$@" "$1" 219b6cee71dSXin LI shift 220b6cee71dSXin LI ;; 221b6cee71dSXin LI esac 222b6cee71dSXin LI fi 223b6cee71dSXin LI shift 224b6cee71dSXin LI done 225b6cee71dSXin LI if test -n "$linker_opts"; then 226b6cee71dSXin LI linker_opts="-link$linker_opts" 227b6cee71dSXin LI fi 228b6cee71dSXin LI exec "$@" $linker_opts 229b6cee71dSXin LI exit 1 230b6cee71dSXin LI} 231b6cee71dSXin LI 232b6cee71dSXin LIeat= 233b6cee71dSXin LI 23428a8b562SDavid E. O'Briencase $1 in 23528a8b562SDavid E. O'Brien '') 236b6cee71dSXin LI echo "$0: No command. Try '$0 --help' for more information." 1>&2 23728a8b562SDavid E. O'Brien exit 1; 23828a8b562SDavid E. O'Brien ;; 23928a8b562SDavid E. O'Brien -h | --h*) 24028a8b562SDavid E. O'Brien cat <<\EOF 24128a8b562SDavid E. O'BrienUsage: compile [--help] [--version] PROGRAM [ARGS] 24228a8b562SDavid E. O'Brien 243b6cee71dSXin LIWrapper for compilers which do not understand '-c -o'. 244b6cee71dSXin LIRemove '-o dest.o' from ARGS, run PROGRAM with the remaining 24528a8b562SDavid E. O'Brienarguments, and rename the output as expected. 24628a8b562SDavid E. O'Brien 24728a8b562SDavid E. O'BrienIf you are trying to build a whole package this is not the 248b6cee71dSXin LIright script to run: please start by reading the file 'INSTALL'. 24928a8b562SDavid E. O'Brien 25028a8b562SDavid E. O'BrienReport bugs to <bug-automake@gnu.org>. 25128a8b562SDavid E. O'BrienEOF 25228a8b562SDavid E. O'Brien exit $? 25328a8b562SDavid E. O'Brien ;; 25428a8b562SDavid E. O'Brien -v | --v*) 25528a8b562SDavid E. O'Brien echo "compile $scriptversion" 25628a8b562SDavid E. O'Brien exit $? 25728a8b562SDavid E. O'Brien ;; 258d38c30c0SXin LI cl | *[/\\]cl | cl.exe | *[/\\]cl.exe | \ 259d38c30c0SXin LI icl | *[/\\]icl | icl.exe | *[/\\]icl.exe ) 260b6cee71dSXin LI func_cl_wrapper "$@" # Doesn't return... 261b6cee71dSXin LI ;; 26228a8b562SDavid E. O'Brienesac 26328a8b562SDavid E. O'Brien 26428a8b562SDavid E. O'Brienofile= 26528a8b562SDavid E. O'Briencfile= 26628a8b562SDavid E. O'Brien 26728a8b562SDavid E. O'Brienfor arg 26828a8b562SDavid E. O'Briendo 26928a8b562SDavid E. O'Brien if test -n "$eat"; then 27028a8b562SDavid E. O'Brien eat= 27128a8b562SDavid E. O'Brien else 27228a8b562SDavid E. O'Brien case $1 in 27328a8b562SDavid E. O'Brien -o) 274b6cee71dSXin LI # configure might choose to run compile as 'compile cc -o foo foo.c'. 275b6cee71dSXin LI # So we strip '-o arg' only if arg is an object. 27628a8b562SDavid E. O'Brien eat=1 27728a8b562SDavid E. O'Brien case $2 in 27828a8b562SDavid E. O'Brien *.o | *.obj) 27928a8b562SDavid E. O'Brien ofile=$2 28028a8b562SDavid E. O'Brien ;; 28128a8b562SDavid E. O'Brien *) 28228a8b562SDavid E. O'Brien set x "$@" -o "$2" 28328a8b562SDavid E. O'Brien shift 28428a8b562SDavid E. O'Brien ;; 28528a8b562SDavid E. O'Brien esac 28628a8b562SDavid E. O'Brien ;; 28728a8b562SDavid E. O'Brien *.c) 28828a8b562SDavid E. O'Brien cfile=$1 28928a8b562SDavid E. O'Brien set x "$@" "$1" 29028a8b562SDavid E. O'Brien shift 29128a8b562SDavid E. O'Brien ;; 29228a8b562SDavid E. O'Brien *) 29328a8b562SDavid E. O'Brien set x "$@" "$1" 29428a8b562SDavid E. O'Brien shift 29528a8b562SDavid E. O'Brien ;; 29628a8b562SDavid E. O'Brien esac 29728a8b562SDavid E. O'Brien fi 29828a8b562SDavid E. O'Brien shift 29928a8b562SDavid E. O'Briendone 30028a8b562SDavid E. O'Brien 30128a8b562SDavid E. O'Brienif test -z "$ofile" || test -z "$cfile"; then 302b6cee71dSXin LI # If no '-o' option was seen then we might have been invoked from a 30328a8b562SDavid E. O'Brien # pattern rule where we don't need one. That is ok -- this is a 30428a8b562SDavid E. O'Brien # normal compilation that the losing compiler can handle. If no 305b6cee71dSXin LI # '.c' file was seen then we are probably linking. That is also 30628a8b562SDavid E. O'Brien # ok. 30728a8b562SDavid E. O'Brien exec "$@" 30828a8b562SDavid E. O'Brienfi 30928a8b562SDavid E. O'Brien 31028a8b562SDavid E. O'Brien# Name of file we expect compiler to create. 31180c86c36SDavid E. O'Briencofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` 31228a8b562SDavid E. O'Brien 31328a8b562SDavid E. O'Brien# Create the lock directory. 314b6cee71dSXin LI# Note: use '[/\\:.-]' here to ensure that we don't use the same name 31528a8b562SDavid E. O'Brien# that we are using for the .o file. Also, base the name on the expected 31628a8b562SDavid E. O'Brien# object file name, since that is what matters with a parallel build. 31780c86c36SDavid E. O'Brienlockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d 31828a8b562SDavid E. O'Brienwhile true; do 31928a8b562SDavid E. O'Brien if mkdir "$lockdir" >/dev/null 2>&1; then 32028a8b562SDavid E. O'Brien break 32128a8b562SDavid E. O'Brien fi 32228a8b562SDavid E. O'Brien sleep 1 32328a8b562SDavid E. O'Briendone 32428a8b562SDavid E. O'Brien# FIXME: race condition here if user kills between mkdir and trap. 32528a8b562SDavid E. O'Brientrap "rmdir '$lockdir'; exit 1" 1 2 15 32628a8b562SDavid E. O'Brien 32728a8b562SDavid E. O'Brien# Run the compile. 32828a8b562SDavid E. O'Brien"$@" 32928a8b562SDavid E. O'Brienret=$? 33028a8b562SDavid E. O'Brien 33128a8b562SDavid E. O'Brienif test -f "$cofile"; then 33280c86c36SDavid E. O'Brien test "$cofile" = "$ofile" || mv "$cofile" "$ofile" 33328a8b562SDavid E. O'Brienelif test -f "${cofile}bj"; then 33480c86c36SDavid E. O'Brien test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" 33528a8b562SDavid E. O'Brienfi 33628a8b562SDavid E. O'Brien 33728a8b562SDavid E. O'Brienrmdir "$lockdir" 33828a8b562SDavid E. O'Brienexit $ret 33928a8b562SDavid E. O'Brien 34028a8b562SDavid E. O'Brien# Local Variables: 34128a8b562SDavid E. O'Brien# mode: shell-script 34228a8b562SDavid E. O'Brien# sh-indentation: 2 343d38c30c0SXin LI# eval: (add-hook 'before-save-hook 'time-stamp) 34428a8b562SDavid E. O'Brien# time-stamp-start: "scriptversion=" 34528a8b562SDavid E. O'Brien# time-stamp-format: "%:y-%02m-%02d.%02H" 346d38c30c0SXin LI# time-stamp-time-zone: "UTC0" 34780c86c36SDavid E. O'Brien# time-stamp-end: "; # UTC" 34828a8b562SDavid E. O'Brien# End: 349