1533545b5Smrg#! /bin/sh 2533545b5Smrg# Wrapper for compilers which do not understand '-c -o'. 3533545b5Smrg 4dfac8f13Smrgscriptversion=2024-06-19.01; # UTC 5533545b5Smrg 6dfac8f13Smrg# Copyright (C) 1999-2024 Free Software Foundation, Inc. 7533545b5Smrg# Written by Tom Tromey <tromey@cygnus.com>. 8533545b5Smrg# 9533545b5Smrg# This program is free software; you can redistribute it and/or modify 10533545b5Smrg# it under the terms of the GNU General Public License as published by 11533545b5Smrg# the Free Software Foundation; either version 2, or (at your option) 12533545b5Smrg# any later version. 13533545b5Smrg# 14533545b5Smrg# This program is distributed in the hope that it will be useful, 15533545b5Smrg# but WITHOUT ANY WARRANTY; without even the implied warranty of 16533545b5Smrg# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17533545b5Smrg# GNU General Public License for more details. 18533545b5Smrg# 19533545b5Smrg# You should have received a copy of the GNU General Public License 20c9e4df9bSmrg# along with this program. If not, see <https://www.gnu.org/licenses/>. 21533545b5Smrg 22533545b5Smrg# As a special exception to the GNU General Public License, if you 23533545b5Smrg# distribute this file as part of a program that contains a 24533545b5Smrg# configuration script generated by Autoconf, you may include it under 25533545b5Smrg# the same distribution terms that you use for the rest of that program. 26533545b5Smrg 27533545b5Smrg# This file is maintained in Automake, please report 28533545b5Smrg# bugs to <bug-automake@gnu.org> or send patches to 29533545b5Smrg# <automake-patches@gnu.org>. 30533545b5Smrg 31533545b5Smrgnl=' 32533545b5Smrg' 33533545b5Smrg 34533545b5Smrg# We need space, tab and new line, in precisely that order. Quoting is 35533545b5Smrg# there to prevent tools from complaining about whitespace usage. 36533545b5SmrgIFS=" "" $nl" 37533545b5Smrg 38533545b5Smrgfile_conv= 39533545b5Smrg 40533545b5Smrg# func_file_conv build_file lazy 41533545b5Smrg# Convert a $build file to $host form and store it in $file 42533545b5Smrg# Currently only supports Windows hosts. If the determined conversion 43533545b5Smrg# type is listed in (the comma separated) LAZY, no conversion will 44533545b5Smrg# take place. 45533545b5Smrgfunc_file_conv () 46533545b5Smrg{ 47533545b5Smrg file=$1 48533545b5Smrg case $file in 49533545b5Smrg / | /[!/]*) # absolute file, and not a UNC file 50533545b5Smrg if test -z "$file_conv"; then 51533545b5Smrg # lazily determine how to convert abs files 52533545b5Smrg case `uname -s` in 53533545b5Smrg MINGW*) 54533545b5Smrg file_conv=mingw 55533545b5Smrg ;; 56c9e4df9bSmrg CYGWIN* | MSYS*) 57533545b5Smrg file_conv=cygwin 58533545b5Smrg ;; 59533545b5Smrg *) 60533545b5Smrg file_conv=wine 61533545b5Smrg ;; 62533545b5Smrg esac 63533545b5Smrg fi 64533545b5Smrg case $file_conv/,$2, in 65533545b5Smrg *,$file_conv,*) 66533545b5Smrg ;; 67533545b5Smrg mingw/*) 68533545b5Smrg file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` 69533545b5Smrg ;; 70c9e4df9bSmrg cygwin/* | msys/*) 71533545b5Smrg file=`cygpath -m "$file" || echo "$file"` 72533545b5Smrg ;; 73533545b5Smrg wine/*) 74533545b5Smrg file=`winepath -w "$file" || echo "$file"` 75533545b5Smrg ;; 76533545b5Smrg esac 77533545b5Smrg ;; 78533545b5Smrg esac 79533545b5Smrg} 80533545b5Smrg 81533545b5Smrg# func_cl_dashL linkdir 82533545b5Smrg# Make cl look for libraries in LINKDIR 83533545b5Smrgfunc_cl_dashL () 84533545b5Smrg{ 85533545b5Smrg func_file_conv "$1" 86533545b5Smrg if test -z "$lib_path"; then 87533545b5Smrg lib_path=$file 88533545b5Smrg else 89533545b5Smrg lib_path="$lib_path;$file" 90533545b5Smrg fi 91533545b5Smrg linker_opts="$linker_opts -LIBPATH:$file" 92533545b5Smrg} 93533545b5Smrg 94533545b5Smrg# func_cl_dashl library 95533545b5Smrg# Do a library search-path lookup for cl 96533545b5Smrgfunc_cl_dashl () 97533545b5Smrg{ 98533545b5Smrg lib=$1 99533545b5Smrg found=no 100533545b5Smrg save_IFS=$IFS 101533545b5Smrg IFS=';' 102533545b5Smrg for dir in $lib_path $LIB 103533545b5Smrg do 104533545b5Smrg IFS=$save_IFS 105533545b5Smrg if $shared && test -f "$dir/$lib.dll.lib"; then 106533545b5Smrg found=yes 107533545b5Smrg lib=$dir/$lib.dll.lib 108533545b5Smrg break 109533545b5Smrg fi 110533545b5Smrg if test -f "$dir/$lib.lib"; then 111533545b5Smrg found=yes 112533545b5Smrg lib=$dir/$lib.lib 113533545b5Smrg break 114533545b5Smrg fi 115533545b5Smrg if test -f "$dir/lib$lib.a"; then 116533545b5Smrg found=yes 117533545b5Smrg lib=$dir/lib$lib.a 118533545b5Smrg break 119533545b5Smrg fi 120533545b5Smrg done 121533545b5Smrg IFS=$save_IFS 122533545b5Smrg 123533545b5Smrg if test "$found" != yes; then 124533545b5Smrg lib=$lib.lib 125533545b5Smrg fi 126533545b5Smrg} 127533545b5Smrg 128533545b5Smrg# func_cl_wrapper cl arg... 129533545b5Smrg# Adjust compile command to suit cl 130533545b5Smrgfunc_cl_wrapper () 131533545b5Smrg{ 132533545b5Smrg # Assume a capable shell 133533545b5Smrg lib_path= 134533545b5Smrg shared=: 135533545b5Smrg linker_opts= 136533545b5Smrg for arg 137533545b5Smrg do 138533545b5Smrg if test -n "$eat"; then 139533545b5Smrg eat= 140533545b5Smrg else 141533545b5Smrg case $1 in 142533545b5Smrg -o) 143533545b5Smrg # configure might choose to run compile as 'compile cc -o foo foo.c'. 144533545b5Smrg eat=1 145533545b5Smrg case $2 in 146dfac8f13Smrg *.o | *.lo | *.[oO][bB][jJ]) 147533545b5Smrg func_file_conv "$2" 148533545b5Smrg set x "$@" -Fo"$file" 149533545b5Smrg shift 150533545b5Smrg ;; 151533545b5Smrg *) 152533545b5Smrg func_file_conv "$2" 153533545b5Smrg set x "$@" -Fe"$file" 154533545b5Smrg shift 155533545b5Smrg ;; 156533545b5Smrg esac 157533545b5Smrg ;; 158533545b5Smrg -I) 159533545b5Smrg eat=1 160533545b5Smrg func_file_conv "$2" mingw 161533545b5Smrg set x "$@" -I"$file" 162533545b5Smrg shift 163533545b5Smrg ;; 164533545b5Smrg -I*) 165533545b5Smrg func_file_conv "${1#-I}" mingw 166533545b5Smrg set x "$@" -I"$file" 167533545b5Smrg shift 168533545b5Smrg ;; 169533545b5Smrg -l) 170533545b5Smrg eat=1 171533545b5Smrg func_cl_dashl "$2" 172533545b5Smrg set x "$@" "$lib" 173533545b5Smrg shift 174533545b5Smrg ;; 175533545b5Smrg -l*) 176533545b5Smrg func_cl_dashl "${1#-l}" 177533545b5Smrg set x "$@" "$lib" 178533545b5Smrg shift 179533545b5Smrg ;; 180533545b5Smrg -L) 181533545b5Smrg eat=1 182533545b5Smrg func_cl_dashL "$2" 183533545b5Smrg ;; 184533545b5Smrg -L*) 185533545b5Smrg func_cl_dashL "${1#-L}" 186533545b5Smrg ;; 187533545b5Smrg -static) 188533545b5Smrg shared=false 189533545b5Smrg ;; 190533545b5Smrg -Wl,*) 191533545b5Smrg arg=${1#-Wl,} 192533545b5Smrg save_ifs="$IFS"; IFS=',' 193533545b5Smrg for flag in $arg; do 194533545b5Smrg IFS="$save_ifs" 195533545b5Smrg linker_opts="$linker_opts $flag" 196533545b5Smrg done 197533545b5Smrg IFS="$save_ifs" 198533545b5Smrg ;; 199533545b5Smrg -Xlinker) 200533545b5Smrg eat=1 201533545b5Smrg linker_opts="$linker_opts $2" 202533545b5Smrg ;; 203533545b5Smrg -*) 204533545b5Smrg set x "$@" "$1" 205533545b5Smrg shift 206533545b5Smrg ;; 207533545b5Smrg *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) 208533545b5Smrg func_file_conv "$1" 209533545b5Smrg set x "$@" -Tp"$file" 210533545b5Smrg shift 211533545b5Smrg ;; 212533545b5Smrg *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) 213533545b5Smrg func_file_conv "$1" mingw 214533545b5Smrg set x "$@" "$file" 215533545b5Smrg shift 216533545b5Smrg ;; 217533545b5Smrg *) 218533545b5Smrg set x "$@" "$1" 219533545b5Smrg shift 220533545b5Smrg ;; 221533545b5Smrg esac 222533545b5Smrg fi 223533545b5Smrg shift 224533545b5Smrg done 225533545b5Smrg if test -n "$linker_opts"; then 226533545b5Smrg linker_opts="-link$linker_opts" 227533545b5Smrg fi 228533545b5Smrg exec "$@" $linker_opts 229533545b5Smrg exit 1 230533545b5Smrg} 231533545b5Smrg 232533545b5Smrgeat= 233533545b5Smrg 234533545b5Smrgcase $1 in 235533545b5Smrg '') 236533545b5Smrg echo "$0: No command. Try '$0 --help' for more information." 1>&2 237533545b5Smrg exit 1; 238533545b5Smrg ;; 239533545b5Smrg -h | --h*) 240533545b5Smrg cat <<\EOF 241533545b5SmrgUsage: compile [--help] [--version] PROGRAM [ARGS] 242533545b5Smrg 243533545b5SmrgWrapper for compilers which do not understand '-c -o'. 244533545b5SmrgRemove '-o dest.o' from ARGS, run PROGRAM with the remaining 245533545b5Smrgarguments, and rename the output as expected. 246533545b5Smrg 247533545b5SmrgIf you are trying to build a whole package this is not the 248533545b5Smrgright script to run: please start by reading the file 'INSTALL'. 249533545b5Smrg 250533545b5SmrgReport bugs to <bug-automake@gnu.org>. 251dfac8f13SmrgGNU Automake home page: <https://www.gnu.org/software/automake/>. 252dfac8f13SmrgGeneral help using GNU software: <https://www.gnu.org/gethelp/>. 253533545b5SmrgEOF 254533545b5Smrg exit $? 255533545b5Smrg ;; 256533545b5Smrg -v | --v*) 257dfac8f13Smrg echo "compile (GNU Automake) $scriptversion" 258533545b5Smrg exit $? 259533545b5Smrg ;; 260c9e4df9bSmrg cl | *[/\\]cl | cl.exe | *[/\\]cl.exe | \ 261dfac8f13Smrg clang-cl | *[/\\]clang-cl | clang-cl.exe | *[/\\]clang-cl.exe | \ 262c9e4df9bSmrg icl | *[/\\]icl | icl.exe | *[/\\]icl.exe ) 263533545b5Smrg func_cl_wrapper "$@" # Doesn't return... 264533545b5Smrg ;; 265533545b5Smrgesac 266533545b5Smrg 267533545b5Smrgofile= 268533545b5Smrgcfile= 269533545b5Smrg 270533545b5Smrgfor arg 271533545b5Smrgdo 272533545b5Smrg if test -n "$eat"; then 273533545b5Smrg eat= 274533545b5Smrg else 275533545b5Smrg case $1 in 276533545b5Smrg -o) 277533545b5Smrg # configure might choose to run compile as 'compile cc -o foo foo.c'. 278533545b5Smrg # So we strip '-o arg' only if arg is an object. 279533545b5Smrg eat=1 280533545b5Smrg case $2 in 281533545b5Smrg *.o | *.obj) 282533545b5Smrg ofile=$2 283533545b5Smrg ;; 284533545b5Smrg *) 285533545b5Smrg set x "$@" -o "$2" 286533545b5Smrg shift 287533545b5Smrg ;; 288533545b5Smrg esac 289533545b5Smrg ;; 290533545b5Smrg *.c) 291533545b5Smrg cfile=$1 292533545b5Smrg set x "$@" "$1" 293533545b5Smrg shift 294533545b5Smrg ;; 295533545b5Smrg *) 296533545b5Smrg set x "$@" "$1" 297533545b5Smrg shift 298533545b5Smrg ;; 299533545b5Smrg esac 300533545b5Smrg fi 301533545b5Smrg shift 302533545b5Smrgdone 303533545b5Smrg 304533545b5Smrgif test -z "$ofile" || test -z "$cfile"; then 305533545b5Smrg # If no '-o' option was seen then we might have been invoked from a 306533545b5Smrg # pattern rule where we don't need one. That is ok -- this is a 307533545b5Smrg # normal compilation that the losing compiler can handle. If no 308533545b5Smrg # '.c' file was seen then we are probably linking. That is also 309533545b5Smrg # ok. 310533545b5Smrg exec "$@" 311533545b5Smrgfi 312533545b5Smrg 313533545b5Smrg# Name of file we expect compiler to create. 314533545b5Smrgcofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` 315533545b5Smrg 316533545b5Smrg# Create the lock directory. 317533545b5Smrg# Note: use '[/\\:.-]' here to ensure that we don't use the same name 318533545b5Smrg# that we are using for the .o file. Also, base the name on the expected 319533545b5Smrg# object file name, since that is what matters with a parallel build. 320533545b5Smrglockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d 321533545b5Smrgwhile true; do 322533545b5Smrg if mkdir "$lockdir" >/dev/null 2>&1; then 323533545b5Smrg break 324533545b5Smrg fi 325533545b5Smrg sleep 1 326533545b5Smrgdone 327533545b5Smrg# FIXME: race condition here if user kills between mkdir and trap. 328533545b5Smrgtrap "rmdir '$lockdir'; exit 1" 1 2 15 329533545b5Smrg 330533545b5Smrg# Run the compile. 331533545b5Smrg"$@" 332533545b5Smrgret=$? 333533545b5Smrg 334533545b5Smrgif test -f "$cofile"; then 335533545b5Smrg test "$cofile" = "$ofile" || mv "$cofile" "$ofile" 336533545b5Smrgelif test -f "${cofile}bj"; then 337533545b5Smrg test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" 338533545b5Smrgfi 339533545b5Smrg 340533545b5Smrgrmdir "$lockdir" 341533545b5Smrgexit $ret 342533545b5Smrg 343533545b5Smrg# Local Variables: 344533545b5Smrg# mode: shell-script 345533545b5Smrg# sh-indentation: 2 346c9e4df9bSmrg# eval: (add-hook 'before-save-hook 'time-stamp) 347533545b5Smrg# time-stamp-start: "scriptversion=" 348533545b5Smrg# time-stamp-format: "%:y-%02m-%02d.%02H" 349c9e4df9bSmrg# time-stamp-time-zone: "UTC0" 350533545b5Smrg# time-stamp-end: "; # UTC" 351533545b5Smrg# End: 352