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