compile revision 1e449e82
11e449e82Smrg#! /bin/sh 21e449e82Smrg# Wrapper for compilers which do not understand '-c -o'. 31e449e82Smrg 41e449e82Smrgscriptversion=2012-10-14.11; # UTC 51e449e82Smrg 61e449e82Smrg# Copyright (C) 1999-2013 Free Software Foundation, Inc. 71e449e82Smrg# Written by Tom Tromey <tromey@cygnus.com>. 81e449e82Smrg# 91e449e82Smrg# This program is free software; you can redistribute it and/or modify 101e449e82Smrg# it under the terms of the GNU General Public License as published by 111e449e82Smrg# the Free Software Foundation; either version 2, or (at your option) 121e449e82Smrg# any later version. 131e449e82Smrg# 141e449e82Smrg# This program is distributed in the hope that it will be useful, 151e449e82Smrg# but WITHOUT ANY WARRANTY; without even the implied warranty of 161e449e82Smrg# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 171e449e82Smrg# GNU General Public License for more details. 181e449e82Smrg# 191e449e82Smrg# You should have received a copy of the GNU General Public License 201e449e82Smrg# along with this program. If not, see <http://www.gnu.org/licenses/>. 211e449e82Smrg 221e449e82Smrg# As a special exception to the GNU General Public License, if you 231e449e82Smrg# distribute this file as part of a program that contains a 241e449e82Smrg# configuration script generated by Autoconf, you may include it under 251e449e82Smrg# the same distribution terms that you use for the rest of that program. 261e449e82Smrg 271e449e82Smrg# This file is maintained in Automake, please report 281e449e82Smrg# bugs to <bug-automake@gnu.org> or send patches to 291e449e82Smrg# <automake-patches@gnu.org>. 301e449e82Smrg 311e449e82Smrgnl=' 321e449e82Smrg' 331e449e82Smrg 341e449e82Smrg# We need space, tab and new line, in precisely that order. Quoting is 351e449e82Smrg# there to prevent tools from complaining about whitespace usage. 361e449e82SmrgIFS=" "" $nl" 371e449e82Smrg 381e449e82Smrgfile_conv= 391e449e82Smrg 401e449e82Smrg# func_file_conv build_file lazy 411e449e82Smrg# Convert a $build file to $host form and store it in $file 421e449e82Smrg# Currently only supports Windows hosts. If the determined conversion 431e449e82Smrg# type is listed in (the comma separated) LAZY, no conversion will 441e449e82Smrg# take place. 451e449e82Smrgfunc_file_conv () 461e449e82Smrg{ 471e449e82Smrg file=$1 481e449e82Smrg case $file in 491e449e82Smrg / | /[!/]*) # absolute file, and not a UNC file 501e449e82Smrg if test -z "$file_conv"; then 511e449e82Smrg # lazily determine how to convert abs files 521e449e82Smrg case `uname -s` in 531e449e82Smrg MINGW*) 541e449e82Smrg file_conv=mingw 551e449e82Smrg ;; 561e449e82Smrg CYGWIN*) 571e449e82Smrg file_conv=cygwin 581e449e82Smrg ;; 591e449e82Smrg *) 601e449e82Smrg file_conv=wine 611e449e82Smrg ;; 621e449e82Smrg esac 631e449e82Smrg fi 641e449e82Smrg case $file_conv/,$2, in 651e449e82Smrg *,$file_conv,*) 661e449e82Smrg ;; 671e449e82Smrg mingw/*) 681e449e82Smrg file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` 691e449e82Smrg ;; 701e449e82Smrg cygwin/*) 711e449e82Smrg file=`cygpath -m "$file" || echo "$file"` 721e449e82Smrg ;; 731e449e82Smrg wine/*) 741e449e82Smrg file=`winepath -w "$file" || echo "$file"` 751e449e82Smrg ;; 761e449e82Smrg esac 771e449e82Smrg ;; 781e449e82Smrg esac 791e449e82Smrg} 801e449e82Smrg 811e449e82Smrg# func_cl_dashL linkdir 821e449e82Smrg# Make cl look for libraries in LINKDIR 831e449e82Smrgfunc_cl_dashL () 841e449e82Smrg{ 851e449e82Smrg func_file_conv "$1" 861e449e82Smrg if test -z "$lib_path"; then 871e449e82Smrg lib_path=$file 881e449e82Smrg else 891e449e82Smrg lib_path="$lib_path;$file" 901e449e82Smrg fi 911e449e82Smrg linker_opts="$linker_opts -LIBPATH:$file" 921e449e82Smrg} 931e449e82Smrg 941e449e82Smrg# func_cl_dashl library 951e449e82Smrg# Do a library search-path lookup for cl 961e449e82Smrgfunc_cl_dashl () 971e449e82Smrg{ 981e449e82Smrg lib=$1 991e449e82Smrg found=no 1001e449e82Smrg save_IFS=$IFS 1011e449e82Smrg IFS=';' 1021e449e82Smrg for dir in $lib_path $LIB 1031e449e82Smrg do 1041e449e82Smrg IFS=$save_IFS 1051e449e82Smrg if $shared && test -f "$dir/$lib.dll.lib"; then 1061e449e82Smrg found=yes 1071e449e82Smrg lib=$dir/$lib.dll.lib 1081e449e82Smrg break 1091e449e82Smrg fi 1101e449e82Smrg if test -f "$dir/$lib.lib"; then 1111e449e82Smrg found=yes 1121e449e82Smrg lib=$dir/$lib.lib 1131e449e82Smrg break 1141e449e82Smrg fi 1151e449e82Smrg if test -f "$dir/lib$lib.a"; then 1161e449e82Smrg found=yes 1171e449e82Smrg lib=$dir/lib$lib.a 1181e449e82Smrg break 1191e449e82Smrg fi 1201e449e82Smrg done 1211e449e82Smrg IFS=$save_IFS 1221e449e82Smrg 1231e449e82Smrg if test "$found" != yes; then 1241e449e82Smrg lib=$lib.lib 1251e449e82Smrg fi 1261e449e82Smrg} 1271e449e82Smrg 1281e449e82Smrg# func_cl_wrapper cl arg... 1291e449e82Smrg# Adjust compile command to suit cl 1301e449e82Smrgfunc_cl_wrapper () 1311e449e82Smrg{ 1321e449e82Smrg # Assume a capable shell 1331e449e82Smrg lib_path= 1341e449e82Smrg shared=: 1351e449e82Smrg linker_opts= 1361e449e82Smrg for arg 1371e449e82Smrg do 1381e449e82Smrg if test -n "$eat"; then 1391e449e82Smrg eat= 1401e449e82Smrg else 1411e449e82Smrg case $1 in 1421e449e82Smrg -o) 1431e449e82Smrg # configure might choose to run compile as 'compile cc -o foo foo.c'. 1441e449e82Smrg eat=1 1451e449e82Smrg case $2 in 1461e449e82Smrg *.o | *.[oO][bB][jJ]) 1471e449e82Smrg func_file_conv "$2" 1481e449e82Smrg set x "$@" -Fo"$file" 1491e449e82Smrg shift 1501e449e82Smrg ;; 1511e449e82Smrg *) 1521e449e82Smrg func_file_conv "$2" 1531e449e82Smrg set x "$@" -Fe"$file" 1541e449e82Smrg shift 1551e449e82Smrg ;; 1561e449e82Smrg esac 1571e449e82Smrg ;; 1581e449e82Smrg -I) 1591e449e82Smrg eat=1 1601e449e82Smrg func_file_conv "$2" mingw 1611e449e82Smrg set x "$@" -I"$file" 1621e449e82Smrg shift 1631e449e82Smrg ;; 1641e449e82Smrg -I*) 1651e449e82Smrg func_file_conv "${1#-I}" mingw 1661e449e82Smrg set x "$@" -I"$file" 1671e449e82Smrg shift 1681e449e82Smrg ;; 1691e449e82Smrg -l) 1701e449e82Smrg eat=1 1711e449e82Smrg func_cl_dashl "$2" 1721e449e82Smrg set x "$@" "$lib" 1731e449e82Smrg shift 1741e449e82Smrg ;; 1751e449e82Smrg -l*) 1761e449e82Smrg func_cl_dashl "${1#-l}" 1771e449e82Smrg set x "$@" "$lib" 1781e449e82Smrg shift 1791e449e82Smrg ;; 1801e449e82Smrg -L) 1811e449e82Smrg eat=1 1821e449e82Smrg func_cl_dashL "$2" 1831e449e82Smrg ;; 1841e449e82Smrg -L*) 1851e449e82Smrg func_cl_dashL "${1#-L}" 1861e449e82Smrg ;; 1871e449e82Smrg -static) 1881e449e82Smrg shared=false 1891e449e82Smrg ;; 1901e449e82Smrg -Wl,*) 1911e449e82Smrg arg=${1#-Wl,} 1921e449e82Smrg save_ifs="$IFS"; IFS=',' 1931e449e82Smrg for flag in $arg; do 1941e449e82Smrg IFS="$save_ifs" 1951e449e82Smrg linker_opts="$linker_opts $flag" 1961e449e82Smrg done 1971e449e82Smrg IFS="$save_ifs" 1981e449e82Smrg ;; 1991e449e82Smrg -Xlinker) 2001e449e82Smrg eat=1 2011e449e82Smrg linker_opts="$linker_opts $2" 2021e449e82Smrg ;; 2031e449e82Smrg -*) 2041e449e82Smrg set x "$@" "$1" 2051e449e82Smrg shift 2061e449e82Smrg ;; 2071e449e82Smrg *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) 2081e449e82Smrg func_file_conv "$1" 2091e449e82Smrg set x "$@" -Tp"$file" 2101e449e82Smrg shift 2111e449e82Smrg ;; 2121e449e82Smrg *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) 2131e449e82Smrg func_file_conv "$1" mingw 2141e449e82Smrg set x "$@" "$file" 2151e449e82Smrg shift 2161e449e82Smrg ;; 2171e449e82Smrg *) 2181e449e82Smrg set x "$@" "$1" 2191e449e82Smrg shift 2201e449e82Smrg ;; 2211e449e82Smrg esac 2221e449e82Smrg fi 2231e449e82Smrg shift 2241e449e82Smrg done 2251e449e82Smrg if test -n "$linker_opts"; then 2261e449e82Smrg linker_opts="-link$linker_opts" 2271e449e82Smrg fi 2281e449e82Smrg exec "$@" $linker_opts 2291e449e82Smrg exit 1 2301e449e82Smrg} 2311e449e82Smrg 2321e449e82Smrgeat= 2331e449e82Smrg 2341e449e82Smrgcase $1 in 2351e449e82Smrg '') 2361e449e82Smrg echo "$0: No command. Try '$0 --help' for more information." 1>&2 2371e449e82Smrg exit 1; 2381e449e82Smrg ;; 2391e449e82Smrg -h | --h*) 2401e449e82Smrg cat <<\EOF 2411e449e82SmrgUsage: compile [--help] [--version] PROGRAM [ARGS] 2421e449e82Smrg 2431e449e82SmrgWrapper for compilers which do not understand '-c -o'. 2441e449e82SmrgRemove '-o dest.o' from ARGS, run PROGRAM with the remaining 2451e449e82Smrgarguments, and rename the output as expected. 2461e449e82Smrg 2471e449e82SmrgIf you are trying to build a whole package this is not the 2481e449e82Smrgright script to run: please start by reading the file 'INSTALL'. 2491e449e82Smrg 2501e449e82SmrgReport bugs to <bug-automake@gnu.org>. 2511e449e82SmrgEOF 2521e449e82Smrg exit $? 2531e449e82Smrg ;; 2541e449e82Smrg -v | --v*) 2551e449e82Smrg echo "compile $scriptversion" 2561e449e82Smrg exit $? 2571e449e82Smrg ;; 2581e449e82Smrg cl | *[/\\]cl | cl.exe | *[/\\]cl.exe ) 2591e449e82Smrg func_cl_wrapper "$@" # Doesn't return... 2601e449e82Smrg ;; 2611e449e82Smrgesac 2621e449e82Smrg 2631e449e82Smrgofile= 2641e449e82Smrgcfile= 2651e449e82Smrg 2661e449e82Smrgfor arg 2671e449e82Smrgdo 2681e449e82Smrg if test -n "$eat"; then 2691e449e82Smrg eat= 2701e449e82Smrg else 2711e449e82Smrg case $1 in 2721e449e82Smrg -o) 2731e449e82Smrg # configure might choose to run compile as 'compile cc -o foo foo.c'. 2741e449e82Smrg # So we strip '-o arg' only if arg is an object. 2751e449e82Smrg eat=1 2761e449e82Smrg case $2 in 2771e449e82Smrg *.o | *.obj) 2781e449e82Smrg ofile=$2 2791e449e82Smrg ;; 2801e449e82Smrg *) 2811e449e82Smrg set x "$@" -o "$2" 2821e449e82Smrg shift 2831e449e82Smrg ;; 2841e449e82Smrg esac 2851e449e82Smrg ;; 2861e449e82Smrg *.c) 2871e449e82Smrg cfile=$1 2881e449e82Smrg set x "$@" "$1" 2891e449e82Smrg shift 2901e449e82Smrg ;; 2911e449e82Smrg *) 2921e449e82Smrg set x "$@" "$1" 2931e449e82Smrg shift 2941e449e82Smrg ;; 2951e449e82Smrg esac 2961e449e82Smrg fi 2971e449e82Smrg shift 2981e449e82Smrgdone 2991e449e82Smrg 3001e449e82Smrgif test -z "$ofile" || test -z "$cfile"; then 3011e449e82Smrg # If no '-o' option was seen then we might have been invoked from a 3021e449e82Smrg # pattern rule where we don't need one. That is ok -- this is a 3031e449e82Smrg # normal compilation that the losing compiler can handle. If no 3041e449e82Smrg # '.c' file was seen then we are probably linking. That is also 3051e449e82Smrg # ok. 3061e449e82Smrg exec "$@" 3071e449e82Smrgfi 3081e449e82Smrg 3091e449e82Smrg# Name of file we expect compiler to create. 3101e449e82Smrgcofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` 3111e449e82Smrg 3121e449e82Smrg# Create the lock directory. 3131e449e82Smrg# Note: use '[/\\:.-]' here to ensure that we don't use the same name 3141e449e82Smrg# that we are using for the .o file. Also, base the name on the expected 3151e449e82Smrg# object file name, since that is what matters with a parallel build. 3161e449e82Smrglockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d 3171e449e82Smrgwhile true; do 3181e449e82Smrg if mkdir "$lockdir" >/dev/null 2>&1; then 3191e449e82Smrg break 3201e449e82Smrg fi 3211e449e82Smrg sleep 1 3221e449e82Smrgdone 3231e449e82Smrg# FIXME: race condition here if user kills between mkdir and trap. 3241e449e82Smrgtrap "rmdir '$lockdir'; exit 1" 1 2 15 3251e449e82Smrg 3261e449e82Smrg# Run the compile. 3271e449e82Smrg"$@" 3281e449e82Smrgret=$? 3291e449e82Smrg 3301e449e82Smrgif test -f "$cofile"; then 3311e449e82Smrg test "$cofile" = "$ofile" || mv "$cofile" "$ofile" 3321e449e82Smrgelif test -f "${cofile}bj"; then 3331e449e82Smrg test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" 3341e449e82Smrgfi 3351e449e82Smrg 3361e449e82Smrgrmdir "$lockdir" 3371e449e82Smrgexit $ret 3381e449e82Smrg 3391e449e82Smrg# Local Variables: 3401e449e82Smrg# mode: shell-script 3411e449e82Smrg# sh-indentation: 2 3421e449e82Smrg# eval: (add-hook 'write-file-hooks 'time-stamp) 3431e449e82Smrg# time-stamp-start: "scriptversion=" 3441e449e82Smrg# time-stamp-format: "%:y-%02m-%02d.%02H" 3451e449e82Smrg# time-stamp-time-zone: "UTC" 3461e449e82Smrg# time-stamp-end: "; # UTC" 3471e449e82Smrg# End: 348