compile revision 25dbecb6
11f27ce9aSmrg#! /bin/sh 225dbecb6Smrg# Wrapper for compilers which do not understand '-c -o'. 31f27ce9aSmrg 425dbecb6Smrgscriptversion=2018-03-07.03; # UTC 51f27ce9aSmrg 625dbecb6Smrg# Copyright (C) 1999-2021 Free Software Foundation, Inc. 71f27ce9aSmrg# Written by Tom Tromey <tromey@cygnus.com>. 81f27ce9aSmrg# 91f27ce9aSmrg# This program is free software; you can redistribute it and/or modify 101f27ce9aSmrg# it under the terms of the GNU General Public License as published by 111f27ce9aSmrg# the Free Software Foundation; either version 2, or (at your option) 121f27ce9aSmrg# any later version. 131f27ce9aSmrg# 141f27ce9aSmrg# This program is distributed in the hope that it will be useful, 151f27ce9aSmrg# but WITHOUT ANY WARRANTY; without even the implied warranty of 161f27ce9aSmrg# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 171f27ce9aSmrg# GNU General Public License for more details. 181f27ce9aSmrg# 191f27ce9aSmrg# You should have received a copy of the GNU General Public License 2025dbecb6Smrg# along with this program. If not, see <https://www.gnu.org/licenses/>. 211f27ce9aSmrg 221f27ce9aSmrg# As a special exception to the GNU General Public License, if you 231f27ce9aSmrg# distribute this file as part of a program that contains a 241f27ce9aSmrg# configuration script generated by Autoconf, you may include it under 251f27ce9aSmrg# the same distribution terms that you use for the rest of that program. 261f27ce9aSmrg 271f27ce9aSmrg# This file is maintained in Automake, please report 281f27ce9aSmrg# bugs to <bug-automake@gnu.org> or send patches to 291f27ce9aSmrg# <automake-patches@gnu.org>. 301f27ce9aSmrg 3125dbecb6Smrgnl=' 3225dbecb6Smrg' 3325dbecb6Smrg 3425dbecb6Smrg# We need space, tab and new line, in precisely that order. Quoting is 3525dbecb6Smrg# there to prevent tools from complaining about whitespace usage. 3625dbecb6SmrgIFS=" "" $nl" 3725dbecb6Smrg 3825dbecb6Smrgfile_conv= 3925dbecb6Smrg 4025dbecb6Smrg# func_file_conv build_file lazy 4125dbecb6Smrg# Convert a $build file to $host form and store it in $file 4225dbecb6Smrg# Currently only supports Windows hosts. If the determined conversion 4325dbecb6Smrg# type is listed in (the comma separated) LAZY, no conversion will 4425dbecb6Smrg# take place. 4525dbecb6Smrgfunc_file_conv () 4625dbecb6Smrg{ 4725dbecb6Smrg file=$1 4825dbecb6Smrg case $file in 4925dbecb6Smrg / | /[!/]*) # absolute file, and not a UNC file 5025dbecb6Smrg if test -z "$file_conv"; then 5125dbecb6Smrg # lazily determine how to convert abs files 5225dbecb6Smrg case `uname -s` in 5325dbecb6Smrg MINGW*) 5425dbecb6Smrg file_conv=mingw 5525dbecb6Smrg ;; 5625dbecb6Smrg CYGWIN* | MSYS*) 5725dbecb6Smrg file_conv=cygwin 5825dbecb6Smrg ;; 5925dbecb6Smrg *) 6025dbecb6Smrg file_conv=wine 6125dbecb6Smrg ;; 6225dbecb6Smrg esac 6325dbecb6Smrg fi 6425dbecb6Smrg case $file_conv/,$2, in 6525dbecb6Smrg *,$file_conv,*) 6625dbecb6Smrg ;; 6725dbecb6Smrg mingw/*) 6825dbecb6Smrg file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` 6925dbecb6Smrg ;; 7025dbecb6Smrg cygwin/* | msys/*) 7125dbecb6Smrg file=`cygpath -m "$file" || echo "$file"` 7225dbecb6Smrg ;; 7325dbecb6Smrg wine/*) 7425dbecb6Smrg file=`winepath -w "$file" || echo "$file"` 7525dbecb6Smrg ;; 7625dbecb6Smrg esac 7725dbecb6Smrg ;; 7825dbecb6Smrg esac 7925dbecb6Smrg} 8025dbecb6Smrg 8125dbecb6Smrg# func_cl_dashL linkdir 8225dbecb6Smrg# Make cl look for libraries in LINKDIR 8325dbecb6Smrgfunc_cl_dashL () 8425dbecb6Smrg{ 8525dbecb6Smrg func_file_conv "$1" 8625dbecb6Smrg if test -z "$lib_path"; then 8725dbecb6Smrg lib_path=$file 8825dbecb6Smrg else 8925dbecb6Smrg lib_path="$lib_path;$file" 9025dbecb6Smrg fi 9125dbecb6Smrg linker_opts="$linker_opts -LIBPATH:$file" 9225dbecb6Smrg} 9325dbecb6Smrg 9425dbecb6Smrg# func_cl_dashl library 9525dbecb6Smrg# Do a library search-path lookup for cl 9625dbecb6Smrgfunc_cl_dashl () 9725dbecb6Smrg{ 9825dbecb6Smrg lib=$1 9925dbecb6Smrg found=no 10025dbecb6Smrg save_IFS=$IFS 10125dbecb6Smrg IFS=';' 10225dbecb6Smrg for dir in $lib_path $LIB 10325dbecb6Smrg do 10425dbecb6Smrg IFS=$save_IFS 10525dbecb6Smrg if $shared && test -f "$dir/$lib.dll.lib"; then 10625dbecb6Smrg found=yes 10725dbecb6Smrg lib=$dir/$lib.dll.lib 10825dbecb6Smrg break 10925dbecb6Smrg fi 11025dbecb6Smrg if test -f "$dir/$lib.lib"; then 11125dbecb6Smrg found=yes 11225dbecb6Smrg lib=$dir/$lib.lib 11325dbecb6Smrg break 11425dbecb6Smrg fi 11525dbecb6Smrg if test -f "$dir/lib$lib.a"; then 11625dbecb6Smrg found=yes 11725dbecb6Smrg lib=$dir/lib$lib.a 11825dbecb6Smrg break 11925dbecb6Smrg fi 12025dbecb6Smrg done 12125dbecb6Smrg IFS=$save_IFS 12225dbecb6Smrg 12325dbecb6Smrg if test "$found" != yes; then 12425dbecb6Smrg lib=$lib.lib 12525dbecb6Smrg fi 12625dbecb6Smrg} 12725dbecb6Smrg 12825dbecb6Smrg# func_cl_wrapper cl arg... 12925dbecb6Smrg# Adjust compile command to suit cl 13025dbecb6Smrgfunc_cl_wrapper () 13125dbecb6Smrg{ 13225dbecb6Smrg # Assume a capable shell 13325dbecb6Smrg lib_path= 13425dbecb6Smrg shared=: 13525dbecb6Smrg linker_opts= 13625dbecb6Smrg for arg 13725dbecb6Smrg do 13825dbecb6Smrg if test -n "$eat"; then 13925dbecb6Smrg eat= 14025dbecb6Smrg else 14125dbecb6Smrg case $1 in 14225dbecb6Smrg -o) 14325dbecb6Smrg # configure might choose to run compile as 'compile cc -o foo foo.c'. 14425dbecb6Smrg eat=1 14525dbecb6Smrg case $2 in 14625dbecb6Smrg *.o | *.[oO][bB][jJ]) 14725dbecb6Smrg func_file_conv "$2" 14825dbecb6Smrg set x "$@" -Fo"$file" 14925dbecb6Smrg shift 15025dbecb6Smrg ;; 15125dbecb6Smrg *) 15225dbecb6Smrg func_file_conv "$2" 15325dbecb6Smrg set x "$@" -Fe"$file" 15425dbecb6Smrg shift 15525dbecb6Smrg ;; 15625dbecb6Smrg esac 15725dbecb6Smrg ;; 15825dbecb6Smrg -I) 15925dbecb6Smrg eat=1 16025dbecb6Smrg func_file_conv "$2" mingw 16125dbecb6Smrg set x "$@" -I"$file" 16225dbecb6Smrg shift 16325dbecb6Smrg ;; 16425dbecb6Smrg -I*) 16525dbecb6Smrg func_file_conv "${1#-I}" mingw 16625dbecb6Smrg set x "$@" -I"$file" 16725dbecb6Smrg shift 16825dbecb6Smrg ;; 16925dbecb6Smrg -l) 17025dbecb6Smrg eat=1 17125dbecb6Smrg func_cl_dashl "$2" 17225dbecb6Smrg set x "$@" "$lib" 17325dbecb6Smrg shift 17425dbecb6Smrg ;; 17525dbecb6Smrg -l*) 17625dbecb6Smrg func_cl_dashl "${1#-l}" 17725dbecb6Smrg set x "$@" "$lib" 17825dbecb6Smrg shift 17925dbecb6Smrg ;; 18025dbecb6Smrg -L) 18125dbecb6Smrg eat=1 18225dbecb6Smrg func_cl_dashL "$2" 18325dbecb6Smrg ;; 18425dbecb6Smrg -L*) 18525dbecb6Smrg func_cl_dashL "${1#-L}" 18625dbecb6Smrg ;; 18725dbecb6Smrg -static) 18825dbecb6Smrg shared=false 18925dbecb6Smrg ;; 19025dbecb6Smrg -Wl,*) 19125dbecb6Smrg arg=${1#-Wl,} 19225dbecb6Smrg save_ifs="$IFS"; IFS=',' 19325dbecb6Smrg for flag in $arg; do 19425dbecb6Smrg IFS="$save_ifs" 19525dbecb6Smrg linker_opts="$linker_opts $flag" 19625dbecb6Smrg done 19725dbecb6Smrg IFS="$save_ifs" 19825dbecb6Smrg ;; 19925dbecb6Smrg -Xlinker) 20025dbecb6Smrg eat=1 20125dbecb6Smrg linker_opts="$linker_opts $2" 20225dbecb6Smrg ;; 20325dbecb6Smrg -*) 20425dbecb6Smrg set x "$@" "$1" 20525dbecb6Smrg shift 20625dbecb6Smrg ;; 20725dbecb6Smrg *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) 20825dbecb6Smrg func_file_conv "$1" 20925dbecb6Smrg set x "$@" -Tp"$file" 21025dbecb6Smrg shift 21125dbecb6Smrg ;; 21225dbecb6Smrg *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) 21325dbecb6Smrg func_file_conv "$1" mingw 21425dbecb6Smrg set x "$@" "$file" 21525dbecb6Smrg shift 21625dbecb6Smrg ;; 21725dbecb6Smrg *) 21825dbecb6Smrg set x "$@" "$1" 21925dbecb6Smrg shift 22025dbecb6Smrg ;; 22125dbecb6Smrg esac 22225dbecb6Smrg fi 22325dbecb6Smrg shift 22425dbecb6Smrg done 22525dbecb6Smrg if test -n "$linker_opts"; then 22625dbecb6Smrg linker_opts="-link$linker_opts" 22725dbecb6Smrg fi 22825dbecb6Smrg exec "$@" $linker_opts 22925dbecb6Smrg exit 1 23025dbecb6Smrg} 23125dbecb6Smrg 23225dbecb6Smrgeat= 23325dbecb6Smrg 2341f27ce9aSmrgcase $1 in 2351f27ce9aSmrg '') 23625dbecb6Smrg echo "$0: No command. Try '$0 --help' for more information." 1>&2 2371f27ce9aSmrg exit 1; 2381f27ce9aSmrg ;; 2391f27ce9aSmrg -h | --h*) 2401f27ce9aSmrg cat <<\EOF 2411f27ce9aSmrgUsage: compile [--help] [--version] PROGRAM [ARGS] 2421f27ce9aSmrg 24325dbecb6SmrgWrapper for compilers which do not understand '-c -o'. 24425dbecb6SmrgRemove '-o dest.o' from ARGS, run PROGRAM with the remaining 2451f27ce9aSmrgarguments, and rename the output as expected. 2461f27ce9aSmrg 2471f27ce9aSmrgIf you are trying to build a whole package this is not the 24825dbecb6Smrgright script to run: please start by reading the file 'INSTALL'. 2491f27ce9aSmrg 2501f27ce9aSmrgReport bugs to <bug-automake@gnu.org>. 2511f27ce9aSmrgEOF 2521f27ce9aSmrg exit $? 2531f27ce9aSmrg ;; 2541f27ce9aSmrg -v | --v*) 2551f27ce9aSmrg echo "compile $scriptversion" 2561f27ce9aSmrg exit $? 2571f27ce9aSmrg ;; 25825dbecb6Smrg cl | *[/\\]cl | cl.exe | *[/\\]cl.exe | \ 25925dbecb6Smrg icl | *[/\\]icl | icl.exe | *[/\\]icl.exe ) 26025dbecb6Smrg func_cl_wrapper "$@" # Doesn't return... 26125dbecb6Smrg ;; 2621f27ce9aSmrgesac 2631f27ce9aSmrg 2641f27ce9aSmrgofile= 2651f27ce9aSmrgcfile= 2661f27ce9aSmrg 2671f27ce9aSmrgfor arg 2681f27ce9aSmrgdo 2691f27ce9aSmrg if test -n "$eat"; then 2701f27ce9aSmrg eat= 2711f27ce9aSmrg else 2721f27ce9aSmrg case $1 in 2731f27ce9aSmrg -o) 27425dbecb6Smrg # configure might choose to run compile as 'compile cc -o foo foo.c'. 27525dbecb6Smrg # So we strip '-o arg' only if arg is an object. 2761f27ce9aSmrg eat=1 2771f27ce9aSmrg case $2 in 2781f27ce9aSmrg *.o | *.obj) 2791f27ce9aSmrg ofile=$2 2801f27ce9aSmrg ;; 2811f27ce9aSmrg *) 2821f27ce9aSmrg set x "$@" -o "$2" 2831f27ce9aSmrg shift 2841f27ce9aSmrg ;; 2851f27ce9aSmrg esac 2861f27ce9aSmrg ;; 2871f27ce9aSmrg *.c) 2881f27ce9aSmrg cfile=$1 2891f27ce9aSmrg set x "$@" "$1" 2901f27ce9aSmrg shift 2911f27ce9aSmrg ;; 2921f27ce9aSmrg *) 2931f27ce9aSmrg set x "$@" "$1" 2941f27ce9aSmrg shift 2951f27ce9aSmrg ;; 2961f27ce9aSmrg esac 2971f27ce9aSmrg fi 2981f27ce9aSmrg shift 2991f27ce9aSmrgdone 3001f27ce9aSmrg 3011f27ce9aSmrgif test -z "$ofile" || test -z "$cfile"; then 30225dbecb6Smrg # If no '-o' option was seen then we might have been invoked from a 3031f27ce9aSmrg # pattern rule where we don't need one. That is ok -- this is a 3041f27ce9aSmrg # normal compilation that the losing compiler can handle. If no 30525dbecb6Smrg # '.c' file was seen then we are probably linking. That is also 3061f27ce9aSmrg # ok. 3071f27ce9aSmrg exec "$@" 3081f27ce9aSmrgfi 3091f27ce9aSmrg 3101f27ce9aSmrg# Name of file we expect compiler to create. 31125dbecb6Smrgcofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` 3121f27ce9aSmrg 3131f27ce9aSmrg# Create the lock directory. 31425dbecb6Smrg# Note: use '[/\\:.-]' here to ensure that we don't use the same name 3151f27ce9aSmrg# that we are using for the .o file. Also, base the name on the expected 3161f27ce9aSmrg# object file name, since that is what matters with a parallel build. 31725dbecb6Smrglockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d 3181f27ce9aSmrgwhile true; do 3191f27ce9aSmrg if mkdir "$lockdir" >/dev/null 2>&1; then 3201f27ce9aSmrg break 3211f27ce9aSmrg fi 3221f27ce9aSmrg sleep 1 3231f27ce9aSmrgdone 3241f27ce9aSmrg# FIXME: race condition here if user kills between mkdir and trap. 3251f27ce9aSmrgtrap "rmdir '$lockdir'; exit 1" 1 2 15 3261f27ce9aSmrg 3271f27ce9aSmrg# Run the compile. 3281f27ce9aSmrg"$@" 3291f27ce9aSmrgret=$? 3301f27ce9aSmrg 3311f27ce9aSmrgif test -f "$cofile"; then 33225dbecb6Smrg test "$cofile" = "$ofile" || mv "$cofile" "$ofile" 3331f27ce9aSmrgelif test -f "${cofile}bj"; then 33425dbecb6Smrg test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" 3351f27ce9aSmrgfi 3361f27ce9aSmrg 3371f27ce9aSmrgrmdir "$lockdir" 3381f27ce9aSmrgexit $ret 3391f27ce9aSmrg 3401f27ce9aSmrg# Local Variables: 3411f27ce9aSmrg# mode: shell-script 3421f27ce9aSmrg# sh-indentation: 2 34325dbecb6Smrg# eval: (add-hook 'before-save-hook 'time-stamp) 3441f27ce9aSmrg# time-stamp-start: "scriptversion=" 3451f27ce9aSmrg# time-stamp-format: "%:y-%02m-%02d.%02H" 34625dbecb6Smrg# time-stamp-time-zone: "UTC0" 34725dbecb6Smrg# time-stamp-end: "; # UTC" 3481f27ce9aSmrg# End: 349