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