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