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