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