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