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