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