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