1ed6f5d66Smrg#! /bin/sh 2ed6f5d66Smrg# Wrapper for compilers which do not understand '-c -o'. 3ed6f5d66Smrg 4a3680546Smrgscriptversion=2024-06-19.01; # UTC 5ed6f5d66Smrg 6a3680546Smrg# Copyright (C) 1999-2024 Free Software Foundation, Inc. 7ed6f5d66Smrg# Written by Tom Tromey <tromey@cygnus.com>. 8ed6f5d66Smrg# 9ed6f5d66Smrg# This program is free software; you can redistribute it and/or modify 10ed6f5d66Smrg# it under the terms of the GNU General Public License as published by 11ed6f5d66Smrg# the Free Software Foundation; either version 2, or (at your option) 12ed6f5d66Smrg# any later version. 13ed6f5d66Smrg# 14ed6f5d66Smrg# This program is distributed in the hope that it will be useful, 15ed6f5d66Smrg# but WITHOUT ANY WARRANTY; without even the implied warranty of 16ed6f5d66Smrg# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17ed6f5d66Smrg# GNU General Public License for more details. 18ed6f5d66Smrg# 19ed6f5d66Smrg# You should have received a copy of the GNU General Public License 203d05230fSmrg# along with this program. If not, see <https://www.gnu.org/licenses/>. 21ed6f5d66Smrg 22ed6f5d66Smrg# As a special exception to the GNU General Public License, if you 23ed6f5d66Smrg# distribute this file as part of a program that contains a 24ed6f5d66Smrg# configuration script generated by Autoconf, you may include it under 25ed6f5d66Smrg# the same distribution terms that you use for the rest of that program. 26ed6f5d66Smrg 27ed6f5d66Smrg# This file is maintained in Automake, please report 28ed6f5d66Smrg# bugs to <bug-automake@gnu.org> or send patches to 29ed6f5d66Smrg# <automake-patches@gnu.org>. 30ed6f5d66Smrg 31ed6f5d66Smrgnl=' 32ed6f5d66Smrg' 33ed6f5d66Smrg 34ed6f5d66Smrg# We need space, tab and new line, in precisely that order. Quoting is 35ed6f5d66Smrg# there to prevent tools from complaining about whitespace usage. 36ed6f5d66SmrgIFS=" "" $nl" 37ed6f5d66Smrg 38ed6f5d66Smrgfile_conv= 39ed6f5d66Smrg 40ed6f5d66Smrg# func_file_conv build_file lazy 41ed6f5d66Smrg# Convert a $build file to $host form and store it in $file 42ed6f5d66Smrg# Currently only supports Windows hosts. If the determined conversion 43ed6f5d66Smrg# type is listed in (the comma separated) LAZY, no conversion will 44ed6f5d66Smrg# take place. 45ed6f5d66Smrgfunc_file_conv () 46ed6f5d66Smrg{ 47ed6f5d66Smrg file=$1 48ed6f5d66Smrg case $file in 49ed6f5d66Smrg / | /[!/]*) # absolute file, and not a UNC file 50ed6f5d66Smrg if test -z "$file_conv"; then 51ed6f5d66Smrg # lazily determine how to convert abs files 52ed6f5d66Smrg case `uname -s` in 53ed6f5d66Smrg MINGW*) 54ed6f5d66Smrg file_conv=mingw 55ed6f5d66Smrg ;; 563d05230fSmrg CYGWIN* | MSYS*) 57ed6f5d66Smrg file_conv=cygwin 58ed6f5d66Smrg ;; 59ed6f5d66Smrg *) 60ed6f5d66Smrg file_conv=wine 61ed6f5d66Smrg ;; 62ed6f5d66Smrg esac 63ed6f5d66Smrg fi 64ed6f5d66Smrg case $file_conv/,$2, in 65ed6f5d66Smrg *,$file_conv,*) 66ed6f5d66Smrg ;; 67ed6f5d66Smrg mingw/*) 68ed6f5d66Smrg file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` 69ed6f5d66Smrg ;; 703d05230fSmrg cygwin/* | msys/*) 71ed6f5d66Smrg file=`cygpath -m "$file" || echo "$file"` 72ed6f5d66Smrg ;; 73ed6f5d66Smrg wine/*) 74ed6f5d66Smrg file=`winepath -w "$file" || echo "$file"` 75ed6f5d66Smrg ;; 76ed6f5d66Smrg esac 77ed6f5d66Smrg ;; 78ed6f5d66Smrg esac 79ed6f5d66Smrg} 80ed6f5d66Smrg 81ed6f5d66Smrg# func_cl_dashL linkdir 82ed6f5d66Smrg# Make cl look for libraries in LINKDIR 83ed6f5d66Smrgfunc_cl_dashL () 84ed6f5d66Smrg{ 85ed6f5d66Smrg func_file_conv "$1" 86ed6f5d66Smrg if test -z "$lib_path"; then 87ed6f5d66Smrg lib_path=$file 88ed6f5d66Smrg else 89ed6f5d66Smrg lib_path="$lib_path;$file" 90ed6f5d66Smrg fi 91ed6f5d66Smrg linker_opts="$linker_opts -LIBPATH:$file" 92ed6f5d66Smrg} 93ed6f5d66Smrg 94ed6f5d66Smrg# func_cl_dashl library 95ed6f5d66Smrg# Do a library search-path lookup for cl 96ed6f5d66Smrgfunc_cl_dashl () 97ed6f5d66Smrg{ 98ed6f5d66Smrg lib=$1 99ed6f5d66Smrg found=no 100ed6f5d66Smrg save_IFS=$IFS 101ed6f5d66Smrg IFS=';' 102ed6f5d66Smrg for dir in $lib_path $LIB 103ed6f5d66Smrg do 104ed6f5d66Smrg IFS=$save_IFS 105ed6f5d66Smrg if $shared && test -f "$dir/$lib.dll.lib"; then 106ed6f5d66Smrg found=yes 107ed6f5d66Smrg lib=$dir/$lib.dll.lib 108ed6f5d66Smrg break 109ed6f5d66Smrg fi 110ed6f5d66Smrg if test -f "$dir/$lib.lib"; then 111ed6f5d66Smrg found=yes 112ed6f5d66Smrg lib=$dir/$lib.lib 113ed6f5d66Smrg break 114ed6f5d66Smrg fi 115ed6f5d66Smrg if test -f "$dir/lib$lib.a"; then 116ed6f5d66Smrg found=yes 117ed6f5d66Smrg lib=$dir/lib$lib.a 118ed6f5d66Smrg break 119ed6f5d66Smrg fi 120ed6f5d66Smrg done 121ed6f5d66Smrg IFS=$save_IFS 122ed6f5d66Smrg 123ed6f5d66Smrg if test "$found" != yes; then 124ed6f5d66Smrg lib=$lib.lib 125ed6f5d66Smrg fi 126ed6f5d66Smrg} 127ed6f5d66Smrg 128ed6f5d66Smrg# func_cl_wrapper cl arg... 129ed6f5d66Smrg# Adjust compile command to suit cl 130ed6f5d66Smrgfunc_cl_wrapper () 131ed6f5d66Smrg{ 132ed6f5d66Smrg # Assume a capable shell 133ed6f5d66Smrg lib_path= 134ed6f5d66Smrg shared=: 135ed6f5d66Smrg linker_opts= 136ed6f5d66Smrg for arg 137ed6f5d66Smrg do 138ed6f5d66Smrg if test -n "$eat"; then 139ed6f5d66Smrg eat= 140ed6f5d66Smrg else 141ed6f5d66Smrg case $1 in 142ed6f5d66Smrg -o) 143ed6f5d66Smrg # configure might choose to run compile as 'compile cc -o foo foo.c'. 144ed6f5d66Smrg eat=1 145ed6f5d66Smrg case $2 in 146a3680546Smrg *.o | *.lo | *.[oO][bB][jJ]) 147ed6f5d66Smrg func_file_conv "$2" 148ed6f5d66Smrg set x "$@" -Fo"$file" 149ed6f5d66Smrg shift 150ed6f5d66Smrg ;; 151ed6f5d66Smrg *) 152ed6f5d66Smrg func_file_conv "$2" 153ed6f5d66Smrg set x "$@" -Fe"$file" 154ed6f5d66Smrg shift 155ed6f5d66Smrg ;; 156ed6f5d66Smrg esac 157ed6f5d66Smrg ;; 158ed6f5d66Smrg -I) 159ed6f5d66Smrg eat=1 160ed6f5d66Smrg func_file_conv "$2" mingw 161ed6f5d66Smrg set x "$@" -I"$file" 162ed6f5d66Smrg shift 163ed6f5d66Smrg ;; 164ed6f5d66Smrg -I*) 165ed6f5d66Smrg func_file_conv "${1#-I}" mingw 166ed6f5d66Smrg set x "$@" -I"$file" 167ed6f5d66Smrg shift 168ed6f5d66Smrg ;; 169ed6f5d66Smrg -l) 170ed6f5d66Smrg eat=1 171ed6f5d66Smrg func_cl_dashl "$2" 172ed6f5d66Smrg set x "$@" "$lib" 173ed6f5d66Smrg shift 174ed6f5d66Smrg ;; 175ed6f5d66Smrg -l*) 176ed6f5d66Smrg func_cl_dashl "${1#-l}" 177ed6f5d66Smrg set x "$@" "$lib" 178ed6f5d66Smrg shift 179ed6f5d66Smrg ;; 180ed6f5d66Smrg -L) 181ed6f5d66Smrg eat=1 182ed6f5d66Smrg func_cl_dashL "$2" 183ed6f5d66Smrg ;; 184ed6f5d66Smrg -L*) 185ed6f5d66Smrg func_cl_dashL "${1#-L}" 186ed6f5d66Smrg ;; 187ed6f5d66Smrg -static) 188ed6f5d66Smrg shared=false 189ed6f5d66Smrg ;; 190ed6f5d66Smrg -Wl,*) 191ed6f5d66Smrg arg=${1#-Wl,} 192ed6f5d66Smrg save_ifs="$IFS"; IFS=',' 193ed6f5d66Smrg for flag in $arg; do 194ed6f5d66Smrg IFS="$save_ifs" 195ed6f5d66Smrg linker_opts="$linker_opts $flag" 196ed6f5d66Smrg done 197ed6f5d66Smrg IFS="$save_ifs" 198ed6f5d66Smrg ;; 199ed6f5d66Smrg -Xlinker) 200ed6f5d66Smrg eat=1 201ed6f5d66Smrg linker_opts="$linker_opts $2" 202ed6f5d66Smrg ;; 203ed6f5d66Smrg -*) 204ed6f5d66Smrg set x "$@" "$1" 205ed6f5d66Smrg shift 206ed6f5d66Smrg ;; 207ed6f5d66Smrg *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) 208ed6f5d66Smrg func_file_conv "$1" 209ed6f5d66Smrg set x "$@" -Tp"$file" 210ed6f5d66Smrg shift 211ed6f5d66Smrg ;; 212ed6f5d66Smrg *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) 213ed6f5d66Smrg func_file_conv "$1" mingw 214ed6f5d66Smrg set x "$@" "$file" 215ed6f5d66Smrg shift 216ed6f5d66Smrg ;; 217ed6f5d66Smrg *) 218ed6f5d66Smrg set x "$@" "$1" 219ed6f5d66Smrg shift 220ed6f5d66Smrg ;; 221ed6f5d66Smrg esac 222ed6f5d66Smrg fi 223ed6f5d66Smrg shift 224ed6f5d66Smrg done 225ed6f5d66Smrg if test -n "$linker_opts"; then 226ed6f5d66Smrg linker_opts="-link$linker_opts" 227ed6f5d66Smrg fi 228ed6f5d66Smrg exec "$@" $linker_opts 229ed6f5d66Smrg exit 1 230ed6f5d66Smrg} 231ed6f5d66Smrg 232ed6f5d66Smrgeat= 233ed6f5d66Smrg 234ed6f5d66Smrgcase $1 in 235ed6f5d66Smrg '') 236ed6f5d66Smrg echo "$0: No command. Try '$0 --help' for more information." 1>&2 237ed6f5d66Smrg exit 1; 238ed6f5d66Smrg ;; 239ed6f5d66Smrg -h | --h*) 240ed6f5d66Smrg cat <<\EOF 241ed6f5d66SmrgUsage: compile [--help] [--version] PROGRAM [ARGS] 242ed6f5d66Smrg 243ed6f5d66SmrgWrapper for compilers which do not understand '-c -o'. 244ed6f5d66SmrgRemove '-o dest.o' from ARGS, run PROGRAM with the remaining 245ed6f5d66Smrgarguments, and rename the output as expected. 246ed6f5d66Smrg 247ed6f5d66SmrgIf you are trying to build a whole package this is not the 248ed6f5d66Smrgright script to run: please start by reading the file 'INSTALL'. 249ed6f5d66Smrg 250ed6f5d66SmrgReport bugs to <bug-automake@gnu.org>. 251a3680546SmrgGNU Automake home page: <https://www.gnu.org/software/automake/>. 252a3680546SmrgGeneral help using GNU software: <https://www.gnu.org/gethelp/>. 253ed6f5d66SmrgEOF 254ed6f5d66Smrg exit $? 255ed6f5d66Smrg ;; 256ed6f5d66Smrg -v | --v*) 257a3680546Smrg echo "compile (GNU Automake) $scriptversion" 258ed6f5d66Smrg exit $? 259ed6f5d66Smrg ;; 260fbc03982Smrg cl | *[/\\]cl | cl.exe | *[/\\]cl.exe | \ 261a3680546Smrg clang-cl | *[/\\]clang-cl | clang-cl.exe | *[/\\]clang-cl.exe | \ 262fbc03982Smrg icl | *[/\\]icl | icl.exe | *[/\\]icl.exe ) 263ed6f5d66Smrg func_cl_wrapper "$@" # Doesn't return... 264ed6f5d66Smrg ;; 265ed6f5d66Smrgesac 266ed6f5d66Smrg 267ed6f5d66Smrgofile= 268ed6f5d66Smrgcfile= 269ed6f5d66Smrg 270ed6f5d66Smrgfor arg 271ed6f5d66Smrgdo 272ed6f5d66Smrg if test -n "$eat"; then 273ed6f5d66Smrg eat= 274ed6f5d66Smrg else 275ed6f5d66Smrg case $1 in 276ed6f5d66Smrg -o) 277ed6f5d66Smrg # configure might choose to run compile as 'compile cc -o foo foo.c'. 278ed6f5d66Smrg # So we strip '-o arg' only if arg is an object. 279ed6f5d66Smrg eat=1 280ed6f5d66Smrg case $2 in 281ed6f5d66Smrg *.o | *.obj) 282ed6f5d66Smrg ofile=$2 283ed6f5d66Smrg ;; 284ed6f5d66Smrg *) 285ed6f5d66Smrg set x "$@" -o "$2" 286ed6f5d66Smrg shift 287ed6f5d66Smrg ;; 288ed6f5d66Smrg esac 289ed6f5d66Smrg ;; 290ed6f5d66Smrg *.c) 291ed6f5d66Smrg cfile=$1 292ed6f5d66Smrg set x "$@" "$1" 293ed6f5d66Smrg shift 294ed6f5d66Smrg ;; 295ed6f5d66Smrg *) 296ed6f5d66Smrg set x "$@" "$1" 297ed6f5d66Smrg shift 298ed6f5d66Smrg ;; 299ed6f5d66Smrg esac 300ed6f5d66Smrg fi 301ed6f5d66Smrg shift 302ed6f5d66Smrgdone 303ed6f5d66Smrg 304ed6f5d66Smrgif test -z "$ofile" || test -z "$cfile"; then 305ed6f5d66Smrg # If no '-o' option was seen then we might have been invoked from a 306ed6f5d66Smrg # pattern rule where we don't need one. That is ok -- this is a 307ed6f5d66Smrg # normal compilation that the losing compiler can handle. If no 308ed6f5d66Smrg # '.c' file was seen then we are probably linking. That is also 309ed6f5d66Smrg # ok. 310ed6f5d66Smrg exec "$@" 311ed6f5d66Smrgfi 312ed6f5d66Smrg 313ed6f5d66Smrg# Name of file we expect compiler to create. 314ed6f5d66Smrgcofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` 315ed6f5d66Smrg 316ed6f5d66Smrg# Create the lock directory. 317ed6f5d66Smrg# Note: use '[/\\:.-]' here to ensure that we don't use the same name 318ed6f5d66Smrg# that we are using for the .o file. Also, base the name on the expected 319ed6f5d66Smrg# object file name, since that is what matters with a parallel build. 320ed6f5d66Smrglockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d 321ed6f5d66Smrgwhile true; do 322ed6f5d66Smrg if mkdir "$lockdir" >/dev/null 2>&1; then 323ed6f5d66Smrg break 324ed6f5d66Smrg fi 325ed6f5d66Smrg sleep 1 326ed6f5d66Smrgdone 327ed6f5d66Smrg# FIXME: race condition here if user kills between mkdir and trap. 328ed6f5d66Smrgtrap "rmdir '$lockdir'; exit 1" 1 2 15 329ed6f5d66Smrg 330ed6f5d66Smrg# Run the compile. 331ed6f5d66Smrg"$@" 332ed6f5d66Smrgret=$? 333ed6f5d66Smrg 334ed6f5d66Smrgif test -f "$cofile"; then 335ed6f5d66Smrg test "$cofile" = "$ofile" || mv "$cofile" "$ofile" 336ed6f5d66Smrgelif test -f "${cofile}bj"; then 337ed6f5d66Smrg test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" 338ed6f5d66Smrgfi 339ed6f5d66Smrg 340ed6f5d66Smrgrmdir "$lockdir" 341ed6f5d66Smrgexit $ret 342ed6f5d66Smrg 343ed6f5d66Smrg# Local Variables: 344ed6f5d66Smrg# mode: shell-script 345ed6f5d66Smrg# sh-indentation: 2 3463d05230fSmrg# eval: (add-hook 'before-save-hook 'time-stamp) 347ed6f5d66Smrg# time-stamp-start: "scriptversion=" 348ed6f5d66Smrg# time-stamp-format: "%:y-%02m-%02d.%02H" 349fbc03982Smrg# time-stamp-time-zone: "UTC0" 350ed6f5d66Smrg# time-stamp-end: "; # UTC" 351ed6f5d66Smrg# End: 352