17cea3689Smrg#! /bin/sh 27cea3689Smrg# Wrapper for compilers which do not understand '-c -o'. 37cea3689Smrg 4ae545d91Smrgscriptversion=2024-06-19.01; # UTC 57cea3689Smrg 6ae545d91Smrg# Copyright (C) 1999-2024 Free Software Foundation, Inc. 77cea3689Smrg# Written by Tom Tromey <tromey@cygnus.com>. 87cea3689Smrg# 97cea3689Smrg# This program is free software; you can redistribute it and/or modify 107cea3689Smrg# it under the terms of the GNU General Public License as published by 117cea3689Smrg# the Free Software Foundation; either version 2, or (at your option) 127cea3689Smrg# any later version. 137cea3689Smrg# 147cea3689Smrg# This program is distributed in the hope that it will be useful, 157cea3689Smrg# but WITHOUT ANY WARRANTY; without even the implied warranty of 167cea3689Smrg# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 177cea3689Smrg# GNU General Public License for more details. 187cea3689Smrg# 197cea3689Smrg# You should have received a copy of the GNU General Public License 2095b7a5c8Smrg# along with this program. If not, see <https://www.gnu.org/licenses/>. 217cea3689Smrg 227cea3689Smrg# As a special exception to the GNU General Public License, if you 237cea3689Smrg# distribute this file as part of a program that contains a 247cea3689Smrg# configuration script generated by Autoconf, you may include it under 257cea3689Smrg# the same distribution terms that you use for the rest of that program. 267cea3689Smrg 277cea3689Smrg# This file is maintained in Automake, please report 287cea3689Smrg# bugs to <bug-automake@gnu.org> or send patches to 297cea3689Smrg# <automake-patches@gnu.org>. 307cea3689Smrg 317cea3689Smrgnl=' 327cea3689Smrg' 337cea3689Smrg 347cea3689Smrg# We need space, tab and new line, in precisely that order. Quoting is 357cea3689Smrg# there to prevent tools from complaining about whitespace usage. 367cea3689SmrgIFS=" "" $nl" 377cea3689Smrg 387cea3689Smrgfile_conv= 397cea3689Smrg 407cea3689Smrg# func_file_conv build_file lazy 417cea3689Smrg# Convert a $build file to $host form and store it in $file 427cea3689Smrg# Currently only supports Windows hosts. If the determined conversion 437cea3689Smrg# type is listed in (the comma separated) LAZY, no conversion will 447cea3689Smrg# take place. 457cea3689Smrgfunc_file_conv () 467cea3689Smrg{ 477cea3689Smrg file=$1 487cea3689Smrg case $file in 497cea3689Smrg / | /[!/]*) # absolute file, and not a UNC file 507cea3689Smrg if test -z "$file_conv"; then 517cea3689Smrg # lazily determine how to convert abs files 527cea3689Smrg case `uname -s` in 537cea3689Smrg MINGW*) 547cea3689Smrg file_conv=mingw 557cea3689Smrg ;; 5695b7a5c8Smrg CYGWIN* | MSYS*) 577cea3689Smrg file_conv=cygwin 587cea3689Smrg ;; 597cea3689Smrg *) 607cea3689Smrg file_conv=wine 617cea3689Smrg ;; 627cea3689Smrg esac 637cea3689Smrg fi 647cea3689Smrg case $file_conv/,$2, in 657cea3689Smrg *,$file_conv,*) 667cea3689Smrg ;; 677cea3689Smrg mingw/*) 687cea3689Smrg file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` 697cea3689Smrg ;; 7095b7a5c8Smrg cygwin/* | msys/*) 717cea3689Smrg file=`cygpath -m "$file" || echo "$file"` 727cea3689Smrg ;; 737cea3689Smrg wine/*) 747cea3689Smrg file=`winepath -w "$file" || echo "$file"` 757cea3689Smrg ;; 767cea3689Smrg esac 777cea3689Smrg ;; 787cea3689Smrg esac 797cea3689Smrg} 807cea3689Smrg 817cea3689Smrg# func_cl_dashL linkdir 827cea3689Smrg# Make cl look for libraries in LINKDIR 837cea3689Smrgfunc_cl_dashL () 847cea3689Smrg{ 857cea3689Smrg func_file_conv "$1" 867cea3689Smrg if test -z "$lib_path"; then 877cea3689Smrg lib_path=$file 887cea3689Smrg else 897cea3689Smrg lib_path="$lib_path;$file" 907cea3689Smrg fi 917cea3689Smrg linker_opts="$linker_opts -LIBPATH:$file" 927cea3689Smrg} 937cea3689Smrg 947cea3689Smrg# func_cl_dashl library 957cea3689Smrg# Do a library search-path lookup for cl 967cea3689Smrgfunc_cl_dashl () 977cea3689Smrg{ 987cea3689Smrg lib=$1 997cea3689Smrg found=no 1007cea3689Smrg save_IFS=$IFS 1017cea3689Smrg IFS=';' 1027cea3689Smrg for dir in $lib_path $LIB 1037cea3689Smrg do 1047cea3689Smrg IFS=$save_IFS 1057cea3689Smrg if $shared && test -f "$dir/$lib.dll.lib"; then 1067cea3689Smrg found=yes 1077cea3689Smrg lib=$dir/$lib.dll.lib 1087cea3689Smrg break 1097cea3689Smrg fi 1107cea3689Smrg if test -f "$dir/$lib.lib"; then 1117cea3689Smrg found=yes 1127cea3689Smrg lib=$dir/$lib.lib 1137cea3689Smrg break 1147cea3689Smrg fi 1157cea3689Smrg if test -f "$dir/lib$lib.a"; then 1167cea3689Smrg found=yes 1177cea3689Smrg lib=$dir/lib$lib.a 1187cea3689Smrg break 1197cea3689Smrg fi 1207cea3689Smrg done 1217cea3689Smrg IFS=$save_IFS 1227cea3689Smrg 1237cea3689Smrg if test "$found" != yes; then 1247cea3689Smrg lib=$lib.lib 1257cea3689Smrg fi 1267cea3689Smrg} 1277cea3689Smrg 1287cea3689Smrg# func_cl_wrapper cl arg... 1297cea3689Smrg# Adjust compile command to suit cl 1307cea3689Smrgfunc_cl_wrapper () 1317cea3689Smrg{ 1327cea3689Smrg # Assume a capable shell 1337cea3689Smrg lib_path= 1347cea3689Smrg shared=: 1357cea3689Smrg linker_opts= 1367cea3689Smrg for arg 1377cea3689Smrg do 1387cea3689Smrg if test -n "$eat"; then 1397cea3689Smrg eat= 1407cea3689Smrg else 1417cea3689Smrg case $1 in 1427cea3689Smrg -o) 1437cea3689Smrg # configure might choose to run compile as 'compile cc -o foo foo.c'. 1447cea3689Smrg eat=1 1457cea3689Smrg case $2 in 146ae545d91Smrg *.o | *.lo | *.[oO][bB][jJ]) 1477cea3689Smrg func_file_conv "$2" 1487cea3689Smrg set x "$@" -Fo"$file" 1497cea3689Smrg shift 1507cea3689Smrg ;; 1517cea3689Smrg *) 1527cea3689Smrg func_file_conv "$2" 1537cea3689Smrg set x "$@" -Fe"$file" 1547cea3689Smrg shift 1557cea3689Smrg ;; 1567cea3689Smrg esac 1577cea3689Smrg ;; 1587cea3689Smrg -I) 1597cea3689Smrg eat=1 1607cea3689Smrg func_file_conv "$2" mingw 1617cea3689Smrg set x "$@" -I"$file" 1627cea3689Smrg shift 1637cea3689Smrg ;; 1647cea3689Smrg -I*) 1657cea3689Smrg func_file_conv "${1#-I}" mingw 1667cea3689Smrg set x "$@" -I"$file" 1677cea3689Smrg shift 1687cea3689Smrg ;; 1697cea3689Smrg -l) 1707cea3689Smrg eat=1 1717cea3689Smrg func_cl_dashl "$2" 1727cea3689Smrg set x "$@" "$lib" 1737cea3689Smrg shift 1747cea3689Smrg ;; 1757cea3689Smrg -l*) 1767cea3689Smrg func_cl_dashl "${1#-l}" 1777cea3689Smrg set x "$@" "$lib" 1787cea3689Smrg shift 1797cea3689Smrg ;; 1807cea3689Smrg -L) 1817cea3689Smrg eat=1 1827cea3689Smrg func_cl_dashL "$2" 1837cea3689Smrg ;; 1847cea3689Smrg -L*) 1857cea3689Smrg func_cl_dashL "${1#-L}" 1867cea3689Smrg ;; 1877cea3689Smrg -static) 1887cea3689Smrg shared=false 1897cea3689Smrg ;; 1907cea3689Smrg -Wl,*) 1917cea3689Smrg arg=${1#-Wl,} 1927cea3689Smrg save_ifs="$IFS"; IFS=',' 1937cea3689Smrg for flag in $arg; do 1947cea3689Smrg IFS="$save_ifs" 1957cea3689Smrg linker_opts="$linker_opts $flag" 1967cea3689Smrg done 1977cea3689Smrg IFS="$save_ifs" 1987cea3689Smrg ;; 1997cea3689Smrg -Xlinker) 2007cea3689Smrg eat=1 2017cea3689Smrg linker_opts="$linker_opts $2" 2027cea3689Smrg ;; 2037cea3689Smrg -*) 2047cea3689Smrg set x "$@" "$1" 2057cea3689Smrg shift 2067cea3689Smrg ;; 2077cea3689Smrg *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) 2087cea3689Smrg func_file_conv "$1" 2097cea3689Smrg set x "$@" -Tp"$file" 2107cea3689Smrg shift 2117cea3689Smrg ;; 2127cea3689Smrg *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) 2137cea3689Smrg func_file_conv "$1" mingw 2147cea3689Smrg set x "$@" "$file" 2157cea3689Smrg shift 2167cea3689Smrg ;; 2177cea3689Smrg *) 2187cea3689Smrg set x "$@" "$1" 2197cea3689Smrg shift 2207cea3689Smrg ;; 2217cea3689Smrg esac 2227cea3689Smrg fi 2237cea3689Smrg shift 2247cea3689Smrg done 2257cea3689Smrg if test -n "$linker_opts"; then 2267cea3689Smrg linker_opts="-link$linker_opts" 2277cea3689Smrg fi 2287cea3689Smrg exec "$@" $linker_opts 2297cea3689Smrg exit 1 2307cea3689Smrg} 2317cea3689Smrg 2327cea3689Smrgeat= 2337cea3689Smrg 2347cea3689Smrgcase $1 in 2357cea3689Smrg '') 2367cea3689Smrg echo "$0: No command. Try '$0 --help' for more information." 1>&2 2377cea3689Smrg exit 1; 2387cea3689Smrg ;; 2397cea3689Smrg -h | --h*) 2407cea3689Smrg cat <<\EOF 2417cea3689SmrgUsage: compile [--help] [--version] PROGRAM [ARGS] 2427cea3689Smrg 2437cea3689SmrgWrapper for compilers which do not understand '-c -o'. 2447cea3689SmrgRemove '-o dest.o' from ARGS, run PROGRAM with the remaining 2457cea3689Smrgarguments, and rename the output as expected. 2467cea3689Smrg 2477cea3689SmrgIf you are trying to build a whole package this is not the 2487cea3689Smrgright script to run: please start by reading the file 'INSTALL'. 2497cea3689Smrg 2507cea3689SmrgReport bugs to <bug-automake@gnu.org>. 251ae545d91SmrgGNU Automake home page: <https://www.gnu.org/software/automake/>. 252ae545d91SmrgGeneral help using GNU software: <https://www.gnu.org/gethelp/>. 2537cea3689SmrgEOF 2547cea3689Smrg exit $? 2557cea3689Smrg ;; 2567cea3689Smrg -v | --v*) 257ae545d91Smrg echo "compile (GNU Automake) $scriptversion" 2587cea3689Smrg exit $? 2597cea3689Smrg ;; 26095b7a5c8Smrg cl | *[/\\]cl | cl.exe | *[/\\]cl.exe | \ 261ae545d91Smrg clang-cl | *[/\\]clang-cl | clang-cl.exe | *[/\\]clang-cl.exe | \ 26295b7a5c8Smrg icl | *[/\\]icl | icl.exe | *[/\\]icl.exe ) 2637cea3689Smrg func_cl_wrapper "$@" # Doesn't return... 2647cea3689Smrg ;; 2657cea3689Smrgesac 2667cea3689Smrg 2677cea3689Smrgofile= 2687cea3689Smrgcfile= 2697cea3689Smrg 2707cea3689Smrgfor arg 2717cea3689Smrgdo 2727cea3689Smrg if test -n "$eat"; then 2737cea3689Smrg eat= 2747cea3689Smrg else 2757cea3689Smrg case $1 in 2767cea3689Smrg -o) 2777cea3689Smrg # configure might choose to run compile as 'compile cc -o foo foo.c'. 2787cea3689Smrg # So we strip '-o arg' only if arg is an object. 2797cea3689Smrg eat=1 2807cea3689Smrg case $2 in 2817cea3689Smrg *.o | *.obj) 2827cea3689Smrg ofile=$2 2837cea3689Smrg ;; 2847cea3689Smrg *) 2857cea3689Smrg set x "$@" -o "$2" 2867cea3689Smrg shift 2877cea3689Smrg ;; 2887cea3689Smrg esac 2897cea3689Smrg ;; 2907cea3689Smrg *.c) 2917cea3689Smrg cfile=$1 2927cea3689Smrg set x "$@" "$1" 2937cea3689Smrg shift 2947cea3689Smrg ;; 2957cea3689Smrg *) 2967cea3689Smrg set x "$@" "$1" 2977cea3689Smrg shift 2987cea3689Smrg ;; 2997cea3689Smrg esac 3007cea3689Smrg fi 3017cea3689Smrg shift 3027cea3689Smrgdone 3037cea3689Smrg 3047cea3689Smrgif test -z "$ofile" || test -z "$cfile"; then 3057cea3689Smrg # If no '-o' option was seen then we might have been invoked from a 3067cea3689Smrg # pattern rule where we don't need one. That is ok -- this is a 3077cea3689Smrg # normal compilation that the losing compiler can handle. If no 3087cea3689Smrg # '.c' file was seen then we are probably linking. That is also 3097cea3689Smrg # ok. 3107cea3689Smrg exec "$@" 3117cea3689Smrgfi 3127cea3689Smrg 3137cea3689Smrg# Name of file we expect compiler to create. 3147cea3689Smrgcofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` 3157cea3689Smrg 3167cea3689Smrg# Create the lock directory. 3177cea3689Smrg# Note: use '[/\\:.-]' here to ensure that we don't use the same name 3187cea3689Smrg# that we are using for the .o file. Also, base the name on the expected 3197cea3689Smrg# object file name, since that is what matters with a parallel build. 3207cea3689Smrglockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d 3217cea3689Smrgwhile true; do 3227cea3689Smrg if mkdir "$lockdir" >/dev/null 2>&1; then 3237cea3689Smrg break 3247cea3689Smrg fi 3257cea3689Smrg sleep 1 3267cea3689Smrgdone 3277cea3689Smrg# FIXME: race condition here if user kills between mkdir and trap. 3287cea3689Smrgtrap "rmdir '$lockdir'; exit 1" 1 2 15 3297cea3689Smrg 3307cea3689Smrg# Run the compile. 3317cea3689Smrg"$@" 3327cea3689Smrgret=$? 3337cea3689Smrg 3347cea3689Smrgif test -f "$cofile"; then 3357cea3689Smrg test "$cofile" = "$ofile" || mv "$cofile" "$ofile" 3367cea3689Smrgelif test -f "${cofile}bj"; then 3377cea3689Smrg test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" 3387cea3689Smrgfi 3397cea3689Smrg 3407cea3689Smrgrmdir "$lockdir" 3417cea3689Smrgexit $ret 3427cea3689Smrg 3437cea3689Smrg# Local Variables: 3447cea3689Smrg# mode: shell-script 3457cea3689Smrg# sh-indentation: 2 34695b7a5c8Smrg# eval: (add-hook 'before-save-hook 'time-stamp) 3477cea3689Smrg# time-stamp-start: "scriptversion=" 3487cea3689Smrg# time-stamp-format: "%:y-%02m-%02d.%02H" 34995b7a5c8Smrg# time-stamp-time-zone: "UTC0" 3507cea3689Smrg# time-stamp-end: "; # UTC" 3517cea3689Smrg# End: 352