16fc018e4Smrg#! /bin/sh 26fc018e4Smrg# Wrapper for compilers which do not understand '-c -o'. 36fc018e4Smrg 4a32e9e42Smrgscriptversion=2018-03-07.03; # UTC 56fc018e4Smrg 6a32e9e42Smrg# Copyright (C) 1999-2018 Free Software Foundation, Inc. 76fc018e4Smrg# Written by Tom Tromey <tromey@cygnus.com>. 86fc018e4Smrg# 96fc018e4Smrg# This program is free software; you can redistribute it and/or modify 106fc018e4Smrg# it under the terms of the GNU General Public License as published by 116fc018e4Smrg# the Free Software Foundation; either version 2, or (at your option) 126fc018e4Smrg# any later version. 136fc018e4Smrg# 146fc018e4Smrg# This program is distributed in the hope that it will be useful, 156fc018e4Smrg# but WITHOUT ANY WARRANTY; without even the implied warranty of 166fc018e4Smrg# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 176fc018e4Smrg# GNU General Public License for more details. 186fc018e4Smrg# 196fc018e4Smrg# You should have received a copy of the GNU General Public License 20a32e9e42Smrg# along with this program. If not, see <https://www.gnu.org/licenses/>. 216fc018e4Smrg 226fc018e4Smrg# As a special exception to the GNU General Public License, if you 236fc018e4Smrg# distribute this file as part of a program that contains a 246fc018e4Smrg# configuration script generated by Autoconf, you may include it under 256fc018e4Smrg# the same distribution terms that you use for the rest of that program. 266fc018e4Smrg 276fc018e4Smrg# This file is maintained in Automake, please report 286fc018e4Smrg# bugs to <bug-automake@gnu.org> or send patches to 296fc018e4Smrg# <automake-patches@gnu.org>. 306fc018e4Smrg 316fc018e4Smrgnl=' 326fc018e4Smrg' 336fc018e4Smrg 346fc018e4Smrg# We need space, tab and new line, in precisely that order. Quoting is 356fc018e4Smrg# there to prevent tools from complaining about whitespace usage. 366fc018e4SmrgIFS=" "" $nl" 376fc018e4Smrg 386fc018e4Smrgfile_conv= 396fc018e4Smrg 406fc018e4Smrg# func_file_conv build_file lazy 416fc018e4Smrg# Convert a $build file to $host form and store it in $file 426fc018e4Smrg# Currently only supports Windows hosts. If the determined conversion 436fc018e4Smrg# type is listed in (the comma separated) LAZY, no conversion will 446fc018e4Smrg# take place. 456fc018e4Smrgfunc_file_conv () 466fc018e4Smrg{ 476fc018e4Smrg file=$1 486fc018e4Smrg case $file in 496fc018e4Smrg / | /[!/]*) # absolute file, and not a UNC file 506fc018e4Smrg if test -z "$file_conv"; then 516fc018e4Smrg # lazily determine how to convert abs files 526fc018e4Smrg case `uname -s` in 536fc018e4Smrg MINGW*) 546fc018e4Smrg file_conv=mingw 556fc018e4Smrg ;; 566fc018e4Smrg CYGWIN*) 576fc018e4Smrg file_conv=cygwin 586fc018e4Smrg ;; 596fc018e4Smrg *) 606fc018e4Smrg file_conv=wine 616fc018e4Smrg ;; 626fc018e4Smrg esac 636fc018e4Smrg fi 646fc018e4Smrg case $file_conv/,$2, in 656fc018e4Smrg *,$file_conv,*) 666fc018e4Smrg ;; 676fc018e4Smrg mingw/*) 686fc018e4Smrg file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` 696fc018e4Smrg ;; 706fc018e4Smrg cygwin/*) 716fc018e4Smrg file=`cygpath -m "$file" || echo "$file"` 726fc018e4Smrg ;; 736fc018e4Smrg wine/*) 746fc018e4Smrg file=`winepath -w "$file" || echo "$file"` 756fc018e4Smrg ;; 766fc018e4Smrg esac 776fc018e4Smrg ;; 786fc018e4Smrg esac 796fc018e4Smrg} 806fc018e4Smrg 816fc018e4Smrg# func_cl_dashL linkdir 826fc018e4Smrg# Make cl look for libraries in LINKDIR 836fc018e4Smrgfunc_cl_dashL () 846fc018e4Smrg{ 856fc018e4Smrg func_file_conv "$1" 866fc018e4Smrg if test -z "$lib_path"; then 876fc018e4Smrg lib_path=$file 886fc018e4Smrg else 896fc018e4Smrg lib_path="$lib_path;$file" 906fc018e4Smrg fi 916fc018e4Smrg linker_opts="$linker_opts -LIBPATH:$file" 926fc018e4Smrg} 936fc018e4Smrg 946fc018e4Smrg# func_cl_dashl library 956fc018e4Smrg# Do a library search-path lookup for cl 966fc018e4Smrgfunc_cl_dashl () 976fc018e4Smrg{ 986fc018e4Smrg lib=$1 996fc018e4Smrg found=no 1006fc018e4Smrg save_IFS=$IFS 1016fc018e4Smrg IFS=';' 1026fc018e4Smrg for dir in $lib_path $LIB 1036fc018e4Smrg do 1046fc018e4Smrg IFS=$save_IFS 1056fc018e4Smrg if $shared && test -f "$dir/$lib.dll.lib"; then 1066fc018e4Smrg found=yes 1076fc018e4Smrg lib=$dir/$lib.dll.lib 1086fc018e4Smrg break 1096fc018e4Smrg fi 1106fc018e4Smrg if test -f "$dir/$lib.lib"; then 1116fc018e4Smrg found=yes 1126fc018e4Smrg lib=$dir/$lib.lib 1136fc018e4Smrg break 1146fc018e4Smrg fi 1156fc018e4Smrg if test -f "$dir/lib$lib.a"; then 1166fc018e4Smrg found=yes 1176fc018e4Smrg lib=$dir/lib$lib.a 1186fc018e4Smrg break 1196fc018e4Smrg fi 1206fc018e4Smrg done 1216fc018e4Smrg IFS=$save_IFS 1226fc018e4Smrg 1236fc018e4Smrg if test "$found" != yes; then 1246fc018e4Smrg lib=$lib.lib 1256fc018e4Smrg fi 1266fc018e4Smrg} 1276fc018e4Smrg 1286fc018e4Smrg# func_cl_wrapper cl arg... 1296fc018e4Smrg# Adjust compile command to suit cl 1306fc018e4Smrgfunc_cl_wrapper () 1316fc018e4Smrg{ 1326fc018e4Smrg # Assume a capable shell 1336fc018e4Smrg lib_path= 1346fc018e4Smrg shared=: 1356fc018e4Smrg linker_opts= 1366fc018e4Smrg for arg 1376fc018e4Smrg do 1386fc018e4Smrg if test -n "$eat"; then 1396fc018e4Smrg eat= 1406fc018e4Smrg else 1416fc018e4Smrg case $1 in 1426fc018e4Smrg -o) 1436fc018e4Smrg # configure might choose to run compile as 'compile cc -o foo foo.c'. 1446fc018e4Smrg eat=1 1456fc018e4Smrg case $2 in 1466fc018e4Smrg *.o | *.[oO][bB][jJ]) 1476fc018e4Smrg func_file_conv "$2" 1486fc018e4Smrg set x "$@" -Fo"$file" 1496fc018e4Smrg shift 1506fc018e4Smrg ;; 1516fc018e4Smrg *) 1526fc018e4Smrg func_file_conv "$2" 1536fc018e4Smrg set x "$@" -Fe"$file" 1546fc018e4Smrg shift 1556fc018e4Smrg ;; 1566fc018e4Smrg esac 1576fc018e4Smrg ;; 1586fc018e4Smrg -I) 1596fc018e4Smrg eat=1 1606fc018e4Smrg func_file_conv "$2" mingw 1616fc018e4Smrg set x "$@" -I"$file" 1626fc018e4Smrg shift 1636fc018e4Smrg ;; 1646fc018e4Smrg -I*) 1656fc018e4Smrg func_file_conv "${1#-I}" mingw 1666fc018e4Smrg set x "$@" -I"$file" 1676fc018e4Smrg shift 1686fc018e4Smrg ;; 1696fc018e4Smrg -l) 1706fc018e4Smrg eat=1 1716fc018e4Smrg func_cl_dashl "$2" 1726fc018e4Smrg set x "$@" "$lib" 1736fc018e4Smrg shift 1746fc018e4Smrg ;; 1756fc018e4Smrg -l*) 1766fc018e4Smrg func_cl_dashl "${1#-l}" 1776fc018e4Smrg set x "$@" "$lib" 1786fc018e4Smrg shift 1796fc018e4Smrg ;; 1806fc018e4Smrg -L) 1816fc018e4Smrg eat=1 1826fc018e4Smrg func_cl_dashL "$2" 1836fc018e4Smrg ;; 1846fc018e4Smrg -L*) 1856fc018e4Smrg func_cl_dashL "${1#-L}" 1866fc018e4Smrg ;; 1876fc018e4Smrg -static) 1886fc018e4Smrg shared=false 1896fc018e4Smrg ;; 1906fc018e4Smrg -Wl,*) 1916fc018e4Smrg arg=${1#-Wl,} 1926fc018e4Smrg save_ifs="$IFS"; IFS=',' 1936fc018e4Smrg for flag in $arg; do 1946fc018e4Smrg IFS="$save_ifs" 1956fc018e4Smrg linker_opts="$linker_opts $flag" 1966fc018e4Smrg done 1976fc018e4Smrg IFS="$save_ifs" 1986fc018e4Smrg ;; 1996fc018e4Smrg -Xlinker) 2006fc018e4Smrg eat=1 2016fc018e4Smrg linker_opts="$linker_opts $2" 2026fc018e4Smrg ;; 2036fc018e4Smrg -*) 2046fc018e4Smrg set x "$@" "$1" 2056fc018e4Smrg shift 2066fc018e4Smrg ;; 2076fc018e4Smrg *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) 2086fc018e4Smrg func_file_conv "$1" 2096fc018e4Smrg set x "$@" -Tp"$file" 2106fc018e4Smrg shift 2116fc018e4Smrg ;; 2126fc018e4Smrg *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) 2136fc018e4Smrg func_file_conv "$1" mingw 2146fc018e4Smrg set x "$@" "$file" 2156fc018e4Smrg shift 2166fc018e4Smrg ;; 2176fc018e4Smrg *) 2186fc018e4Smrg set x "$@" "$1" 2196fc018e4Smrg shift 2206fc018e4Smrg ;; 2216fc018e4Smrg esac 2226fc018e4Smrg fi 2236fc018e4Smrg shift 2246fc018e4Smrg done 2256fc018e4Smrg if test -n "$linker_opts"; then 2266fc018e4Smrg linker_opts="-link$linker_opts" 2276fc018e4Smrg fi 2286fc018e4Smrg exec "$@" $linker_opts 2296fc018e4Smrg exit 1 2306fc018e4Smrg} 2316fc018e4Smrg 2326fc018e4Smrgeat= 2336fc018e4Smrg 2346fc018e4Smrgcase $1 in 2356fc018e4Smrg '') 2366fc018e4Smrg echo "$0: No command. Try '$0 --help' for more information." 1>&2 2376fc018e4Smrg exit 1; 2386fc018e4Smrg ;; 2396fc018e4Smrg -h | --h*) 2406fc018e4Smrg cat <<\EOF 2416fc018e4SmrgUsage: compile [--help] [--version] PROGRAM [ARGS] 2426fc018e4Smrg 2436fc018e4SmrgWrapper for compilers which do not understand '-c -o'. 2446fc018e4SmrgRemove '-o dest.o' from ARGS, run PROGRAM with the remaining 2456fc018e4Smrgarguments, and rename the output as expected. 2466fc018e4Smrg 2476fc018e4SmrgIf you are trying to build a whole package this is not the 2486fc018e4Smrgright script to run: please start by reading the file 'INSTALL'. 2496fc018e4Smrg 2506fc018e4SmrgReport bugs to <bug-automake@gnu.org>. 2516fc018e4SmrgEOF 2526fc018e4Smrg exit $? 2536fc018e4Smrg ;; 2546fc018e4Smrg -v | --v*) 2556fc018e4Smrg echo "compile $scriptversion" 2566fc018e4Smrg exit $? 2576fc018e4Smrg ;; 258a32e9e42Smrg cl | *[/\\]cl | cl.exe | *[/\\]cl.exe | \ 259a32e9e42Smrg icl | *[/\\]icl | icl.exe | *[/\\]icl.exe ) 2606fc018e4Smrg func_cl_wrapper "$@" # Doesn't return... 2616fc018e4Smrg ;; 2626fc018e4Smrgesac 2636fc018e4Smrg 2646fc018e4Smrgofile= 2656fc018e4Smrgcfile= 2666fc018e4Smrg 2676fc018e4Smrgfor arg 2686fc018e4Smrgdo 2696fc018e4Smrg if test -n "$eat"; then 2706fc018e4Smrg eat= 2716fc018e4Smrg else 2726fc018e4Smrg case $1 in 2736fc018e4Smrg -o) 2746fc018e4Smrg # configure might choose to run compile as 'compile cc -o foo foo.c'. 2756fc018e4Smrg # So we strip '-o arg' only if arg is an object. 2766fc018e4Smrg eat=1 2776fc018e4Smrg case $2 in 2786fc018e4Smrg *.o | *.obj) 2796fc018e4Smrg ofile=$2 2806fc018e4Smrg ;; 2816fc018e4Smrg *) 2826fc018e4Smrg set x "$@" -o "$2" 2836fc018e4Smrg shift 2846fc018e4Smrg ;; 2856fc018e4Smrg esac 2866fc018e4Smrg ;; 2876fc018e4Smrg *.c) 2886fc018e4Smrg cfile=$1 2896fc018e4Smrg set x "$@" "$1" 2906fc018e4Smrg shift 2916fc018e4Smrg ;; 2926fc018e4Smrg *) 2936fc018e4Smrg set x "$@" "$1" 2946fc018e4Smrg shift 2956fc018e4Smrg ;; 2966fc018e4Smrg esac 2976fc018e4Smrg fi 2986fc018e4Smrg shift 2996fc018e4Smrgdone 3006fc018e4Smrg 3016fc018e4Smrgif test -z "$ofile" || test -z "$cfile"; then 3026fc018e4Smrg # If no '-o' option was seen then we might have been invoked from a 3036fc018e4Smrg # pattern rule where we don't need one. That is ok -- this is a 3046fc018e4Smrg # normal compilation that the losing compiler can handle. If no 3056fc018e4Smrg # '.c' file was seen then we are probably linking. That is also 3066fc018e4Smrg # ok. 3076fc018e4Smrg exec "$@" 3086fc018e4Smrgfi 3096fc018e4Smrg 3106fc018e4Smrg# Name of file we expect compiler to create. 3116fc018e4Smrgcofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` 3126fc018e4Smrg 3136fc018e4Smrg# Create the lock directory. 3146fc018e4Smrg# Note: use '[/\\:.-]' here to ensure that we don't use the same name 3156fc018e4Smrg# that we are using for the .o file. Also, base the name on the expected 3166fc018e4Smrg# object file name, since that is what matters with a parallel build. 3176fc018e4Smrglockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d 3186fc018e4Smrgwhile true; do 3196fc018e4Smrg if mkdir "$lockdir" >/dev/null 2>&1; then 3206fc018e4Smrg break 3216fc018e4Smrg fi 3226fc018e4Smrg sleep 1 3236fc018e4Smrgdone 3246fc018e4Smrg# FIXME: race condition here if user kills between mkdir and trap. 3256fc018e4Smrgtrap "rmdir '$lockdir'; exit 1" 1 2 15 3266fc018e4Smrg 3276fc018e4Smrg# Run the compile. 3286fc018e4Smrg"$@" 3296fc018e4Smrgret=$? 3306fc018e4Smrg 3316fc018e4Smrgif test -f "$cofile"; then 3326fc018e4Smrg test "$cofile" = "$ofile" || mv "$cofile" "$ofile" 3336fc018e4Smrgelif test -f "${cofile}bj"; then 3346fc018e4Smrg test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" 3356fc018e4Smrgfi 3366fc018e4Smrg 3376fc018e4Smrgrmdir "$lockdir" 3386fc018e4Smrgexit $ret 3396fc018e4Smrg 3406fc018e4Smrg# Local Variables: 3416fc018e4Smrg# mode: shell-script 3426fc018e4Smrg# sh-indentation: 2 343a32e9e42Smrg# eval: (add-hook 'before-save-hook 'time-stamp) 3446fc018e4Smrg# time-stamp-start: "scriptversion=" 3456fc018e4Smrg# time-stamp-format: "%:y-%02m-%02d.%02H" 346a32e9e42Smrg# time-stamp-time-zone: "UTC0" 3476fc018e4Smrg# time-stamp-end: "; # UTC" 3486fc018e4Smrg# End: 349