13eed67faSmbalmer#! /bin/sh 23eed67faSmbalmer# depcomp - compile a program generating dependencies as side-effects 33eed67faSmbalmer 41a9c160aSmrgscriptversion=2018-03-07.03; # UTC 53eed67faSmbalmer 6621f50c3Smrg# Copyright (C) 1999-2021 Free Software Foundation, Inc. 73eed67faSmbalmer 83eed67faSmbalmer# This program is free software; you can redistribute it and/or modify 93eed67faSmbalmer# it under the terms of the GNU General Public License as published by 103eed67faSmbalmer# the Free Software Foundation; either version 2, or (at your option) 113eed67faSmbalmer# any later version. 123eed67faSmbalmer 133eed67faSmbalmer# This program is distributed in the hope that it will be useful, 143eed67faSmbalmer# but WITHOUT ANY WARRANTY; without even the implied warranty of 153eed67faSmbalmer# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 163eed67faSmbalmer# GNU General Public License for more details. 173eed67faSmbalmer 183eed67faSmbalmer# You should have received a copy of the GNU General Public License 191a9c160aSmrg# along with this program. If not, see <https://www.gnu.org/licenses/>. 203eed67faSmbalmer 213eed67faSmbalmer# As a special exception to the GNU General Public License, if you 223eed67faSmbalmer# distribute this file as part of a program that contains a 233eed67faSmbalmer# configuration script generated by Autoconf, you may include it under 243eed67faSmbalmer# the same distribution terms that you use for the rest of that program. 253eed67faSmbalmer 263eed67faSmbalmer# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>. 273eed67faSmbalmer 283eed67faSmbalmercase $1 in 293eed67faSmbalmer '') 301a9c160aSmrg echo "$0: No command. Try '$0 --help' for more information." 1>&2 311a9c160aSmrg exit 1; 321a9c160aSmrg ;; 333eed67faSmbalmer -h | --h*) 343eed67faSmbalmer cat <<\EOF 353eed67faSmbalmerUsage: depcomp [--help] [--version] PROGRAM [ARGS] 363eed67faSmbalmer 373eed67faSmbalmerRun PROGRAMS ARGS to compile a file, generating dependencies 383eed67faSmbalmeras side-effects. 393eed67faSmbalmer 403eed67faSmbalmerEnvironment variables: 413eed67faSmbalmer depmode Dependency tracking mode. 421a9c160aSmrg source Source file read by 'PROGRAMS ARGS'. 431a9c160aSmrg object Object file output by 'PROGRAMS ARGS'. 443eed67faSmbalmer DEPDIR directory where to store dependencies. 453eed67faSmbalmer depfile Dependency file to output. 4675cbef56Smrg tmpdepfile Temporary file to use when outputting dependencies. 473eed67faSmbalmer libtool Whether libtool is used (yes/no). 483eed67faSmbalmer 493eed67faSmbalmerReport bugs to <bug-automake@gnu.org>. 503eed67faSmbalmerEOF 513eed67faSmbalmer exit $? 523eed67faSmbalmer ;; 533eed67faSmbalmer -v | --v*) 543eed67faSmbalmer echo "depcomp $scriptversion" 553eed67faSmbalmer exit $? 563eed67faSmbalmer ;; 573eed67faSmbalmeresac 583eed67faSmbalmer 591a9c160aSmrg# Get the directory component of the given path, and save it in the 601a9c160aSmrg# global variables '$dir'. Note that this directory component will 611a9c160aSmrg# be either empty or ending with a '/' character. This is deliberate. 621a9c160aSmrgset_dir_from () 631a9c160aSmrg{ 641a9c160aSmrg case $1 in 651a9c160aSmrg */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;; 661a9c160aSmrg *) dir=;; 671a9c160aSmrg esac 681a9c160aSmrg} 691a9c160aSmrg 701a9c160aSmrg# Get the suffix-stripped basename of the given path, and save it the 711a9c160aSmrg# global variable '$base'. 721a9c160aSmrgset_base_from () 731a9c160aSmrg{ 741a9c160aSmrg base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'` 751a9c160aSmrg} 761a9c160aSmrg 771a9c160aSmrg# If no dependency file was actually created by the compiler invocation, 781a9c160aSmrg# we still have to create a dummy depfile, to avoid errors with the 791a9c160aSmrg# Makefile "include basename.Plo" scheme. 801a9c160aSmrgmake_dummy_depfile () 811a9c160aSmrg{ 821a9c160aSmrg echo "#dummy" > "$depfile" 831a9c160aSmrg} 841a9c160aSmrg 851a9c160aSmrg# Factor out some common post-processing of the generated depfile. 861a9c160aSmrg# Requires the auxiliary global variable '$tmpdepfile' to be set. 871a9c160aSmrgaix_post_process_depfile () 881a9c160aSmrg{ 891a9c160aSmrg # If the compiler actually managed to produce a dependency file, 901a9c160aSmrg # post-process it. 911a9c160aSmrg if test -f "$tmpdepfile"; then 921a9c160aSmrg # Each line is of the form 'foo.o: dependency.h'. 931a9c160aSmrg # Do two passes, one to just change these to 941a9c160aSmrg # $object: dependency.h 951a9c160aSmrg # and one to simply output 961a9c160aSmrg # dependency.h: 971a9c160aSmrg # which is needed to avoid the deleted-header problem. 981a9c160aSmrg { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile" 991a9c160aSmrg sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile" 1001a9c160aSmrg } > "$depfile" 1011a9c160aSmrg rm -f "$tmpdepfile" 1021a9c160aSmrg else 1031a9c160aSmrg make_dummy_depfile 1041a9c160aSmrg fi 1051a9c160aSmrg} 1061a9c160aSmrg 1071a9c160aSmrg# A tabulation character. 1081a9c160aSmrgtab=' ' 1091a9c160aSmrg# A newline character. 1101a9c160aSmrgnl=' 1111a9c160aSmrg' 1121a9c160aSmrg# Character ranges might be problematic outside the C locale. 1131a9c160aSmrg# These definitions help. 1141a9c160aSmrgupper=ABCDEFGHIJKLMNOPQRSTUVWXYZ 1151a9c160aSmrglower=abcdefghijklmnopqrstuvwxyz 1161a9c160aSmrgdigits=0123456789 1171a9c160aSmrgalpha=${upper}${lower} 1181a9c160aSmrg 1193eed67faSmbalmerif test -z "$depmode" || test -z "$source" || test -z "$object"; then 1203eed67faSmbalmer echo "depcomp: Variables source, object and depmode must be set" 1>&2 1213eed67faSmbalmer exit 1 1223eed67faSmbalmerfi 1233eed67faSmbalmer 1243eed67faSmbalmer# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. 1253eed67faSmbalmerdepfile=${depfile-`echo "$object" | 1263eed67faSmbalmer sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} 1273eed67faSmbalmertmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} 1283eed67faSmbalmer 1293eed67faSmbalmerrm -f "$tmpdepfile" 1303eed67faSmbalmer 1311a9c160aSmrg# Avoid interferences from the environment. 1321a9c160aSmrggccflag= dashmflag= 1331a9c160aSmrg 1343eed67faSmbalmer# Some modes work just like other modes, but use different flags. We 1353eed67faSmbalmer# parameterize here, but still list the modes in the big case below, 1363eed67faSmbalmer# to make depend.m4 easier to write. Note that we *cannot* use a case 1373eed67faSmbalmer# here, because this file can only contain one case statement. 1383eed67faSmbalmerif test "$depmode" = hp; then 1393eed67faSmbalmer # HP compiler uses -M and no extra arg. 1403eed67faSmbalmer gccflag=-M 1413eed67faSmbalmer depmode=gcc 1423eed67faSmbalmerfi 1433eed67faSmbalmer 1443eed67faSmbalmerif test "$depmode" = dashXmstdout; then 1451a9c160aSmrg # This is just like dashmstdout with a different argument. 1461a9c160aSmrg dashmflag=-xM 1471a9c160aSmrg depmode=dashmstdout 1483eed67faSmbalmerfi 1493eed67faSmbalmer 150dc407927Smrgcygpath_u="cygpath -u -f -" 151dc407927Smrgif test "$depmode" = msvcmsys; then 1521a9c160aSmrg # This is just like msvisualcpp but w/o cygpath translation. 1531a9c160aSmrg # Just convert the backslash-escaped backslashes to single forward 1541a9c160aSmrg # slashes to satisfy depend.m4 1551a9c160aSmrg cygpath_u='sed s,\\\\,/,g' 1561a9c160aSmrg depmode=msvisualcpp 157dc407927Smrgfi 158dc407927Smrg 15975cbef56Smrgif test "$depmode" = msvc7msys; then 1601a9c160aSmrg # This is just like msvc7 but w/o cygpath translation. 1611a9c160aSmrg # Just convert the backslash-escaped backslashes to single forward 1621a9c160aSmrg # slashes to satisfy depend.m4 1631a9c160aSmrg cygpath_u='sed s,\\\\,/,g' 1641a9c160aSmrg depmode=msvc7 1651a9c160aSmrgfi 1661a9c160aSmrg 1671a9c160aSmrgif test "$depmode" = xlc; then 1681a9c160aSmrg # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information. 1691a9c160aSmrg gccflag=-qmakedep=gcc,-MF 1701a9c160aSmrg depmode=gcc 17175cbef56Smrgfi 17275cbef56Smrg 1733eed67faSmbalmercase "$depmode" in 1743eed67faSmbalmergcc3) 1753eed67faSmbalmer## gcc 3 implements dependency tracking that does exactly what 1763eed67faSmbalmer## we want. Yay! Note: for some reason libtool 1.4 doesn't like 1773eed67faSmbalmer## it if -MD -MP comes after the -MF stuff. Hmm. 178dc407927Smrg## Unfortunately, FreeBSD c89 acceptance of flags depends upon 179dc407927Smrg## the command line argument order; so add the flags where they 180dc407927Smrg## appear in depend2.am. Note that the slowdown incurred here 181dc407927Smrg## affects only configure: in makefiles, %FASTDEP% shortcuts this. 182dc407927Smrg for arg 183dc407927Smrg do 184dc407927Smrg case $arg in 185dc407927Smrg -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; 186dc407927Smrg *) set fnord "$@" "$arg" ;; 187dc407927Smrg esac 188dc407927Smrg shift # fnord 189dc407927Smrg shift # $arg 190dc407927Smrg done 191dc407927Smrg "$@" 1923eed67faSmbalmer stat=$? 1931a9c160aSmrg if test $stat -ne 0; then 1943eed67faSmbalmer rm -f "$tmpdepfile" 1953eed67faSmbalmer exit $stat 1963eed67faSmbalmer fi 1973eed67faSmbalmer mv "$tmpdepfile" "$depfile" 1983eed67faSmbalmer ;; 1993eed67faSmbalmer 2003eed67faSmbalmergcc) 2011a9c160aSmrg## Note that this doesn't just cater to obsosete pre-3.x GCC compilers. 2021a9c160aSmrg## but also to in-use compilers like IMB xlc/xlC and the HP C compiler. 2031a9c160aSmrg## (see the conditional assignment to $gccflag above). 2043eed67faSmbalmer## There are various ways to get dependency output from gcc. Here's 2053eed67faSmbalmer## why we pick this rather obscure method: 2063eed67faSmbalmer## - Don't want to use -MD because we'd like the dependencies to end 2073eed67faSmbalmer## up in a subdir. Having to rename by hand is ugly. 2083eed67faSmbalmer## (We might end up doing this anyway to support other compilers.) 2093eed67faSmbalmer## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like 2101a9c160aSmrg## -MM, not -M (despite what the docs say). Also, it might not be 2111a9c160aSmrg## supported by the other compilers which use the 'gcc' depmode. 2123eed67faSmbalmer## - Using -M directly means running the compiler twice (even worse 2133eed67faSmbalmer## than renaming). 2143eed67faSmbalmer if test -z "$gccflag"; then 2153eed67faSmbalmer gccflag=-MD, 2163eed67faSmbalmer fi 2173eed67faSmbalmer "$@" -Wp,"$gccflag$tmpdepfile" 2183eed67faSmbalmer stat=$? 2191a9c160aSmrg if test $stat -ne 0; then 2203eed67faSmbalmer rm -f "$tmpdepfile" 2213eed67faSmbalmer exit $stat 2223eed67faSmbalmer fi 2233eed67faSmbalmer rm -f "$depfile" 2243eed67faSmbalmer echo "$object : \\" > "$depfile" 2251a9c160aSmrg # The second -e expression handles DOS-style file names with drive 2261a9c160aSmrg # letters. 2273eed67faSmbalmer sed -e 's/^[^:]*: / /' \ 2283eed67faSmbalmer -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" 2291a9c160aSmrg## This next piece of magic avoids the "deleted header file" problem. 2303eed67faSmbalmer## The problem is that when a header file which appears in a .P file 2313eed67faSmbalmer## is deleted, the dependency causes make to die (because there is 2323eed67faSmbalmer## typically no way to rebuild the header). We avoid this by adding 2333eed67faSmbalmer## dummy dependencies for each header file. Too bad gcc doesn't do 2343eed67faSmbalmer## this for us directly. 2351a9c160aSmrg## Some versions of gcc put a space before the ':'. On the theory 2363eed67faSmbalmer## that the space means something, we add a space to the output as 23775cbef56Smrg## well. hp depmode also adds that space, but also prefixes the VPATH 23875cbef56Smrg## to the object. Take care to not repeat it in the output. 2393eed67faSmbalmer## Some versions of the HPUX 10.20 sed can't process this invocation 2403eed67faSmbalmer## correctly. Breaking it into two sed invocations is a workaround. 2411a9c160aSmrg tr ' ' "$nl" < "$tmpdepfile" \ 2421a9c160aSmrg | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ 2431a9c160aSmrg | sed -e 's/$/ :/' >> "$depfile" 2443eed67faSmbalmer rm -f "$tmpdepfile" 2453eed67faSmbalmer ;; 2463eed67faSmbalmer 2473eed67faSmbalmerhp) 2483eed67faSmbalmer # This case exists only to let depend.m4 do its work. It works by 2493eed67faSmbalmer # looking at the text of this script. This case will never be run, 2503eed67faSmbalmer # since it is checked for above. 2513eed67faSmbalmer exit 1 2523eed67faSmbalmer ;; 2533eed67faSmbalmer 2543eed67faSmbalmersgi) 2553eed67faSmbalmer if test "$libtool" = yes; then 2563eed67faSmbalmer "$@" "-Wp,-MDupdate,$tmpdepfile" 2573eed67faSmbalmer else 2583eed67faSmbalmer "$@" -MDupdate "$tmpdepfile" 2593eed67faSmbalmer fi 2603eed67faSmbalmer stat=$? 2611a9c160aSmrg if test $stat -ne 0; then 2623eed67faSmbalmer rm -f "$tmpdepfile" 2633eed67faSmbalmer exit $stat 2643eed67faSmbalmer fi 2653eed67faSmbalmer rm -f "$depfile" 2663eed67faSmbalmer 2673eed67faSmbalmer if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files 2683eed67faSmbalmer echo "$object : \\" > "$depfile" 2693eed67faSmbalmer # Clip off the initial element (the dependent). Don't try to be 2703eed67faSmbalmer # clever and replace this with sed code, as IRIX sed won't handle 2713eed67faSmbalmer # lines with more than a fixed number of characters (4096 in 2723eed67faSmbalmer # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; 2731a9c160aSmrg # the IRIX cc adds comments like '#:fec' to the end of the 2743eed67faSmbalmer # dependency line. 2751a9c160aSmrg tr ' ' "$nl" < "$tmpdepfile" \ 2761a9c160aSmrg | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \ 2771a9c160aSmrg | tr "$nl" ' ' >> "$depfile" 278dc407927Smrg echo >> "$depfile" 2793eed67faSmbalmer # The second pass generates a dummy entry for each header file. 2801a9c160aSmrg tr ' ' "$nl" < "$tmpdepfile" \ 2811a9c160aSmrg | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ 2821a9c160aSmrg >> "$depfile" 2833eed67faSmbalmer else 2841a9c160aSmrg make_dummy_depfile 2853eed67faSmbalmer fi 2863eed67faSmbalmer rm -f "$tmpdepfile" 2873eed67faSmbalmer ;; 2883eed67faSmbalmer 2891a9c160aSmrgxlc) 2901a9c160aSmrg # This case exists only to let depend.m4 do its work. It works by 2911a9c160aSmrg # looking at the text of this script. This case will never be run, 2921a9c160aSmrg # since it is checked for above. 2931a9c160aSmrg exit 1 2941a9c160aSmrg ;; 2951a9c160aSmrg 2963eed67faSmbalmeraix) 2973eed67faSmbalmer # The C for AIX Compiler uses -M and outputs the dependencies 2983eed67faSmbalmer # in a .u file. In older versions, this file always lives in the 2991a9c160aSmrg # current directory. Also, the AIX compiler puts '$object:' at the 3003eed67faSmbalmer # start of each line; $object doesn't have directory information. 3013eed67faSmbalmer # Version 6 uses the directory in both cases. 3021a9c160aSmrg set_dir_from "$object" 3031a9c160aSmrg set_base_from "$object" 3043eed67faSmbalmer if test "$libtool" = yes; then 305dc407927Smrg tmpdepfile1=$dir$base.u 306dc407927Smrg tmpdepfile2=$base.u 307dc407927Smrg tmpdepfile3=$dir.libs/$base.u 3083eed67faSmbalmer "$@" -Wc,-M 3093eed67faSmbalmer else 310dc407927Smrg tmpdepfile1=$dir$base.u 311dc407927Smrg tmpdepfile2=$dir$base.u 312dc407927Smrg tmpdepfile3=$dir$base.u 3133eed67faSmbalmer "$@" -M 3143eed67faSmbalmer fi 3153eed67faSmbalmer stat=$? 3161a9c160aSmrg if test $stat -ne 0; then 317dc407927Smrg rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 3183eed67faSmbalmer exit $stat 3193eed67faSmbalmer fi 3203eed67faSmbalmer 321dc407927Smrg for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 322dc407927Smrg do 323dc407927Smrg test -f "$tmpdepfile" && break 324dc407927Smrg done 3251a9c160aSmrg aix_post_process_depfile 3261a9c160aSmrg ;; 3271a9c160aSmrg 3281a9c160aSmrgtcc) 3291a9c160aSmrg # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26 3301a9c160aSmrg # FIXME: That version still under development at the moment of writing. 3311a9c160aSmrg # Make that this statement remains true also for stable, released 3321a9c160aSmrg # versions. 3331a9c160aSmrg # It will wrap lines (doesn't matter whether long or short) with a 3341a9c160aSmrg # trailing '\', as in: 3351a9c160aSmrg # 3361a9c160aSmrg # foo.o : \ 3371a9c160aSmrg # foo.c \ 3381a9c160aSmrg # foo.h \ 3391a9c160aSmrg # 3401a9c160aSmrg # It will put a trailing '\' even on the last line, and will use leading 3411a9c160aSmrg # spaces rather than leading tabs (at least since its commit 0394caf7 3421a9c160aSmrg # "Emit spaces for -MD"). 3431a9c160aSmrg "$@" -MD -MF "$tmpdepfile" 3441a9c160aSmrg stat=$? 3451a9c160aSmrg if test $stat -ne 0; then 3461a9c160aSmrg rm -f "$tmpdepfile" 3471a9c160aSmrg exit $stat 3483eed67faSmbalmer fi 3491a9c160aSmrg rm -f "$depfile" 3501a9c160aSmrg # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'. 3511a9c160aSmrg # We have to change lines of the first kind to '$object: \'. 3521a9c160aSmrg sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile" 3531a9c160aSmrg # And for each line of the second kind, we have to emit a 'dep.h:' 3541a9c160aSmrg # dummy dependency, to avoid the deleted-header problem. 3551a9c160aSmrg sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile" 3563eed67faSmbalmer rm -f "$tmpdepfile" 3573eed67faSmbalmer ;; 3583eed67faSmbalmer 3591a9c160aSmrg## The order of this option in the case statement is important, since the 3601a9c160aSmrg## shell code in configure will try each of these formats in the order 3611a9c160aSmrg## listed in this file. A plain '-MD' option would be understood by many 3621a9c160aSmrg## compilers, so we must ensure this comes after the gcc and icc options. 3631a9c160aSmrgpgcc) 3641a9c160aSmrg # Portland's C compiler understands '-MD'. 3651a9c160aSmrg # Will always output deps to 'file.d' where file is the root name of the 3661a9c160aSmrg # source file under compilation, even if file resides in a subdirectory. 3671a9c160aSmrg # The object file name does not affect the name of the '.d' file. 3681a9c160aSmrg # pgcc 10.2 will output 3693eed67faSmbalmer # foo.o: sub/foo.c sub/foo.h 3701a9c160aSmrg # and will wrap long lines using '\' : 3713eed67faSmbalmer # foo.o: sub/foo.c ... \ 3723eed67faSmbalmer # sub/foo.h ... \ 3733eed67faSmbalmer # ... 3741a9c160aSmrg set_dir_from "$object" 3751a9c160aSmrg # Use the source, not the object, to determine the base name, since 3761a9c160aSmrg # that's sadly what pgcc will do too. 3771a9c160aSmrg set_base_from "$source" 3781a9c160aSmrg tmpdepfile=$base.d 3791a9c160aSmrg 3801a9c160aSmrg # For projects that build the same source file twice into different object 3811a9c160aSmrg # files, the pgcc approach of using the *source* file root name can cause 3821a9c160aSmrg # problems in parallel builds. Use a locking strategy to avoid stomping on 3831a9c160aSmrg # the same $tmpdepfile. 3841a9c160aSmrg lockdir=$base.d-lock 3851a9c160aSmrg trap " 3861a9c160aSmrg echo '$0: caught signal, cleaning up...' >&2 3871a9c160aSmrg rmdir '$lockdir' 3881a9c160aSmrg exit 1 3891a9c160aSmrg " 1 2 13 15 3901a9c160aSmrg numtries=100 3911a9c160aSmrg i=$numtries 3921a9c160aSmrg while test $i -gt 0; do 3931a9c160aSmrg # mkdir is a portable test-and-set. 3941a9c160aSmrg if mkdir "$lockdir" 2>/dev/null; then 3951a9c160aSmrg # This process acquired the lock. 3961a9c160aSmrg "$@" -MD 3971a9c160aSmrg stat=$? 3981a9c160aSmrg # Release the lock. 3991a9c160aSmrg rmdir "$lockdir" 4001a9c160aSmrg break 4011a9c160aSmrg else 4021a9c160aSmrg # If the lock is being held by a different process, wait 4031a9c160aSmrg # until the winning process is done or we timeout. 4041a9c160aSmrg while test -d "$lockdir" && test $i -gt 0; do 4051a9c160aSmrg sleep 1 4061a9c160aSmrg i=`expr $i - 1` 4071a9c160aSmrg done 4081a9c160aSmrg fi 4091a9c160aSmrg i=`expr $i - 1` 4101a9c160aSmrg done 4111a9c160aSmrg trap - 1 2 13 15 4121a9c160aSmrg if test $i -le 0; then 4131a9c160aSmrg echo "$0: failed to acquire lock after $numtries attempts" >&2 4141a9c160aSmrg echo "$0: check lockdir '$lockdir'" >&2 4151a9c160aSmrg exit 1 4161a9c160aSmrg fi 4173eed67faSmbalmer 4181a9c160aSmrg if test $stat -ne 0; then 4193eed67faSmbalmer rm -f "$tmpdepfile" 4203eed67faSmbalmer exit $stat 4213eed67faSmbalmer fi 4223eed67faSmbalmer rm -f "$depfile" 4233eed67faSmbalmer # Each line is of the form `foo.o: dependent.h', 4243eed67faSmbalmer # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. 4253eed67faSmbalmer # Do two passes, one to just change these to 4263eed67faSmbalmer # `$object: dependent.h' and one to simply `dependent.h:'. 4273eed67faSmbalmer sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" 4283eed67faSmbalmer # Some versions of the HPUX 10.20 sed can't process this invocation 4293eed67faSmbalmer # correctly. Breaking it into two sed invocations is a workaround. 4301a9c160aSmrg sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \ 4311a9c160aSmrg | sed -e 's/$/ :/' >> "$depfile" 4323eed67faSmbalmer rm -f "$tmpdepfile" 4333eed67faSmbalmer ;; 4343eed67faSmbalmer 435dc407927Smrghp2) 436dc407927Smrg # The "hp" stanza above does not work with aCC (C++) and HP's ia64 437dc407927Smrg # compilers, which have integrated preprocessors. The correct option 438dc407927Smrg # to use with these is +Maked; it writes dependencies to a file named 439dc407927Smrg # 'foo.d', which lands next to the object file, wherever that 440dc407927Smrg # happens to be. 441dc407927Smrg # Much of this is similar to the tru64 case; see comments there. 4421a9c160aSmrg set_dir_from "$object" 4431a9c160aSmrg set_base_from "$object" 444dc407927Smrg if test "$libtool" = yes; then 445dc407927Smrg tmpdepfile1=$dir$base.d 446dc407927Smrg tmpdepfile2=$dir.libs/$base.d 447dc407927Smrg "$@" -Wc,+Maked 448dc407927Smrg else 449dc407927Smrg tmpdepfile1=$dir$base.d 450dc407927Smrg tmpdepfile2=$dir$base.d 451dc407927Smrg "$@" +Maked 452dc407927Smrg fi 453dc407927Smrg stat=$? 4541a9c160aSmrg if test $stat -ne 0; then 455dc407927Smrg rm -f "$tmpdepfile1" "$tmpdepfile2" 456dc407927Smrg exit $stat 457dc407927Smrg fi 458dc407927Smrg 459dc407927Smrg for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" 460dc407927Smrg do 461dc407927Smrg test -f "$tmpdepfile" && break 462dc407927Smrg done 463dc407927Smrg if test -f "$tmpdepfile"; then 4641a9c160aSmrg sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile" 4651a9c160aSmrg # Add 'dependent.h:' lines. 466dc407927Smrg sed -ne '2,${ 4671a9c160aSmrg s/^ *// 4681a9c160aSmrg s/ \\*$// 4691a9c160aSmrg s/$/:/ 4701a9c160aSmrg p 4711a9c160aSmrg }' "$tmpdepfile" >> "$depfile" 472dc407927Smrg else 4731a9c160aSmrg make_dummy_depfile 474dc407927Smrg fi 475dc407927Smrg rm -f "$tmpdepfile" "$tmpdepfile2" 476dc407927Smrg ;; 477dc407927Smrg 4783eed67faSmbalmertru64) 4791a9c160aSmrg # The Tru64 compiler uses -MD to generate dependencies as a side 4801a9c160aSmrg # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. 4811a9c160aSmrg # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put 4821a9c160aSmrg # dependencies in 'foo.d' instead, so we check for that too. 4831a9c160aSmrg # Subdirectories are respected. 4841a9c160aSmrg set_dir_from "$object" 4851a9c160aSmrg set_base_from "$object" 4861a9c160aSmrg 4871a9c160aSmrg if test "$libtool" = yes; then 4881a9c160aSmrg # Libtool generates 2 separate objects for the 2 libraries. These 4891a9c160aSmrg # two compilations output dependencies in $dir.libs/$base.o.d and 4901a9c160aSmrg # in $dir$base.o.d. We have to check for both files, because 4911a9c160aSmrg # one of the two compilations can be disabled. We should prefer 4921a9c160aSmrg # $dir$base.o.d over $dir.libs/$base.o.d because the latter is 4931a9c160aSmrg # automatically cleaned when .libs/ is deleted, while ignoring 4941a9c160aSmrg # the former would cause a distcleancheck panic. 4951a9c160aSmrg tmpdepfile1=$dir$base.o.d # libtool 1.5 4961a9c160aSmrg tmpdepfile2=$dir.libs/$base.o.d # Likewise. 4971a9c160aSmrg tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504 4981a9c160aSmrg "$@" -Wc,-MD 4991a9c160aSmrg else 5001a9c160aSmrg tmpdepfile1=$dir$base.d 5011a9c160aSmrg tmpdepfile2=$dir$base.d 5021a9c160aSmrg tmpdepfile3=$dir$base.d 5031a9c160aSmrg "$@" -MD 5041a9c160aSmrg fi 5051a9c160aSmrg 5061a9c160aSmrg stat=$? 5071a9c160aSmrg if test $stat -ne 0; then 5081a9c160aSmrg rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 5091a9c160aSmrg exit $stat 5101a9c160aSmrg fi 5111a9c160aSmrg 5121a9c160aSmrg for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 5131a9c160aSmrg do 5141a9c160aSmrg test -f "$tmpdepfile" && break 5151a9c160aSmrg done 5161a9c160aSmrg # Same post-processing that is required for AIX mode. 5171a9c160aSmrg aix_post_process_depfile 5181a9c160aSmrg ;; 5193eed67faSmbalmer 52075cbef56Smrgmsvc7) 52175cbef56Smrg if test "$libtool" = yes; then 52275cbef56Smrg showIncludes=-Wc,-showIncludes 52375cbef56Smrg else 52475cbef56Smrg showIncludes=-showIncludes 52575cbef56Smrg fi 52675cbef56Smrg "$@" $showIncludes > "$tmpdepfile" 52775cbef56Smrg stat=$? 52875cbef56Smrg grep -v '^Note: including file: ' "$tmpdepfile" 5291a9c160aSmrg if test $stat -ne 0; then 53075cbef56Smrg rm -f "$tmpdepfile" 53175cbef56Smrg exit $stat 53275cbef56Smrg fi 53375cbef56Smrg rm -f "$depfile" 53475cbef56Smrg echo "$object : \\" > "$depfile" 53575cbef56Smrg # The first sed program below extracts the file names and escapes 53675cbef56Smrg # backslashes for cygpath. The second sed program outputs the file 53775cbef56Smrg # name when reading, but also accumulates all include files in the 53875cbef56Smrg # hold buffer in order to output them again at the end. This only 53975cbef56Smrg # works with sed implementations that can handle large buffers. 54075cbef56Smrg sed < "$tmpdepfile" -n ' 54175cbef56Smrg/^Note: including file: *\(.*\)/ { 54275cbef56Smrg s//\1/ 54375cbef56Smrg s/\\/\\\\/g 54475cbef56Smrg p 54575cbef56Smrg}' | $cygpath_u | sort -u | sed -n ' 54675cbef56Smrgs/ /\\ /g 5471a9c160aSmrgs/\(.*\)/'"$tab"'\1 \\/p 54875cbef56Smrgs/.\(.*\) \\/\1:/ 54975cbef56SmrgH 55075cbef56Smrg$ { 5511a9c160aSmrg s/.*/'"$tab"'/ 55275cbef56Smrg G 55375cbef56Smrg p 55475cbef56Smrg}' >> "$depfile" 5551a9c160aSmrg echo >> "$depfile" # make sure the fragment doesn't end with a backslash 55675cbef56Smrg rm -f "$tmpdepfile" 55775cbef56Smrg ;; 55875cbef56Smrg 55975cbef56Smrgmsvc7msys) 56075cbef56Smrg # This case exists only to let depend.m4 do its work. It works by 56175cbef56Smrg # looking at the text of this script. This case will never be run, 56275cbef56Smrg # since it is checked for above. 56375cbef56Smrg exit 1 56475cbef56Smrg ;; 56575cbef56Smrg 5663eed67faSmbalmer#nosideeffect) 5673eed67faSmbalmer # This comment above is used by automake to tell side-effect 5683eed67faSmbalmer # dependency tracking mechanisms from slower ones. 5693eed67faSmbalmer 5703eed67faSmbalmerdashmstdout) 5713eed67faSmbalmer # Important note: in order to support this mode, a compiler *must* 5723eed67faSmbalmer # always write the preprocessed file to stdout, regardless of -o. 5733eed67faSmbalmer "$@" || exit $? 5743eed67faSmbalmer 5753eed67faSmbalmer # Remove the call to Libtool. 5763eed67faSmbalmer if test "$libtool" = yes; then 577dc407927Smrg while test "X$1" != 'X--mode=compile'; do 5783eed67faSmbalmer shift 5793eed67faSmbalmer done 5803eed67faSmbalmer shift 5813eed67faSmbalmer fi 5823eed67faSmbalmer 5831a9c160aSmrg # Remove '-o $object'. 5843eed67faSmbalmer IFS=" " 5853eed67faSmbalmer for arg 5863eed67faSmbalmer do 5873eed67faSmbalmer case $arg in 5883eed67faSmbalmer -o) 5893eed67faSmbalmer shift 5903eed67faSmbalmer ;; 5913eed67faSmbalmer $object) 5923eed67faSmbalmer shift 5933eed67faSmbalmer ;; 5943eed67faSmbalmer *) 5953eed67faSmbalmer set fnord "$@" "$arg" 5963eed67faSmbalmer shift # fnord 5973eed67faSmbalmer shift # $arg 5983eed67faSmbalmer ;; 5993eed67faSmbalmer esac 6003eed67faSmbalmer done 6013eed67faSmbalmer 6023eed67faSmbalmer test -z "$dashmflag" && dashmflag=-M 6031a9c160aSmrg # Require at least two characters before searching for ':' 6043eed67faSmbalmer # in the target name. This is to cope with DOS-style filenames: 6051a9c160aSmrg # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. 6063eed67faSmbalmer "$@" $dashmflag | 6071a9c160aSmrg sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile" 6083eed67faSmbalmer rm -f "$depfile" 6093eed67faSmbalmer cat < "$tmpdepfile" > "$depfile" 6101a9c160aSmrg # Some versions of the HPUX 10.20 sed can't process this sed invocation 6111a9c160aSmrg # correctly. Breaking it into two sed invocations is a workaround. 6121a9c160aSmrg tr ' ' "$nl" < "$tmpdepfile" \ 6131a9c160aSmrg | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ 6141a9c160aSmrg | sed -e 's/$/ :/' >> "$depfile" 6153eed67faSmbalmer rm -f "$tmpdepfile" 6163eed67faSmbalmer ;; 6173eed67faSmbalmer 6183eed67faSmbalmerdashXmstdout) 6193eed67faSmbalmer # This case only exists to satisfy depend.m4. It is never actually 6203eed67faSmbalmer # run, as this mode is specially recognized in the preamble. 6213eed67faSmbalmer exit 1 6223eed67faSmbalmer ;; 6233eed67faSmbalmer 6243eed67faSmbalmermakedepend) 6253eed67faSmbalmer "$@" || exit $? 6263eed67faSmbalmer # Remove any Libtool call 6273eed67faSmbalmer if test "$libtool" = yes; then 628dc407927Smrg while test "X$1" != 'X--mode=compile'; do 6293eed67faSmbalmer shift 6303eed67faSmbalmer done 6313eed67faSmbalmer shift 6323eed67faSmbalmer fi 6333eed67faSmbalmer # X makedepend 6343eed67faSmbalmer shift 635dc407927Smrg cleared=no eat=no 636dc407927Smrg for arg 637dc407927Smrg do 6383eed67faSmbalmer case $cleared in 6393eed67faSmbalmer no) 6403eed67faSmbalmer set ""; shift 6413eed67faSmbalmer cleared=yes ;; 6423eed67faSmbalmer esac 643dc407927Smrg if test $eat = yes; then 644dc407927Smrg eat=no 645dc407927Smrg continue 646dc407927Smrg fi 6473eed67faSmbalmer case "$arg" in 6483eed67faSmbalmer -D*|-I*) 6493eed67faSmbalmer set fnord "$@" "$arg"; shift ;; 6503eed67faSmbalmer # Strip any option that makedepend may not understand. Remove 6513eed67faSmbalmer # the object too, otherwise makedepend will parse it as a source file. 652dc407927Smrg -arch) 653dc407927Smrg eat=yes ;; 6543eed67faSmbalmer -*|$object) 6553eed67faSmbalmer ;; 6563eed67faSmbalmer *) 6573eed67faSmbalmer set fnord "$@" "$arg"; shift ;; 6583eed67faSmbalmer esac 6593eed67faSmbalmer done 660dc407927Smrg obj_suffix=`echo "$object" | sed 's/^.*\././'` 6613eed67faSmbalmer touch "$tmpdepfile" 6623eed67faSmbalmer ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" 6633eed67faSmbalmer rm -f "$depfile" 66475cbef56Smrg # makedepend may prepend the VPATH from the source file name to the object. 66575cbef56Smrg # No need to regex-escape $object, excess matching of '.' is harmless. 66675cbef56Smrg sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" 6671a9c160aSmrg # Some versions of the HPUX 10.20 sed can't process the last invocation 6681a9c160aSmrg # correctly. Breaking it into two sed invocations is a workaround. 6691a9c160aSmrg sed '1,2d' "$tmpdepfile" \ 6701a9c160aSmrg | tr ' ' "$nl" \ 6711a9c160aSmrg | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ 6721a9c160aSmrg | sed -e 's/$/ :/' >> "$depfile" 6733eed67faSmbalmer rm -f "$tmpdepfile" "$tmpdepfile".bak 6743eed67faSmbalmer ;; 6753eed67faSmbalmer 6763eed67faSmbalmercpp) 6773eed67faSmbalmer # Important note: in order to support this mode, a compiler *must* 6783eed67faSmbalmer # always write the preprocessed file to stdout. 6793eed67faSmbalmer "$@" || exit $? 6803eed67faSmbalmer 6813eed67faSmbalmer # Remove the call to Libtool. 6823eed67faSmbalmer if test "$libtool" = yes; then 683dc407927Smrg while test "X$1" != 'X--mode=compile'; do 6843eed67faSmbalmer shift 6853eed67faSmbalmer done 6863eed67faSmbalmer shift 6873eed67faSmbalmer fi 6883eed67faSmbalmer 6891a9c160aSmrg # Remove '-o $object'. 6903eed67faSmbalmer IFS=" " 6913eed67faSmbalmer for arg 6923eed67faSmbalmer do 6933eed67faSmbalmer case $arg in 6943eed67faSmbalmer -o) 6953eed67faSmbalmer shift 6963eed67faSmbalmer ;; 6973eed67faSmbalmer $object) 6983eed67faSmbalmer shift 6993eed67faSmbalmer ;; 7003eed67faSmbalmer *) 7013eed67faSmbalmer set fnord "$@" "$arg" 7023eed67faSmbalmer shift # fnord 7033eed67faSmbalmer shift # $arg 7043eed67faSmbalmer ;; 7053eed67faSmbalmer esac 7063eed67faSmbalmer done 7073eed67faSmbalmer 7081a9c160aSmrg "$@" -E \ 7091a9c160aSmrg | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ 7101a9c160aSmrg -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ 7111a9c160aSmrg | sed '$ s: \\$::' > "$tmpdepfile" 7123eed67faSmbalmer rm -f "$depfile" 7133eed67faSmbalmer echo "$object : \\" > "$depfile" 7143eed67faSmbalmer cat < "$tmpdepfile" >> "$depfile" 7153eed67faSmbalmer sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" 7163eed67faSmbalmer rm -f "$tmpdepfile" 7173eed67faSmbalmer ;; 7183eed67faSmbalmer 7193eed67faSmbalmermsvisualcpp) 7203eed67faSmbalmer # Important note: in order to support this mode, a compiler *must* 721dc407927Smrg # always write the preprocessed file to stdout. 7223eed67faSmbalmer "$@" || exit $? 723dc407927Smrg 724dc407927Smrg # Remove the call to Libtool. 725dc407927Smrg if test "$libtool" = yes; then 726dc407927Smrg while test "X$1" != 'X--mode=compile'; do 727dc407927Smrg shift 728dc407927Smrg done 729dc407927Smrg shift 730dc407927Smrg fi 731dc407927Smrg 7323eed67faSmbalmer IFS=" " 7333eed67faSmbalmer for arg 7343eed67faSmbalmer do 7353eed67faSmbalmer case "$arg" in 736dc407927Smrg -o) 737dc407927Smrg shift 738dc407927Smrg ;; 739dc407927Smrg $object) 740dc407927Smrg shift 741dc407927Smrg ;; 7423eed67faSmbalmer "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") 7431a9c160aSmrg set fnord "$@" 7441a9c160aSmrg shift 7451a9c160aSmrg shift 7461a9c160aSmrg ;; 7473eed67faSmbalmer *) 7481a9c160aSmrg set fnord "$@" "$arg" 7491a9c160aSmrg shift 7501a9c160aSmrg shift 7511a9c160aSmrg ;; 7523eed67faSmbalmer esac 7533eed67faSmbalmer done 754dc407927Smrg "$@" -E 2>/dev/null | 755dc407927Smrg sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" 7563eed67faSmbalmer rm -f "$depfile" 7573eed67faSmbalmer echo "$object : \\" > "$depfile" 7581a9c160aSmrg sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" 7591a9c160aSmrg echo "$tab" >> "$depfile" 760dc407927Smrg sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" 7613eed67faSmbalmer rm -f "$tmpdepfile" 7623eed67faSmbalmer ;; 7633eed67faSmbalmer 764dc407927Smrgmsvcmsys) 765dc407927Smrg # This case exists only to let depend.m4 do its work. It works by 766dc407927Smrg # looking at the text of this script. This case will never be run, 767dc407927Smrg # since it is checked for above. 768dc407927Smrg exit 1 769dc407927Smrg ;; 770dc407927Smrg 7713eed67faSmbalmernone) 7723eed67faSmbalmer exec "$@" 7733eed67faSmbalmer ;; 7743eed67faSmbalmer 7753eed67faSmbalmer*) 7763eed67faSmbalmer echo "Unknown depmode $depmode" 1>&2 7773eed67faSmbalmer exit 1 7783eed67faSmbalmer ;; 7793eed67faSmbalmeresac 7803eed67faSmbalmer 7813eed67faSmbalmerexit 0 7823eed67faSmbalmer 7833eed67faSmbalmer# Local Variables: 7843eed67faSmbalmer# mode: shell-script 7853eed67faSmbalmer# sh-indentation: 2 7861a9c160aSmrg# eval: (add-hook 'before-save-hook 'time-stamp) 7873eed67faSmbalmer# time-stamp-start: "scriptversion=" 7883eed67faSmbalmer# time-stamp-format: "%:y-%02m-%02d.%02H" 7891a9c160aSmrg# time-stamp-time-zone: "UTC0" 790dc407927Smrg# time-stamp-end: "; # UTC" 7913eed67faSmbalmer# End: 792