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