compile revision 945aa7e3
1010cdda0Smrg#! /bin/sh 2945aa7e3Smrg# Wrapper for compilers which do not understand '-c -o'. 3010cdda0Smrg 4945aa7e3Smrgscriptversion=2018-03-07.03; # UTC 5b3eb03f3Smrg 6945aa7e3Smrg# Copyright (C) 1999-2021 Free Software Foundation, Inc. 7010cdda0Smrg# Written by Tom Tromey <tromey@cygnus.com>. 8010cdda0Smrg# 9010cdda0Smrg# This program is free software; you can redistribute it and/or modify 10010cdda0Smrg# it under the terms of the GNU General Public License as published by 11010cdda0Smrg# the Free Software Foundation; either version 2, or (at your option) 12010cdda0Smrg# any later version. 13010cdda0Smrg# 14010cdda0Smrg# This program is distributed in the hope that it will be useful, 15010cdda0Smrg# but WITHOUT ANY WARRANTY; without even the implied warranty of 16010cdda0Smrg# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17010cdda0Smrg# GNU General Public License for more details. 18010cdda0Smrg# 19010cdda0Smrg# You should have received a copy of the GNU General Public License 20945aa7e3Smrg# along with this program. If not, see <https://www.gnu.org/licenses/>. 21010cdda0Smrg 22010cdda0Smrg# As a special exception to the GNU General Public License, if you 23010cdda0Smrg# distribute this file as part of a program that contains a 24010cdda0Smrg# configuration script generated by Autoconf, you may include it under 25010cdda0Smrg# the same distribution terms that you use for the rest of that program. 26010cdda0Smrg 27b3eb03f3Smrg# This file is maintained in Automake, please report 28b3eb03f3Smrg# bugs to <bug-automake@gnu.org> or send patches to 29b3eb03f3Smrg# <automake-patches@gnu.org>. 30b3eb03f3Smrg 31b4485a66Smrgnl=' 32b4485a66Smrg' 33b4485a66Smrg 34b4485a66Smrg# We need space, tab and new line, in precisely that order. Quoting is 35b4485a66Smrg# there to prevent tools from complaining about whitespace usage. 36b4485a66SmrgIFS=" "" $nl" 37b4485a66Smrg 38b4485a66Smrgfile_conv= 39b4485a66Smrg 40b4485a66Smrg# func_file_conv build_file lazy 41b4485a66Smrg# Convert a $build file to $host form and store it in $file 42945aa7e3Smrg# Currently only supports Windows hosts. If the determined conversion 43b4485a66Smrg# type is listed in (the comma separated) LAZY, no conversion will 44b4485a66Smrg# take place. 45b4485a66Smrgfunc_file_conv () 46b4485a66Smrg{ 47b4485a66Smrg file=$1 48b4485a66Smrg case $file in 49b4485a66Smrg / | /[!/]*) # absolute file, and not a UNC file 50b4485a66Smrg if test -z "$file_conv"; then 51b4485a66Smrg # lazily determine how to convert abs files 52b4485a66Smrg case `uname -s` in 53b4485a66Smrg MINGW*) 54b4485a66Smrg file_conv=mingw 55b4485a66Smrg ;; 56945aa7e3Smrg CYGWIN* | MSYS*) 57b4485a66Smrg file_conv=cygwin 58b4485a66Smrg ;; 59b4485a66Smrg *) 60b4485a66Smrg file_conv=wine 61b4485a66Smrg ;; 62b4485a66Smrg esac 63b4485a66Smrg fi 64b4485a66Smrg case $file_conv/,$2, in 65b4485a66Smrg *,$file_conv,*) 66b4485a66Smrg ;; 67b4485a66Smrg mingw/*) 68b4485a66Smrg file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` 69b4485a66Smrg ;; 70945aa7e3Smrg cygwin/* | msys/*) 71b4485a66Smrg file=`cygpath -m "$file" || echo "$file"` 72b4485a66Smrg ;; 73b4485a66Smrg wine/*) 74b4485a66Smrg file=`winepath -w "$file" || echo "$file"` 75b4485a66Smrg ;; 76b4485a66Smrg esac 77b4485a66Smrg ;; 78b4485a66Smrg esac 79b4485a66Smrg} 80b4485a66Smrg 81945aa7e3Smrg# func_cl_dashL linkdir 82945aa7e3Smrg# Make cl look for libraries in LINKDIR 83945aa7e3Smrgfunc_cl_dashL () 84945aa7e3Smrg{ 85945aa7e3Smrg func_file_conv "$1" 86945aa7e3Smrg if test -z "$lib_path"; then 87945aa7e3Smrg lib_path=$file 88945aa7e3Smrg else 89945aa7e3Smrg lib_path="$lib_path;$file" 90945aa7e3Smrg fi 91945aa7e3Smrg linker_opts="$linker_opts -LIBPATH:$file" 92945aa7e3Smrg} 93945aa7e3Smrg 94945aa7e3Smrg# func_cl_dashl library 95945aa7e3Smrg# Do a library search-path lookup for cl 96945aa7e3Smrgfunc_cl_dashl () 97945aa7e3Smrg{ 98945aa7e3Smrg lib=$1 99945aa7e3Smrg found=no 100945aa7e3Smrg save_IFS=$IFS 101945aa7e3Smrg IFS=';' 102945aa7e3Smrg for dir in $lib_path $LIB 103945aa7e3Smrg do 104945aa7e3Smrg IFS=$save_IFS 105945aa7e3Smrg if $shared && test -f "$dir/$lib.dll.lib"; then 106945aa7e3Smrg found=yes 107945aa7e3Smrg lib=$dir/$lib.dll.lib 108945aa7e3Smrg break 109945aa7e3Smrg fi 110945aa7e3Smrg if test -f "$dir/$lib.lib"; then 111945aa7e3Smrg found=yes 112945aa7e3Smrg lib=$dir/$lib.lib 113945aa7e3Smrg break 114945aa7e3Smrg fi 115945aa7e3Smrg if test -f "$dir/lib$lib.a"; then 116945aa7e3Smrg found=yes 117945aa7e3Smrg lib=$dir/lib$lib.a 118945aa7e3Smrg break 119945aa7e3Smrg fi 120945aa7e3Smrg done 121945aa7e3Smrg IFS=$save_IFS 122945aa7e3Smrg 123945aa7e3Smrg if test "$found" != yes; then 124945aa7e3Smrg lib=$lib.lib 125945aa7e3Smrg fi 126945aa7e3Smrg} 127945aa7e3Smrg 128b4485a66Smrg# func_cl_wrapper cl arg... 129b4485a66Smrg# Adjust compile command to suit cl 130b4485a66Smrgfunc_cl_wrapper () 131b4485a66Smrg{ 132b4485a66Smrg # Assume a capable shell 133b4485a66Smrg lib_path= 134b4485a66Smrg shared=: 135b4485a66Smrg linker_opts= 136b4485a66Smrg for arg 137b4485a66Smrg do 138b4485a66Smrg if test -n "$eat"; then 139b4485a66Smrg eat= 140b4485a66Smrg else 141b4485a66Smrg case $1 in 142b4485a66Smrg -o) 143945aa7e3Smrg # configure might choose to run compile as 'compile cc -o foo foo.c'. 144b4485a66Smrg eat=1 145b4485a66Smrg case $2 in 146b4485a66Smrg *.o | *.[oO][bB][jJ]) 147b4485a66Smrg func_file_conv "$2" 148b4485a66Smrg set x "$@" -Fo"$file" 149b4485a66Smrg shift 150b4485a66Smrg ;; 151b4485a66Smrg *) 152b4485a66Smrg func_file_conv "$2" 153b4485a66Smrg set x "$@" -Fe"$file" 154b4485a66Smrg shift 155b4485a66Smrg ;; 156b4485a66Smrg esac 157b4485a66Smrg ;; 158945aa7e3Smrg -I) 159945aa7e3Smrg eat=1 160945aa7e3Smrg func_file_conv "$2" mingw 161945aa7e3Smrg set x "$@" -I"$file" 162945aa7e3Smrg shift 163945aa7e3Smrg ;; 164b4485a66Smrg -I*) 165b4485a66Smrg func_file_conv "${1#-I}" mingw 166b4485a66Smrg set x "$@" -I"$file" 167b4485a66Smrg shift 168b4485a66Smrg ;; 169945aa7e3Smrg -l) 170945aa7e3Smrg eat=1 171945aa7e3Smrg func_cl_dashl "$2" 172945aa7e3Smrg set x "$@" "$lib" 173945aa7e3Smrg shift 174945aa7e3Smrg ;; 175b4485a66Smrg -l*) 176945aa7e3Smrg func_cl_dashl "${1#-l}" 177945aa7e3Smrg set x "$@" "$lib" 178b4485a66Smrg shift 179b4485a66Smrg ;; 180945aa7e3Smrg -L) 181945aa7e3Smrg eat=1 182945aa7e3Smrg func_cl_dashL "$2" 183945aa7e3Smrg ;; 184b4485a66Smrg -L*) 185945aa7e3Smrg func_cl_dashL "${1#-L}" 186b4485a66Smrg ;; 187b4485a66Smrg -static) 188b4485a66Smrg shared=false 189b4485a66Smrg ;; 190b4485a66Smrg -Wl,*) 191b4485a66Smrg arg=${1#-Wl,} 192b4485a66Smrg save_ifs="$IFS"; IFS=',' 193b4485a66Smrg for flag in $arg; do 194b4485a66Smrg IFS="$save_ifs" 195b4485a66Smrg linker_opts="$linker_opts $flag" 196b4485a66Smrg done 197b4485a66Smrg IFS="$save_ifs" 198b4485a66Smrg ;; 199b4485a66Smrg -Xlinker) 200b4485a66Smrg eat=1 201b4485a66Smrg linker_opts="$linker_opts $2" 202b4485a66Smrg ;; 203b4485a66Smrg -*) 204b4485a66Smrg set x "$@" "$1" 205b4485a66Smrg shift 206b4485a66Smrg ;; 207b4485a66Smrg *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) 208b4485a66Smrg func_file_conv "$1" 209b4485a66Smrg set x "$@" -Tp"$file" 210b4485a66Smrg shift 211b4485a66Smrg ;; 212b4485a66Smrg *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) 213b4485a66Smrg func_file_conv "$1" mingw 214b4485a66Smrg set x "$@" "$file" 215b4485a66Smrg shift 216b4485a66Smrg ;; 217b4485a66Smrg *) 218b4485a66Smrg set x "$@" "$1" 219b4485a66Smrg shift 220b4485a66Smrg ;; 221b4485a66Smrg esac 222b4485a66Smrg fi 223b4485a66Smrg shift 224b4485a66Smrg done 225b4485a66Smrg if test -n "$linker_opts"; then 226b4485a66Smrg linker_opts="-link$linker_opts" 227b4485a66Smrg fi 228b4485a66Smrg exec "$@" $linker_opts 229b4485a66Smrg exit 1 230b4485a66Smrg} 231b4485a66Smrg 232b4485a66Smrgeat= 233b4485a66Smrg 234b3eb03f3Smrgcase $1 in 235b3eb03f3Smrg '') 236945aa7e3Smrg echo "$0: No command. Try '$0 --help' for more information." 1>&2 237b3eb03f3Smrg exit 1; 238b3eb03f3Smrg ;; 239b3eb03f3Smrg -h | --h*) 240b3eb03f3Smrg cat <<\EOF 241b3eb03f3SmrgUsage: compile [--help] [--version] PROGRAM [ARGS] 242b3eb03f3Smrg 243945aa7e3SmrgWrapper for compilers which do not understand '-c -o'. 244945aa7e3SmrgRemove '-o dest.o' from ARGS, run PROGRAM with the remaining 245b3eb03f3Smrgarguments, and rename the output as expected. 246010cdda0Smrg 247b3eb03f3SmrgIf you are trying to build a whole package this is not the 248945aa7e3Smrgright script to run: please start by reading the file 'INSTALL'. 249b3eb03f3Smrg 250b3eb03f3SmrgReport bugs to <bug-automake@gnu.org>. 251b3eb03f3SmrgEOF 252b3eb03f3Smrg exit $? 253b3eb03f3Smrg ;; 254b3eb03f3Smrg -v | --v*) 255b3eb03f3Smrg echo "compile $scriptversion" 256b3eb03f3Smrg exit $? 257b3eb03f3Smrg ;; 258945aa7e3Smrg cl | *[/\\]cl | cl.exe | *[/\\]cl.exe | \ 259945aa7e3Smrg icl | *[/\\]icl | icl.exe | *[/\\]icl.exe ) 260b4485a66Smrg func_cl_wrapper "$@" # Doesn't return... 261b4485a66Smrg ;; 262b3eb03f3Smrgesac 263010cdda0Smrg 264010cdda0Smrgofile= 265010cdda0Smrgcfile= 266b3eb03f3Smrg 267b3eb03f3Smrgfor arg 268b3eb03f3Smrgdo 269b3eb03f3Smrg if test -n "$eat"; then 270b3eb03f3Smrg eat= 271b3eb03f3Smrg else 272b3eb03f3Smrg case $1 in 273b3eb03f3Smrg -o) 274945aa7e3Smrg # configure might choose to run compile as 'compile cc -o foo foo.c'. 275945aa7e3Smrg # So we strip '-o arg' only if arg is an object. 276b3eb03f3Smrg eat=1 277b3eb03f3Smrg case $2 in 278b3eb03f3Smrg *.o | *.obj) 279b3eb03f3Smrg ofile=$2 280b3eb03f3Smrg ;; 281b3eb03f3Smrg *) 282b3eb03f3Smrg set x "$@" -o "$2" 283b3eb03f3Smrg shift 284b3eb03f3Smrg ;; 285b3eb03f3Smrg esac 286b3eb03f3Smrg ;; 287b3eb03f3Smrg *.c) 288b3eb03f3Smrg cfile=$1 289b3eb03f3Smrg set x "$@" "$1" 290b3eb03f3Smrg shift 291b3eb03f3Smrg ;; 292b3eb03f3Smrg *) 293b3eb03f3Smrg set x "$@" "$1" 294b3eb03f3Smrg shift 295b3eb03f3Smrg ;; 296b3eb03f3Smrg esac 297b3eb03f3Smrg fi 298b3eb03f3Smrg shift 299010cdda0Smrgdone 300010cdda0Smrg 301010cdda0Smrgif test -z "$ofile" || test -z "$cfile"; then 302945aa7e3Smrg # If no '-o' option was seen then we might have been invoked from a 303b3eb03f3Smrg # pattern rule where we don't need one. That is ok -- this is a 304b3eb03f3Smrg # normal compilation that the losing compiler can handle. If no 305945aa7e3Smrg # '.c' file was seen then we are probably linking. That is also 306b3eb03f3Smrg # ok. 307b3eb03f3Smrg exec "$@" 308010cdda0Smrgfi 309010cdda0Smrg 310010cdda0Smrg# Name of file we expect compiler to create. 311b3eb03f3Smrgcofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` 312010cdda0Smrg 313010cdda0Smrg# Create the lock directory. 314945aa7e3Smrg# Note: use '[/\\:.-]' here to ensure that we don't use the same name 315010cdda0Smrg# that we are using for the .o file. Also, base the name on the expected 316010cdda0Smrg# object file name, since that is what matters with a parallel build. 317b3eb03f3Smrglockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d 318010cdda0Smrgwhile true; do 319b3eb03f3Smrg if mkdir "$lockdir" >/dev/null 2>&1; then 320b3eb03f3Smrg break 321b3eb03f3Smrg fi 322b3eb03f3Smrg sleep 1 323010cdda0Smrgdone 324010cdda0Smrg# FIXME: race condition here if user kills between mkdir and trap. 325b3eb03f3Smrgtrap "rmdir '$lockdir'; exit 1" 1 2 15 326010cdda0Smrg 327010cdda0Smrg# Run the compile. 328b3eb03f3Smrg"$@" 329b3eb03f3Smrgret=$? 330010cdda0Smrg 331010cdda0Smrgif test -f "$cofile"; then 332af23b0a6Smrg test "$cofile" = "$ofile" || mv "$cofile" "$ofile" 333b3eb03f3Smrgelif test -f "${cofile}bj"; then 334af23b0a6Smrg test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" 335010cdda0Smrgfi 336010cdda0Smrg 337b3eb03f3Smrgrmdir "$lockdir" 338b3eb03f3Smrgexit $ret 339b3eb03f3Smrg 340b3eb03f3Smrg# Local Variables: 341b3eb03f3Smrg# mode: shell-script 342b3eb03f3Smrg# sh-indentation: 2 343945aa7e3Smrg# eval: (add-hook 'before-save-hook 'time-stamp) 344b3eb03f3Smrg# time-stamp-start: "scriptversion=" 345b3eb03f3Smrg# time-stamp-format: "%:y-%02m-%02d.%02H" 346945aa7e3Smrg# time-stamp-time-zone: "UTC0" 347b3eb03f3Smrg# time-stamp-end: "; # UTC" 348b3eb03f3Smrg# End: 349