compile revision 39413783
1de2362d3Smrg#! /bin/sh 218781e08Smrg# Wrapper for compilers which do not understand '-c -o'. 3de2362d3Smrg 439413783Smrgscriptversion=2018-03-07.03; # UTC 5de2362d3Smrg 639413783Smrg# Copyright (C) 1999-2018 Free Software Foundation, Inc. 7de2362d3Smrg# Written by Tom Tromey <tromey@cygnus.com>. 8de2362d3Smrg# 9de2362d3Smrg# This program is free software; you can redistribute it and/or modify 10de2362d3Smrg# it under the terms of the GNU General Public License as published by 11de2362d3Smrg# the Free Software Foundation; either version 2, or (at your option) 12de2362d3Smrg# any later version. 13de2362d3Smrg# 14de2362d3Smrg# This program is distributed in the hope that it will be useful, 15de2362d3Smrg# but WITHOUT ANY WARRANTY; without even the implied warranty of 16de2362d3Smrg# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17de2362d3Smrg# GNU General Public License for more details. 18de2362d3Smrg# 19de2362d3Smrg# You should have received a copy of the GNU General Public License 2039413783Smrg# along with this program. If not, see <https://www.gnu.org/licenses/>. 21de2362d3Smrg 22de2362d3Smrg# As a special exception to the GNU General Public License, if you 23de2362d3Smrg# distribute this file as part of a program that contains a 24de2362d3Smrg# configuration script generated by Autoconf, you may include it under 25de2362d3Smrg# the same distribution terms that you use for the rest of that program. 26de2362d3Smrg 27de2362d3Smrg# This file is maintained in Automake, please report 28de2362d3Smrg# bugs to <bug-automake@gnu.org> or send patches to 29de2362d3Smrg# <automake-patches@gnu.org>. 30de2362d3Smrg 3118781e08Smrgnl=' 3218781e08Smrg' 3318781e08Smrg 3418781e08Smrg# We need space, tab and new line, in precisely that order. Quoting is 3518781e08Smrg# there to prevent tools from complaining about whitespace usage. 3618781e08SmrgIFS=" "" $nl" 3718781e08Smrg 3818781e08Smrgfile_conv= 3918781e08Smrg 4018781e08Smrg# func_file_conv build_file lazy 4118781e08Smrg# Convert a $build file to $host form and store it in $file 4218781e08Smrg# Currently only supports Windows hosts. If the determined conversion 4318781e08Smrg# type is listed in (the comma separated) LAZY, no conversion will 4418781e08Smrg# take place. 4518781e08Smrgfunc_file_conv () 4618781e08Smrg{ 4718781e08Smrg file=$1 4818781e08Smrg case $file in 4918781e08Smrg / | /[!/]*) # absolute file, and not a UNC file 5018781e08Smrg if test -z "$file_conv"; then 5118781e08Smrg # lazily determine how to convert abs files 5218781e08Smrg case `uname -s` in 5318781e08Smrg MINGW*) 5418781e08Smrg file_conv=mingw 5518781e08Smrg ;; 5618781e08Smrg CYGWIN*) 5718781e08Smrg file_conv=cygwin 5818781e08Smrg ;; 5918781e08Smrg *) 6018781e08Smrg file_conv=wine 6118781e08Smrg ;; 6218781e08Smrg esac 6318781e08Smrg fi 6418781e08Smrg case $file_conv/,$2, in 6518781e08Smrg *,$file_conv,*) 6618781e08Smrg ;; 6718781e08Smrg mingw/*) 6818781e08Smrg file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` 6918781e08Smrg ;; 7018781e08Smrg cygwin/*) 7118781e08Smrg file=`cygpath -m "$file" || echo "$file"` 7218781e08Smrg ;; 7318781e08Smrg wine/*) 7418781e08Smrg file=`winepath -w "$file" || echo "$file"` 7518781e08Smrg ;; 7618781e08Smrg esac 7718781e08Smrg ;; 7818781e08Smrg esac 7918781e08Smrg} 8018781e08Smrg 8118781e08Smrg# func_cl_dashL linkdir 8218781e08Smrg# Make cl look for libraries in LINKDIR 8318781e08Smrgfunc_cl_dashL () 8418781e08Smrg{ 8518781e08Smrg func_file_conv "$1" 8618781e08Smrg if test -z "$lib_path"; then 8718781e08Smrg lib_path=$file 8818781e08Smrg else 8918781e08Smrg lib_path="$lib_path;$file" 9018781e08Smrg fi 9118781e08Smrg linker_opts="$linker_opts -LIBPATH:$file" 9218781e08Smrg} 9318781e08Smrg 9418781e08Smrg# func_cl_dashl library 9518781e08Smrg# Do a library search-path lookup for cl 9618781e08Smrgfunc_cl_dashl () 9718781e08Smrg{ 9818781e08Smrg lib=$1 9918781e08Smrg found=no 10018781e08Smrg save_IFS=$IFS 10118781e08Smrg IFS=';' 10218781e08Smrg for dir in $lib_path $LIB 10318781e08Smrg do 10418781e08Smrg IFS=$save_IFS 10518781e08Smrg if $shared && test -f "$dir/$lib.dll.lib"; then 10618781e08Smrg found=yes 10718781e08Smrg lib=$dir/$lib.dll.lib 10818781e08Smrg break 10918781e08Smrg fi 11018781e08Smrg if test -f "$dir/$lib.lib"; then 11118781e08Smrg found=yes 11218781e08Smrg lib=$dir/$lib.lib 11318781e08Smrg break 11418781e08Smrg fi 11518781e08Smrg if test -f "$dir/lib$lib.a"; then 11618781e08Smrg found=yes 11718781e08Smrg lib=$dir/lib$lib.a 11818781e08Smrg break 11918781e08Smrg fi 12018781e08Smrg done 12118781e08Smrg IFS=$save_IFS 12218781e08Smrg 12318781e08Smrg if test "$found" != yes; then 12418781e08Smrg lib=$lib.lib 12518781e08Smrg fi 12618781e08Smrg} 12718781e08Smrg 12818781e08Smrg# func_cl_wrapper cl arg... 12918781e08Smrg# Adjust compile command to suit cl 13018781e08Smrgfunc_cl_wrapper () 13118781e08Smrg{ 13218781e08Smrg # Assume a capable shell 13318781e08Smrg lib_path= 13418781e08Smrg shared=: 13518781e08Smrg linker_opts= 13618781e08Smrg for arg 13718781e08Smrg do 13818781e08Smrg if test -n "$eat"; then 13918781e08Smrg eat= 14018781e08Smrg else 14118781e08Smrg case $1 in 14218781e08Smrg -o) 14318781e08Smrg # configure might choose to run compile as 'compile cc -o foo foo.c'. 14418781e08Smrg eat=1 14518781e08Smrg case $2 in 14618781e08Smrg *.o | *.[oO][bB][jJ]) 14718781e08Smrg func_file_conv "$2" 14818781e08Smrg set x "$@" -Fo"$file" 14918781e08Smrg shift 15018781e08Smrg ;; 15118781e08Smrg *) 15218781e08Smrg func_file_conv "$2" 15318781e08Smrg set x "$@" -Fe"$file" 15418781e08Smrg shift 15518781e08Smrg ;; 15618781e08Smrg esac 15718781e08Smrg ;; 15818781e08Smrg -I) 15918781e08Smrg eat=1 16018781e08Smrg func_file_conv "$2" mingw 16118781e08Smrg set x "$@" -I"$file" 16218781e08Smrg shift 16318781e08Smrg ;; 16418781e08Smrg -I*) 16518781e08Smrg func_file_conv "${1#-I}" mingw 16618781e08Smrg set x "$@" -I"$file" 16718781e08Smrg shift 16818781e08Smrg ;; 16918781e08Smrg -l) 17018781e08Smrg eat=1 17118781e08Smrg func_cl_dashl "$2" 17218781e08Smrg set x "$@" "$lib" 17318781e08Smrg shift 17418781e08Smrg ;; 17518781e08Smrg -l*) 17618781e08Smrg func_cl_dashl "${1#-l}" 17718781e08Smrg set x "$@" "$lib" 17818781e08Smrg shift 17918781e08Smrg ;; 18018781e08Smrg -L) 18118781e08Smrg eat=1 18218781e08Smrg func_cl_dashL "$2" 18318781e08Smrg ;; 18418781e08Smrg -L*) 18518781e08Smrg func_cl_dashL "${1#-L}" 18618781e08Smrg ;; 18718781e08Smrg -static) 18818781e08Smrg shared=false 18918781e08Smrg ;; 19018781e08Smrg -Wl,*) 19118781e08Smrg arg=${1#-Wl,} 19218781e08Smrg save_ifs="$IFS"; IFS=',' 19318781e08Smrg for flag in $arg; do 19418781e08Smrg IFS="$save_ifs" 19518781e08Smrg linker_opts="$linker_opts $flag" 19618781e08Smrg done 19718781e08Smrg IFS="$save_ifs" 19818781e08Smrg ;; 19918781e08Smrg -Xlinker) 20018781e08Smrg eat=1 20118781e08Smrg linker_opts="$linker_opts $2" 20218781e08Smrg ;; 20318781e08Smrg -*) 20418781e08Smrg set x "$@" "$1" 20518781e08Smrg shift 20618781e08Smrg ;; 20718781e08Smrg *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) 20818781e08Smrg func_file_conv "$1" 20918781e08Smrg set x "$@" -Tp"$file" 21018781e08Smrg shift 21118781e08Smrg ;; 21218781e08Smrg *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) 21318781e08Smrg func_file_conv "$1" mingw 21418781e08Smrg set x "$@" "$file" 21518781e08Smrg shift 21618781e08Smrg ;; 21718781e08Smrg *) 21818781e08Smrg set x "$@" "$1" 21918781e08Smrg shift 22018781e08Smrg ;; 22118781e08Smrg esac 22218781e08Smrg fi 22318781e08Smrg shift 22418781e08Smrg done 22518781e08Smrg if test -n "$linker_opts"; then 22618781e08Smrg linker_opts="-link$linker_opts" 22718781e08Smrg fi 22818781e08Smrg exec "$@" $linker_opts 22918781e08Smrg exit 1 23018781e08Smrg} 23118781e08Smrg 23218781e08Smrgeat= 23318781e08Smrg 234de2362d3Smrgcase $1 in 235de2362d3Smrg '') 23618781e08Smrg echo "$0: No command. Try '$0 --help' for more information." 1>&2 237de2362d3Smrg exit 1; 238de2362d3Smrg ;; 239de2362d3Smrg -h | --h*) 240de2362d3Smrg cat <<\EOF 241de2362d3SmrgUsage: compile [--help] [--version] PROGRAM [ARGS] 242de2362d3Smrg 24318781e08SmrgWrapper for compilers which do not understand '-c -o'. 24418781e08SmrgRemove '-o dest.o' from ARGS, run PROGRAM with the remaining 245de2362d3Smrgarguments, and rename the output as expected. 246de2362d3Smrg 247de2362d3SmrgIf you are trying to build a whole package this is not the 24818781e08Smrgright script to run: please start by reading the file 'INSTALL'. 249de2362d3Smrg 250de2362d3SmrgReport bugs to <bug-automake@gnu.org>. 251de2362d3SmrgEOF 252de2362d3Smrg exit $? 253de2362d3Smrg ;; 254de2362d3Smrg -v | --v*) 255de2362d3Smrg echo "compile $scriptversion" 256de2362d3Smrg exit $? 257de2362d3Smrg ;; 25839413783Smrg cl | *[/\\]cl | cl.exe | *[/\\]cl.exe | \ 25939413783Smrg icl | *[/\\]icl | icl.exe | *[/\\]icl.exe ) 26018781e08Smrg func_cl_wrapper "$@" # Doesn't return... 26118781e08Smrg ;; 262de2362d3Smrgesac 263de2362d3Smrg 264de2362d3Smrgofile= 265de2362d3Smrgcfile= 266de2362d3Smrg 267de2362d3Smrgfor arg 268de2362d3Smrgdo 269de2362d3Smrg if test -n "$eat"; then 270de2362d3Smrg eat= 271de2362d3Smrg else 272de2362d3Smrg case $1 in 273de2362d3Smrg -o) 27418781e08Smrg # configure might choose to run compile as 'compile cc -o foo foo.c'. 27518781e08Smrg # So we strip '-o arg' only if arg is an object. 276de2362d3Smrg eat=1 277de2362d3Smrg case $2 in 278de2362d3Smrg *.o | *.obj) 279de2362d3Smrg ofile=$2 280de2362d3Smrg ;; 281de2362d3Smrg *) 282de2362d3Smrg set x "$@" -o "$2" 283de2362d3Smrg shift 284de2362d3Smrg ;; 285de2362d3Smrg esac 286de2362d3Smrg ;; 287de2362d3Smrg *.c) 288de2362d3Smrg cfile=$1 289de2362d3Smrg set x "$@" "$1" 290de2362d3Smrg shift 291de2362d3Smrg ;; 292de2362d3Smrg *) 293de2362d3Smrg set x "$@" "$1" 294de2362d3Smrg shift 295de2362d3Smrg ;; 296de2362d3Smrg esac 297de2362d3Smrg fi 298de2362d3Smrg shift 299de2362d3Smrgdone 300de2362d3Smrg 301de2362d3Smrgif test -z "$ofile" || test -z "$cfile"; then 30218781e08Smrg # If no '-o' option was seen then we might have been invoked from a 303de2362d3Smrg # pattern rule where we don't need one. That is ok -- this is a 304de2362d3Smrg # normal compilation that the losing compiler can handle. If no 30518781e08Smrg # '.c' file was seen then we are probably linking. That is also 306de2362d3Smrg # ok. 307de2362d3Smrg exec "$@" 308de2362d3Smrgfi 309de2362d3Smrg 310de2362d3Smrg# Name of file we expect compiler to create. 311de2362d3Smrgcofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` 312de2362d3Smrg 313de2362d3Smrg# Create the lock directory. 31418781e08Smrg# Note: use '[/\\:.-]' here to ensure that we don't use the same name 315de2362d3Smrg# that we are using for the .o file. Also, base the name on the expected 316de2362d3Smrg# object file name, since that is what matters with a parallel build. 317de2362d3Smrglockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d 318de2362d3Smrgwhile true; do 319de2362d3Smrg if mkdir "$lockdir" >/dev/null 2>&1; then 320de2362d3Smrg break 321de2362d3Smrg fi 322de2362d3Smrg sleep 1 323de2362d3Smrgdone 324de2362d3Smrg# FIXME: race condition here if user kills between mkdir and trap. 325de2362d3Smrgtrap "rmdir '$lockdir'; exit 1" 1 2 15 326de2362d3Smrg 327de2362d3Smrg# Run the compile. 328de2362d3Smrg"$@" 329de2362d3Smrgret=$? 330de2362d3Smrg 331de2362d3Smrgif test -f "$cofile"; then 332de2362d3Smrg test "$cofile" = "$ofile" || mv "$cofile" "$ofile" 333de2362d3Smrgelif test -f "${cofile}bj"; then 334de2362d3Smrg test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" 335de2362d3Smrgfi 336de2362d3Smrg 337de2362d3Smrgrmdir "$lockdir" 338de2362d3Smrgexit $ret 339de2362d3Smrg 340de2362d3Smrg# Local Variables: 341de2362d3Smrg# mode: shell-script 342de2362d3Smrg# sh-indentation: 2 34339413783Smrg# eval: (add-hook 'before-save-hook 'time-stamp) 344de2362d3Smrg# time-stamp-start: "scriptversion=" 345de2362d3Smrg# time-stamp-format: "%:y-%02m-%02d.%02H" 34639413783Smrg# time-stamp-time-zone: "UTC0" 347de2362d3Smrg# time-stamp-end: "; # UTC" 348de2362d3Smrg# End: 349