compile revision 4f87a9f1
12d6e8b77Smrg#! /bin/sh 22d6e8b77Smrg# Wrapper for compilers which do not understand '-c -o'. 32d6e8b77Smrg 44f87a9f1Smrgscriptversion=2018-03-07.03; # UTC 52d6e8b77Smrg 64f87a9f1Smrg# Copyright (C) 1999-2021 Free Software Foundation, Inc. 72d6e8b77Smrg# Written by Tom Tromey <tromey@cygnus.com>. 82d6e8b77Smrg# 92d6e8b77Smrg# This program is free software; you can redistribute it and/or modify 102d6e8b77Smrg# it under the terms of the GNU General Public License as published by 112d6e8b77Smrg# the Free Software Foundation; either version 2, or (at your option) 122d6e8b77Smrg# any later version. 132d6e8b77Smrg# 142d6e8b77Smrg# This program is distributed in the hope that it will be useful, 152d6e8b77Smrg# but WITHOUT ANY WARRANTY; without even the implied warranty of 162d6e8b77Smrg# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 172d6e8b77Smrg# GNU General Public License for more details. 182d6e8b77Smrg# 192d6e8b77Smrg# You should have received a copy of the GNU General Public License 204f87a9f1Smrg# along with this program. If not, see <https://www.gnu.org/licenses/>. 212d6e8b77Smrg 222d6e8b77Smrg# As a special exception to the GNU General Public License, if you 232d6e8b77Smrg# distribute this file as part of a program that contains a 242d6e8b77Smrg# configuration script generated by Autoconf, you may include it under 252d6e8b77Smrg# the same distribution terms that you use for the rest of that program. 262d6e8b77Smrg 272d6e8b77Smrg# This file is maintained in Automake, please report 282d6e8b77Smrg# bugs to <bug-automake@gnu.org> or send patches to 292d6e8b77Smrg# <automake-patches@gnu.org>. 302d6e8b77Smrg 312d6e8b77Smrgnl=' 322d6e8b77Smrg' 332d6e8b77Smrg 342d6e8b77Smrg# We need space, tab and new line, in precisely that order. Quoting is 352d6e8b77Smrg# there to prevent tools from complaining about whitespace usage. 362d6e8b77SmrgIFS=" "" $nl" 372d6e8b77Smrg 382d6e8b77Smrgfile_conv= 392d6e8b77Smrg 402d6e8b77Smrg# func_file_conv build_file lazy 412d6e8b77Smrg# Convert a $build file to $host form and store it in $file 422d6e8b77Smrg# Currently only supports Windows hosts. If the determined conversion 432d6e8b77Smrg# type is listed in (the comma separated) LAZY, no conversion will 442d6e8b77Smrg# take place. 452d6e8b77Smrgfunc_file_conv () 462d6e8b77Smrg{ 472d6e8b77Smrg file=$1 482d6e8b77Smrg case $file in 492d6e8b77Smrg / | /[!/]*) # absolute file, and not a UNC file 502d6e8b77Smrg if test -z "$file_conv"; then 512d6e8b77Smrg # lazily determine how to convert abs files 522d6e8b77Smrg case `uname -s` in 532d6e8b77Smrg MINGW*) 542d6e8b77Smrg file_conv=mingw 552d6e8b77Smrg ;; 564f87a9f1Smrg CYGWIN* | MSYS*) 572d6e8b77Smrg file_conv=cygwin 582d6e8b77Smrg ;; 592d6e8b77Smrg *) 602d6e8b77Smrg file_conv=wine 612d6e8b77Smrg ;; 622d6e8b77Smrg esac 632d6e8b77Smrg fi 642d6e8b77Smrg case $file_conv/,$2, in 652d6e8b77Smrg *,$file_conv,*) 662d6e8b77Smrg ;; 672d6e8b77Smrg mingw/*) 682d6e8b77Smrg file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` 692d6e8b77Smrg ;; 704f87a9f1Smrg cygwin/* | msys/*) 712d6e8b77Smrg file=`cygpath -m "$file" || echo "$file"` 722d6e8b77Smrg ;; 732d6e8b77Smrg wine/*) 742d6e8b77Smrg file=`winepath -w "$file" || echo "$file"` 752d6e8b77Smrg ;; 762d6e8b77Smrg esac 772d6e8b77Smrg ;; 782d6e8b77Smrg esac 792d6e8b77Smrg} 802d6e8b77Smrg 812d6e8b77Smrg# func_cl_dashL linkdir 822d6e8b77Smrg# Make cl look for libraries in LINKDIR 832d6e8b77Smrgfunc_cl_dashL () 842d6e8b77Smrg{ 852d6e8b77Smrg func_file_conv "$1" 862d6e8b77Smrg if test -z "$lib_path"; then 872d6e8b77Smrg lib_path=$file 882d6e8b77Smrg else 892d6e8b77Smrg lib_path="$lib_path;$file" 902d6e8b77Smrg fi 912d6e8b77Smrg linker_opts="$linker_opts -LIBPATH:$file" 922d6e8b77Smrg} 932d6e8b77Smrg 942d6e8b77Smrg# func_cl_dashl library 952d6e8b77Smrg# Do a library search-path lookup for cl 962d6e8b77Smrgfunc_cl_dashl () 972d6e8b77Smrg{ 982d6e8b77Smrg lib=$1 992d6e8b77Smrg found=no 1002d6e8b77Smrg save_IFS=$IFS 1012d6e8b77Smrg IFS=';' 1022d6e8b77Smrg for dir in $lib_path $LIB 1032d6e8b77Smrg do 1042d6e8b77Smrg IFS=$save_IFS 1052d6e8b77Smrg if $shared && test -f "$dir/$lib.dll.lib"; then 1062d6e8b77Smrg found=yes 1072d6e8b77Smrg lib=$dir/$lib.dll.lib 1082d6e8b77Smrg break 1092d6e8b77Smrg fi 1102d6e8b77Smrg if test -f "$dir/$lib.lib"; then 1112d6e8b77Smrg found=yes 1122d6e8b77Smrg lib=$dir/$lib.lib 1132d6e8b77Smrg break 1142d6e8b77Smrg fi 1152d6e8b77Smrg if test -f "$dir/lib$lib.a"; then 1162d6e8b77Smrg found=yes 1172d6e8b77Smrg lib=$dir/lib$lib.a 1182d6e8b77Smrg break 1192d6e8b77Smrg fi 1202d6e8b77Smrg done 1212d6e8b77Smrg IFS=$save_IFS 1222d6e8b77Smrg 1232d6e8b77Smrg if test "$found" != yes; then 1242d6e8b77Smrg lib=$lib.lib 1252d6e8b77Smrg fi 1262d6e8b77Smrg} 1272d6e8b77Smrg 1282d6e8b77Smrg# func_cl_wrapper cl arg... 1292d6e8b77Smrg# Adjust compile command to suit cl 1302d6e8b77Smrgfunc_cl_wrapper () 1312d6e8b77Smrg{ 1322d6e8b77Smrg # Assume a capable shell 1332d6e8b77Smrg lib_path= 1342d6e8b77Smrg shared=: 1352d6e8b77Smrg linker_opts= 1362d6e8b77Smrg for arg 1372d6e8b77Smrg do 1382d6e8b77Smrg if test -n "$eat"; then 1392d6e8b77Smrg eat= 1402d6e8b77Smrg else 1412d6e8b77Smrg case $1 in 1422d6e8b77Smrg -o) 1432d6e8b77Smrg # configure might choose to run compile as 'compile cc -o foo foo.c'. 1442d6e8b77Smrg eat=1 1452d6e8b77Smrg case $2 in 1462d6e8b77Smrg *.o | *.[oO][bB][jJ]) 1472d6e8b77Smrg func_file_conv "$2" 1482d6e8b77Smrg set x "$@" -Fo"$file" 1492d6e8b77Smrg shift 1502d6e8b77Smrg ;; 1512d6e8b77Smrg *) 1522d6e8b77Smrg func_file_conv "$2" 1532d6e8b77Smrg set x "$@" -Fe"$file" 1542d6e8b77Smrg shift 1552d6e8b77Smrg ;; 1562d6e8b77Smrg esac 1572d6e8b77Smrg ;; 1582d6e8b77Smrg -I) 1592d6e8b77Smrg eat=1 1602d6e8b77Smrg func_file_conv "$2" mingw 1612d6e8b77Smrg set x "$@" -I"$file" 1622d6e8b77Smrg shift 1632d6e8b77Smrg ;; 1642d6e8b77Smrg -I*) 1652d6e8b77Smrg func_file_conv "${1#-I}" mingw 1662d6e8b77Smrg set x "$@" -I"$file" 1672d6e8b77Smrg shift 1682d6e8b77Smrg ;; 1692d6e8b77Smrg -l) 1702d6e8b77Smrg eat=1 1712d6e8b77Smrg func_cl_dashl "$2" 1722d6e8b77Smrg set x "$@" "$lib" 1732d6e8b77Smrg shift 1742d6e8b77Smrg ;; 1752d6e8b77Smrg -l*) 1762d6e8b77Smrg func_cl_dashl "${1#-l}" 1772d6e8b77Smrg set x "$@" "$lib" 1782d6e8b77Smrg shift 1792d6e8b77Smrg ;; 1802d6e8b77Smrg -L) 1812d6e8b77Smrg eat=1 1822d6e8b77Smrg func_cl_dashL "$2" 1832d6e8b77Smrg ;; 1842d6e8b77Smrg -L*) 1852d6e8b77Smrg func_cl_dashL "${1#-L}" 1862d6e8b77Smrg ;; 1872d6e8b77Smrg -static) 1882d6e8b77Smrg shared=false 1892d6e8b77Smrg ;; 1902d6e8b77Smrg -Wl,*) 1912d6e8b77Smrg arg=${1#-Wl,} 1922d6e8b77Smrg save_ifs="$IFS"; IFS=',' 1932d6e8b77Smrg for flag in $arg; do 1942d6e8b77Smrg IFS="$save_ifs" 1952d6e8b77Smrg linker_opts="$linker_opts $flag" 1962d6e8b77Smrg done 1972d6e8b77Smrg IFS="$save_ifs" 1982d6e8b77Smrg ;; 1992d6e8b77Smrg -Xlinker) 2002d6e8b77Smrg eat=1 2012d6e8b77Smrg linker_opts="$linker_opts $2" 2022d6e8b77Smrg ;; 2032d6e8b77Smrg -*) 2042d6e8b77Smrg set x "$@" "$1" 2052d6e8b77Smrg shift 2062d6e8b77Smrg ;; 2072d6e8b77Smrg *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) 2082d6e8b77Smrg func_file_conv "$1" 2092d6e8b77Smrg set x "$@" -Tp"$file" 2102d6e8b77Smrg shift 2112d6e8b77Smrg ;; 2122d6e8b77Smrg *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) 2132d6e8b77Smrg func_file_conv "$1" mingw 2142d6e8b77Smrg set x "$@" "$file" 2152d6e8b77Smrg shift 2162d6e8b77Smrg ;; 2172d6e8b77Smrg *) 2182d6e8b77Smrg set x "$@" "$1" 2192d6e8b77Smrg shift 2202d6e8b77Smrg ;; 2212d6e8b77Smrg esac 2222d6e8b77Smrg fi 2232d6e8b77Smrg shift 2242d6e8b77Smrg done 2252d6e8b77Smrg if test -n "$linker_opts"; then 2262d6e8b77Smrg linker_opts="-link$linker_opts" 2272d6e8b77Smrg fi 2282d6e8b77Smrg exec "$@" $linker_opts 2292d6e8b77Smrg exit 1 2302d6e8b77Smrg} 2312d6e8b77Smrg 2322d6e8b77Smrgeat= 2332d6e8b77Smrg 2342d6e8b77Smrgcase $1 in 2352d6e8b77Smrg '') 2362d6e8b77Smrg echo "$0: No command. Try '$0 --help' for more information." 1>&2 2372d6e8b77Smrg exit 1; 2382d6e8b77Smrg ;; 2392d6e8b77Smrg -h | --h*) 2402d6e8b77Smrg cat <<\EOF 2412d6e8b77SmrgUsage: compile [--help] [--version] PROGRAM [ARGS] 2422d6e8b77Smrg 2432d6e8b77SmrgWrapper for compilers which do not understand '-c -o'. 2442d6e8b77SmrgRemove '-o dest.o' from ARGS, run PROGRAM with the remaining 2452d6e8b77Smrgarguments, and rename the output as expected. 2462d6e8b77Smrg 2472d6e8b77SmrgIf you are trying to build a whole package this is not the 2482d6e8b77Smrgright script to run: please start by reading the file 'INSTALL'. 2492d6e8b77Smrg 2502d6e8b77SmrgReport bugs to <bug-automake@gnu.org>. 2512d6e8b77SmrgEOF 2522d6e8b77Smrg exit $? 2532d6e8b77Smrg ;; 2542d6e8b77Smrg -v | --v*) 2552d6e8b77Smrg echo "compile $scriptversion" 2562d6e8b77Smrg exit $? 2572d6e8b77Smrg ;; 2584f87a9f1Smrg cl | *[/\\]cl | cl.exe | *[/\\]cl.exe | \ 2594f87a9f1Smrg icl | *[/\\]icl | icl.exe | *[/\\]icl.exe ) 2602d6e8b77Smrg func_cl_wrapper "$@" # Doesn't return... 2612d6e8b77Smrg ;; 2622d6e8b77Smrgesac 2632d6e8b77Smrg 2642d6e8b77Smrgofile= 2652d6e8b77Smrgcfile= 2662d6e8b77Smrg 2672d6e8b77Smrgfor arg 2682d6e8b77Smrgdo 2692d6e8b77Smrg if test -n "$eat"; then 2702d6e8b77Smrg eat= 2712d6e8b77Smrg else 2722d6e8b77Smrg case $1 in 2732d6e8b77Smrg -o) 2742d6e8b77Smrg # configure might choose to run compile as 'compile cc -o foo foo.c'. 2752d6e8b77Smrg # So we strip '-o arg' only if arg is an object. 2762d6e8b77Smrg eat=1 2772d6e8b77Smrg case $2 in 2782d6e8b77Smrg *.o | *.obj) 2792d6e8b77Smrg ofile=$2 2802d6e8b77Smrg ;; 2812d6e8b77Smrg *) 2822d6e8b77Smrg set x "$@" -o "$2" 2832d6e8b77Smrg shift 2842d6e8b77Smrg ;; 2852d6e8b77Smrg esac 2862d6e8b77Smrg ;; 2872d6e8b77Smrg *.c) 2882d6e8b77Smrg cfile=$1 2892d6e8b77Smrg set x "$@" "$1" 2902d6e8b77Smrg shift 2912d6e8b77Smrg ;; 2922d6e8b77Smrg *) 2932d6e8b77Smrg set x "$@" "$1" 2942d6e8b77Smrg shift 2952d6e8b77Smrg ;; 2962d6e8b77Smrg esac 2972d6e8b77Smrg fi 2982d6e8b77Smrg shift 2992d6e8b77Smrgdone 3002d6e8b77Smrg 3012d6e8b77Smrgif test -z "$ofile" || test -z "$cfile"; then 3022d6e8b77Smrg # If no '-o' option was seen then we might have been invoked from a 3032d6e8b77Smrg # pattern rule where we don't need one. That is ok -- this is a 3042d6e8b77Smrg # normal compilation that the losing compiler can handle. If no 3052d6e8b77Smrg # '.c' file was seen then we are probably linking. That is also 3062d6e8b77Smrg # ok. 3072d6e8b77Smrg exec "$@" 3082d6e8b77Smrgfi 3092d6e8b77Smrg 3102d6e8b77Smrg# Name of file we expect compiler to create. 3112d6e8b77Smrgcofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` 3122d6e8b77Smrg 3132d6e8b77Smrg# Create the lock directory. 3142d6e8b77Smrg# Note: use '[/\\:.-]' here to ensure that we don't use the same name 3152d6e8b77Smrg# that we are using for the .o file. Also, base the name on the expected 3162d6e8b77Smrg# object file name, since that is what matters with a parallel build. 3172d6e8b77Smrglockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d 3182d6e8b77Smrgwhile true; do 3192d6e8b77Smrg if mkdir "$lockdir" >/dev/null 2>&1; then 3202d6e8b77Smrg break 3212d6e8b77Smrg fi 3222d6e8b77Smrg sleep 1 3232d6e8b77Smrgdone 3242d6e8b77Smrg# FIXME: race condition here if user kills between mkdir and trap. 3252d6e8b77Smrgtrap "rmdir '$lockdir'; exit 1" 1 2 15 3262d6e8b77Smrg 3272d6e8b77Smrg# Run the compile. 3282d6e8b77Smrg"$@" 3292d6e8b77Smrgret=$? 3302d6e8b77Smrg 3312d6e8b77Smrgif test -f "$cofile"; then 3322d6e8b77Smrg test "$cofile" = "$ofile" || mv "$cofile" "$ofile" 3332d6e8b77Smrgelif test -f "${cofile}bj"; then 3342d6e8b77Smrg test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" 3352d6e8b77Smrgfi 3362d6e8b77Smrg 3372d6e8b77Smrgrmdir "$lockdir" 3382d6e8b77Smrgexit $ret 3392d6e8b77Smrg 3402d6e8b77Smrg# Local Variables: 3412d6e8b77Smrg# mode: shell-script 3422d6e8b77Smrg# sh-indentation: 2 3434f87a9f1Smrg# eval: (add-hook 'before-save-hook 'time-stamp) 3442d6e8b77Smrg# time-stamp-start: "scriptversion=" 3452d6e8b77Smrg# time-stamp-format: "%:y-%02m-%02d.%02H" 3464f87a9f1Smrg# time-stamp-time-zone: "UTC0" 3472d6e8b77Smrg# time-stamp-end: "; # UTC" 3482d6e8b77Smrg# End: 349