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