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