1ff7e0accSmrg#! /bin/sh 2ff7e0accSmrg# depcomp - compile a program generating dependencies as side-effects 3ff7e0accSmrg 42163f7f8Smrgscriptversion=2018-03-07.03; # UTC 5ff7e0accSmrg 62163f7f8Smrg# Copyright (C) 1999-2021 Free Software Foundation, Inc. 7ff7e0accSmrg 8ff7e0accSmrg# This program is free software; you can redistribute it and/or modify 9ff7e0accSmrg# it under the terms of the GNU General Public License as published by 10ff7e0accSmrg# the Free Software Foundation; either version 2, or (at your option) 11ff7e0accSmrg# any later version. 12ff7e0accSmrg 13ff7e0accSmrg# This program is distributed in the hope that it will be useful, 14ff7e0accSmrg# but WITHOUT ANY WARRANTY; without even the implied warranty of 15ff7e0accSmrg# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16ff7e0accSmrg# GNU General Public License for more details. 17ff7e0accSmrg 18ff7e0accSmrg# You should have received a copy of the GNU General Public License 192163f7f8Smrg# along with this program. If not, see <https://www.gnu.org/licenses/>. 20ff7e0accSmrg 21ff7e0accSmrg# As a special exception to the GNU General Public License, if you 22ff7e0accSmrg# distribute this file as part of a program that contains a 23ff7e0accSmrg# configuration script generated by Autoconf, you may include it under 24ff7e0accSmrg# the same distribution terms that you use for the rest of that program. 25ff7e0accSmrg 26ff7e0accSmrg# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>. 27ff7e0accSmrg 28ff7e0accSmrgcase $1 in 29ff7e0accSmrg '') 3005bee9bcSmrg echo "$0: No command. Try '$0 --help' for more information." 1>&2 3105bee9bcSmrg exit 1; 3205bee9bcSmrg ;; 33ff7e0accSmrg -h | --h*) 34ff7e0accSmrg cat <<\EOF 35ff7e0accSmrgUsage: depcomp [--help] [--version] PROGRAM [ARGS] 36ff7e0accSmrg 37ff7e0accSmrgRun PROGRAMS ARGS to compile a file, generating dependencies 38ff7e0accSmrgas side-effects. 39ff7e0accSmrg 40ff7e0accSmrgEnvironment variables: 41ff7e0accSmrg depmode Dependency tracking mode. 4205bee9bcSmrg source Source file read by 'PROGRAMS ARGS'. 4305bee9bcSmrg object Object file output by 'PROGRAMS ARGS'. 44ff7e0accSmrg DEPDIR directory where to store dependencies. 45ff7e0accSmrg depfile Dependency file to output. 4605bee9bcSmrg tmpdepfile Temporary file to use when outputting dependencies. 47ff7e0accSmrg libtool Whether libtool is used (yes/no). 48ff7e0accSmrg 49ff7e0accSmrgReport bugs to <bug-automake@gnu.org>. 50ff7e0accSmrgEOF 51ff7e0accSmrg exit $? 52ff7e0accSmrg ;; 53ff7e0accSmrg -v | --v*) 54ff7e0accSmrg echo "depcomp $scriptversion" 55ff7e0accSmrg exit $? 56ff7e0accSmrg ;; 57ff7e0accSmrgesac 58ff7e0accSmrg 5905bee9bcSmrg# Get the directory component of the given path, and save it in the 6005bee9bcSmrg# global variables '$dir'. Note that this directory component will 6105bee9bcSmrg# be either empty or ending with a '/' character. This is deliberate. 6205bee9bcSmrgset_dir_from () 6305bee9bcSmrg{ 6405bee9bcSmrg case $1 in 6505bee9bcSmrg */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;; 6605bee9bcSmrg *) dir=;; 6705bee9bcSmrg esac 6805bee9bcSmrg} 6905bee9bcSmrg 7005bee9bcSmrg# Get the suffix-stripped basename of the given path, and save it the 7105bee9bcSmrg# global variable '$base'. 7205bee9bcSmrgset_base_from () 7305bee9bcSmrg{ 7405bee9bcSmrg base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'` 7505bee9bcSmrg} 7605bee9bcSmrg 7705bee9bcSmrg# If no dependency file was actually created by the compiler invocation, 7805bee9bcSmrg# we still have to create a dummy depfile, to avoid errors with the 7905bee9bcSmrg# Makefile "include basename.Plo" scheme. 8005bee9bcSmrgmake_dummy_depfile () 8105bee9bcSmrg{ 8205bee9bcSmrg echo "#dummy" > "$depfile" 8305bee9bcSmrg} 8405bee9bcSmrg 8505bee9bcSmrg# Factor out some common post-processing of the generated depfile. 8605bee9bcSmrg# Requires the auxiliary global variable '$tmpdepfile' to be set. 8705bee9bcSmrgaix_post_process_depfile () 8805bee9bcSmrg{ 8905bee9bcSmrg # If the compiler actually managed to produce a dependency file, 9005bee9bcSmrg # post-process it. 9105bee9bcSmrg if test -f "$tmpdepfile"; then 9205bee9bcSmrg # Each line is of the form 'foo.o: dependency.h'. 9305bee9bcSmrg # Do two passes, one to just change these to 9405bee9bcSmrg # $object: dependency.h 9505bee9bcSmrg # and one to simply output 9605bee9bcSmrg # dependency.h: 9705bee9bcSmrg # which is needed to avoid the deleted-header problem. 9805bee9bcSmrg { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile" 9905bee9bcSmrg sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile" 10005bee9bcSmrg } > "$depfile" 10105bee9bcSmrg rm -f "$tmpdepfile" 10205bee9bcSmrg else 10305bee9bcSmrg make_dummy_depfile 10405bee9bcSmrg fi 10505bee9bcSmrg} 10605bee9bcSmrg 10705bee9bcSmrg# A tabulation character. 10805bee9bcSmrgtab=' ' 10905bee9bcSmrg# A newline character. 11005bee9bcSmrgnl=' 11105bee9bcSmrg' 11205bee9bcSmrg# Character ranges might be problematic outside the C locale. 11305bee9bcSmrg# These definitions help. 11405bee9bcSmrgupper=ABCDEFGHIJKLMNOPQRSTUVWXYZ 11505bee9bcSmrglower=abcdefghijklmnopqrstuvwxyz 11605bee9bcSmrgdigits=0123456789 11705bee9bcSmrgalpha=${upper}${lower} 11805bee9bcSmrg 119ff7e0accSmrgif test -z "$depmode" || test -z "$source" || test -z "$object"; then 120ff7e0accSmrg echo "depcomp: Variables source, object and depmode must be set" 1>&2 121ff7e0accSmrg exit 1 122ff7e0accSmrgfi 123ff7e0accSmrg 124ff7e0accSmrg# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. 125ff7e0accSmrgdepfile=${depfile-`echo "$object" | 126ff7e0accSmrg sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} 127ff7e0accSmrgtmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} 128ff7e0accSmrg 129ff7e0accSmrgrm -f "$tmpdepfile" 130ff7e0accSmrg 13105bee9bcSmrg# Avoid interferences from the environment. 13205bee9bcSmrggccflag= dashmflag= 13305bee9bcSmrg 134ff7e0accSmrg# Some modes work just like other modes, but use different flags. We 135ff7e0accSmrg# parameterize here, but still list the modes in the big case below, 136ff7e0accSmrg# to make depend.m4 easier to write. Note that we *cannot* use a case 137ff7e0accSmrg# here, because this file can only contain one case statement. 138ff7e0accSmrgif test "$depmode" = hp; then 139ff7e0accSmrg # HP compiler uses -M and no extra arg. 140ff7e0accSmrg gccflag=-M 141ff7e0accSmrg depmode=gcc 142ff7e0accSmrgfi 143ff7e0accSmrg 144ff7e0accSmrgif test "$depmode" = dashXmstdout; then 14505bee9bcSmrg # This is just like dashmstdout with a different argument. 14605bee9bcSmrg dashmflag=-xM 14705bee9bcSmrg depmode=dashmstdout 148ff7e0accSmrgfi 149ff7e0accSmrg 15010998002Smrgcygpath_u="cygpath -u -f -" 15110998002Smrgif test "$depmode" = msvcmsys; then 15205bee9bcSmrg # This is just like msvisualcpp but w/o cygpath translation. 15305bee9bcSmrg # Just convert the backslash-escaped backslashes to single forward 15405bee9bcSmrg # slashes to satisfy depend.m4 15505bee9bcSmrg cygpath_u='sed s,\\\\,/,g' 15605bee9bcSmrg depmode=msvisualcpp 15705bee9bcSmrgfi 15805bee9bcSmrg 15905bee9bcSmrgif test "$depmode" = msvc7msys; then 16005bee9bcSmrg # This is just like msvc7 but w/o cygpath translation. 16105bee9bcSmrg # Just convert the backslash-escaped backslashes to single forward 16205bee9bcSmrg # slashes to satisfy depend.m4 16305bee9bcSmrg cygpath_u='sed s,\\\\,/,g' 16405bee9bcSmrg depmode=msvc7 16505bee9bcSmrgfi 16605bee9bcSmrg 16705bee9bcSmrgif test "$depmode" = xlc; then 16805bee9bcSmrg # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information. 16905bee9bcSmrg gccflag=-qmakedep=gcc,-MF 17005bee9bcSmrg depmode=gcc 17110998002Smrgfi 17210998002Smrg 173ff7e0accSmrgcase "$depmode" in 174ff7e0accSmrggcc3) 175ff7e0accSmrg## gcc 3 implements dependency tracking that does exactly what 176ff7e0accSmrg## we want. Yay! Note: for some reason libtool 1.4 doesn't like 177ff7e0accSmrg## it if -MD -MP comes after the -MF stuff. Hmm. 178ff7e0accSmrg## Unfortunately, FreeBSD c89 acceptance of flags depends upon 179ff7e0accSmrg## the command line argument order; so add the flags where they 180ff7e0accSmrg## appear in depend2.am. Note that the slowdown incurred here 181ff7e0accSmrg## affects only configure: in makefiles, %FASTDEP% shortcuts this. 182ff7e0accSmrg for arg 183ff7e0accSmrg do 184ff7e0accSmrg case $arg in 185ff7e0accSmrg -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; 186ff7e0accSmrg *) set fnord "$@" "$arg" ;; 187ff7e0accSmrg esac 188ff7e0accSmrg shift # fnord 189ff7e0accSmrg shift # $arg 190ff7e0accSmrg done 191ff7e0accSmrg "$@" 192ff7e0accSmrg stat=$? 19305bee9bcSmrg if test $stat -ne 0; then 194ff7e0accSmrg rm -f "$tmpdepfile" 195ff7e0accSmrg exit $stat 196ff7e0accSmrg fi 197ff7e0accSmrg mv "$tmpdepfile" "$depfile" 198ff7e0accSmrg ;; 199ff7e0accSmrg 200ff7e0accSmrggcc) 20105bee9bcSmrg## Note that this doesn't just cater to obsosete pre-3.x GCC compilers. 20205bee9bcSmrg## but also to in-use compilers like IMB xlc/xlC and the HP C compiler. 20305bee9bcSmrg## (see the conditional assignment to $gccflag above). 204ff7e0accSmrg## There are various ways to get dependency output from gcc. Here's 205ff7e0accSmrg## why we pick this rather obscure method: 206ff7e0accSmrg## - Don't want to use -MD because we'd like the dependencies to end 207ff7e0accSmrg## up in a subdir. Having to rename by hand is ugly. 208ff7e0accSmrg## (We might end up doing this anyway to support other compilers.) 209ff7e0accSmrg## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like 21005bee9bcSmrg## -MM, not -M (despite what the docs say). Also, it might not be 21105bee9bcSmrg## supported by the other compilers which use the 'gcc' depmode. 212ff7e0accSmrg## - Using -M directly means running the compiler twice (even worse 213ff7e0accSmrg## than renaming). 214ff7e0accSmrg if test -z "$gccflag"; then 215ff7e0accSmrg gccflag=-MD, 216ff7e0accSmrg fi 217ff7e0accSmrg "$@" -Wp,"$gccflag$tmpdepfile" 218ff7e0accSmrg stat=$? 21905bee9bcSmrg if test $stat -ne 0; then 220ff7e0accSmrg rm -f "$tmpdepfile" 221ff7e0accSmrg exit $stat 222ff7e0accSmrg fi 223ff7e0accSmrg rm -f "$depfile" 224ff7e0accSmrg echo "$object : \\" > "$depfile" 22505bee9bcSmrg # The second -e expression handles DOS-style file names with drive 22605bee9bcSmrg # letters. 227ff7e0accSmrg sed -e 's/^[^:]*: / /' \ 228ff7e0accSmrg -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" 22905bee9bcSmrg## This next piece of magic avoids the "deleted header file" problem. 230ff7e0accSmrg## The problem is that when a header file which appears in a .P file 231ff7e0accSmrg## is deleted, the dependency causes make to die (because there is 232ff7e0accSmrg## typically no way to rebuild the header). We avoid this by adding 233ff7e0accSmrg## dummy dependencies for each header file. Too bad gcc doesn't do 234ff7e0accSmrg## this for us directly. 23505bee9bcSmrg## Some versions of gcc put a space before the ':'. On the theory 236ff7e0accSmrg## that the space means something, we add a space to the output as 23705bee9bcSmrg## well. hp depmode also adds that space, but also prefixes the VPATH 23805bee9bcSmrg## to the object. Take care to not repeat it in the output. 239ff7e0accSmrg## Some versions of the HPUX 10.20 sed can't process this invocation 240ff7e0accSmrg## correctly. Breaking it into two sed invocations is a workaround. 24105bee9bcSmrg tr ' ' "$nl" < "$tmpdepfile" \ 24205bee9bcSmrg | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ 24305bee9bcSmrg | sed -e 's/$/ :/' >> "$depfile" 244ff7e0accSmrg rm -f "$tmpdepfile" 245ff7e0accSmrg ;; 246ff7e0accSmrg 247ff7e0accSmrghp) 248ff7e0accSmrg # This case exists only to let depend.m4 do its work. It works by 249ff7e0accSmrg # looking at the text of this script. This case will never be run, 250ff7e0accSmrg # since it is checked for above. 251ff7e0accSmrg exit 1 252ff7e0accSmrg ;; 253ff7e0accSmrg 254ff7e0accSmrgsgi) 255ff7e0accSmrg if test "$libtool" = yes; then 256ff7e0accSmrg "$@" "-Wp,-MDupdate,$tmpdepfile" 257ff7e0accSmrg else 258ff7e0accSmrg "$@" -MDupdate "$tmpdepfile" 259ff7e0accSmrg fi 260ff7e0accSmrg stat=$? 26105bee9bcSmrg if test $stat -ne 0; then 262ff7e0accSmrg rm -f "$tmpdepfile" 263ff7e0accSmrg exit $stat 264ff7e0accSmrg fi 265ff7e0accSmrg rm -f "$depfile" 266ff7e0accSmrg 267ff7e0accSmrg if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files 268ff7e0accSmrg echo "$object : \\" > "$depfile" 269ff7e0accSmrg # Clip off the initial element (the dependent). Don't try to be 270ff7e0accSmrg # clever and replace this with sed code, as IRIX sed won't handle 271ff7e0accSmrg # lines with more than a fixed number of characters (4096 in 272ff7e0accSmrg # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; 27305bee9bcSmrg # the IRIX cc adds comments like '#:fec' to the end of the 274ff7e0accSmrg # dependency line. 27505bee9bcSmrg tr ' ' "$nl" < "$tmpdepfile" \ 27605bee9bcSmrg | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \ 27705bee9bcSmrg | tr "$nl" ' ' >> "$depfile" 27810998002Smrg echo >> "$depfile" 279ff7e0accSmrg # The second pass generates a dummy entry for each header file. 28005bee9bcSmrg tr ' ' "$nl" < "$tmpdepfile" \ 28105bee9bcSmrg | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ 28205bee9bcSmrg >> "$depfile" 283ff7e0accSmrg else 28405bee9bcSmrg make_dummy_depfile 285ff7e0accSmrg fi 286ff7e0accSmrg rm -f "$tmpdepfile" 287ff7e0accSmrg ;; 288ff7e0accSmrg 28905bee9bcSmrgxlc) 29005bee9bcSmrg # This case exists only to let depend.m4 do its work. It works by 29105bee9bcSmrg # looking at the text of this script. This case will never be run, 29205bee9bcSmrg # since it is checked for above. 29305bee9bcSmrg exit 1 29405bee9bcSmrg ;; 29505bee9bcSmrg 296ff7e0accSmrgaix) 297ff7e0accSmrg # The C for AIX Compiler uses -M and outputs the dependencies 298ff7e0accSmrg # in a .u file. In older versions, this file always lives in the 29905bee9bcSmrg # current directory. Also, the AIX compiler puts '$object:' at the 300ff7e0accSmrg # start of each line; $object doesn't have directory information. 301ff7e0accSmrg # Version 6 uses the directory in both cases. 30205bee9bcSmrg set_dir_from "$object" 30305bee9bcSmrg set_base_from "$object" 304ff7e0accSmrg if test "$libtool" = yes; then 305a005d216Smrg tmpdepfile1=$dir$base.u 306a005d216Smrg tmpdepfile2=$base.u 307a005d216Smrg tmpdepfile3=$dir.libs/$base.u 308ff7e0accSmrg "$@" -Wc,-M 309ff7e0accSmrg else 310a005d216Smrg tmpdepfile1=$dir$base.u 311a005d216Smrg tmpdepfile2=$dir$base.u 312a005d216Smrg tmpdepfile3=$dir$base.u 313ff7e0accSmrg "$@" -M 314ff7e0accSmrg fi 315ff7e0accSmrg stat=$? 31605bee9bcSmrg if test $stat -ne 0; then 317a005d216Smrg rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 318ff7e0accSmrg exit $stat 319ff7e0accSmrg fi 320ff7e0accSmrg 321a005d216Smrg for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 322a005d216Smrg do 323a005d216Smrg test -f "$tmpdepfile" && break 324a005d216Smrg done 32505bee9bcSmrg aix_post_process_depfile 32605bee9bcSmrg ;; 32705bee9bcSmrg 32805bee9bcSmrgtcc) 32905bee9bcSmrg # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26 33005bee9bcSmrg # FIXME: That version still under development at the moment of writing. 33105bee9bcSmrg # Make that this statement remains true also for stable, released 33205bee9bcSmrg # versions. 33305bee9bcSmrg # It will wrap lines (doesn't matter whether long or short) with a 33405bee9bcSmrg # trailing '\', as in: 33505bee9bcSmrg # 33605bee9bcSmrg # foo.o : \ 33705bee9bcSmrg # foo.c \ 33805bee9bcSmrg # foo.h \ 33905bee9bcSmrg # 34005bee9bcSmrg # It will put a trailing '\' even on the last line, and will use leading 34105bee9bcSmrg # spaces rather than leading tabs (at least since its commit 0394caf7 34205bee9bcSmrg # "Emit spaces for -MD"). 34305bee9bcSmrg "$@" -MD -MF "$tmpdepfile" 34405bee9bcSmrg stat=$? 34505bee9bcSmrg if test $stat -ne 0; then 34605bee9bcSmrg rm -f "$tmpdepfile" 34705bee9bcSmrg exit $stat 348ff7e0accSmrg fi 34905bee9bcSmrg rm -f "$depfile" 35005bee9bcSmrg # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'. 35105bee9bcSmrg # We have to change lines of the first kind to '$object: \'. 35205bee9bcSmrg sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile" 35305bee9bcSmrg # And for each line of the second kind, we have to emit a 'dep.h:' 35405bee9bcSmrg # dummy dependency, to avoid the deleted-header problem. 35505bee9bcSmrg sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile" 356ff7e0accSmrg rm -f "$tmpdepfile" 357ff7e0accSmrg ;; 358ff7e0accSmrg 35905bee9bcSmrg## The order of this option in the case statement is important, since the 36005bee9bcSmrg## shell code in configure will try each of these formats in the order 36105bee9bcSmrg## listed in this file. A plain '-MD' option would be understood by many 36205bee9bcSmrg## compilers, so we must ensure this comes after the gcc and icc options. 36305bee9bcSmrgpgcc) 36405bee9bcSmrg # Portland's C compiler understands '-MD'. 36505bee9bcSmrg # Will always output deps to 'file.d' where file is the root name of the 36605bee9bcSmrg # source file under compilation, even if file resides in a subdirectory. 36705bee9bcSmrg # The object file name does not affect the name of the '.d' file. 36805bee9bcSmrg # pgcc 10.2 will output 369ff7e0accSmrg # foo.o: sub/foo.c sub/foo.h 37005bee9bcSmrg # and will wrap long lines using '\' : 371ff7e0accSmrg # foo.o: sub/foo.c ... \ 372ff7e0accSmrg # sub/foo.h ... \ 373ff7e0accSmrg # ... 37405bee9bcSmrg set_dir_from "$object" 37505bee9bcSmrg # Use the source, not the object, to determine the base name, since 37605bee9bcSmrg # that's sadly what pgcc will do too. 37705bee9bcSmrg set_base_from "$source" 37805bee9bcSmrg tmpdepfile=$base.d 37905bee9bcSmrg 38005bee9bcSmrg # For projects that build the same source file twice into different object 38105bee9bcSmrg # files, the pgcc approach of using the *source* file root name can cause 38205bee9bcSmrg # problems in parallel builds. Use a locking strategy to avoid stomping on 38305bee9bcSmrg # the same $tmpdepfile. 38405bee9bcSmrg lockdir=$base.d-lock 38505bee9bcSmrg trap " 38605bee9bcSmrg echo '$0: caught signal, cleaning up...' >&2 38705bee9bcSmrg rmdir '$lockdir' 38805bee9bcSmrg exit 1 38905bee9bcSmrg " 1 2 13 15 39005bee9bcSmrg numtries=100 39105bee9bcSmrg i=$numtries 39205bee9bcSmrg while test $i -gt 0; do 39305bee9bcSmrg # mkdir is a portable test-and-set. 39405bee9bcSmrg if mkdir "$lockdir" 2>/dev/null; then 39505bee9bcSmrg # This process acquired the lock. 39605bee9bcSmrg "$@" -MD 39705bee9bcSmrg stat=$? 39805bee9bcSmrg # Release the lock. 39905bee9bcSmrg rmdir "$lockdir" 40005bee9bcSmrg break 40105bee9bcSmrg else 40205bee9bcSmrg # If the lock is being held by a different process, wait 40305bee9bcSmrg # until the winning process is done or we timeout. 40405bee9bcSmrg while test -d "$lockdir" && test $i -gt 0; do 40505bee9bcSmrg sleep 1 40605bee9bcSmrg i=`expr $i - 1` 40705bee9bcSmrg done 40805bee9bcSmrg fi 40905bee9bcSmrg i=`expr $i - 1` 41005bee9bcSmrg done 41105bee9bcSmrg trap - 1 2 13 15 41205bee9bcSmrg if test $i -le 0; then 41305bee9bcSmrg echo "$0: failed to acquire lock after $numtries attempts" >&2 41405bee9bcSmrg echo "$0: check lockdir '$lockdir'" >&2 41505bee9bcSmrg exit 1 41605bee9bcSmrg fi 417ff7e0accSmrg 41805bee9bcSmrg if test $stat -ne 0; then 419ff7e0accSmrg rm -f "$tmpdepfile" 420ff7e0accSmrg exit $stat 421ff7e0accSmrg fi 422ff7e0accSmrg rm -f "$depfile" 423ff7e0accSmrg # Each line is of the form `foo.o: dependent.h', 424ff7e0accSmrg # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. 425ff7e0accSmrg # Do two passes, one to just change these to 426ff7e0accSmrg # `$object: dependent.h' and one to simply `dependent.h:'. 427ff7e0accSmrg sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" 428ff7e0accSmrg # Some versions of the HPUX 10.20 sed can't process this invocation 429ff7e0accSmrg # correctly. Breaking it into two sed invocations is a workaround. 43005bee9bcSmrg sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \ 43105bee9bcSmrg | sed -e 's/$/ :/' >> "$depfile" 432ff7e0accSmrg rm -f "$tmpdepfile" 433ff7e0accSmrg ;; 434ff7e0accSmrg 435ff7e0accSmrghp2) 436ff7e0accSmrg # The "hp" stanza above does not work with aCC (C++) and HP's ia64 437ff7e0accSmrg # compilers, which have integrated preprocessors. The correct option 438ff7e0accSmrg # to use with these is +Maked; it writes dependencies to a file named 439ff7e0accSmrg # 'foo.d', which lands next to the object file, wherever that 440ff7e0accSmrg # happens to be. 441ff7e0accSmrg # Much of this is similar to the tru64 case; see comments there. 44205bee9bcSmrg set_dir_from "$object" 44305bee9bcSmrg set_base_from "$object" 444ff7e0accSmrg if test "$libtool" = yes; then 445ff7e0accSmrg tmpdepfile1=$dir$base.d 446ff7e0accSmrg tmpdepfile2=$dir.libs/$base.d 447ff7e0accSmrg "$@" -Wc,+Maked 448ff7e0accSmrg else 449ff7e0accSmrg tmpdepfile1=$dir$base.d 450ff7e0accSmrg tmpdepfile2=$dir$base.d 451ff7e0accSmrg "$@" +Maked 452ff7e0accSmrg fi 453ff7e0accSmrg stat=$? 45405bee9bcSmrg if test $stat -ne 0; then 455ff7e0accSmrg rm -f "$tmpdepfile1" "$tmpdepfile2" 456ff7e0accSmrg exit $stat 457ff7e0accSmrg fi 458ff7e0accSmrg 459ff7e0accSmrg for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" 460ff7e0accSmrg do 461ff7e0accSmrg test -f "$tmpdepfile" && break 462ff7e0accSmrg done 463ff7e0accSmrg if test -f "$tmpdepfile"; then 46405bee9bcSmrg sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile" 46505bee9bcSmrg # Add 'dependent.h:' lines. 46610998002Smrg sed -ne '2,${ 46705bee9bcSmrg s/^ *// 46805bee9bcSmrg s/ \\*$// 46905bee9bcSmrg s/$/:/ 47005bee9bcSmrg p 47105bee9bcSmrg }' "$tmpdepfile" >> "$depfile" 472ff7e0accSmrg else 47305bee9bcSmrg make_dummy_depfile 474ff7e0accSmrg fi 475ff7e0accSmrg rm -f "$tmpdepfile" "$tmpdepfile2" 476ff7e0accSmrg ;; 477ff7e0accSmrg 478ff7e0accSmrgtru64) 47905bee9bcSmrg # The Tru64 compiler uses -MD to generate dependencies as a side 48005bee9bcSmrg # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. 48105bee9bcSmrg # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put 48205bee9bcSmrg # dependencies in 'foo.d' instead, so we check for that too. 48305bee9bcSmrg # Subdirectories are respected. 48405bee9bcSmrg set_dir_from "$object" 48505bee9bcSmrg set_base_from "$object" 48605bee9bcSmrg 48705bee9bcSmrg if test "$libtool" = yes; then 48805bee9bcSmrg # Libtool generates 2 separate objects for the 2 libraries. These 48905bee9bcSmrg # two compilations output dependencies in $dir.libs/$base.o.d and 49005bee9bcSmrg # in $dir$base.o.d. We have to check for both files, because 49105bee9bcSmrg # one of the two compilations can be disabled. We should prefer 49205bee9bcSmrg # $dir$base.o.d over $dir.libs/$base.o.d because the latter is 49305bee9bcSmrg # automatically cleaned when .libs/ is deleted, while ignoring 49405bee9bcSmrg # the former would cause a distcleancheck panic. 49505bee9bcSmrg tmpdepfile1=$dir$base.o.d # libtool 1.5 49605bee9bcSmrg tmpdepfile2=$dir.libs/$base.o.d # Likewise. 49705bee9bcSmrg tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504 49805bee9bcSmrg "$@" -Wc,-MD 49905bee9bcSmrg else 50005bee9bcSmrg tmpdepfile1=$dir$base.d 50105bee9bcSmrg tmpdepfile2=$dir$base.d 50205bee9bcSmrg tmpdepfile3=$dir$base.d 50305bee9bcSmrg "$@" -MD 50405bee9bcSmrg fi 50505bee9bcSmrg 50605bee9bcSmrg stat=$? 50705bee9bcSmrg if test $stat -ne 0; then 50805bee9bcSmrg rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 50905bee9bcSmrg exit $stat 51005bee9bcSmrg fi 51105bee9bcSmrg 51205bee9bcSmrg for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 51305bee9bcSmrg do 51405bee9bcSmrg test -f "$tmpdepfile" && break 51505bee9bcSmrg done 51605bee9bcSmrg # Same post-processing that is required for AIX mode. 51705bee9bcSmrg aix_post_process_depfile 51805bee9bcSmrg ;; 51905bee9bcSmrg 52005bee9bcSmrgmsvc7) 52105bee9bcSmrg if test "$libtool" = yes; then 52205bee9bcSmrg showIncludes=-Wc,-showIncludes 52305bee9bcSmrg else 52405bee9bcSmrg showIncludes=-showIncludes 52505bee9bcSmrg fi 52605bee9bcSmrg "$@" $showIncludes > "$tmpdepfile" 52705bee9bcSmrg stat=$? 52805bee9bcSmrg grep -v '^Note: including file: ' "$tmpdepfile" 52905bee9bcSmrg if test $stat -ne 0; then 53005bee9bcSmrg rm -f "$tmpdepfile" 53105bee9bcSmrg exit $stat 53205bee9bcSmrg fi 53305bee9bcSmrg rm -f "$depfile" 53405bee9bcSmrg echo "$object : \\" > "$depfile" 53505bee9bcSmrg # The first sed program below extracts the file names and escapes 53605bee9bcSmrg # backslashes for cygpath. The second sed program outputs the file 53705bee9bcSmrg # name when reading, but also accumulates all include files in the 53805bee9bcSmrg # hold buffer in order to output them again at the end. This only 53905bee9bcSmrg # works with sed implementations that can handle large buffers. 54005bee9bcSmrg sed < "$tmpdepfile" -n ' 54105bee9bcSmrg/^Note: including file: *\(.*\)/ { 54205bee9bcSmrg s//\1/ 54305bee9bcSmrg s/\\/\\\\/g 54405bee9bcSmrg p 54505bee9bcSmrg}' | $cygpath_u | sort -u | sed -n ' 54605bee9bcSmrgs/ /\\ /g 54705bee9bcSmrgs/\(.*\)/'"$tab"'\1 \\/p 54805bee9bcSmrgs/.\(.*\) \\/\1:/ 54905bee9bcSmrgH 55005bee9bcSmrg$ { 55105bee9bcSmrg s/.*/'"$tab"'/ 55205bee9bcSmrg G 55305bee9bcSmrg p 55405bee9bcSmrg}' >> "$depfile" 5550c91c449Smrg echo >> "$depfile" # make sure the fragment doesn't end with a backslash 55605bee9bcSmrg rm -f "$tmpdepfile" 55705bee9bcSmrg ;; 55805bee9bcSmrg 55905bee9bcSmrgmsvc7msys) 56005bee9bcSmrg # This case exists only to let depend.m4 do its work. It works by 56105bee9bcSmrg # looking at the text of this script. This case will never be run, 56205bee9bcSmrg # since it is checked for above. 56305bee9bcSmrg exit 1 56405bee9bcSmrg ;; 565ff7e0accSmrg 566ff7e0accSmrg#nosideeffect) 567ff7e0accSmrg # This comment above is used by automake to tell side-effect 568ff7e0accSmrg # dependency tracking mechanisms from slower ones. 569ff7e0accSmrg 570ff7e0accSmrgdashmstdout) 571ff7e0accSmrg # Important note: in order to support this mode, a compiler *must* 572ff7e0accSmrg # always write the preprocessed file to stdout, regardless of -o. 573ff7e0accSmrg "$@" || exit $? 574ff7e0accSmrg 575ff7e0accSmrg # Remove the call to Libtool. 576ff7e0accSmrg if test "$libtool" = yes; then 57710998002Smrg while test "X$1" != 'X--mode=compile'; do 578ff7e0accSmrg shift 579ff7e0accSmrg done 580ff7e0accSmrg shift 581ff7e0accSmrg fi 582ff7e0accSmrg 58305bee9bcSmrg # Remove '-o $object'. 584ff7e0accSmrg IFS=" " 585ff7e0accSmrg for arg 586ff7e0accSmrg do 587ff7e0accSmrg case $arg in 588ff7e0accSmrg -o) 589ff7e0accSmrg shift 590ff7e0accSmrg ;; 591ff7e0accSmrg $object) 592ff7e0accSmrg shift 593ff7e0accSmrg ;; 594ff7e0accSmrg *) 595ff7e0accSmrg set fnord "$@" "$arg" 596ff7e0accSmrg shift # fnord 597ff7e0accSmrg shift # $arg 598ff7e0accSmrg ;; 599ff7e0accSmrg esac 600ff7e0accSmrg done 601ff7e0accSmrg 602ff7e0accSmrg test -z "$dashmflag" && dashmflag=-M 60305bee9bcSmrg # Require at least two characters before searching for ':' 604ff7e0accSmrg # in the target name. This is to cope with DOS-style filenames: 60505bee9bcSmrg # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. 606ff7e0accSmrg "$@" $dashmflag | 60705bee9bcSmrg sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile" 608ff7e0accSmrg rm -f "$depfile" 609ff7e0accSmrg cat < "$tmpdepfile" > "$depfile" 61005bee9bcSmrg # Some versions of the HPUX 10.20 sed can't process this sed invocation 61105bee9bcSmrg # correctly. Breaking it into two sed invocations is a workaround. 61205bee9bcSmrg tr ' ' "$nl" < "$tmpdepfile" \ 61305bee9bcSmrg | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ 61405bee9bcSmrg | sed -e 's/$/ :/' >> "$depfile" 615ff7e0accSmrg rm -f "$tmpdepfile" 616ff7e0accSmrg ;; 617ff7e0accSmrg 618ff7e0accSmrgdashXmstdout) 619ff7e0accSmrg # This case only exists to satisfy depend.m4. It is never actually 620ff7e0accSmrg # run, as this mode is specially recognized in the preamble. 621ff7e0accSmrg exit 1 622ff7e0accSmrg ;; 623ff7e0accSmrg 624ff7e0accSmrgmakedepend) 625ff7e0accSmrg "$@" || exit $? 626ff7e0accSmrg # Remove any Libtool call 627ff7e0accSmrg if test "$libtool" = yes; then 62810998002Smrg while test "X$1" != 'X--mode=compile'; do 629ff7e0accSmrg shift 630ff7e0accSmrg done 631ff7e0accSmrg shift 632ff7e0accSmrg fi 633ff7e0accSmrg # X makedepend 634ff7e0accSmrg shift 63510998002Smrg cleared=no eat=no 63610998002Smrg for arg 63710998002Smrg do 638ff7e0accSmrg case $cleared in 639ff7e0accSmrg no) 640ff7e0accSmrg set ""; shift 641ff7e0accSmrg cleared=yes ;; 642ff7e0accSmrg esac 64310998002Smrg if test $eat = yes; then 64410998002Smrg eat=no 64510998002Smrg continue 64610998002Smrg fi 647ff7e0accSmrg case "$arg" in 648ff7e0accSmrg -D*|-I*) 649ff7e0accSmrg set fnord "$@" "$arg"; shift ;; 650ff7e0accSmrg # Strip any option that makedepend may not understand. Remove 651ff7e0accSmrg # the object too, otherwise makedepend will parse it as a source file. 65210998002Smrg -arch) 65310998002Smrg eat=yes ;; 654ff7e0accSmrg -*|$object) 655ff7e0accSmrg ;; 656ff7e0accSmrg *) 657ff7e0accSmrg set fnord "$@" "$arg"; shift ;; 658ff7e0accSmrg esac 659ff7e0accSmrg done 66010998002Smrg obj_suffix=`echo "$object" | sed 's/^.*\././'` 661ff7e0accSmrg touch "$tmpdepfile" 662ff7e0accSmrg ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" 663ff7e0accSmrg rm -f "$depfile" 66405bee9bcSmrg # makedepend may prepend the VPATH from the source file name to the object. 66505bee9bcSmrg # No need to regex-escape $object, excess matching of '.' is harmless. 66605bee9bcSmrg sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" 66705bee9bcSmrg # Some versions of the HPUX 10.20 sed can't process the last invocation 66805bee9bcSmrg # correctly. Breaking it into two sed invocations is a workaround. 66905bee9bcSmrg sed '1,2d' "$tmpdepfile" \ 67005bee9bcSmrg | tr ' ' "$nl" \ 67105bee9bcSmrg | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ 67205bee9bcSmrg | sed -e 's/$/ :/' >> "$depfile" 673ff7e0accSmrg rm -f "$tmpdepfile" "$tmpdepfile".bak 674ff7e0accSmrg ;; 675ff7e0accSmrg 676ff7e0accSmrgcpp) 677ff7e0accSmrg # Important note: in order to support this mode, a compiler *must* 678ff7e0accSmrg # always write the preprocessed file to stdout. 679ff7e0accSmrg "$@" || exit $? 680ff7e0accSmrg 681ff7e0accSmrg # Remove the call to Libtool. 682ff7e0accSmrg if test "$libtool" = yes; then 68310998002Smrg while test "X$1" != 'X--mode=compile'; do 684ff7e0accSmrg shift 685ff7e0accSmrg done 686ff7e0accSmrg shift 687ff7e0accSmrg fi 688ff7e0accSmrg 68905bee9bcSmrg # Remove '-o $object'. 690ff7e0accSmrg IFS=" " 691ff7e0accSmrg for arg 692ff7e0accSmrg do 693ff7e0accSmrg case $arg in 694ff7e0accSmrg -o) 695ff7e0accSmrg shift 696ff7e0accSmrg ;; 697ff7e0accSmrg $object) 698ff7e0accSmrg shift 699ff7e0accSmrg ;; 700ff7e0accSmrg *) 701ff7e0accSmrg set fnord "$@" "$arg" 702ff7e0accSmrg shift # fnord 703ff7e0accSmrg shift # $arg 704ff7e0accSmrg ;; 705ff7e0accSmrg esac 706ff7e0accSmrg done 707ff7e0accSmrg 70805bee9bcSmrg "$@" -E \ 70905bee9bcSmrg | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ 71005bee9bcSmrg -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ 71105bee9bcSmrg | sed '$ s: \\$::' > "$tmpdepfile" 712ff7e0accSmrg rm -f "$depfile" 713ff7e0accSmrg echo "$object : \\" > "$depfile" 714ff7e0accSmrg cat < "$tmpdepfile" >> "$depfile" 715ff7e0accSmrg sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" 716ff7e0accSmrg rm -f "$tmpdepfile" 717ff7e0accSmrg ;; 718ff7e0accSmrg 719ff7e0accSmrgmsvisualcpp) 720ff7e0accSmrg # Important note: in order to support this mode, a compiler *must* 72110998002Smrg # always write the preprocessed file to stdout. 722ff7e0accSmrg "$@" || exit $? 72310998002Smrg 72410998002Smrg # Remove the call to Libtool. 72510998002Smrg if test "$libtool" = yes; then 72610998002Smrg while test "X$1" != 'X--mode=compile'; do 72710998002Smrg shift 72810998002Smrg done 72910998002Smrg shift 73010998002Smrg fi 73110998002Smrg 732ff7e0accSmrg IFS=" " 733ff7e0accSmrg for arg 734ff7e0accSmrg do 735ff7e0accSmrg case "$arg" in 73610998002Smrg -o) 73710998002Smrg shift 73810998002Smrg ;; 73910998002Smrg $object) 74010998002Smrg shift 74110998002Smrg ;; 742ff7e0accSmrg "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") 74305bee9bcSmrg set fnord "$@" 74405bee9bcSmrg shift 74505bee9bcSmrg shift 74605bee9bcSmrg ;; 747ff7e0accSmrg *) 74805bee9bcSmrg set fnord "$@" "$arg" 74905bee9bcSmrg shift 75005bee9bcSmrg shift 75105bee9bcSmrg ;; 752ff7e0accSmrg esac 753ff7e0accSmrg done 75410998002Smrg "$@" -E 2>/dev/null | 75510998002Smrg sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" 756ff7e0accSmrg rm -f "$depfile" 757ff7e0accSmrg echo "$object : \\" > "$depfile" 75805bee9bcSmrg sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" 75905bee9bcSmrg echo "$tab" >> "$depfile" 76010998002Smrg sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" 761ff7e0accSmrg rm -f "$tmpdepfile" 762ff7e0accSmrg ;; 763ff7e0accSmrg 76410998002Smrgmsvcmsys) 76510998002Smrg # This case exists only to let depend.m4 do its work. It works by 76610998002Smrg # looking at the text of this script. This case will never be run, 76710998002Smrg # since it is checked for above. 76810998002Smrg exit 1 76910998002Smrg ;; 77010998002Smrg 771ff7e0accSmrgnone) 772ff7e0accSmrg exec "$@" 773ff7e0accSmrg ;; 774ff7e0accSmrg 775ff7e0accSmrg*) 776ff7e0accSmrg echo "Unknown depmode $depmode" 1>&2 777ff7e0accSmrg exit 1 778ff7e0accSmrg ;; 779ff7e0accSmrgesac 780ff7e0accSmrg 781ff7e0accSmrgexit 0 782ff7e0accSmrg 783ff7e0accSmrg# Local Variables: 784ff7e0accSmrg# mode: shell-script 785ff7e0accSmrg# sh-indentation: 2 7862163f7f8Smrg# eval: (add-hook 'before-save-hook 'time-stamp) 787ff7e0accSmrg# time-stamp-start: "scriptversion=" 788ff7e0accSmrg# time-stamp-format: "%:y-%02m-%02d.%02H" 7892163f7f8Smrg# time-stamp-time-zone: "UTC0" 79010998002Smrg# time-stamp-end: "; # UTC" 791ff7e0accSmrg# End: 792