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