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