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