depcomp revision 6af7124f
1ba6a1819Smrg#! /bin/sh 2ba6a1819Smrg# depcomp - compile a program generating dependencies as side-effects 3ba6a1819Smrg 46af7124fSmrgscriptversion=2013-05-30.07; # UTC 5ba6a1819Smrg 61bedbe3fSmrg# Copyright (C) 1999-2013 Free Software Foundation, Inc. 7ba6a1819Smrg 8ba6a1819Smrg# This program is free software; you can redistribute it and/or modify 9ba6a1819Smrg# it under the terms of the GNU General Public License as published by 10ba6a1819Smrg# the Free Software Foundation; either version 2, or (at your option) 11ba6a1819Smrg# any later version. 12ba6a1819Smrg 13ba6a1819Smrg# This program is distributed in the hope that it will be useful, 14ba6a1819Smrg# but WITHOUT ANY WARRANTY; without even the implied warranty of 15ba6a1819Smrg# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16ba6a1819Smrg# GNU General Public License for more details. 17ba6a1819Smrg 18ba6a1819Smrg# You should have received a copy of the GNU General Public License 19549e21daSmrg# along with this program. If not, see <http://www.gnu.org/licenses/>. 20ba6a1819Smrg 21ba6a1819Smrg# As a special exception to the GNU General Public License, if you 22ba6a1819Smrg# distribute this file as part of a program that contains a 23ba6a1819Smrg# configuration script generated by Autoconf, you may include it under 24ba6a1819Smrg# the same distribution terms that you use for the rest of that program. 25ba6a1819Smrg 26ba6a1819Smrg# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>. 27ba6a1819Smrg 28ba6a1819Smrgcase $1 in 29ba6a1819Smrg '') 301bedbe3fSmrg echo "$0: No command. Try '$0 --help' for more information." 1>&2 311bedbe3fSmrg exit 1; 321bedbe3fSmrg ;; 33ba6a1819Smrg -h | --h*) 34ba6a1819Smrg cat <<\EOF 35ba6a1819SmrgUsage: depcomp [--help] [--version] PROGRAM [ARGS] 36ba6a1819Smrg 37ba6a1819SmrgRun PROGRAMS ARGS to compile a file, generating dependencies 38ba6a1819Smrgas side-effects. 39ba6a1819Smrg 40ba6a1819SmrgEnvironment variables: 41ba6a1819Smrg depmode Dependency tracking mode. 421bedbe3fSmrg source Source file read by 'PROGRAMS ARGS'. 431bedbe3fSmrg object Object file output by 'PROGRAMS ARGS'. 44ba6a1819Smrg DEPDIR directory where to store dependencies. 45ba6a1819Smrg depfile Dependency file to output. 461bedbe3fSmrg tmpdepfile Temporary file to use when outputting dependencies. 47ba6a1819Smrg libtool Whether libtool is used (yes/no). 48ba6a1819Smrg 49ba6a1819SmrgReport bugs to <bug-automake@gnu.org>. 50ba6a1819SmrgEOF 51ba6a1819Smrg exit $? 52ba6a1819Smrg ;; 53ba6a1819Smrg -v | --v*) 54ba6a1819Smrg echo "depcomp $scriptversion" 55ba6a1819Smrg exit $? 56ba6a1819Smrg ;; 57ba6a1819Smrgesac 58ba6a1819Smrg 591bedbe3fSmrg# Get the directory component of the given path, and save it in the 601bedbe3fSmrg# global variables '$dir'. Note that this directory component will 611bedbe3fSmrg# be either empty or ending with a '/' character. This is deliberate. 621bedbe3fSmrgset_dir_from () 631bedbe3fSmrg{ 641bedbe3fSmrg case $1 in 651bedbe3fSmrg */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;; 661bedbe3fSmrg *) dir=;; 671bedbe3fSmrg esac 681bedbe3fSmrg} 691bedbe3fSmrg 701bedbe3fSmrg# Get the suffix-stripped basename of the given path, and save it the 711bedbe3fSmrg# global variable '$base'. 721bedbe3fSmrgset_base_from () 731bedbe3fSmrg{ 741bedbe3fSmrg base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'` 751bedbe3fSmrg} 761bedbe3fSmrg 771bedbe3fSmrg# If no dependency file was actually created by the compiler invocation, 781bedbe3fSmrg# we still have to create a dummy depfile, to avoid errors with the 791bedbe3fSmrg# Makefile "include basename.Plo" scheme. 801bedbe3fSmrgmake_dummy_depfile () 811bedbe3fSmrg{ 821bedbe3fSmrg echo "#dummy" > "$depfile" 831bedbe3fSmrg} 841bedbe3fSmrg 851bedbe3fSmrg# Factor out some common post-processing of the generated depfile. 861bedbe3fSmrg# Requires the auxiliary global variable '$tmpdepfile' to be set. 871bedbe3fSmrgaix_post_process_depfile () 881bedbe3fSmrg{ 891bedbe3fSmrg # If the compiler actually managed to produce a dependency file, 901bedbe3fSmrg # post-process it. 911bedbe3fSmrg if test -f "$tmpdepfile"; then 921bedbe3fSmrg # Each line is of the form 'foo.o: dependency.h'. 931bedbe3fSmrg # Do two passes, one to just change these to 941bedbe3fSmrg # $object: dependency.h 951bedbe3fSmrg # and one to simply output 961bedbe3fSmrg # dependency.h: 971bedbe3fSmrg # which is needed to avoid the deleted-header problem. 981bedbe3fSmrg { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile" 991bedbe3fSmrg sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile" 1001bedbe3fSmrg } > "$depfile" 1011bedbe3fSmrg rm -f "$tmpdepfile" 1021bedbe3fSmrg else 1031bedbe3fSmrg make_dummy_depfile 1041bedbe3fSmrg fi 1051bedbe3fSmrg} 1061bedbe3fSmrg 1071bedbe3fSmrg# A tabulation character. 1081bedbe3fSmrgtab=' ' 1091bedbe3fSmrg# A newline character. 1101bedbe3fSmrgnl=' 1111bedbe3fSmrg' 1121bedbe3fSmrg# Character ranges might be problematic outside the C locale. 1131bedbe3fSmrg# These definitions help. 1141bedbe3fSmrgupper=ABCDEFGHIJKLMNOPQRSTUVWXYZ 1151bedbe3fSmrglower=abcdefghijklmnopqrstuvwxyz 1161bedbe3fSmrgdigits=0123456789 1171bedbe3fSmrgalpha=${upper}${lower} 1181bedbe3fSmrg 119ba6a1819Smrgif test -z "$depmode" || test -z "$source" || test -z "$object"; then 120ba6a1819Smrg echo "depcomp: Variables source, object and depmode must be set" 1>&2 121ba6a1819Smrg exit 1 122ba6a1819Smrgfi 123ba6a1819Smrg 124ba6a1819Smrg# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. 125ba6a1819Smrgdepfile=${depfile-`echo "$object" | 126ba6a1819Smrg sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} 127ba6a1819Smrgtmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} 128ba6a1819Smrg 129ba6a1819Smrgrm -f "$tmpdepfile" 130ba6a1819Smrg 1311bedbe3fSmrg# Avoid interferences from the environment. 1321bedbe3fSmrggccflag= dashmflag= 1331bedbe3fSmrg 134ba6a1819Smrg# Some modes work just like other modes, but use different flags. We 135ba6a1819Smrg# parameterize here, but still list the modes in the big case below, 136ba6a1819Smrg# to make depend.m4 easier to write. Note that we *cannot* use a case 137ba6a1819Smrg# here, because this file can only contain one case statement. 138ba6a1819Smrgif test "$depmode" = hp; then 139ba6a1819Smrg # HP compiler uses -M and no extra arg. 140ba6a1819Smrg gccflag=-M 141ba6a1819Smrg depmode=gcc 142ba6a1819Smrgfi 143ba6a1819Smrg 144ba6a1819Smrgif test "$depmode" = dashXmstdout; then 1451bedbe3fSmrg # This is just like dashmstdout with a different argument. 1461bedbe3fSmrg dashmflag=-xM 1471bedbe3fSmrg depmode=dashmstdout 148ba6a1819Smrgfi 149ba6a1819Smrg 150549e21daSmrgcygpath_u="cygpath -u -f -" 151549e21daSmrgif test "$depmode" = msvcmsys; then 1521bedbe3fSmrg # This is just like msvisualcpp but w/o cygpath translation. 1531bedbe3fSmrg # Just convert the backslash-escaped backslashes to single forward 1541bedbe3fSmrg # slashes to satisfy depend.m4 1551bedbe3fSmrg cygpath_u='sed s,\\\\,/,g' 1561bedbe3fSmrg depmode=msvisualcpp 1571bedbe3fSmrgfi 1581bedbe3fSmrg 1591bedbe3fSmrgif test "$depmode" = msvc7msys; then 1601bedbe3fSmrg # This is just like msvc7 but w/o cygpath translation. 1611bedbe3fSmrg # Just convert the backslash-escaped backslashes to single forward 1621bedbe3fSmrg # slashes to satisfy depend.m4 1631bedbe3fSmrg cygpath_u='sed s,\\\\,/,g' 1641bedbe3fSmrg depmode=msvc7 1651bedbe3fSmrgfi 1661bedbe3fSmrg 1671bedbe3fSmrgif test "$depmode" = xlc; then 1681bedbe3fSmrg # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information. 1691bedbe3fSmrg gccflag=-qmakedep=gcc,-MF 1701bedbe3fSmrg depmode=gcc 171549e21daSmrgfi 172549e21daSmrg 173ba6a1819Smrgcase "$depmode" in 174ba6a1819Smrggcc3) 175ba6a1819Smrg## gcc 3 implements dependency tracking that does exactly what 176ba6a1819Smrg## we want. Yay! Note: for some reason libtool 1.4 doesn't like 177ba6a1819Smrg## it if -MD -MP comes after the -MF stuff. Hmm. 178ba6a1819Smrg## Unfortunately, FreeBSD c89 acceptance of flags depends upon 179ba6a1819Smrg## the command line argument order; so add the flags where they 180ba6a1819Smrg## appear in depend2.am. Note that the slowdown incurred here 181ba6a1819Smrg## affects only configure: in makefiles, %FASTDEP% shortcuts this. 182ba6a1819Smrg for arg 183ba6a1819Smrg do 184ba6a1819Smrg case $arg in 185ba6a1819Smrg -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; 186ba6a1819Smrg *) set fnord "$@" "$arg" ;; 187ba6a1819Smrg esac 188ba6a1819Smrg shift # fnord 189ba6a1819Smrg shift # $arg 190ba6a1819Smrg done 191ba6a1819Smrg "$@" 192ba6a1819Smrg stat=$? 1931bedbe3fSmrg if test $stat -ne 0; then 194ba6a1819Smrg rm -f "$tmpdepfile" 195ba6a1819Smrg exit $stat 196ba6a1819Smrg fi 197ba6a1819Smrg mv "$tmpdepfile" "$depfile" 198ba6a1819Smrg ;; 199ba6a1819Smrg 200ba6a1819Smrggcc) 2011bedbe3fSmrg## Note that this doesn't just cater to obsosete pre-3.x GCC compilers. 2021bedbe3fSmrg## but also to in-use compilers like IMB xlc/xlC and the HP C compiler. 2031bedbe3fSmrg## (see the conditional assignment to $gccflag above). 204ba6a1819Smrg## There are various ways to get dependency output from gcc. Here's 205ba6a1819Smrg## why we pick this rather obscure method: 206ba6a1819Smrg## - Don't want to use -MD because we'd like the dependencies to end 207ba6a1819Smrg## up in a subdir. Having to rename by hand is ugly. 208ba6a1819Smrg## (We might end up doing this anyway to support other compilers.) 209ba6a1819Smrg## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like 2101bedbe3fSmrg## -MM, not -M (despite what the docs say). Also, it might not be 2111bedbe3fSmrg## supported by the other compilers which use the 'gcc' depmode. 212ba6a1819Smrg## - Using -M directly means running the compiler twice (even worse 213ba6a1819Smrg## than renaming). 214ba6a1819Smrg if test -z "$gccflag"; then 215ba6a1819Smrg gccflag=-MD, 216ba6a1819Smrg fi 217ba6a1819Smrg "$@" -Wp,"$gccflag$tmpdepfile" 218ba6a1819Smrg stat=$? 2191bedbe3fSmrg if test $stat -ne 0; then 220ba6a1819Smrg rm -f "$tmpdepfile" 221ba6a1819Smrg exit $stat 222ba6a1819Smrg fi 223ba6a1819Smrg rm -f "$depfile" 224ba6a1819Smrg echo "$object : \\" > "$depfile" 2251bedbe3fSmrg # The second -e expression handles DOS-style file names with drive 2261bedbe3fSmrg # letters. 227ba6a1819Smrg sed -e 's/^[^:]*: / /' \ 228ba6a1819Smrg -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" 2291bedbe3fSmrg## This next piece of magic avoids the "deleted header file" problem. 230ba6a1819Smrg## The problem is that when a header file which appears in a .P file 231ba6a1819Smrg## is deleted, the dependency causes make to die (because there is 232ba6a1819Smrg## typically no way to rebuild the header). We avoid this by adding 233ba6a1819Smrg## dummy dependencies for each header file. Too bad gcc doesn't do 234ba6a1819Smrg## this for us directly. 2351bedbe3fSmrg## Some versions of gcc put a space before the ':'. On the theory 236ba6a1819Smrg## that the space means something, we add a space to the output as 2371bedbe3fSmrg## well. hp depmode also adds that space, but also prefixes the VPATH 2381bedbe3fSmrg## to the object. Take care to not repeat it in the output. 239ba6a1819Smrg## Some versions of the HPUX 10.20 sed can't process this invocation 240ba6a1819Smrg## correctly. Breaking it into two sed invocations is a workaround. 2411bedbe3fSmrg tr ' ' "$nl" < "$tmpdepfile" \ 2421bedbe3fSmrg | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ 2431bedbe3fSmrg | sed -e 's/$/ :/' >> "$depfile" 244ba6a1819Smrg rm -f "$tmpdepfile" 245ba6a1819Smrg ;; 246ba6a1819Smrg 247ba6a1819Smrghp) 248ba6a1819Smrg # This case exists only to let depend.m4 do its work. It works by 249ba6a1819Smrg # looking at the text of this script. This case will never be run, 250ba6a1819Smrg # since it is checked for above. 251ba6a1819Smrg exit 1 252ba6a1819Smrg ;; 253ba6a1819Smrg 254ba6a1819Smrgsgi) 255ba6a1819Smrg if test "$libtool" = yes; then 256ba6a1819Smrg "$@" "-Wp,-MDupdate,$tmpdepfile" 257ba6a1819Smrg else 258ba6a1819Smrg "$@" -MDupdate "$tmpdepfile" 259ba6a1819Smrg fi 260ba6a1819Smrg stat=$? 2611bedbe3fSmrg if test $stat -ne 0; then 262ba6a1819Smrg rm -f "$tmpdepfile" 263ba6a1819Smrg exit $stat 264ba6a1819Smrg fi 265ba6a1819Smrg rm -f "$depfile" 266ba6a1819Smrg 267ba6a1819Smrg if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files 268ba6a1819Smrg echo "$object : \\" > "$depfile" 269ba6a1819Smrg # Clip off the initial element (the dependent). Don't try to be 270ba6a1819Smrg # clever and replace this with sed code, as IRIX sed won't handle 271ba6a1819Smrg # lines with more than a fixed number of characters (4096 in 272ba6a1819Smrg # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; 2731bedbe3fSmrg # the IRIX cc adds comments like '#:fec' to the end of the 274ba6a1819Smrg # dependency line. 2751bedbe3fSmrg tr ' ' "$nl" < "$tmpdepfile" \ 2761bedbe3fSmrg | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \ 2771bedbe3fSmrg | tr "$nl" ' ' >> "$depfile" 278549e21daSmrg echo >> "$depfile" 279ba6a1819Smrg # The second pass generates a dummy entry for each header file. 2801bedbe3fSmrg tr ' ' "$nl" < "$tmpdepfile" \ 2811bedbe3fSmrg | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ 2821bedbe3fSmrg >> "$depfile" 283ba6a1819Smrg else 2841bedbe3fSmrg make_dummy_depfile 285ba6a1819Smrg fi 286ba6a1819Smrg rm -f "$tmpdepfile" 287ba6a1819Smrg ;; 288ba6a1819Smrg 2891bedbe3fSmrgxlc) 2901bedbe3fSmrg # This case exists only to let depend.m4 do its work. It works by 2911bedbe3fSmrg # looking at the text of this script. This case will never be run, 2921bedbe3fSmrg # since it is checked for above. 2931bedbe3fSmrg exit 1 2941bedbe3fSmrg ;; 2951bedbe3fSmrg 296ba6a1819Smrgaix) 297ba6a1819Smrg # The C for AIX Compiler uses -M and outputs the dependencies 298ba6a1819Smrg # in a .u file. In older versions, this file always lives in the 2991bedbe3fSmrg # current directory. Also, the AIX compiler puts '$object:' at the 300ba6a1819Smrg # start of each line; $object doesn't have directory information. 301ba6a1819Smrg # Version 6 uses the directory in both cases. 3021bedbe3fSmrg set_dir_from "$object" 3031bedbe3fSmrg set_base_from "$object" 304ba6a1819Smrg if test "$libtool" = yes; then 305549e21daSmrg tmpdepfile1=$dir$base.u 306549e21daSmrg tmpdepfile2=$base.u 307549e21daSmrg tmpdepfile3=$dir.libs/$base.u 308ba6a1819Smrg "$@" -Wc,-M 309ba6a1819Smrg else 310549e21daSmrg tmpdepfile1=$dir$base.u 311549e21daSmrg tmpdepfile2=$dir$base.u 312549e21daSmrg tmpdepfile3=$dir$base.u 313ba6a1819Smrg "$@" -M 314ba6a1819Smrg fi 315ba6a1819Smrg stat=$? 3161bedbe3fSmrg if test $stat -ne 0; then 317549e21daSmrg rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 318ba6a1819Smrg exit $stat 319ba6a1819Smrg fi 320ba6a1819Smrg 321549e21daSmrg for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 322549e21daSmrg do 323549e21daSmrg test -f "$tmpdepfile" && break 324549e21daSmrg done 3251bedbe3fSmrg aix_post_process_depfile 3261bedbe3fSmrg ;; 3271bedbe3fSmrg 3281bedbe3fSmrgtcc) 3291bedbe3fSmrg # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26 3301bedbe3fSmrg # FIXME: That version still under development at the moment of writing. 3311bedbe3fSmrg # Make that this statement remains true also for stable, released 3321bedbe3fSmrg # versions. 3331bedbe3fSmrg # It will wrap lines (doesn't matter whether long or short) with a 3341bedbe3fSmrg # trailing '\', as in: 3351bedbe3fSmrg # 3361bedbe3fSmrg # foo.o : \ 3371bedbe3fSmrg # foo.c \ 3381bedbe3fSmrg # foo.h \ 3391bedbe3fSmrg # 3401bedbe3fSmrg # It will put a trailing '\' even on the last line, and will use leading 3411bedbe3fSmrg # spaces rather than leading tabs (at least since its commit 0394caf7 3421bedbe3fSmrg # "Emit spaces for -MD"). 3431bedbe3fSmrg "$@" -MD -MF "$tmpdepfile" 3441bedbe3fSmrg stat=$? 3451bedbe3fSmrg if test $stat -ne 0; then 3461bedbe3fSmrg rm -f "$tmpdepfile" 3471bedbe3fSmrg exit $stat 348ba6a1819Smrg fi 3491bedbe3fSmrg rm -f "$depfile" 3501bedbe3fSmrg # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'. 3511bedbe3fSmrg # We have to change lines of the first kind to '$object: \'. 3521bedbe3fSmrg sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile" 3531bedbe3fSmrg # And for each line of the second kind, we have to emit a 'dep.h:' 3541bedbe3fSmrg # dummy dependency, to avoid the deleted-header problem. 3551bedbe3fSmrg sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile" 356ba6a1819Smrg rm -f "$tmpdepfile" 357ba6a1819Smrg ;; 358ba6a1819Smrg 3591bedbe3fSmrg## The order of this option in the case statement is important, since the 3601bedbe3fSmrg## shell code in configure will try each of these formats in the order 3611bedbe3fSmrg## listed in this file. A plain '-MD' option would be understood by many 3621bedbe3fSmrg## compilers, so we must ensure this comes after the gcc and icc options. 3631bedbe3fSmrgpgcc) 3641bedbe3fSmrg # Portland's C compiler understands '-MD'. 3651bedbe3fSmrg # Will always output deps to 'file.d' where file is the root name of the 3661bedbe3fSmrg # source file under compilation, even if file resides in a subdirectory. 3671bedbe3fSmrg # The object file name does not affect the name of the '.d' file. 3681bedbe3fSmrg # pgcc 10.2 will output 369ba6a1819Smrg # foo.o: sub/foo.c sub/foo.h 3701bedbe3fSmrg # and will wrap long lines using '\' : 371ba6a1819Smrg # foo.o: sub/foo.c ... \ 372ba6a1819Smrg # sub/foo.h ... \ 373ba6a1819Smrg # ... 3741bedbe3fSmrg set_dir_from "$object" 3751bedbe3fSmrg # Use the source, not the object, to determine the base name, since 3761bedbe3fSmrg # that's sadly what pgcc will do too. 3771bedbe3fSmrg set_base_from "$source" 3781bedbe3fSmrg tmpdepfile=$base.d 3791bedbe3fSmrg 3801bedbe3fSmrg # For projects that build the same source file twice into different object 3811bedbe3fSmrg # files, the pgcc approach of using the *source* file root name can cause 3821bedbe3fSmrg # problems in parallel builds. Use a locking strategy to avoid stomping on 3831bedbe3fSmrg # the same $tmpdepfile. 3841bedbe3fSmrg lockdir=$base.d-lock 3851bedbe3fSmrg trap " 3861bedbe3fSmrg echo '$0: caught signal, cleaning up...' >&2 3871bedbe3fSmrg rmdir '$lockdir' 3881bedbe3fSmrg exit 1 3891bedbe3fSmrg " 1 2 13 15 3901bedbe3fSmrg numtries=100 3911bedbe3fSmrg i=$numtries 3921bedbe3fSmrg while test $i -gt 0; do 3931bedbe3fSmrg # mkdir is a portable test-and-set. 3941bedbe3fSmrg if mkdir "$lockdir" 2>/dev/null; then 3951bedbe3fSmrg # This process acquired the lock. 3961bedbe3fSmrg "$@" -MD 3971bedbe3fSmrg stat=$? 3981bedbe3fSmrg # Release the lock. 3991bedbe3fSmrg rmdir "$lockdir" 4001bedbe3fSmrg break 4011bedbe3fSmrg else 4021bedbe3fSmrg # If the lock is being held by a different process, wait 4031bedbe3fSmrg # until the winning process is done or we timeout. 4041bedbe3fSmrg while test -d "$lockdir" && test $i -gt 0; do 4051bedbe3fSmrg sleep 1 4061bedbe3fSmrg i=`expr $i - 1` 4071bedbe3fSmrg done 4081bedbe3fSmrg fi 4091bedbe3fSmrg i=`expr $i - 1` 4101bedbe3fSmrg done 4111bedbe3fSmrg trap - 1 2 13 15 4121bedbe3fSmrg if test $i -le 0; then 4131bedbe3fSmrg echo "$0: failed to acquire lock after $numtries attempts" >&2 4141bedbe3fSmrg echo "$0: check lockdir '$lockdir'" >&2 4151bedbe3fSmrg exit 1 4161bedbe3fSmrg fi 417ba6a1819Smrg 4181bedbe3fSmrg if test $stat -ne 0; then 419ba6a1819Smrg rm -f "$tmpdepfile" 420ba6a1819Smrg exit $stat 421ba6a1819Smrg fi 422ba6a1819Smrg rm -f "$depfile" 423ba6a1819Smrg # Each line is of the form `foo.o: dependent.h', 424ba6a1819Smrg # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. 425ba6a1819Smrg # Do two passes, one to just change these to 426ba6a1819Smrg # `$object: dependent.h' and one to simply `dependent.h:'. 427ba6a1819Smrg sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" 428ba6a1819Smrg # Some versions of the HPUX 10.20 sed can't process this invocation 429ba6a1819Smrg # correctly. Breaking it into two sed invocations is a workaround. 4301bedbe3fSmrg sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \ 4311bedbe3fSmrg | sed -e 's/$/ :/' >> "$depfile" 432ba6a1819Smrg rm -f "$tmpdepfile" 433ba6a1819Smrg ;; 434ba6a1819Smrg 435ba6a1819Smrghp2) 436ba6a1819Smrg # The "hp" stanza above does not work with aCC (C++) and HP's ia64 437ba6a1819Smrg # compilers, which have integrated preprocessors. The correct option 438ba6a1819Smrg # to use with these is +Maked; it writes dependencies to a file named 439ba6a1819Smrg # 'foo.d', which lands next to the object file, wherever that 440ba6a1819Smrg # happens to be. 441ba6a1819Smrg # Much of this is similar to the tru64 case; see comments there. 4421bedbe3fSmrg set_dir_from "$object" 4431bedbe3fSmrg set_base_from "$object" 444ba6a1819Smrg if test "$libtool" = yes; then 445ba6a1819Smrg tmpdepfile1=$dir$base.d 446ba6a1819Smrg tmpdepfile2=$dir.libs/$base.d 447ba6a1819Smrg "$@" -Wc,+Maked 448ba6a1819Smrg else 449ba6a1819Smrg tmpdepfile1=$dir$base.d 450ba6a1819Smrg tmpdepfile2=$dir$base.d 451ba6a1819Smrg "$@" +Maked 452ba6a1819Smrg fi 453ba6a1819Smrg stat=$? 4541bedbe3fSmrg if test $stat -ne 0; then 455ba6a1819Smrg rm -f "$tmpdepfile1" "$tmpdepfile2" 456ba6a1819Smrg exit $stat 457ba6a1819Smrg fi 458ba6a1819Smrg 459ba6a1819Smrg for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" 460ba6a1819Smrg do 461ba6a1819Smrg test -f "$tmpdepfile" && break 462ba6a1819Smrg done 463ba6a1819Smrg if test -f "$tmpdepfile"; then 4641bedbe3fSmrg sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile" 4651bedbe3fSmrg # Add 'dependent.h:' lines. 466549e21daSmrg sed -ne '2,${ 4671bedbe3fSmrg s/^ *// 4681bedbe3fSmrg s/ \\*$// 4691bedbe3fSmrg s/$/:/ 4701bedbe3fSmrg p 4711bedbe3fSmrg }' "$tmpdepfile" >> "$depfile" 472ba6a1819Smrg else 4731bedbe3fSmrg make_dummy_depfile 474ba6a1819Smrg fi 475ba6a1819Smrg rm -f "$tmpdepfile" "$tmpdepfile2" 476ba6a1819Smrg ;; 477ba6a1819Smrg 478ba6a1819Smrgtru64) 4791bedbe3fSmrg # The Tru64 compiler uses -MD to generate dependencies as a side 4801bedbe3fSmrg # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. 4811bedbe3fSmrg # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put 4821bedbe3fSmrg # dependencies in 'foo.d' instead, so we check for that too. 4831bedbe3fSmrg # Subdirectories are respected. 4841bedbe3fSmrg set_dir_from "$object" 4851bedbe3fSmrg set_base_from "$object" 4861bedbe3fSmrg 4871bedbe3fSmrg if test "$libtool" = yes; then 4881bedbe3fSmrg # Libtool generates 2 separate objects for the 2 libraries. These 4891bedbe3fSmrg # two compilations output dependencies in $dir.libs/$base.o.d and 4901bedbe3fSmrg # in $dir$base.o.d. We have to check for both files, because 4911bedbe3fSmrg # one of the two compilations can be disabled. We should prefer 4921bedbe3fSmrg # $dir$base.o.d over $dir.libs/$base.o.d because the latter is 4931bedbe3fSmrg # automatically cleaned when .libs/ is deleted, while ignoring 4941bedbe3fSmrg # the former would cause a distcleancheck panic. 4951bedbe3fSmrg tmpdepfile1=$dir$base.o.d # libtool 1.5 4961bedbe3fSmrg tmpdepfile2=$dir.libs/$base.o.d # Likewise. 4971bedbe3fSmrg tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504 4981bedbe3fSmrg "$@" -Wc,-MD 4991bedbe3fSmrg else 5001bedbe3fSmrg tmpdepfile1=$dir$base.d 5011bedbe3fSmrg tmpdepfile2=$dir$base.d 5021bedbe3fSmrg tmpdepfile3=$dir$base.d 5031bedbe3fSmrg "$@" -MD 5041bedbe3fSmrg fi 5051bedbe3fSmrg 5061bedbe3fSmrg stat=$? 5071bedbe3fSmrg if test $stat -ne 0; then 5081bedbe3fSmrg rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 5091bedbe3fSmrg exit $stat 5101bedbe3fSmrg fi 5111bedbe3fSmrg 5121bedbe3fSmrg for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 5131bedbe3fSmrg do 5141bedbe3fSmrg test -f "$tmpdepfile" && break 5151bedbe3fSmrg done 5161bedbe3fSmrg # Same post-processing that is required for AIX mode. 5171bedbe3fSmrg aix_post_process_depfile 5181bedbe3fSmrg ;; 5191bedbe3fSmrg 5201bedbe3fSmrgmsvc7) 5211bedbe3fSmrg if test "$libtool" = yes; then 5221bedbe3fSmrg showIncludes=-Wc,-showIncludes 5231bedbe3fSmrg else 5241bedbe3fSmrg showIncludes=-showIncludes 5251bedbe3fSmrg fi 5261bedbe3fSmrg "$@" $showIncludes > "$tmpdepfile" 5271bedbe3fSmrg stat=$? 5281bedbe3fSmrg grep -v '^Note: including file: ' "$tmpdepfile" 5291bedbe3fSmrg if test $stat -ne 0; then 5301bedbe3fSmrg rm -f "$tmpdepfile" 5311bedbe3fSmrg exit $stat 5321bedbe3fSmrg fi 5331bedbe3fSmrg rm -f "$depfile" 5341bedbe3fSmrg echo "$object : \\" > "$depfile" 5351bedbe3fSmrg # The first sed program below extracts the file names and escapes 5361bedbe3fSmrg # backslashes for cygpath. The second sed program outputs the file 5371bedbe3fSmrg # name when reading, but also accumulates all include files in the 5381bedbe3fSmrg # hold buffer in order to output them again at the end. This only 5391bedbe3fSmrg # works with sed implementations that can handle large buffers. 5401bedbe3fSmrg sed < "$tmpdepfile" -n ' 5411bedbe3fSmrg/^Note: including file: *\(.*\)/ { 5421bedbe3fSmrg s//\1/ 5431bedbe3fSmrg s/\\/\\\\/g 5441bedbe3fSmrg p 5451bedbe3fSmrg}' | $cygpath_u | sort -u | sed -n ' 5461bedbe3fSmrgs/ /\\ /g 5471bedbe3fSmrgs/\(.*\)/'"$tab"'\1 \\/p 5481bedbe3fSmrgs/.\(.*\) \\/\1:/ 5491bedbe3fSmrgH 5501bedbe3fSmrg$ { 5511bedbe3fSmrg s/.*/'"$tab"'/ 5521bedbe3fSmrg G 5531bedbe3fSmrg p 5541bedbe3fSmrg}' >> "$depfile" 5556af7124fSmrg echo >> "$depfile" # make sure the fragment doesn't end with a backslash 5561bedbe3fSmrg rm -f "$tmpdepfile" 5571bedbe3fSmrg ;; 5581bedbe3fSmrg 5591bedbe3fSmrgmsvc7msys) 5601bedbe3fSmrg # This case exists only to let depend.m4 do its work. It works by 5611bedbe3fSmrg # looking at the text of this script. This case will never be run, 5621bedbe3fSmrg # since it is checked for above. 5631bedbe3fSmrg exit 1 5641bedbe3fSmrg ;; 565ba6a1819Smrg 566ba6a1819Smrg#nosideeffect) 567ba6a1819Smrg # This comment above is used by automake to tell side-effect 568ba6a1819Smrg # dependency tracking mechanisms from slower ones. 569ba6a1819Smrg 570ba6a1819Smrgdashmstdout) 571ba6a1819Smrg # Important note: in order to support this mode, a compiler *must* 572ba6a1819Smrg # always write the preprocessed file to stdout, regardless of -o. 573ba6a1819Smrg "$@" || exit $? 574ba6a1819Smrg 575ba6a1819Smrg # Remove the call to Libtool. 576ba6a1819Smrg if test "$libtool" = yes; then 577549e21daSmrg while test "X$1" != 'X--mode=compile'; do 578ba6a1819Smrg shift 579ba6a1819Smrg done 580ba6a1819Smrg shift 581ba6a1819Smrg fi 582ba6a1819Smrg 5831bedbe3fSmrg # Remove '-o $object'. 584ba6a1819Smrg IFS=" " 585ba6a1819Smrg for arg 586ba6a1819Smrg do 587ba6a1819Smrg case $arg in 588ba6a1819Smrg -o) 589ba6a1819Smrg shift 590ba6a1819Smrg ;; 591ba6a1819Smrg $object) 592ba6a1819Smrg shift 593ba6a1819Smrg ;; 594ba6a1819Smrg *) 595ba6a1819Smrg set fnord "$@" "$arg" 596ba6a1819Smrg shift # fnord 597ba6a1819Smrg shift # $arg 598ba6a1819Smrg ;; 599ba6a1819Smrg esac 600ba6a1819Smrg done 601ba6a1819Smrg 602ba6a1819Smrg test -z "$dashmflag" && dashmflag=-M 6031bedbe3fSmrg # Require at least two characters before searching for ':' 604ba6a1819Smrg # in the target name. This is to cope with DOS-style filenames: 6051bedbe3fSmrg # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. 606ba6a1819Smrg "$@" $dashmflag | 6071bedbe3fSmrg sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile" 608ba6a1819Smrg rm -f "$depfile" 609ba6a1819Smrg cat < "$tmpdepfile" > "$depfile" 6101bedbe3fSmrg # Some versions of the HPUX 10.20 sed can't process this sed invocation 6111bedbe3fSmrg # correctly. Breaking it into two sed invocations is a workaround. 6121bedbe3fSmrg tr ' ' "$nl" < "$tmpdepfile" \ 6131bedbe3fSmrg | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ 6141bedbe3fSmrg | sed -e 's/$/ :/' >> "$depfile" 615ba6a1819Smrg rm -f "$tmpdepfile" 616ba6a1819Smrg ;; 617ba6a1819Smrg 618ba6a1819SmrgdashXmstdout) 619ba6a1819Smrg # This case only exists to satisfy depend.m4. It is never actually 620ba6a1819Smrg # run, as this mode is specially recognized in the preamble. 621ba6a1819Smrg exit 1 622ba6a1819Smrg ;; 623ba6a1819Smrg 624ba6a1819Smrgmakedepend) 625ba6a1819Smrg "$@" || exit $? 626ba6a1819Smrg # Remove any Libtool call 627ba6a1819Smrg if test "$libtool" = yes; then 628549e21daSmrg while test "X$1" != 'X--mode=compile'; do 629ba6a1819Smrg shift 630ba6a1819Smrg done 631ba6a1819Smrg shift 632ba6a1819Smrg fi 633ba6a1819Smrg # X makedepend 634ba6a1819Smrg shift 635549e21daSmrg cleared=no eat=no 636549e21daSmrg for arg 637549e21daSmrg do 638ba6a1819Smrg case $cleared in 639ba6a1819Smrg no) 640ba6a1819Smrg set ""; shift 641ba6a1819Smrg cleared=yes ;; 642ba6a1819Smrg esac 643549e21daSmrg if test $eat = yes; then 644549e21daSmrg eat=no 645549e21daSmrg continue 646549e21daSmrg fi 647ba6a1819Smrg case "$arg" in 648ba6a1819Smrg -D*|-I*) 649ba6a1819Smrg set fnord "$@" "$arg"; shift ;; 650ba6a1819Smrg # Strip any option that makedepend may not understand. Remove 651ba6a1819Smrg # the object too, otherwise makedepend will parse it as a source file. 652549e21daSmrg -arch) 653549e21daSmrg eat=yes ;; 654ba6a1819Smrg -*|$object) 655ba6a1819Smrg ;; 656ba6a1819Smrg *) 657ba6a1819Smrg set fnord "$@" "$arg"; shift ;; 658ba6a1819Smrg esac 659ba6a1819Smrg done 660549e21daSmrg obj_suffix=`echo "$object" | sed 's/^.*\././'` 661ba6a1819Smrg touch "$tmpdepfile" 662ba6a1819Smrg ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" 663ba6a1819Smrg rm -f "$depfile" 6641bedbe3fSmrg # makedepend may prepend the VPATH from the source file name to the object. 6651bedbe3fSmrg # No need to regex-escape $object, excess matching of '.' is harmless. 6661bedbe3fSmrg sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" 6671bedbe3fSmrg # Some versions of the HPUX 10.20 sed can't process the last invocation 6681bedbe3fSmrg # correctly. Breaking it into two sed invocations is a workaround. 6691bedbe3fSmrg sed '1,2d' "$tmpdepfile" \ 6701bedbe3fSmrg | tr ' ' "$nl" \ 6711bedbe3fSmrg | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ 6721bedbe3fSmrg | sed -e 's/$/ :/' >> "$depfile" 673ba6a1819Smrg rm -f "$tmpdepfile" "$tmpdepfile".bak 674ba6a1819Smrg ;; 675ba6a1819Smrg 676ba6a1819Smrgcpp) 677ba6a1819Smrg # Important note: in order to support this mode, a compiler *must* 678ba6a1819Smrg # always write the preprocessed file to stdout. 679ba6a1819Smrg "$@" || exit $? 680ba6a1819Smrg 681ba6a1819Smrg # Remove the call to Libtool. 682ba6a1819Smrg if test "$libtool" = yes; then 683549e21daSmrg while test "X$1" != 'X--mode=compile'; do 684ba6a1819Smrg shift 685ba6a1819Smrg done 686ba6a1819Smrg shift 687ba6a1819Smrg fi 688ba6a1819Smrg 6891bedbe3fSmrg # Remove '-o $object'. 690ba6a1819Smrg IFS=" " 691ba6a1819Smrg for arg 692ba6a1819Smrg do 693ba6a1819Smrg case $arg in 694ba6a1819Smrg -o) 695ba6a1819Smrg shift 696ba6a1819Smrg ;; 697ba6a1819Smrg $object) 698ba6a1819Smrg shift 699ba6a1819Smrg ;; 700ba6a1819Smrg *) 701ba6a1819Smrg set fnord "$@" "$arg" 702ba6a1819Smrg shift # fnord 703ba6a1819Smrg shift # $arg 704ba6a1819Smrg ;; 705ba6a1819Smrg esac 706ba6a1819Smrg done 707ba6a1819Smrg 7081bedbe3fSmrg "$@" -E \ 7091bedbe3fSmrg | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ 7101bedbe3fSmrg -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ 7111bedbe3fSmrg | sed '$ s: \\$::' > "$tmpdepfile" 712ba6a1819Smrg rm -f "$depfile" 713ba6a1819Smrg echo "$object : \\" > "$depfile" 714ba6a1819Smrg cat < "$tmpdepfile" >> "$depfile" 715ba6a1819Smrg sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" 716ba6a1819Smrg rm -f "$tmpdepfile" 717ba6a1819Smrg ;; 718ba6a1819Smrg 719ba6a1819Smrgmsvisualcpp) 720ba6a1819Smrg # Important note: in order to support this mode, a compiler *must* 721549e21daSmrg # always write the preprocessed file to stdout. 722ba6a1819Smrg "$@" || exit $? 723549e21daSmrg 724549e21daSmrg # Remove the call to Libtool. 725549e21daSmrg if test "$libtool" = yes; then 726549e21daSmrg while test "X$1" != 'X--mode=compile'; do 727549e21daSmrg shift 728549e21daSmrg done 729549e21daSmrg shift 730549e21daSmrg fi 731549e21daSmrg 732ba6a1819Smrg IFS=" " 733ba6a1819Smrg for arg 734ba6a1819Smrg do 735ba6a1819Smrg case "$arg" in 736549e21daSmrg -o) 737549e21daSmrg shift 738549e21daSmrg ;; 739549e21daSmrg $object) 740549e21daSmrg shift 741549e21daSmrg ;; 742ba6a1819Smrg "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") 7431bedbe3fSmrg set fnord "$@" 7441bedbe3fSmrg shift 7451bedbe3fSmrg shift 7461bedbe3fSmrg ;; 747ba6a1819Smrg *) 7481bedbe3fSmrg set fnord "$@" "$arg" 7491bedbe3fSmrg shift 7501bedbe3fSmrg shift 7511bedbe3fSmrg ;; 752ba6a1819Smrg esac 753ba6a1819Smrg done 754549e21daSmrg "$@" -E 2>/dev/null | 755549e21daSmrg sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" 756ba6a1819Smrg rm -f "$depfile" 757ba6a1819Smrg echo "$object : \\" > "$depfile" 7581bedbe3fSmrg sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" 7591bedbe3fSmrg echo "$tab" >> "$depfile" 760549e21daSmrg sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" 761ba6a1819Smrg rm -f "$tmpdepfile" 762ba6a1819Smrg ;; 763ba6a1819Smrg 764549e21daSmrgmsvcmsys) 765549e21daSmrg # This case exists only to let depend.m4 do its work. It works by 766549e21daSmrg # looking at the text of this script. This case will never be run, 767549e21daSmrg # since it is checked for above. 768549e21daSmrg exit 1 769549e21daSmrg ;; 770549e21daSmrg 771ba6a1819Smrgnone) 772ba6a1819Smrg exec "$@" 773ba6a1819Smrg ;; 774ba6a1819Smrg 775ba6a1819Smrg*) 776ba6a1819Smrg echo "Unknown depmode $depmode" 1>&2 777ba6a1819Smrg exit 1 778ba6a1819Smrg ;; 779ba6a1819Smrgesac 780ba6a1819Smrg 781ba6a1819Smrgexit 0 782ba6a1819Smrg 783ba6a1819Smrg# Local Variables: 784ba6a1819Smrg# mode: shell-script 785ba6a1819Smrg# sh-indentation: 2 786ba6a1819Smrg# eval: (add-hook 'write-file-hooks 'time-stamp) 787ba6a1819Smrg# time-stamp-start: "scriptversion=" 788ba6a1819Smrg# time-stamp-format: "%:y-%02m-%02d.%02H" 789549e21daSmrg# time-stamp-time-zone: "UTC" 790549e21daSmrg# time-stamp-end: "; # UTC" 791ba6a1819Smrg# End: 792