compile revision 0ea508b1
19d0ccd10Smrg#! /bin/sh 29d0ccd10Smrg# Wrapper for compilers which do not understand '-c -o'. 39d0ccd10Smrg 40ea508b1Smrgscriptversion=2018-03-07.03; # UTC 59d0ccd10Smrg 60ea508b1Smrg# Copyright (C) 1999-2021 Free Software Foundation, Inc. 79d0ccd10Smrg# Written by Tom Tromey <tromey@cygnus.com>. 89d0ccd10Smrg# 99d0ccd10Smrg# This program is free software; you can redistribute it and/or modify 109d0ccd10Smrg# it under the terms of the GNU General Public License as published by 119d0ccd10Smrg# the Free Software Foundation; either version 2, or (at your option) 129d0ccd10Smrg# any later version. 139d0ccd10Smrg# 149d0ccd10Smrg# This program is distributed in the hope that it will be useful, 159d0ccd10Smrg# but WITHOUT ANY WARRANTY; without even the implied warranty of 169d0ccd10Smrg# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 179d0ccd10Smrg# GNU General Public License for more details. 189d0ccd10Smrg# 199d0ccd10Smrg# You should have received a copy of the GNU General Public License 200ea508b1Smrg# along with this program. If not, see <https://www.gnu.org/licenses/>. 219d0ccd10Smrg 229d0ccd10Smrg# As a special exception to the GNU General Public License, if you 239d0ccd10Smrg# distribute this file as part of a program that contains a 249d0ccd10Smrg# configuration script generated by Autoconf, you may include it under 259d0ccd10Smrg# the same distribution terms that you use for the rest of that program. 269d0ccd10Smrg 279d0ccd10Smrg# This file is maintained in Automake, please report 289d0ccd10Smrg# bugs to <bug-automake@gnu.org> or send patches to 299d0ccd10Smrg# <automake-patches@gnu.org>. 309d0ccd10Smrg 319d0ccd10Smrgnl=' 329d0ccd10Smrg' 339d0ccd10Smrg 349d0ccd10Smrg# We need space, tab and new line, in precisely that order. Quoting is 359d0ccd10Smrg# there to prevent tools from complaining about whitespace usage. 369d0ccd10SmrgIFS=" "" $nl" 379d0ccd10Smrg 389d0ccd10Smrgfile_conv= 399d0ccd10Smrg 409d0ccd10Smrg# func_file_conv build_file lazy 419d0ccd10Smrg# Convert a $build file to $host form and store it in $file 429d0ccd10Smrg# Currently only supports Windows hosts. If the determined conversion 439d0ccd10Smrg# type is listed in (the comma separated) LAZY, no conversion will 449d0ccd10Smrg# take place. 459d0ccd10Smrgfunc_file_conv () 469d0ccd10Smrg{ 479d0ccd10Smrg file=$1 489d0ccd10Smrg case $file in 499d0ccd10Smrg / | /[!/]*) # absolute file, and not a UNC file 509d0ccd10Smrg if test -z "$file_conv"; then 519d0ccd10Smrg # lazily determine how to convert abs files 529d0ccd10Smrg case `uname -s` in 539d0ccd10Smrg MINGW*) 549d0ccd10Smrg file_conv=mingw 559d0ccd10Smrg ;; 560ea508b1Smrg CYGWIN* | MSYS*) 579d0ccd10Smrg file_conv=cygwin 589d0ccd10Smrg ;; 599d0ccd10Smrg *) 609d0ccd10Smrg file_conv=wine 619d0ccd10Smrg ;; 629d0ccd10Smrg esac 639d0ccd10Smrg fi 649d0ccd10Smrg case $file_conv/,$2, in 659d0ccd10Smrg *,$file_conv,*) 669d0ccd10Smrg ;; 679d0ccd10Smrg mingw/*) 689d0ccd10Smrg file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` 699d0ccd10Smrg ;; 700ea508b1Smrg cygwin/* | msys/*) 719d0ccd10Smrg file=`cygpath -m "$file" || echo "$file"` 729d0ccd10Smrg ;; 739d0ccd10Smrg wine/*) 749d0ccd10Smrg file=`winepath -w "$file" || echo "$file"` 759d0ccd10Smrg ;; 769d0ccd10Smrg esac 779d0ccd10Smrg ;; 789d0ccd10Smrg esac 799d0ccd10Smrg} 809d0ccd10Smrg 819d0ccd10Smrg# func_cl_dashL linkdir 829d0ccd10Smrg# Make cl look for libraries in LINKDIR 839d0ccd10Smrgfunc_cl_dashL () 849d0ccd10Smrg{ 859d0ccd10Smrg func_file_conv "$1" 869d0ccd10Smrg if test -z "$lib_path"; then 879d0ccd10Smrg lib_path=$file 889d0ccd10Smrg else 899d0ccd10Smrg lib_path="$lib_path;$file" 909d0ccd10Smrg fi 919d0ccd10Smrg linker_opts="$linker_opts -LIBPATH:$file" 929d0ccd10Smrg} 939d0ccd10Smrg 949d0ccd10Smrg# func_cl_dashl library 959d0ccd10Smrg# Do a library search-path lookup for cl 969d0ccd10Smrgfunc_cl_dashl () 979d0ccd10Smrg{ 989d0ccd10Smrg lib=$1 999d0ccd10Smrg found=no 1009d0ccd10Smrg save_IFS=$IFS 1019d0ccd10Smrg IFS=';' 1029d0ccd10Smrg for dir in $lib_path $LIB 1039d0ccd10Smrg do 1049d0ccd10Smrg IFS=$save_IFS 1059d0ccd10Smrg if $shared && test -f "$dir/$lib.dll.lib"; then 1069d0ccd10Smrg found=yes 1079d0ccd10Smrg lib=$dir/$lib.dll.lib 1089d0ccd10Smrg break 1099d0ccd10Smrg fi 1109d0ccd10Smrg if test -f "$dir/$lib.lib"; then 1119d0ccd10Smrg found=yes 1129d0ccd10Smrg lib=$dir/$lib.lib 1139d0ccd10Smrg break 1149d0ccd10Smrg fi 1159d0ccd10Smrg if test -f "$dir/lib$lib.a"; then 1169d0ccd10Smrg found=yes 1179d0ccd10Smrg lib=$dir/lib$lib.a 1189d0ccd10Smrg break 1199d0ccd10Smrg fi 1209d0ccd10Smrg done 1219d0ccd10Smrg IFS=$save_IFS 1229d0ccd10Smrg 1239d0ccd10Smrg if test "$found" != yes; then 1249d0ccd10Smrg lib=$lib.lib 1259d0ccd10Smrg fi 1269d0ccd10Smrg} 1279d0ccd10Smrg 1289d0ccd10Smrg# func_cl_wrapper cl arg... 1299d0ccd10Smrg# Adjust compile command to suit cl 1309d0ccd10Smrgfunc_cl_wrapper () 1319d0ccd10Smrg{ 1329d0ccd10Smrg # Assume a capable shell 1339d0ccd10Smrg lib_path= 1349d0ccd10Smrg shared=: 1359d0ccd10Smrg linker_opts= 1369d0ccd10Smrg for arg 1379d0ccd10Smrg do 1389d0ccd10Smrg if test -n "$eat"; then 1399d0ccd10Smrg eat= 1409d0ccd10Smrg else 1419d0ccd10Smrg case $1 in 1429d0ccd10Smrg -o) 1439d0ccd10Smrg # configure might choose to run compile as 'compile cc -o foo foo.c'. 1449d0ccd10Smrg eat=1 1459d0ccd10Smrg case $2 in 1469d0ccd10Smrg *.o | *.[oO][bB][jJ]) 1479d0ccd10Smrg func_file_conv "$2" 1489d0ccd10Smrg set x "$@" -Fo"$file" 1499d0ccd10Smrg shift 1509d0ccd10Smrg ;; 1519d0ccd10Smrg *) 1529d0ccd10Smrg func_file_conv "$2" 1539d0ccd10Smrg set x "$@" -Fe"$file" 1549d0ccd10Smrg shift 1559d0ccd10Smrg ;; 1569d0ccd10Smrg esac 1579d0ccd10Smrg ;; 1589d0ccd10Smrg -I) 1599d0ccd10Smrg eat=1 1609d0ccd10Smrg func_file_conv "$2" mingw 1619d0ccd10Smrg set x "$@" -I"$file" 1629d0ccd10Smrg shift 1639d0ccd10Smrg ;; 1649d0ccd10Smrg -I*) 1659d0ccd10Smrg func_file_conv "${1#-I}" mingw 1669d0ccd10Smrg set x "$@" -I"$file" 1679d0ccd10Smrg shift 1689d0ccd10Smrg ;; 1699d0ccd10Smrg -l) 1709d0ccd10Smrg eat=1 1719d0ccd10Smrg func_cl_dashl "$2" 1729d0ccd10Smrg set x "$@" "$lib" 1739d0ccd10Smrg shift 1749d0ccd10Smrg ;; 1759d0ccd10Smrg -l*) 1769d0ccd10Smrg func_cl_dashl "${1#-l}" 1779d0ccd10Smrg set x "$@" "$lib" 1789d0ccd10Smrg shift 1799d0ccd10Smrg ;; 1809d0ccd10Smrg -L) 1819d0ccd10Smrg eat=1 1829d0ccd10Smrg func_cl_dashL "$2" 1839d0ccd10Smrg ;; 1849d0ccd10Smrg -L*) 1859d0ccd10Smrg func_cl_dashL "${1#-L}" 1869d0ccd10Smrg ;; 1879d0ccd10Smrg -static) 1889d0ccd10Smrg shared=false 1899d0ccd10Smrg ;; 1909d0ccd10Smrg -Wl,*) 1919d0ccd10Smrg arg=${1#-Wl,} 1929d0ccd10Smrg save_ifs="$IFS"; IFS=',' 1939d0ccd10Smrg for flag in $arg; do 1949d0ccd10Smrg IFS="$save_ifs" 1959d0ccd10Smrg linker_opts="$linker_opts $flag" 1969d0ccd10Smrg done 1979d0ccd10Smrg IFS="$save_ifs" 1989d0ccd10Smrg ;; 1999d0ccd10Smrg -Xlinker) 2009d0ccd10Smrg eat=1 2019d0ccd10Smrg linker_opts="$linker_opts $2" 2029d0ccd10Smrg ;; 2039d0ccd10Smrg -*) 2049d0ccd10Smrg set x "$@" "$1" 2059d0ccd10Smrg shift 2069d0ccd10Smrg ;; 2079d0ccd10Smrg *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) 2089d0ccd10Smrg func_file_conv "$1" 2099d0ccd10Smrg set x "$@" -Tp"$file" 2109d0ccd10Smrg shift 2119d0ccd10Smrg ;; 2129d0ccd10Smrg *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) 2139d0ccd10Smrg func_file_conv "$1" mingw 2149d0ccd10Smrg set x "$@" "$file" 2159d0ccd10Smrg shift 2169d0ccd10Smrg ;; 2179d0ccd10Smrg *) 2189d0ccd10Smrg set x "$@" "$1" 2199d0ccd10Smrg shift 2209d0ccd10Smrg ;; 2219d0ccd10Smrg esac 2229d0ccd10Smrg fi 2239d0ccd10Smrg shift 2249d0ccd10Smrg done 2259d0ccd10Smrg if test -n "$linker_opts"; then 2269d0ccd10Smrg linker_opts="-link$linker_opts" 2279d0ccd10Smrg fi 2289d0ccd10Smrg exec "$@" $linker_opts 2299d0ccd10Smrg exit 1 2309d0ccd10Smrg} 2319d0ccd10Smrg 2329d0ccd10Smrgeat= 2339d0ccd10Smrg 2349d0ccd10Smrgcase $1 in 2359d0ccd10Smrg '') 2369d0ccd10Smrg echo "$0: No command. Try '$0 --help' for more information." 1>&2 2379d0ccd10Smrg exit 1; 2389d0ccd10Smrg ;; 2399d0ccd10Smrg -h | --h*) 2409d0ccd10Smrg cat <<\EOF 2419d0ccd10SmrgUsage: compile [--help] [--version] PROGRAM [ARGS] 2429d0ccd10Smrg 2439d0ccd10SmrgWrapper for compilers which do not understand '-c -o'. 2449d0ccd10SmrgRemove '-o dest.o' from ARGS, run PROGRAM with the remaining 2459d0ccd10Smrgarguments, and rename the output as expected. 2469d0ccd10Smrg 2479d0ccd10SmrgIf you are trying to build a whole package this is not the 2489d0ccd10Smrgright script to run: please start by reading the file 'INSTALL'. 2499d0ccd10Smrg 2509d0ccd10SmrgReport bugs to <bug-automake@gnu.org>. 2519d0ccd10SmrgEOF 2529d0ccd10Smrg exit $? 2539d0ccd10Smrg ;; 2549d0ccd10Smrg -v | --v*) 2559d0ccd10Smrg echo "compile $scriptversion" 2569d0ccd10Smrg exit $? 2579d0ccd10Smrg ;; 2580ea508b1Smrg cl | *[/\\]cl | cl.exe | *[/\\]cl.exe | \ 2590ea508b1Smrg icl | *[/\\]icl | icl.exe | *[/\\]icl.exe ) 2609d0ccd10Smrg func_cl_wrapper "$@" # Doesn't return... 2619d0ccd10Smrg ;; 2629d0ccd10Smrgesac 2639d0ccd10Smrg 2649d0ccd10Smrgofile= 2659d0ccd10Smrgcfile= 2669d0ccd10Smrg 2679d0ccd10Smrgfor arg 2689d0ccd10Smrgdo 2699d0ccd10Smrg if test -n "$eat"; then 2709d0ccd10Smrg eat= 2719d0ccd10Smrg else 2729d0ccd10Smrg case $1 in 2739d0ccd10Smrg -o) 2749d0ccd10Smrg # configure might choose to run compile as 'compile cc -o foo foo.c'. 2759d0ccd10Smrg # So we strip '-o arg' only if arg is an object. 2769d0ccd10Smrg eat=1 2779d0ccd10Smrg case $2 in 2789d0ccd10Smrg *.o | *.obj) 2799d0ccd10Smrg ofile=$2 2809d0ccd10Smrg ;; 2819d0ccd10Smrg *) 2829d0ccd10Smrg set x "$@" -o "$2" 2839d0ccd10Smrg shift 2849d0ccd10Smrg ;; 2859d0ccd10Smrg esac 2869d0ccd10Smrg ;; 2879d0ccd10Smrg *.c) 2889d0ccd10Smrg cfile=$1 2899d0ccd10Smrg set x "$@" "$1" 2909d0ccd10Smrg shift 2919d0ccd10Smrg ;; 2929d0ccd10Smrg *) 2939d0ccd10Smrg set x "$@" "$1" 2949d0ccd10Smrg shift 2959d0ccd10Smrg ;; 2969d0ccd10Smrg esac 2979d0ccd10Smrg fi 2989d0ccd10Smrg shift 2999d0ccd10Smrgdone 3009d0ccd10Smrg 3019d0ccd10Smrgif test -z "$ofile" || test -z "$cfile"; then 3029d0ccd10Smrg # If no '-o' option was seen then we might have been invoked from a 3039d0ccd10Smrg # pattern rule where we don't need one. That is ok -- this is a 3049d0ccd10Smrg # normal compilation that the losing compiler can handle. If no 3059d0ccd10Smrg # '.c' file was seen then we are probably linking. That is also 3069d0ccd10Smrg # ok. 3079d0ccd10Smrg exec "$@" 3089d0ccd10Smrgfi 3099d0ccd10Smrg 3109d0ccd10Smrg# Name of file we expect compiler to create. 3119d0ccd10Smrgcofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` 3129d0ccd10Smrg 3139d0ccd10Smrg# Create the lock directory. 3149d0ccd10Smrg# Note: use '[/\\:.-]' here to ensure that we don't use the same name 3159d0ccd10Smrg# that we are using for the .o file. Also, base the name on the expected 3169d0ccd10Smrg# object file name, since that is what matters with a parallel build. 3179d0ccd10Smrglockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d 3189d0ccd10Smrgwhile true; do 3199d0ccd10Smrg if mkdir "$lockdir" >/dev/null 2>&1; then 3209d0ccd10Smrg break 3219d0ccd10Smrg fi 3229d0ccd10Smrg sleep 1 3239d0ccd10Smrgdone 3249d0ccd10Smrg# FIXME: race condition here if user kills between mkdir and trap. 3259d0ccd10Smrgtrap "rmdir '$lockdir'; exit 1" 1 2 15 3269d0ccd10Smrg 3279d0ccd10Smrg# Run the compile. 3289d0ccd10Smrg"$@" 3299d0ccd10Smrgret=$? 3309d0ccd10Smrg 3319d0ccd10Smrgif test -f "$cofile"; then 3329d0ccd10Smrg test "$cofile" = "$ofile" || mv "$cofile" "$ofile" 3339d0ccd10Smrgelif test -f "${cofile}bj"; then 3349d0ccd10Smrg test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" 3359d0ccd10Smrgfi 3369d0ccd10Smrg 3379d0ccd10Smrgrmdir "$lockdir" 3389d0ccd10Smrgexit $ret 3399d0ccd10Smrg 3409d0ccd10Smrg# Local Variables: 3419d0ccd10Smrg# mode: shell-script 3429d0ccd10Smrg# sh-indentation: 2 3430ea508b1Smrg# eval: (add-hook 'before-save-hook 'time-stamp) 3449d0ccd10Smrg# time-stamp-start: "scriptversion=" 3459d0ccd10Smrg# time-stamp-format: "%:y-%02m-%02d.%02H" 3460ea508b1Smrg# time-stamp-time-zone: "UTC0" 3479d0ccd10Smrg# time-stamp-end: "; # UTC" 3489d0ccd10Smrg# End: 349