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