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