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