compile revision d422ce2e
16257f37dSmrg#! /bin/sh 26257f37dSmrg# Wrapper for compilers which do not understand '-c -o'. 36257f37dSmrg 4d422ce2eSmrgscriptversion=2018-03-07.03; # UTC 56257f37dSmrg 6d422ce2eSmrg# Copyright (C) 1999-2021 Free Software Foundation, Inc. 76257f37dSmrg# Written by Tom Tromey <tromey@cygnus.com>. 86257f37dSmrg# 96257f37dSmrg# This program is free software; you can redistribute it and/or modify 106257f37dSmrg# it under the terms of the GNU General Public License as published by 116257f37dSmrg# the Free Software Foundation; either version 2, or (at your option) 126257f37dSmrg# any later version. 136257f37dSmrg# 146257f37dSmrg# This program is distributed in the hope that it will be useful, 156257f37dSmrg# but WITHOUT ANY WARRANTY; without even the implied warranty of 166257f37dSmrg# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 176257f37dSmrg# GNU General Public License for more details. 186257f37dSmrg# 196257f37dSmrg# You should have received a copy of the GNU General Public License 20d422ce2eSmrg# along with this program. If not, see <https://www.gnu.org/licenses/>. 216257f37dSmrg 226257f37dSmrg# As a special exception to the GNU General Public License, if you 236257f37dSmrg# distribute this file as part of a program that contains a 246257f37dSmrg# configuration script generated by Autoconf, you may include it under 256257f37dSmrg# the same distribution terms that you use for the rest of that program. 266257f37dSmrg 276257f37dSmrg# This file is maintained in Automake, please report 286257f37dSmrg# bugs to <bug-automake@gnu.org> or send patches to 296257f37dSmrg# <automake-patches@gnu.org>. 306257f37dSmrg 316257f37dSmrgnl=' 326257f37dSmrg' 336257f37dSmrg 346257f37dSmrg# We need space, tab and new line, in precisely that order. Quoting is 356257f37dSmrg# there to prevent tools from complaining about whitespace usage. 366257f37dSmrgIFS=" "" $nl" 376257f37dSmrg 386257f37dSmrgfile_conv= 396257f37dSmrg 406257f37dSmrg# func_file_conv build_file lazy 416257f37dSmrg# Convert a $build file to $host form and store it in $file 426257f37dSmrg# Currently only supports Windows hosts. If the determined conversion 436257f37dSmrg# type is listed in (the comma separated) LAZY, no conversion will 446257f37dSmrg# take place. 456257f37dSmrgfunc_file_conv () 466257f37dSmrg{ 476257f37dSmrg file=$1 486257f37dSmrg case $file in 496257f37dSmrg / | /[!/]*) # absolute file, and not a UNC file 506257f37dSmrg if test -z "$file_conv"; then 516257f37dSmrg # lazily determine how to convert abs files 526257f37dSmrg case `uname -s` in 536257f37dSmrg MINGW*) 546257f37dSmrg file_conv=mingw 556257f37dSmrg ;; 56d422ce2eSmrg CYGWIN* | MSYS*) 576257f37dSmrg file_conv=cygwin 586257f37dSmrg ;; 596257f37dSmrg *) 606257f37dSmrg file_conv=wine 616257f37dSmrg ;; 626257f37dSmrg esac 636257f37dSmrg fi 646257f37dSmrg case $file_conv/,$2, in 656257f37dSmrg *,$file_conv,*) 666257f37dSmrg ;; 676257f37dSmrg mingw/*) 686257f37dSmrg file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` 696257f37dSmrg ;; 70d422ce2eSmrg cygwin/* | msys/*) 716257f37dSmrg file=`cygpath -m "$file" || echo "$file"` 726257f37dSmrg ;; 736257f37dSmrg wine/*) 746257f37dSmrg file=`winepath -w "$file" || echo "$file"` 756257f37dSmrg ;; 766257f37dSmrg esac 776257f37dSmrg ;; 786257f37dSmrg esac 796257f37dSmrg} 806257f37dSmrg 816257f37dSmrg# func_cl_dashL linkdir 826257f37dSmrg# Make cl look for libraries in LINKDIR 836257f37dSmrgfunc_cl_dashL () 846257f37dSmrg{ 856257f37dSmrg func_file_conv "$1" 866257f37dSmrg if test -z "$lib_path"; then 876257f37dSmrg lib_path=$file 886257f37dSmrg else 896257f37dSmrg lib_path="$lib_path;$file" 906257f37dSmrg fi 916257f37dSmrg linker_opts="$linker_opts -LIBPATH:$file" 926257f37dSmrg} 936257f37dSmrg 946257f37dSmrg# func_cl_dashl library 956257f37dSmrg# Do a library search-path lookup for cl 966257f37dSmrgfunc_cl_dashl () 976257f37dSmrg{ 986257f37dSmrg lib=$1 996257f37dSmrg found=no 1006257f37dSmrg save_IFS=$IFS 1016257f37dSmrg IFS=';' 1026257f37dSmrg for dir in $lib_path $LIB 1036257f37dSmrg do 1046257f37dSmrg IFS=$save_IFS 1056257f37dSmrg if $shared && test -f "$dir/$lib.dll.lib"; then 1066257f37dSmrg found=yes 1076257f37dSmrg lib=$dir/$lib.dll.lib 1086257f37dSmrg break 1096257f37dSmrg fi 1106257f37dSmrg if test -f "$dir/$lib.lib"; then 1116257f37dSmrg found=yes 1126257f37dSmrg lib=$dir/$lib.lib 1136257f37dSmrg break 1146257f37dSmrg fi 1156257f37dSmrg if test -f "$dir/lib$lib.a"; then 1166257f37dSmrg found=yes 1176257f37dSmrg lib=$dir/lib$lib.a 1186257f37dSmrg break 1196257f37dSmrg fi 1206257f37dSmrg done 1216257f37dSmrg IFS=$save_IFS 1226257f37dSmrg 1236257f37dSmrg if test "$found" != yes; then 1246257f37dSmrg lib=$lib.lib 1256257f37dSmrg fi 1266257f37dSmrg} 1276257f37dSmrg 1286257f37dSmrg# func_cl_wrapper cl arg... 1296257f37dSmrg# Adjust compile command to suit cl 1306257f37dSmrgfunc_cl_wrapper () 1316257f37dSmrg{ 1326257f37dSmrg # Assume a capable shell 1336257f37dSmrg lib_path= 1346257f37dSmrg shared=: 1356257f37dSmrg linker_opts= 1366257f37dSmrg for arg 1376257f37dSmrg do 1386257f37dSmrg if test -n "$eat"; then 1396257f37dSmrg eat= 1406257f37dSmrg else 1416257f37dSmrg case $1 in 1426257f37dSmrg -o) 1436257f37dSmrg # configure might choose to run compile as 'compile cc -o foo foo.c'. 1446257f37dSmrg eat=1 1456257f37dSmrg case $2 in 1466257f37dSmrg *.o | *.[oO][bB][jJ]) 1476257f37dSmrg func_file_conv "$2" 1486257f37dSmrg set x "$@" -Fo"$file" 1496257f37dSmrg shift 1506257f37dSmrg ;; 1516257f37dSmrg *) 1526257f37dSmrg func_file_conv "$2" 1536257f37dSmrg set x "$@" -Fe"$file" 1546257f37dSmrg shift 1556257f37dSmrg ;; 1566257f37dSmrg esac 1576257f37dSmrg ;; 1586257f37dSmrg -I) 1596257f37dSmrg eat=1 1606257f37dSmrg func_file_conv "$2" mingw 1616257f37dSmrg set x "$@" -I"$file" 1626257f37dSmrg shift 1636257f37dSmrg ;; 1646257f37dSmrg -I*) 1656257f37dSmrg func_file_conv "${1#-I}" mingw 1666257f37dSmrg set x "$@" -I"$file" 1676257f37dSmrg shift 1686257f37dSmrg ;; 1696257f37dSmrg -l) 1706257f37dSmrg eat=1 1716257f37dSmrg func_cl_dashl "$2" 1726257f37dSmrg set x "$@" "$lib" 1736257f37dSmrg shift 1746257f37dSmrg ;; 1756257f37dSmrg -l*) 1766257f37dSmrg func_cl_dashl "${1#-l}" 1776257f37dSmrg set x "$@" "$lib" 1786257f37dSmrg shift 1796257f37dSmrg ;; 1806257f37dSmrg -L) 1816257f37dSmrg eat=1 1826257f37dSmrg func_cl_dashL "$2" 1836257f37dSmrg ;; 1846257f37dSmrg -L*) 1856257f37dSmrg func_cl_dashL "${1#-L}" 1866257f37dSmrg ;; 1876257f37dSmrg -static) 1886257f37dSmrg shared=false 1896257f37dSmrg ;; 1906257f37dSmrg -Wl,*) 1916257f37dSmrg arg=${1#-Wl,} 1926257f37dSmrg save_ifs="$IFS"; IFS=',' 1936257f37dSmrg for flag in $arg; do 1946257f37dSmrg IFS="$save_ifs" 1956257f37dSmrg linker_opts="$linker_opts $flag" 1966257f37dSmrg done 1976257f37dSmrg IFS="$save_ifs" 1986257f37dSmrg ;; 1996257f37dSmrg -Xlinker) 2006257f37dSmrg eat=1 2016257f37dSmrg linker_opts="$linker_opts $2" 2026257f37dSmrg ;; 2036257f37dSmrg -*) 2046257f37dSmrg set x "$@" "$1" 2056257f37dSmrg shift 2066257f37dSmrg ;; 2076257f37dSmrg *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) 2086257f37dSmrg func_file_conv "$1" 2096257f37dSmrg set x "$@" -Tp"$file" 2106257f37dSmrg shift 2116257f37dSmrg ;; 2126257f37dSmrg *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) 2136257f37dSmrg func_file_conv "$1" mingw 2146257f37dSmrg set x "$@" "$file" 2156257f37dSmrg shift 2166257f37dSmrg ;; 2176257f37dSmrg *) 2186257f37dSmrg set x "$@" "$1" 2196257f37dSmrg shift 2206257f37dSmrg ;; 2216257f37dSmrg esac 2226257f37dSmrg fi 2236257f37dSmrg shift 2246257f37dSmrg done 2256257f37dSmrg if test -n "$linker_opts"; then 2266257f37dSmrg linker_opts="-link$linker_opts" 2276257f37dSmrg fi 2286257f37dSmrg exec "$@" $linker_opts 2296257f37dSmrg exit 1 2306257f37dSmrg} 2316257f37dSmrg 2326257f37dSmrgeat= 2336257f37dSmrg 2346257f37dSmrgcase $1 in 2356257f37dSmrg '') 2366257f37dSmrg echo "$0: No command. Try '$0 --help' for more information." 1>&2 2376257f37dSmrg exit 1; 2386257f37dSmrg ;; 2396257f37dSmrg -h | --h*) 2406257f37dSmrg cat <<\EOF 2416257f37dSmrgUsage: compile [--help] [--version] PROGRAM [ARGS] 2426257f37dSmrg 2436257f37dSmrgWrapper for compilers which do not understand '-c -o'. 2446257f37dSmrgRemove '-o dest.o' from ARGS, run PROGRAM with the remaining 2456257f37dSmrgarguments, and rename the output as expected. 2466257f37dSmrg 2476257f37dSmrgIf you are trying to build a whole package this is not the 2486257f37dSmrgright script to run: please start by reading the file 'INSTALL'. 2496257f37dSmrg 2506257f37dSmrgReport bugs to <bug-automake@gnu.org>. 2516257f37dSmrgEOF 2526257f37dSmrg exit $? 2536257f37dSmrg ;; 2546257f37dSmrg -v | --v*) 2556257f37dSmrg echo "compile $scriptversion" 2566257f37dSmrg exit $? 2576257f37dSmrg ;; 258d422ce2eSmrg cl | *[/\\]cl | cl.exe | *[/\\]cl.exe | \ 259d422ce2eSmrg icl | *[/\\]icl | icl.exe | *[/\\]icl.exe ) 2606257f37dSmrg func_cl_wrapper "$@" # Doesn't return... 2616257f37dSmrg ;; 2626257f37dSmrgesac 2636257f37dSmrg 2646257f37dSmrgofile= 2656257f37dSmrgcfile= 2666257f37dSmrg 2676257f37dSmrgfor arg 2686257f37dSmrgdo 2696257f37dSmrg if test -n "$eat"; then 2706257f37dSmrg eat= 2716257f37dSmrg else 2726257f37dSmrg case $1 in 2736257f37dSmrg -o) 2746257f37dSmrg # configure might choose to run compile as 'compile cc -o foo foo.c'. 2756257f37dSmrg # So we strip '-o arg' only if arg is an object. 2766257f37dSmrg eat=1 2776257f37dSmrg case $2 in 2786257f37dSmrg *.o | *.obj) 2796257f37dSmrg ofile=$2 2806257f37dSmrg ;; 2816257f37dSmrg *) 2826257f37dSmrg set x "$@" -o "$2" 2836257f37dSmrg shift 2846257f37dSmrg ;; 2856257f37dSmrg esac 2866257f37dSmrg ;; 2876257f37dSmrg *.c) 2886257f37dSmrg cfile=$1 2896257f37dSmrg set x "$@" "$1" 2906257f37dSmrg shift 2916257f37dSmrg ;; 2926257f37dSmrg *) 2936257f37dSmrg set x "$@" "$1" 2946257f37dSmrg shift 2956257f37dSmrg ;; 2966257f37dSmrg esac 2976257f37dSmrg fi 2986257f37dSmrg shift 2996257f37dSmrgdone 3006257f37dSmrg 3016257f37dSmrgif test -z "$ofile" || test -z "$cfile"; then 3026257f37dSmrg # If no '-o' option was seen then we might have been invoked from a 3036257f37dSmrg # pattern rule where we don't need one. That is ok -- this is a 3046257f37dSmrg # normal compilation that the losing compiler can handle. If no 3056257f37dSmrg # '.c' file was seen then we are probably linking. That is also 3066257f37dSmrg # ok. 3076257f37dSmrg exec "$@" 3086257f37dSmrgfi 3096257f37dSmrg 3106257f37dSmrg# Name of file we expect compiler to create. 3116257f37dSmrgcofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` 3126257f37dSmrg 3136257f37dSmrg# Create the lock directory. 3146257f37dSmrg# Note: use '[/\\:.-]' here to ensure that we don't use the same name 3156257f37dSmrg# that we are using for the .o file. Also, base the name on the expected 3166257f37dSmrg# object file name, since that is what matters with a parallel build. 3176257f37dSmrglockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d 3186257f37dSmrgwhile true; do 3196257f37dSmrg if mkdir "$lockdir" >/dev/null 2>&1; then 3206257f37dSmrg break 3216257f37dSmrg fi 3226257f37dSmrg sleep 1 3236257f37dSmrgdone 3246257f37dSmrg# FIXME: race condition here if user kills between mkdir and trap. 3256257f37dSmrgtrap "rmdir '$lockdir'; exit 1" 1 2 15 3266257f37dSmrg 3276257f37dSmrg# Run the compile. 3286257f37dSmrg"$@" 3296257f37dSmrgret=$? 3306257f37dSmrg 3316257f37dSmrgif test -f "$cofile"; then 3326257f37dSmrg test "$cofile" = "$ofile" || mv "$cofile" "$ofile" 3336257f37dSmrgelif test -f "${cofile}bj"; then 3346257f37dSmrg test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" 3356257f37dSmrgfi 3366257f37dSmrg 3376257f37dSmrgrmdir "$lockdir" 3386257f37dSmrgexit $ret 3396257f37dSmrg 3406257f37dSmrg# Local Variables: 3416257f37dSmrg# mode: shell-script 3426257f37dSmrg# sh-indentation: 2 343d422ce2eSmrg# eval: (add-hook 'before-save-hook 'time-stamp) 3446257f37dSmrg# time-stamp-start: "scriptversion=" 3456257f37dSmrg# time-stamp-format: "%:y-%02m-%02d.%02H" 346d422ce2eSmrg# time-stamp-time-zone: "UTC0" 3476257f37dSmrg# time-stamp-end: "; # UTC" 3486257f37dSmrg# End: 349