compile revision 8fc2d0c6
10a392d7eSmrg#! /bin/sh 20a392d7eSmrg# Wrapper for compilers which do not understand '-c -o'. 30a392d7eSmrg 48fc2d0c6Smrgscriptversion=2018-03-07.03; # UTC 50a392d7eSmrg 68fc2d0c6Smrg# Copyright (C) 1999-2021 Free Software Foundation, Inc. 70a392d7eSmrg# Written by Tom Tromey <tromey@cygnus.com>. 80a392d7eSmrg# 90a392d7eSmrg# This program is free software; you can redistribute it and/or modify 100a392d7eSmrg# it under the terms of the GNU General Public License as published by 110a392d7eSmrg# the Free Software Foundation; either version 2, or (at your option) 120a392d7eSmrg# any later version. 130a392d7eSmrg# 140a392d7eSmrg# This program is distributed in the hope that it will be useful, 150a392d7eSmrg# but WITHOUT ANY WARRANTY; without even the implied warranty of 160a392d7eSmrg# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 170a392d7eSmrg# GNU General Public License for more details. 180a392d7eSmrg# 190a392d7eSmrg# You should have received a copy of the GNU General Public License 208fc2d0c6Smrg# along with this program. If not, see <https://www.gnu.org/licenses/>. 210a392d7eSmrg 220a392d7eSmrg# As a special exception to the GNU General Public License, if you 230a392d7eSmrg# distribute this file as part of a program that contains a 240a392d7eSmrg# configuration script generated by Autoconf, you may include it under 250a392d7eSmrg# the same distribution terms that you use for the rest of that program. 260a392d7eSmrg 270a392d7eSmrg# This file is maintained in Automake, please report 280a392d7eSmrg# bugs to <bug-automake@gnu.org> or send patches to 290a392d7eSmrg# <automake-patches@gnu.org>. 300a392d7eSmrg 310a392d7eSmrgnl=' 320a392d7eSmrg' 330a392d7eSmrg 340a392d7eSmrg# We need space, tab and new line, in precisely that order. Quoting is 350a392d7eSmrg# there to prevent tools from complaining about whitespace usage. 360a392d7eSmrgIFS=" "" $nl" 370a392d7eSmrg 380a392d7eSmrgfile_conv= 390a392d7eSmrg 400a392d7eSmrg# func_file_conv build_file lazy 410a392d7eSmrg# Convert a $build file to $host form and store it in $file 420a392d7eSmrg# Currently only supports Windows hosts. If the determined conversion 430a392d7eSmrg# type is listed in (the comma separated) LAZY, no conversion will 440a392d7eSmrg# take place. 450a392d7eSmrgfunc_file_conv () 460a392d7eSmrg{ 470a392d7eSmrg file=$1 480a392d7eSmrg case $file in 490a392d7eSmrg / | /[!/]*) # absolute file, and not a UNC file 500a392d7eSmrg if test -z "$file_conv"; then 510a392d7eSmrg # lazily determine how to convert abs files 520a392d7eSmrg case `uname -s` in 530a392d7eSmrg MINGW*) 540a392d7eSmrg file_conv=mingw 550a392d7eSmrg ;; 568fc2d0c6Smrg CYGWIN* | MSYS*) 570a392d7eSmrg file_conv=cygwin 580a392d7eSmrg ;; 590a392d7eSmrg *) 600a392d7eSmrg file_conv=wine 610a392d7eSmrg ;; 620a392d7eSmrg esac 630a392d7eSmrg fi 640a392d7eSmrg case $file_conv/,$2, in 650a392d7eSmrg *,$file_conv,*) 660a392d7eSmrg ;; 670a392d7eSmrg mingw/*) 680a392d7eSmrg file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` 690a392d7eSmrg ;; 708fc2d0c6Smrg cygwin/* | msys/*) 710a392d7eSmrg file=`cygpath -m "$file" || echo "$file"` 720a392d7eSmrg ;; 730a392d7eSmrg wine/*) 740a392d7eSmrg file=`winepath -w "$file" || echo "$file"` 750a392d7eSmrg ;; 760a392d7eSmrg esac 770a392d7eSmrg ;; 780a392d7eSmrg esac 790a392d7eSmrg} 800a392d7eSmrg 810a392d7eSmrg# func_cl_dashL linkdir 820a392d7eSmrg# Make cl look for libraries in LINKDIR 830a392d7eSmrgfunc_cl_dashL () 840a392d7eSmrg{ 850a392d7eSmrg func_file_conv "$1" 860a392d7eSmrg if test -z "$lib_path"; then 870a392d7eSmrg lib_path=$file 880a392d7eSmrg else 890a392d7eSmrg lib_path="$lib_path;$file" 900a392d7eSmrg fi 910a392d7eSmrg linker_opts="$linker_opts -LIBPATH:$file" 920a392d7eSmrg} 930a392d7eSmrg 940a392d7eSmrg# func_cl_dashl library 950a392d7eSmrg# Do a library search-path lookup for cl 960a392d7eSmrgfunc_cl_dashl () 970a392d7eSmrg{ 980a392d7eSmrg lib=$1 990a392d7eSmrg found=no 1000a392d7eSmrg save_IFS=$IFS 1010a392d7eSmrg IFS=';' 1020a392d7eSmrg for dir in $lib_path $LIB 1030a392d7eSmrg do 1040a392d7eSmrg IFS=$save_IFS 1050a392d7eSmrg if $shared && test -f "$dir/$lib.dll.lib"; then 1060a392d7eSmrg found=yes 1070a392d7eSmrg lib=$dir/$lib.dll.lib 1080a392d7eSmrg break 1090a392d7eSmrg fi 1100a392d7eSmrg if test -f "$dir/$lib.lib"; then 1110a392d7eSmrg found=yes 1120a392d7eSmrg lib=$dir/$lib.lib 1130a392d7eSmrg break 1140a392d7eSmrg fi 1150a392d7eSmrg if test -f "$dir/lib$lib.a"; then 1160a392d7eSmrg found=yes 1170a392d7eSmrg lib=$dir/lib$lib.a 1180a392d7eSmrg break 1190a392d7eSmrg fi 1200a392d7eSmrg done 1210a392d7eSmrg IFS=$save_IFS 1220a392d7eSmrg 1230a392d7eSmrg if test "$found" != yes; then 1240a392d7eSmrg lib=$lib.lib 1250a392d7eSmrg fi 1260a392d7eSmrg} 1270a392d7eSmrg 1280a392d7eSmrg# func_cl_wrapper cl arg... 1290a392d7eSmrg# Adjust compile command to suit cl 1300a392d7eSmrgfunc_cl_wrapper () 1310a392d7eSmrg{ 1320a392d7eSmrg # Assume a capable shell 1330a392d7eSmrg lib_path= 1340a392d7eSmrg shared=: 1350a392d7eSmrg linker_opts= 1360a392d7eSmrg for arg 1370a392d7eSmrg do 1380a392d7eSmrg if test -n "$eat"; then 1390a392d7eSmrg eat= 1400a392d7eSmrg else 1410a392d7eSmrg case $1 in 1420a392d7eSmrg -o) 1430a392d7eSmrg # configure might choose to run compile as 'compile cc -o foo foo.c'. 1440a392d7eSmrg eat=1 1450a392d7eSmrg case $2 in 1460a392d7eSmrg *.o | *.[oO][bB][jJ]) 1470a392d7eSmrg func_file_conv "$2" 1480a392d7eSmrg set x "$@" -Fo"$file" 1490a392d7eSmrg shift 1500a392d7eSmrg ;; 1510a392d7eSmrg *) 1520a392d7eSmrg func_file_conv "$2" 1530a392d7eSmrg set x "$@" -Fe"$file" 1540a392d7eSmrg shift 1550a392d7eSmrg ;; 1560a392d7eSmrg esac 1570a392d7eSmrg ;; 1580a392d7eSmrg -I) 1590a392d7eSmrg eat=1 1600a392d7eSmrg func_file_conv "$2" mingw 1610a392d7eSmrg set x "$@" -I"$file" 1620a392d7eSmrg shift 1630a392d7eSmrg ;; 1640a392d7eSmrg -I*) 1650a392d7eSmrg func_file_conv "${1#-I}" mingw 1660a392d7eSmrg set x "$@" -I"$file" 1670a392d7eSmrg shift 1680a392d7eSmrg ;; 1690a392d7eSmrg -l) 1700a392d7eSmrg eat=1 1710a392d7eSmrg func_cl_dashl "$2" 1720a392d7eSmrg set x "$@" "$lib" 1730a392d7eSmrg shift 1740a392d7eSmrg ;; 1750a392d7eSmrg -l*) 1760a392d7eSmrg func_cl_dashl "${1#-l}" 1770a392d7eSmrg set x "$@" "$lib" 1780a392d7eSmrg shift 1790a392d7eSmrg ;; 1800a392d7eSmrg -L) 1810a392d7eSmrg eat=1 1820a392d7eSmrg func_cl_dashL "$2" 1830a392d7eSmrg ;; 1840a392d7eSmrg -L*) 1850a392d7eSmrg func_cl_dashL "${1#-L}" 1860a392d7eSmrg ;; 1870a392d7eSmrg -static) 1880a392d7eSmrg shared=false 1890a392d7eSmrg ;; 1900a392d7eSmrg -Wl,*) 1910a392d7eSmrg arg=${1#-Wl,} 1920a392d7eSmrg save_ifs="$IFS"; IFS=',' 1930a392d7eSmrg for flag in $arg; do 1940a392d7eSmrg IFS="$save_ifs" 1950a392d7eSmrg linker_opts="$linker_opts $flag" 1960a392d7eSmrg done 1970a392d7eSmrg IFS="$save_ifs" 1980a392d7eSmrg ;; 1990a392d7eSmrg -Xlinker) 2000a392d7eSmrg eat=1 2010a392d7eSmrg linker_opts="$linker_opts $2" 2020a392d7eSmrg ;; 2030a392d7eSmrg -*) 2040a392d7eSmrg set x "$@" "$1" 2050a392d7eSmrg shift 2060a392d7eSmrg ;; 2070a392d7eSmrg *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) 2080a392d7eSmrg func_file_conv "$1" 2090a392d7eSmrg set x "$@" -Tp"$file" 2100a392d7eSmrg shift 2110a392d7eSmrg ;; 2120a392d7eSmrg *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) 2130a392d7eSmrg func_file_conv "$1" mingw 2140a392d7eSmrg set x "$@" "$file" 2150a392d7eSmrg shift 2160a392d7eSmrg ;; 2170a392d7eSmrg *) 2180a392d7eSmrg set x "$@" "$1" 2190a392d7eSmrg shift 2200a392d7eSmrg ;; 2210a392d7eSmrg esac 2220a392d7eSmrg fi 2230a392d7eSmrg shift 2240a392d7eSmrg done 2250a392d7eSmrg if test -n "$linker_opts"; then 2260a392d7eSmrg linker_opts="-link$linker_opts" 2270a392d7eSmrg fi 2280a392d7eSmrg exec "$@" $linker_opts 2290a392d7eSmrg exit 1 2300a392d7eSmrg} 2310a392d7eSmrg 2320a392d7eSmrgeat= 2330a392d7eSmrg 2340a392d7eSmrgcase $1 in 2350a392d7eSmrg '') 2360a392d7eSmrg echo "$0: No command. Try '$0 --help' for more information." 1>&2 2370a392d7eSmrg exit 1; 2380a392d7eSmrg ;; 2390a392d7eSmrg -h | --h*) 2400a392d7eSmrg cat <<\EOF 2410a392d7eSmrgUsage: compile [--help] [--version] PROGRAM [ARGS] 2420a392d7eSmrg 2430a392d7eSmrgWrapper for compilers which do not understand '-c -o'. 2440a392d7eSmrgRemove '-o dest.o' from ARGS, run PROGRAM with the remaining 2450a392d7eSmrgarguments, and rename the output as expected. 2460a392d7eSmrg 2470a392d7eSmrgIf you are trying to build a whole package this is not the 2480a392d7eSmrgright script to run: please start by reading the file 'INSTALL'. 2490a392d7eSmrg 2500a392d7eSmrgReport bugs to <bug-automake@gnu.org>. 2510a392d7eSmrgEOF 2520a392d7eSmrg exit $? 2530a392d7eSmrg ;; 2540a392d7eSmrg -v | --v*) 2550a392d7eSmrg echo "compile $scriptversion" 2560a392d7eSmrg exit $? 2570a392d7eSmrg ;; 2588fc2d0c6Smrg cl | *[/\\]cl | cl.exe | *[/\\]cl.exe | \ 2598fc2d0c6Smrg icl | *[/\\]icl | icl.exe | *[/\\]icl.exe ) 2600a392d7eSmrg func_cl_wrapper "$@" # Doesn't return... 2610a392d7eSmrg ;; 2620a392d7eSmrgesac 2630a392d7eSmrg 2640a392d7eSmrgofile= 2650a392d7eSmrgcfile= 2660a392d7eSmrg 2670a392d7eSmrgfor arg 2680a392d7eSmrgdo 2690a392d7eSmrg if test -n "$eat"; then 2700a392d7eSmrg eat= 2710a392d7eSmrg else 2720a392d7eSmrg case $1 in 2730a392d7eSmrg -o) 2740a392d7eSmrg # configure might choose to run compile as 'compile cc -o foo foo.c'. 2750a392d7eSmrg # So we strip '-o arg' only if arg is an object. 2760a392d7eSmrg eat=1 2770a392d7eSmrg case $2 in 2780a392d7eSmrg *.o | *.obj) 2790a392d7eSmrg ofile=$2 2800a392d7eSmrg ;; 2810a392d7eSmrg *) 2820a392d7eSmrg set x "$@" -o "$2" 2830a392d7eSmrg shift 2840a392d7eSmrg ;; 2850a392d7eSmrg esac 2860a392d7eSmrg ;; 2870a392d7eSmrg *.c) 2880a392d7eSmrg cfile=$1 2890a392d7eSmrg set x "$@" "$1" 2900a392d7eSmrg shift 2910a392d7eSmrg ;; 2920a392d7eSmrg *) 2930a392d7eSmrg set x "$@" "$1" 2940a392d7eSmrg shift 2950a392d7eSmrg ;; 2960a392d7eSmrg esac 2970a392d7eSmrg fi 2980a392d7eSmrg shift 2990a392d7eSmrgdone 3000a392d7eSmrg 3010a392d7eSmrgif test -z "$ofile" || test -z "$cfile"; then 3020a392d7eSmrg # If no '-o' option was seen then we might have been invoked from a 3030a392d7eSmrg # pattern rule where we don't need one. That is ok -- this is a 3040a392d7eSmrg # normal compilation that the losing compiler can handle. If no 3050a392d7eSmrg # '.c' file was seen then we are probably linking. That is also 3060a392d7eSmrg # ok. 3070a392d7eSmrg exec "$@" 3080a392d7eSmrgfi 3090a392d7eSmrg 3100a392d7eSmrg# Name of file we expect compiler to create. 3110a392d7eSmrgcofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` 3120a392d7eSmrg 3130a392d7eSmrg# Create the lock directory. 3140a392d7eSmrg# Note: use '[/\\:.-]' here to ensure that we don't use the same name 3150a392d7eSmrg# that we are using for the .o file. Also, base the name on the expected 3160a392d7eSmrg# object file name, since that is what matters with a parallel build. 3170a392d7eSmrglockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d 3180a392d7eSmrgwhile true; do 3190a392d7eSmrg if mkdir "$lockdir" >/dev/null 2>&1; then 3200a392d7eSmrg break 3210a392d7eSmrg fi 3220a392d7eSmrg sleep 1 3230a392d7eSmrgdone 3240a392d7eSmrg# FIXME: race condition here if user kills between mkdir and trap. 3250a392d7eSmrgtrap "rmdir '$lockdir'; exit 1" 1 2 15 3260a392d7eSmrg 3270a392d7eSmrg# Run the compile. 3280a392d7eSmrg"$@" 3290a392d7eSmrgret=$? 3300a392d7eSmrg 3310a392d7eSmrgif test -f "$cofile"; then 3320a392d7eSmrg test "$cofile" = "$ofile" || mv "$cofile" "$ofile" 3330a392d7eSmrgelif test -f "${cofile}bj"; then 3340a392d7eSmrg test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" 3350a392d7eSmrgfi 3360a392d7eSmrg 3370a392d7eSmrgrmdir "$lockdir" 3380a392d7eSmrgexit $ret 3390a392d7eSmrg 3400a392d7eSmrg# Local Variables: 3410a392d7eSmrg# mode: shell-script 3420a392d7eSmrg# sh-indentation: 2 3438fc2d0c6Smrg# eval: (add-hook 'before-save-hook 'time-stamp) 3440a392d7eSmrg# time-stamp-start: "scriptversion=" 3450a392d7eSmrg# time-stamp-format: "%:y-%02m-%02d.%02H" 3468fc2d0c6Smrg# time-stamp-time-zone: "UTC0" 3470a392d7eSmrg# time-stamp-end: "; # UTC" 3480a392d7eSmrg# End: 349