compile revision 25420f97
1dff01e5aSmrg#! /bin/sh 2dff01e5aSmrg# Wrapper for compilers which do not understand '-c -o'. 3dff01e5aSmrg 484febdacSmrgscriptversion=2018-03-07.03; # UTC 5dff01e5aSmrg 625420f97Smrg# Copyright (C) 1999-2021 Free Software Foundation, Inc. 7dff01e5aSmrg# Written by Tom Tromey <tromey@cygnus.com>. 8dff01e5aSmrg# 9dff01e5aSmrg# This program is free software; you can redistribute it and/or modify 10dff01e5aSmrg# it under the terms of the GNU General Public License as published by 11dff01e5aSmrg# the Free Software Foundation; either version 2, or (at your option) 12dff01e5aSmrg# any later version. 13dff01e5aSmrg# 14dff01e5aSmrg# This program is distributed in the hope that it will be useful, 15dff01e5aSmrg# but WITHOUT ANY WARRANTY; without even the implied warranty of 16dff01e5aSmrg# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17dff01e5aSmrg# GNU General Public License for more details. 18dff01e5aSmrg# 19dff01e5aSmrg# You should have received a copy of the GNU General Public License 2084febdacSmrg# along with this program. If not, see <https://www.gnu.org/licenses/>. 21dff01e5aSmrg 22dff01e5aSmrg# As a special exception to the GNU General Public License, if you 23dff01e5aSmrg# distribute this file as part of a program that contains a 24dff01e5aSmrg# configuration script generated by Autoconf, you may include it under 25dff01e5aSmrg# the same distribution terms that you use for the rest of that program. 26dff01e5aSmrg 27dff01e5aSmrg# This file is maintained in Automake, please report 28dff01e5aSmrg# bugs to <bug-automake@gnu.org> or send patches to 29dff01e5aSmrg# <automake-patches@gnu.org>. 30dff01e5aSmrg 31dff01e5aSmrgnl=' 32dff01e5aSmrg' 33dff01e5aSmrg 34dff01e5aSmrg# We need space, tab and new line, in precisely that order. Quoting is 35dff01e5aSmrg# there to prevent tools from complaining about whitespace usage. 36dff01e5aSmrgIFS=" "" $nl" 37dff01e5aSmrg 38dff01e5aSmrgfile_conv= 39dff01e5aSmrg 40dff01e5aSmrg# func_file_conv build_file lazy 41dff01e5aSmrg# Convert a $build file to $host form and store it in $file 42dff01e5aSmrg# Currently only supports Windows hosts. If the determined conversion 43dff01e5aSmrg# type is listed in (the comma separated) LAZY, no conversion will 44dff01e5aSmrg# take place. 45dff01e5aSmrgfunc_file_conv () 46dff01e5aSmrg{ 47dff01e5aSmrg file=$1 48dff01e5aSmrg case $file in 49dff01e5aSmrg / | /[!/]*) # absolute file, and not a UNC file 50dff01e5aSmrg if test -z "$file_conv"; then 51dff01e5aSmrg # lazily determine how to convert abs files 52dff01e5aSmrg case `uname -s` in 53dff01e5aSmrg MINGW*) 54dff01e5aSmrg file_conv=mingw 55dff01e5aSmrg ;; 5625420f97Smrg CYGWIN* | MSYS*) 57dff01e5aSmrg file_conv=cygwin 58dff01e5aSmrg ;; 59dff01e5aSmrg *) 60dff01e5aSmrg file_conv=wine 61dff01e5aSmrg ;; 62dff01e5aSmrg esac 63dff01e5aSmrg fi 64dff01e5aSmrg case $file_conv/,$2, in 65dff01e5aSmrg *,$file_conv,*) 66dff01e5aSmrg ;; 67dff01e5aSmrg mingw/*) 68dff01e5aSmrg file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` 69dff01e5aSmrg ;; 7025420f97Smrg cygwin/* | msys/*) 71dff01e5aSmrg file=`cygpath -m "$file" || echo "$file"` 72dff01e5aSmrg ;; 73dff01e5aSmrg wine/*) 74dff01e5aSmrg file=`winepath -w "$file" || echo "$file"` 75dff01e5aSmrg ;; 76dff01e5aSmrg esac 77dff01e5aSmrg ;; 78dff01e5aSmrg esac 79dff01e5aSmrg} 80dff01e5aSmrg 81dff01e5aSmrg# func_cl_dashL linkdir 82dff01e5aSmrg# Make cl look for libraries in LINKDIR 83dff01e5aSmrgfunc_cl_dashL () 84dff01e5aSmrg{ 85dff01e5aSmrg func_file_conv "$1" 86dff01e5aSmrg if test -z "$lib_path"; then 87dff01e5aSmrg lib_path=$file 88dff01e5aSmrg else 89dff01e5aSmrg lib_path="$lib_path;$file" 90dff01e5aSmrg fi 91dff01e5aSmrg linker_opts="$linker_opts -LIBPATH:$file" 92dff01e5aSmrg} 93dff01e5aSmrg 94dff01e5aSmrg# func_cl_dashl library 95dff01e5aSmrg# Do a library search-path lookup for cl 96dff01e5aSmrgfunc_cl_dashl () 97dff01e5aSmrg{ 98dff01e5aSmrg lib=$1 99dff01e5aSmrg found=no 100dff01e5aSmrg save_IFS=$IFS 101dff01e5aSmrg IFS=';' 102dff01e5aSmrg for dir in $lib_path $LIB 103dff01e5aSmrg do 104dff01e5aSmrg IFS=$save_IFS 105dff01e5aSmrg if $shared && test -f "$dir/$lib.dll.lib"; then 106dff01e5aSmrg found=yes 107dff01e5aSmrg lib=$dir/$lib.dll.lib 108dff01e5aSmrg break 109dff01e5aSmrg fi 110dff01e5aSmrg if test -f "$dir/$lib.lib"; then 111dff01e5aSmrg found=yes 112dff01e5aSmrg lib=$dir/$lib.lib 113dff01e5aSmrg break 114dff01e5aSmrg fi 115dff01e5aSmrg if test -f "$dir/lib$lib.a"; then 116dff01e5aSmrg found=yes 117dff01e5aSmrg lib=$dir/lib$lib.a 118dff01e5aSmrg break 119dff01e5aSmrg fi 120dff01e5aSmrg done 121dff01e5aSmrg IFS=$save_IFS 122dff01e5aSmrg 123dff01e5aSmrg if test "$found" != yes; then 124dff01e5aSmrg lib=$lib.lib 125dff01e5aSmrg fi 126dff01e5aSmrg} 127dff01e5aSmrg 128dff01e5aSmrg# func_cl_wrapper cl arg... 129dff01e5aSmrg# Adjust compile command to suit cl 130dff01e5aSmrgfunc_cl_wrapper () 131dff01e5aSmrg{ 132dff01e5aSmrg # Assume a capable shell 133dff01e5aSmrg lib_path= 134dff01e5aSmrg shared=: 135dff01e5aSmrg linker_opts= 136dff01e5aSmrg for arg 137dff01e5aSmrg do 138dff01e5aSmrg if test -n "$eat"; then 139dff01e5aSmrg eat= 140dff01e5aSmrg else 141dff01e5aSmrg case $1 in 142dff01e5aSmrg -o) 143dff01e5aSmrg # configure might choose to run compile as 'compile cc -o foo foo.c'. 144dff01e5aSmrg eat=1 145dff01e5aSmrg case $2 in 146dff01e5aSmrg *.o | *.[oO][bB][jJ]) 147dff01e5aSmrg func_file_conv "$2" 148dff01e5aSmrg set x "$@" -Fo"$file" 149dff01e5aSmrg shift 150dff01e5aSmrg ;; 151dff01e5aSmrg *) 152dff01e5aSmrg func_file_conv "$2" 153dff01e5aSmrg set x "$@" -Fe"$file" 154dff01e5aSmrg shift 155dff01e5aSmrg ;; 156dff01e5aSmrg esac 157dff01e5aSmrg ;; 158dff01e5aSmrg -I) 159dff01e5aSmrg eat=1 160dff01e5aSmrg func_file_conv "$2" mingw 161dff01e5aSmrg set x "$@" -I"$file" 162dff01e5aSmrg shift 163dff01e5aSmrg ;; 164dff01e5aSmrg -I*) 165dff01e5aSmrg func_file_conv "${1#-I}" mingw 166dff01e5aSmrg set x "$@" -I"$file" 167dff01e5aSmrg shift 168dff01e5aSmrg ;; 169dff01e5aSmrg -l) 170dff01e5aSmrg eat=1 171dff01e5aSmrg func_cl_dashl "$2" 172dff01e5aSmrg set x "$@" "$lib" 173dff01e5aSmrg shift 174dff01e5aSmrg ;; 175dff01e5aSmrg -l*) 176dff01e5aSmrg func_cl_dashl "${1#-l}" 177dff01e5aSmrg set x "$@" "$lib" 178dff01e5aSmrg shift 179dff01e5aSmrg ;; 180dff01e5aSmrg -L) 181dff01e5aSmrg eat=1 182dff01e5aSmrg func_cl_dashL "$2" 183dff01e5aSmrg ;; 184dff01e5aSmrg -L*) 185dff01e5aSmrg func_cl_dashL "${1#-L}" 186dff01e5aSmrg ;; 187dff01e5aSmrg -static) 188dff01e5aSmrg shared=false 189dff01e5aSmrg ;; 190dff01e5aSmrg -Wl,*) 191dff01e5aSmrg arg=${1#-Wl,} 192dff01e5aSmrg save_ifs="$IFS"; IFS=',' 193dff01e5aSmrg for flag in $arg; do 194dff01e5aSmrg IFS="$save_ifs" 195dff01e5aSmrg linker_opts="$linker_opts $flag" 196dff01e5aSmrg done 197dff01e5aSmrg IFS="$save_ifs" 198dff01e5aSmrg ;; 199dff01e5aSmrg -Xlinker) 200dff01e5aSmrg eat=1 201dff01e5aSmrg linker_opts="$linker_opts $2" 202dff01e5aSmrg ;; 203dff01e5aSmrg -*) 204dff01e5aSmrg set x "$@" "$1" 205dff01e5aSmrg shift 206dff01e5aSmrg ;; 207dff01e5aSmrg *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) 208dff01e5aSmrg func_file_conv "$1" 209dff01e5aSmrg set x "$@" -Tp"$file" 210dff01e5aSmrg shift 211dff01e5aSmrg ;; 212dff01e5aSmrg *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) 213dff01e5aSmrg func_file_conv "$1" mingw 214dff01e5aSmrg set x "$@" "$file" 215dff01e5aSmrg shift 216dff01e5aSmrg ;; 217dff01e5aSmrg *) 218dff01e5aSmrg set x "$@" "$1" 219dff01e5aSmrg shift 220dff01e5aSmrg ;; 221dff01e5aSmrg esac 222dff01e5aSmrg fi 223dff01e5aSmrg shift 224dff01e5aSmrg done 225dff01e5aSmrg if test -n "$linker_opts"; then 226dff01e5aSmrg linker_opts="-link$linker_opts" 227dff01e5aSmrg fi 228dff01e5aSmrg exec "$@" $linker_opts 229dff01e5aSmrg exit 1 230dff01e5aSmrg} 231dff01e5aSmrg 232dff01e5aSmrgeat= 233dff01e5aSmrg 234dff01e5aSmrgcase $1 in 235dff01e5aSmrg '') 236dff01e5aSmrg echo "$0: No command. Try '$0 --help' for more information." 1>&2 237dff01e5aSmrg exit 1; 238dff01e5aSmrg ;; 239dff01e5aSmrg -h | --h*) 240dff01e5aSmrg cat <<\EOF 241dff01e5aSmrgUsage: compile [--help] [--version] PROGRAM [ARGS] 242dff01e5aSmrg 243dff01e5aSmrgWrapper for compilers which do not understand '-c -o'. 244dff01e5aSmrgRemove '-o dest.o' from ARGS, run PROGRAM with the remaining 245dff01e5aSmrgarguments, and rename the output as expected. 246dff01e5aSmrg 247dff01e5aSmrgIf you are trying to build a whole package this is not the 248dff01e5aSmrgright script to run: please start by reading the file 'INSTALL'. 249dff01e5aSmrg 250dff01e5aSmrgReport bugs to <bug-automake@gnu.org>. 251dff01e5aSmrgEOF 252dff01e5aSmrg exit $? 253dff01e5aSmrg ;; 254dff01e5aSmrg -v | --v*) 255dff01e5aSmrg echo "compile $scriptversion" 256dff01e5aSmrg exit $? 257dff01e5aSmrg ;; 25884febdacSmrg cl | *[/\\]cl | cl.exe | *[/\\]cl.exe | \ 25984febdacSmrg icl | *[/\\]icl | icl.exe | *[/\\]icl.exe ) 260dff01e5aSmrg func_cl_wrapper "$@" # Doesn't return... 261dff01e5aSmrg ;; 262dff01e5aSmrgesac 263dff01e5aSmrg 264dff01e5aSmrgofile= 265dff01e5aSmrgcfile= 266dff01e5aSmrg 267dff01e5aSmrgfor arg 268dff01e5aSmrgdo 269dff01e5aSmrg if test -n "$eat"; then 270dff01e5aSmrg eat= 271dff01e5aSmrg else 272dff01e5aSmrg case $1 in 273dff01e5aSmrg -o) 274dff01e5aSmrg # configure might choose to run compile as 'compile cc -o foo foo.c'. 275dff01e5aSmrg # So we strip '-o arg' only if arg is an object. 276dff01e5aSmrg eat=1 277dff01e5aSmrg case $2 in 278dff01e5aSmrg *.o | *.obj) 279dff01e5aSmrg ofile=$2 280dff01e5aSmrg ;; 281dff01e5aSmrg *) 282dff01e5aSmrg set x "$@" -o "$2" 283dff01e5aSmrg shift 284dff01e5aSmrg ;; 285dff01e5aSmrg esac 286dff01e5aSmrg ;; 287dff01e5aSmrg *.c) 288dff01e5aSmrg cfile=$1 289dff01e5aSmrg set x "$@" "$1" 290dff01e5aSmrg shift 291dff01e5aSmrg ;; 292dff01e5aSmrg *) 293dff01e5aSmrg set x "$@" "$1" 294dff01e5aSmrg shift 295dff01e5aSmrg ;; 296dff01e5aSmrg esac 297dff01e5aSmrg fi 298dff01e5aSmrg shift 299dff01e5aSmrgdone 300dff01e5aSmrg 301dff01e5aSmrgif test -z "$ofile" || test -z "$cfile"; then 302dff01e5aSmrg # If no '-o' option was seen then we might have been invoked from a 303dff01e5aSmrg # pattern rule where we don't need one. That is ok -- this is a 304dff01e5aSmrg # normal compilation that the losing compiler can handle. If no 305dff01e5aSmrg # '.c' file was seen then we are probably linking. That is also 306dff01e5aSmrg # ok. 307dff01e5aSmrg exec "$@" 308dff01e5aSmrgfi 309dff01e5aSmrg 310dff01e5aSmrg# Name of file we expect compiler to create. 311dff01e5aSmrgcofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` 312dff01e5aSmrg 313dff01e5aSmrg# Create the lock directory. 314dff01e5aSmrg# Note: use '[/\\:.-]' here to ensure that we don't use the same name 315dff01e5aSmrg# that we are using for the .o file. Also, base the name on the expected 316dff01e5aSmrg# object file name, since that is what matters with a parallel build. 317dff01e5aSmrglockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d 318dff01e5aSmrgwhile true; do 319dff01e5aSmrg if mkdir "$lockdir" >/dev/null 2>&1; then 320dff01e5aSmrg break 321dff01e5aSmrg fi 322dff01e5aSmrg sleep 1 323dff01e5aSmrgdone 324dff01e5aSmrg# FIXME: race condition here if user kills between mkdir and trap. 325dff01e5aSmrgtrap "rmdir '$lockdir'; exit 1" 1 2 15 326dff01e5aSmrg 327dff01e5aSmrg# Run the compile. 328dff01e5aSmrg"$@" 329dff01e5aSmrgret=$? 330dff01e5aSmrg 331dff01e5aSmrgif test -f "$cofile"; then 332dff01e5aSmrg test "$cofile" = "$ofile" || mv "$cofile" "$ofile" 333dff01e5aSmrgelif test -f "${cofile}bj"; then 334dff01e5aSmrg test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" 335dff01e5aSmrgfi 336dff01e5aSmrg 337dff01e5aSmrgrmdir "$lockdir" 338dff01e5aSmrgexit $ret 339dff01e5aSmrg 340dff01e5aSmrg# Local Variables: 341dff01e5aSmrg# mode: shell-script 342dff01e5aSmrg# sh-indentation: 2 34384febdacSmrg# eval: (add-hook 'before-save-hook 'time-stamp) 344dff01e5aSmrg# time-stamp-start: "scriptversion=" 345dff01e5aSmrg# time-stamp-format: "%:y-%02m-%02d.%02H" 34684febdacSmrg# time-stamp-time-zone: "UTC0" 347dff01e5aSmrg# time-stamp-end: "; # UTC" 348dff01e5aSmrg# End: 349