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