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