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