11e00de39Smrg#! /bin/sh 21e00de39Smrg# depcomp - compile a program generating dependencies as side-effects 31e00de39Smrg 4d67195daSmrgscriptversion=2018-03-07.03; # UTC 51e00de39Smrg 6d67195daSmrg# Copyright (C) 1999-2021 Free Software Foundation, Inc. 71e00de39Smrg 81e00de39Smrg# This program is free software; you can redistribute it and/or modify 91e00de39Smrg# it under the terms of the GNU General Public License as published by 101e00de39Smrg# the Free Software Foundation; either version 2, or (at your option) 111e00de39Smrg# any later version. 121e00de39Smrg 131e00de39Smrg# This program is distributed in the hope that it will be useful, 141e00de39Smrg# but WITHOUT ANY WARRANTY; without even the implied warranty of 151e00de39Smrg# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 161e00de39Smrg# GNU General Public License for more details. 171e00de39Smrg 181e00de39Smrg# You should have received a copy of the GNU General Public License 19d67195daSmrg# along with this program. If not, see <https://www.gnu.org/licenses/>. 201e00de39Smrg 211e00de39Smrg# As a special exception to the GNU General Public License, if you 221e00de39Smrg# distribute this file as part of a program that contains a 231e00de39Smrg# configuration script generated by Autoconf, you may include it under 241e00de39Smrg# the same distribution terms that you use for the rest of that program. 251e00de39Smrg 261e00de39Smrg# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>. 271e00de39Smrg 281e00de39Smrgcase $1 in 291e00de39Smrg '') 30b6f5cd12Smrg echo "$0: No command. Try '$0 --help' for more information." 1>&2 31b6f5cd12Smrg exit 1; 32b6f5cd12Smrg ;; 331e00de39Smrg -h | --h*) 341e00de39Smrg cat <<\EOF 351e00de39SmrgUsage: depcomp [--help] [--version] PROGRAM [ARGS] 361e00de39Smrg 371e00de39SmrgRun PROGRAMS ARGS to compile a file, generating dependencies 381e00de39Smrgas side-effects. 391e00de39Smrg 401e00de39SmrgEnvironment variables: 411e00de39Smrg depmode Dependency tracking mode. 42b6f5cd12Smrg source Source file read by 'PROGRAMS ARGS'. 43b6f5cd12Smrg object Object file output by 'PROGRAMS ARGS'. 441e00de39Smrg DEPDIR directory where to store dependencies. 451e00de39Smrg depfile Dependency file to output. 46b6f5cd12Smrg tmpdepfile Temporary file to use when outputting dependencies. 471e00de39Smrg libtool Whether libtool is used (yes/no). 481e00de39Smrg 491e00de39SmrgReport bugs to <bug-automake@gnu.org>. 501e00de39SmrgEOF 511e00de39Smrg exit $? 521e00de39Smrg ;; 531e00de39Smrg -v | --v*) 541e00de39Smrg echo "depcomp $scriptversion" 551e00de39Smrg exit $? 561e00de39Smrg ;; 571e00de39Smrgesac 581e00de39Smrg 59b6f5cd12Smrg# Get the directory component of the given path, and save it in the 60b6f5cd12Smrg# global variables '$dir'. Note that this directory component will 61b6f5cd12Smrg# be either empty or ending with a '/' character. This is deliberate. 62b6f5cd12Smrgset_dir_from () 63b6f5cd12Smrg{ 64b6f5cd12Smrg case $1 in 65b6f5cd12Smrg */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;; 66b6f5cd12Smrg *) dir=;; 67b6f5cd12Smrg esac 68b6f5cd12Smrg} 69b6f5cd12Smrg 70b6f5cd12Smrg# Get the suffix-stripped basename of the given path, and save it the 71b6f5cd12Smrg# global variable '$base'. 72b6f5cd12Smrgset_base_from () 73b6f5cd12Smrg{ 74b6f5cd12Smrg base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'` 75b6f5cd12Smrg} 76b6f5cd12Smrg 77b6f5cd12Smrg# If no dependency file was actually created by the compiler invocation, 78b6f5cd12Smrg# we still have to create a dummy depfile, to avoid errors with the 79b6f5cd12Smrg# Makefile "include basename.Plo" scheme. 80b6f5cd12Smrgmake_dummy_depfile () 81b6f5cd12Smrg{ 82b6f5cd12Smrg echo "#dummy" > "$depfile" 83b6f5cd12Smrg} 84b6f5cd12Smrg 85b6f5cd12Smrg# Factor out some common post-processing of the generated depfile. 86b6f5cd12Smrg# Requires the auxiliary global variable '$tmpdepfile' to be set. 87b6f5cd12Smrgaix_post_process_depfile () 88b6f5cd12Smrg{ 89b6f5cd12Smrg # If the compiler actually managed to produce a dependency file, 90b6f5cd12Smrg # post-process it. 91b6f5cd12Smrg if test -f "$tmpdepfile"; then 92b6f5cd12Smrg # Each line is of the form 'foo.o: dependency.h'. 93b6f5cd12Smrg # Do two passes, one to just change these to 94b6f5cd12Smrg # $object: dependency.h 95b6f5cd12Smrg # and one to simply output 96b6f5cd12Smrg # dependency.h: 97b6f5cd12Smrg # which is needed to avoid the deleted-header problem. 98b6f5cd12Smrg { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile" 99b6f5cd12Smrg sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile" 100b6f5cd12Smrg } > "$depfile" 101b6f5cd12Smrg rm -f "$tmpdepfile" 102b6f5cd12Smrg else 103b6f5cd12Smrg make_dummy_depfile 104b6f5cd12Smrg fi 105b6f5cd12Smrg} 106b6f5cd12Smrg 107b6f5cd12Smrg# A tabulation character. 108b6f5cd12Smrgtab=' ' 109b6f5cd12Smrg# A newline character. 110b6f5cd12Smrgnl=' 111b6f5cd12Smrg' 112b6f5cd12Smrg# Character ranges might be problematic outside the C locale. 113b6f5cd12Smrg# These definitions help. 114b6f5cd12Smrgupper=ABCDEFGHIJKLMNOPQRSTUVWXYZ 115b6f5cd12Smrglower=abcdefghijklmnopqrstuvwxyz 116b6f5cd12Smrgdigits=0123456789 117b6f5cd12Smrgalpha=${upper}${lower} 118b6f5cd12Smrg 1191e00de39Smrgif test -z "$depmode" || test -z "$source" || test -z "$object"; then 1201e00de39Smrg echo "depcomp: Variables source, object and depmode must be set" 1>&2 1211e00de39Smrg exit 1 1221e00de39Smrgfi 1231e00de39Smrg 1241e00de39Smrg# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. 1251e00de39Smrgdepfile=${depfile-`echo "$object" | 1261e00de39Smrg sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} 1271e00de39Smrgtmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} 1281e00de39Smrg 1291e00de39Smrgrm -f "$tmpdepfile" 1301e00de39Smrg 131b6f5cd12Smrg# Avoid interferences from the environment. 132b6f5cd12Smrggccflag= dashmflag= 133b6f5cd12Smrg 1341e00de39Smrg# Some modes work just like other modes, but use different flags. We 1351e00de39Smrg# parameterize here, but still list the modes in the big case below, 1361e00de39Smrg# to make depend.m4 easier to write. Note that we *cannot* use a case 1371e00de39Smrg# here, because this file can only contain one case statement. 1381e00de39Smrgif test "$depmode" = hp; then 1391e00de39Smrg # HP compiler uses -M and no extra arg. 1401e00de39Smrg gccflag=-M 1411e00de39Smrg depmode=gcc 1421e00de39Smrgfi 1431e00de39Smrg 1441e00de39Smrgif test "$depmode" = dashXmstdout; then 145b6f5cd12Smrg # This is just like dashmstdout with a different argument. 146b6f5cd12Smrg dashmflag=-xM 147b6f5cd12Smrg depmode=dashmstdout 1481e00de39Smrgfi 1491e00de39Smrg 15021ecb1efSmrgcygpath_u="cygpath -u -f -" 15121ecb1efSmrgif test "$depmode" = msvcmsys; then 152b6f5cd12Smrg # This is just like msvisualcpp but w/o cygpath translation. 153b6f5cd12Smrg # Just convert the backslash-escaped backslashes to single forward 154b6f5cd12Smrg # slashes to satisfy depend.m4 155b6f5cd12Smrg cygpath_u='sed s,\\\\,/,g' 156b6f5cd12Smrg depmode=msvisualcpp 157b6f5cd12Smrgfi 158b6f5cd12Smrg 159b6f5cd12Smrgif test "$depmode" = msvc7msys; then 160b6f5cd12Smrg # This is just like msvc7 but w/o cygpath translation. 161b6f5cd12Smrg # Just convert the backslash-escaped backslashes to single forward 162b6f5cd12Smrg # slashes to satisfy depend.m4 163b6f5cd12Smrg cygpath_u='sed s,\\\\,/,g' 164b6f5cd12Smrg depmode=msvc7 165b6f5cd12Smrgfi 166b6f5cd12Smrg 167b6f5cd12Smrgif test "$depmode" = xlc; then 168b6f5cd12Smrg # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information. 169b6f5cd12Smrg gccflag=-qmakedep=gcc,-MF 170b6f5cd12Smrg depmode=gcc 17121ecb1efSmrgfi 17221ecb1efSmrg 1731e00de39Smrgcase "$depmode" in 1741e00de39Smrggcc3) 1751e00de39Smrg## gcc 3 implements dependency tracking that does exactly what 1761e00de39Smrg## we want. Yay! Note: for some reason libtool 1.4 doesn't like 1771e00de39Smrg## it if -MD -MP comes after the -MF stuff. Hmm. 1781e00de39Smrg## Unfortunately, FreeBSD c89 acceptance of flags depends upon 1791e00de39Smrg## the command line argument order; so add the flags where they 1801e00de39Smrg## appear in depend2.am. Note that the slowdown incurred here 1811e00de39Smrg## affects only configure: in makefiles, %FASTDEP% shortcuts this. 1821e00de39Smrg for arg 1831e00de39Smrg do 1841e00de39Smrg case $arg in 1851e00de39Smrg -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; 1861e00de39Smrg *) set fnord "$@" "$arg" ;; 1871e00de39Smrg esac 1881e00de39Smrg shift # fnord 1891e00de39Smrg shift # $arg 1901e00de39Smrg done 1911e00de39Smrg "$@" 1921e00de39Smrg stat=$? 193b6f5cd12Smrg if test $stat -ne 0; then 1941e00de39Smrg rm -f "$tmpdepfile" 1951e00de39Smrg exit $stat 1961e00de39Smrg fi 1971e00de39Smrg mv "$tmpdepfile" "$depfile" 1981e00de39Smrg ;; 1991e00de39Smrg 2001e00de39Smrggcc) 201b6f5cd12Smrg## Note that this doesn't just cater to obsosete pre-3.x GCC compilers. 202b6f5cd12Smrg## but also to in-use compilers like IMB xlc/xlC and the HP C compiler. 203b6f5cd12Smrg## (see the conditional assignment to $gccflag above). 2041e00de39Smrg## There are various ways to get dependency output from gcc. Here's 2051e00de39Smrg## why we pick this rather obscure method: 2061e00de39Smrg## - Don't want to use -MD because we'd like the dependencies to end 2071e00de39Smrg## up in a subdir. Having to rename by hand is ugly. 2081e00de39Smrg## (We might end up doing this anyway to support other compilers.) 2091e00de39Smrg## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like 210b6f5cd12Smrg## -MM, not -M (despite what the docs say). Also, it might not be 211b6f5cd12Smrg## supported by the other compilers which use the 'gcc' depmode. 2121e00de39Smrg## - Using -M directly means running the compiler twice (even worse 2131e00de39Smrg## than renaming). 2141e00de39Smrg if test -z "$gccflag"; then 2151e00de39Smrg gccflag=-MD, 2161e00de39Smrg fi 2171e00de39Smrg "$@" -Wp,"$gccflag$tmpdepfile" 2181e00de39Smrg stat=$? 219b6f5cd12Smrg if test $stat -ne 0; then 2201e00de39Smrg rm -f "$tmpdepfile" 2211e00de39Smrg exit $stat 2221e00de39Smrg fi 2231e00de39Smrg rm -f "$depfile" 2241e00de39Smrg echo "$object : \\" > "$depfile" 225b6f5cd12Smrg # The second -e expression handles DOS-style file names with drive 226b6f5cd12Smrg # letters. 2271e00de39Smrg sed -e 's/^[^:]*: / /' \ 2281e00de39Smrg -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" 229b6f5cd12Smrg## This next piece of magic avoids the "deleted header file" problem. 2301e00de39Smrg## The problem is that when a header file which appears in a .P file 2311e00de39Smrg## is deleted, the dependency causes make to die (because there is 2321e00de39Smrg## typically no way to rebuild the header). We avoid this by adding 2331e00de39Smrg## dummy dependencies for each header file. Too bad gcc doesn't do 2341e00de39Smrg## this for us directly. 235b6f5cd12Smrg## Some versions of gcc put a space before the ':'. On the theory 2361e00de39Smrg## that the space means something, we add a space to the output as 237b6f5cd12Smrg## well. hp depmode also adds that space, but also prefixes the VPATH 238b6f5cd12Smrg## to the object. Take care to not repeat it in the output. 2391e00de39Smrg## Some versions of the HPUX 10.20 sed can't process this invocation 2401e00de39Smrg## correctly. Breaking it into two sed invocations is a workaround. 241b6f5cd12Smrg tr ' ' "$nl" < "$tmpdepfile" \ 242b6f5cd12Smrg | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ 243b6f5cd12Smrg | sed -e 's/$/ :/' >> "$depfile" 2441e00de39Smrg rm -f "$tmpdepfile" 2451e00de39Smrg ;; 2461e00de39Smrg 2471e00de39Smrghp) 2481e00de39Smrg # This case exists only to let depend.m4 do its work. It works by 2491e00de39Smrg # looking at the text of this script. This case will never be run, 2501e00de39Smrg # since it is checked for above. 2511e00de39Smrg exit 1 2521e00de39Smrg ;; 2531e00de39Smrg 2541e00de39Smrgsgi) 2551e00de39Smrg if test "$libtool" = yes; then 2561e00de39Smrg "$@" "-Wp,-MDupdate,$tmpdepfile" 2571e00de39Smrg else 2581e00de39Smrg "$@" -MDupdate "$tmpdepfile" 2591e00de39Smrg fi 2601e00de39Smrg stat=$? 261b6f5cd12Smrg if test $stat -ne 0; then 2621e00de39Smrg rm -f "$tmpdepfile" 2631e00de39Smrg exit $stat 2641e00de39Smrg fi 2651e00de39Smrg rm -f "$depfile" 2661e00de39Smrg 2671e00de39Smrg if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files 2681e00de39Smrg echo "$object : \\" > "$depfile" 2691e00de39Smrg # Clip off the initial element (the dependent). Don't try to be 2701e00de39Smrg # clever and replace this with sed code, as IRIX sed won't handle 2711e00de39Smrg # lines with more than a fixed number of characters (4096 in 2721e00de39Smrg # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; 273b6f5cd12Smrg # the IRIX cc adds comments like '#:fec' to the end of the 2741e00de39Smrg # dependency line. 275b6f5cd12Smrg tr ' ' "$nl" < "$tmpdepfile" \ 276b6f5cd12Smrg | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \ 277b6f5cd12Smrg | tr "$nl" ' ' >> "$depfile" 27821ecb1efSmrg echo >> "$depfile" 2791e00de39Smrg # The second pass generates a dummy entry for each header file. 280b6f5cd12Smrg tr ' ' "$nl" < "$tmpdepfile" \ 281b6f5cd12Smrg | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ 282b6f5cd12Smrg >> "$depfile" 2831e00de39Smrg else 284b6f5cd12Smrg make_dummy_depfile 2851e00de39Smrg fi 2861e00de39Smrg rm -f "$tmpdepfile" 2871e00de39Smrg ;; 2881e00de39Smrg 289b6f5cd12Smrgxlc) 290b6f5cd12Smrg # This case exists only to let depend.m4 do its work. It works by 291b6f5cd12Smrg # looking at the text of this script. This case will never be run, 292b6f5cd12Smrg # since it is checked for above. 293b6f5cd12Smrg exit 1 294b6f5cd12Smrg ;; 295b6f5cd12Smrg 2961e00de39Smrgaix) 2971e00de39Smrg # The C for AIX Compiler uses -M and outputs the dependencies 2981e00de39Smrg # in a .u file. In older versions, this file always lives in the 299b6f5cd12Smrg # current directory. Also, the AIX compiler puts '$object:' at the 3001e00de39Smrg # start of each line; $object doesn't have directory information. 3011e00de39Smrg # Version 6 uses the directory in both cases. 302b6f5cd12Smrg set_dir_from "$object" 303b6f5cd12Smrg set_base_from "$object" 3041e00de39Smrg if test "$libtool" = yes; then 3051e00de39Smrg tmpdepfile1=$dir$base.u 3061e00de39Smrg tmpdepfile2=$base.u 3071e00de39Smrg tmpdepfile3=$dir.libs/$base.u 3081e00de39Smrg "$@" -Wc,-M 3091e00de39Smrg else 3101e00de39Smrg tmpdepfile1=$dir$base.u 3111e00de39Smrg tmpdepfile2=$dir$base.u 3121e00de39Smrg tmpdepfile3=$dir$base.u 3131e00de39Smrg "$@" -M 3141e00de39Smrg fi 3151e00de39Smrg stat=$? 316b6f5cd12Smrg if test $stat -ne 0; then 3171e00de39Smrg rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 3181e00de39Smrg exit $stat 3191e00de39Smrg fi 3201e00de39Smrg 3211e00de39Smrg for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 3221e00de39Smrg do 3231e00de39Smrg test -f "$tmpdepfile" && break 3241e00de39Smrg done 325b6f5cd12Smrg aix_post_process_depfile 326b6f5cd12Smrg ;; 327b6f5cd12Smrg 328b6f5cd12Smrgtcc) 329b6f5cd12Smrg # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26 330b6f5cd12Smrg # FIXME: That version still under development at the moment of writing. 331b6f5cd12Smrg # Make that this statement remains true also for stable, released 332b6f5cd12Smrg # versions. 333b6f5cd12Smrg # It will wrap lines (doesn't matter whether long or short) with a 334b6f5cd12Smrg # trailing '\', as in: 335b6f5cd12Smrg # 336b6f5cd12Smrg # foo.o : \ 337b6f5cd12Smrg # foo.c \ 338b6f5cd12Smrg # foo.h \ 339b6f5cd12Smrg # 340b6f5cd12Smrg # It will put a trailing '\' even on the last line, and will use leading 341b6f5cd12Smrg # spaces rather than leading tabs (at least since its commit 0394caf7 342b6f5cd12Smrg # "Emit spaces for -MD"). 343b6f5cd12Smrg "$@" -MD -MF "$tmpdepfile" 344b6f5cd12Smrg stat=$? 345b6f5cd12Smrg if test $stat -ne 0; then 346b6f5cd12Smrg rm -f "$tmpdepfile" 347b6f5cd12Smrg exit $stat 3481e00de39Smrg fi 349b6f5cd12Smrg rm -f "$depfile" 350b6f5cd12Smrg # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'. 351b6f5cd12Smrg # We have to change lines of the first kind to '$object: \'. 352b6f5cd12Smrg sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile" 353b6f5cd12Smrg # And for each line of the second kind, we have to emit a 'dep.h:' 354b6f5cd12Smrg # dummy dependency, to avoid the deleted-header problem. 355b6f5cd12Smrg sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile" 3561e00de39Smrg rm -f "$tmpdepfile" 3571e00de39Smrg ;; 3581e00de39Smrg 359b6f5cd12Smrg## The order of this option in the case statement is important, since the 360b6f5cd12Smrg## shell code in configure will try each of these formats in the order 361b6f5cd12Smrg## listed in this file. A plain '-MD' option would be understood by many 362b6f5cd12Smrg## compilers, so we must ensure this comes after the gcc and icc options. 363b6f5cd12Smrgpgcc) 364b6f5cd12Smrg # Portland's C compiler understands '-MD'. 365b6f5cd12Smrg # Will always output deps to 'file.d' where file is the root name of the 366b6f5cd12Smrg # source file under compilation, even if file resides in a subdirectory. 367b6f5cd12Smrg # The object file name does not affect the name of the '.d' file. 368b6f5cd12Smrg # pgcc 10.2 will output 3691e00de39Smrg # foo.o: sub/foo.c sub/foo.h 370b6f5cd12Smrg # and will wrap long lines using '\' : 3711e00de39Smrg # foo.o: sub/foo.c ... \ 3721e00de39Smrg # sub/foo.h ... \ 3731e00de39Smrg # ... 374b6f5cd12Smrg set_dir_from "$object" 375b6f5cd12Smrg # Use the source, not the object, to determine the base name, since 376b6f5cd12Smrg # that's sadly what pgcc will do too. 377b6f5cd12Smrg set_base_from "$source" 378b6f5cd12Smrg tmpdepfile=$base.d 379b6f5cd12Smrg 380b6f5cd12Smrg # For projects that build the same source file twice into different object 381b6f5cd12Smrg # files, the pgcc approach of using the *source* file root name can cause 382b6f5cd12Smrg # problems in parallel builds. Use a locking strategy to avoid stomping on 383b6f5cd12Smrg # the same $tmpdepfile. 384b6f5cd12Smrg lockdir=$base.d-lock 385b6f5cd12Smrg trap " 386b6f5cd12Smrg echo '$0: caught signal, cleaning up...' >&2 387b6f5cd12Smrg rmdir '$lockdir' 388b6f5cd12Smrg exit 1 389b6f5cd12Smrg " 1 2 13 15 390b6f5cd12Smrg numtries=100 391b6f5cd12Smrg i=$numtries 392b6f5cd12Smrg while test $i -gt 0; do 393b6f5cd12Smrg # mkdir is a portable test-and-set. 394b6f5cd12Smrg if mkdir "$lockdir" 2>/dev/null; then 395b6f5cd12Smrg # This process acquired the lock. 396b6f5cd12Smrg "$@" -MD 397b6f5cd12Smrg stat=$? 398b6f5cd12Smrg # Release the lock. 399b6f5cd12Smrg rmdir "$lockdir" 400b6f5cd12Smrg break 401b6f5cd12Smrg else 402b6f5cd12Smrg # If the lock is being held by a different process, wait 403b6f5cd12Smrg # until the winning process is done or we timeout. 404b6f5cd12Smrg while test -d "$lockdir" && test $i -gt 0; do 405b6f5cd12Smrg sleep 1 406b6f5cd12Smrg i=`expr $i - 1` 407b6f5cd12Smrg done 408b6f5cd12Smrg fi 409b6f5cd12Smrg i=`expr $i - 1` 410b6f5cd12Smrg done 411b6f5cd12Smrg trap - 1 2 13 15 412b6f5cd12Smrg if test $i -le 0; then 413b6f5cd12Smrg echo "$0: failed to acquire lock after $numtries attempts" >&2 414b6f5cd12Smrg echo "$0: check lockdir '$lockdir'" >&2 415b6f5cd12Smrg exit 1 416b6f5cd12Smrg fi 4171e00de39Smrg 418b6f5cd12Smrg if test $stat -ne 0; then 4191e00de39Smrg rm -f "$tmpdepfile" 4201e00de39Smrg exit $stat 4211e00de39Smrg fi 4221e00de39Smrg rm -f "$depfile" 4231e00de39Smrg # Each line is of the form `foo.o: dependent.h', 4241e00de39Smrg # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. 4251e00de39Smrg # Do two passes, one to just change these to 4261e00de39Smrg # `$object: dependent.h' and one to simply `dependent.h:'. 4271e00de39Smrg sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" 4281e00de39Smrg # Some versions of the HPUX 10.20 sed can't process this invocation 4291e00de39Smrg # correctly. Breaking it into two sed invocations is a workaround. 430b6f5cd12Smrg sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \ 431b6f5cd12Smrg | sed -e 's/$/ :/' >> "$depfile" 4321e00de39Smrg rm -f "$tmpdepfile" 4331e00de39Smrg ;; 4341e00de39Smrg 4351e00de39Smrghp2) 4361e00de39Smrg # The "hp" stanza above does not work with aCC (C++) and HP's ia64 4371e00de39Smrg # compilers, which have integrated preprocessors. The correct option 4381e00de39Smrg # to use with these is +Maked; it writes dependencies to a file named 4391e00de39Smrg # 'foo.d', which lands next to the object file, wherever that 4401e00de39Smrg # happens to be. 4411e00de39Smrg # Much of this is similar to the tru64 case; see comments there. 442b6f5cd12Smrg set_dir_from "$object" 443b6f5cd12Smrg set_base_from "$object" 4441e00de39Smrg if test "$libtool" = yes; then 4451e00de39Smrg tmpdepfile1=$dir$base.d 4461e00de39Smrg tmpdepfile2=$dir.libs/$base.d 4471e00de39Smrg "$@" -Wc,+Maked 4481e00de39Smrg else 4491e00de39Smrg tmpdepfile1=$dir$base.d 4501e00de39Smrg tmpdepfile2=$dir$base.d 4511e00de39Smrg "$@" +Maked 4521e00de39Smrg fi 4531e00de39Smrg stat=$? 454b6f5cd12Smrg if test $stat -ne 0; then 4551e00de39Smrg rm -f "$tmpdepfile1" "$tmpdepfile2" 4561e00de39Smrg exit $stat 4571e00de39Smrg fi 4581e00de39Smrg 4591e00de39Smrg for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" 4601e00de39Smrg do 4611e00de39Smrg test -f "$tmpdepfile" && break 4621e00de39Smrg done 4631e00de39Smrg if test -f "$tmpdepfile"; then 464b6f5cd12Smrg sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile" 465b6f5cd12Smrg # Add 'dependent.h:' lines. 46621ecb1efSmrg sed -ne '2,${ 467b6f5cd12Smrg s/^ *// 468b6f5cd12Smrg s/ \\*$// 469b6f5cd12Smrg s/$/:/ 470b6f5cd12Smrg p 471b6f5cd12Smrg }' "$tmpdepfile" >> "$depfile" 4721e00de39Smrg else 473b6f5cd12Smrg make_dummy_depfile 4741e00de39Smrg fi 4751e00de39Smrg rm -f "$tmpdepfile" "$tmpdepfile2" 4761e00de39Smrg ;; 4771e00de39Smrg 4781e00de39Smrgtru64) 479b6f5cd12Smrg # The Tru64 compiler uses -MD to generate dependencies as a side 480b6f5cd12Smrg # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. 481b6f5cd12Smrg # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put 482b6f5cd12Smrg # dependencies in 'foo.d' instead, so we check for that too. 483b6f5cd12Smrg # Subdirectories are respected. 484b6f5cd12Smrg set_dir_from "$object" 485b6f5cd12Smrg set_base_from "$object" 486b6f5cd12Smrg 487b6f5cd12Smrg if test "$libtool" = yes; then 488b6f5cd12Smrg # Libtool generates 2 separate objects for the 2 libraries. These 489b6f5cd12Smrg # two compilations output dependencies in $dir.libs/$base.o.d and 490b6f5cd12Smrg # in $dir$base.o.d. We have to check for both files, because 491b6f5cd12Smrg # one of the two compilations can be disabled. We should prefer 492b6f5cd12Smrg # $dir$base.o.d over $dir.libs/$base.o.d because the latter is 493b6f5cd12Smrg # automatically cleaned when .libs/ is deleted, while ignoring 494b6f5cd12Smrg # the former would cause a distcleancheck panic. 495b6f5cd12Smrg tmpdepfile1=$dir$base.o.d # libtool 1.5 496b6f5cd12Smrg tmpdepfile2=$dir.libs/$base.o.d # Likewise. 497b6f5cd12Smrg tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504 498b6f5cd12Smrg "$@" -Wc,-MD 499b6f5cd12Smrg else 500b6f5cd12Smrg tmpdepfile1=$dir$base.d 501b6f5cd12Smrg tmpdepfile2=$dir$base.d 502b6f5cd12Smrg tmpdepfile3=$dir$base.d 503b6f5cd12Smrg "$@" -MD 504b6f5cd12Smrg fi 505b6f5cd12Smrg 506b6f5cd12Smrg stat=$? 507b6f5cd12Smrg if test $stat -ne 0; then 508b6f5cd12Smrg rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 509b6f5cd12Smrg exit $stat 510b6f5cd12Smrg fi 511b6f5cd12Smrg 512b6f5cd12Smrg for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 513b6f5cd12Smrg do 514b6f5cd12Smrg test -f "$tmpdepfile" && break 515b6f5cd12Smrg done 516b6f5cd12Smrg # Same post-processing that is required for AIX mode. 517b6f5cd12Smrg aix_post_process_depfile 518b6f5cd12Smrg ;; 519b6f5cd12Smrg 520b6f5cd12Smrgmsvc7) 521b6f5cd12Smrg if test "$libtool" = yes; then 522b6f5cd12Smrg showIncludes=-Wc,-showIncludes 523b6f5cd12Smrg else 524b6f5cd12Smrg showIncludes=-showIncludes 525b6f5cd12Smrg fi 526b6f5cd12Smrg "$@" $showIncludes > "$tmpdepfile" 527b6f5cd12Smrg stat=$? 528b6f5cd12Smrg grep -v '^Note: including file: ' "$tmpdepfile" 529b6f5cd12Smrg if test $stat -ne 0; then 530b6f5cd12Smrg rm -f "$tmpdepfile" 531b6f5cd12Smrg exit $stat 532b6f5cd12Smrg fi 533b6f5cd12Smrg rm -f "$depfile" 534b6f5cd12Smrg echo "$object : \\" > "$depfile" 535b6f5cd12Smrg # The first sed program below extracts the file names and escapes 536b6f5cd12Smrg # backslashes for cygpath. The second sed program outputs the file 537b6f5cd12Smrg # name when reading, but also accumulates all include files in the 538b6f5cd12Smrg # hold buffer in order to output them again at the end. This only 539b6f5cd12Smrg # works with sed implementations that can handle large buffers. 540b6f5cd12Smrg sed < "$tmpdepfile" -n ' 541b6f5cd12Smrg/^Note: including file: *\(.*\)/ { 542b6f5cd12Smrg s//\1/ 543b6f5cd12Smrg s/\\/\\\\/g 544b6f5cd12Smrg p 545b6f5cd12Smrg}' | $cygpath_u | sort -u | sed -n ' 546b6f5cd12Smrgs/ /\\ /g 547b6f5cd12Smrgs/\(.*\)/'"$tab"'\1 \\/p 548b6f5cd12Smrgs/.\(.*\) \\/\1:/ 549b6f5cd12SmrgH 550b6f5cd12Smrg$ { 551b6f5cd12Smrg s/.*/'"$tab"'/ 552b6f5cd12Smrg G 553b6f5cd12Smrg p 554b6f5cd12Smrg}' >> "$depfile" 55579bbd9e8Smrg echo >> "$depfile" # make sure the fragment doesn't end with a backslash 556b6f5cd12Smrg rm -f "$tmpdepfile" 557b6f5cd12Smrg ;; 558b6f5cd12Smrg 559b6f5cd12Smrgmsvc7msys) 560b6f5cd12Smrg # This case exists only to let depend.m4 do its work. It works by 561b6f5cd12Smrg # looking at the text of this script. This case will never be run, 562b6f5cd12Smrg # since it is checked for above. 563b6f5cd12Smrg exit 1 564b6f5cd12Smrg ;; 5651e00de39Smrg 5661e00de39Smrg#nosideeffect) 5671e00de39Smrg # This comment above is used by automake to tell side-effect 5681e00de39Smrg # dependency tracking mechanisms from slower ones. 5691e00de39Smrg 5701e00de39Smrgdashmstdout) 5711e00de39Smrg # Important note: in order to support this mode, a compiler *must* 5721e00de39Smrg # always write the preprocessed file to stdout, regardless of -o. 5731e00de39Smrg "$@" || exit $? 5741e00de39Smrg 5751e00de39Smrg # Remove the call to Libtool. 5761e00de39Smrg if test "$libtool" = yes; then 57721ecb1efSmrg while test "X$1" != 'X--mode=compile'; do 5781e00de39Smrg shift 5791e00de39Smrg done 5801e00de39Smrg shift 5811e00de39Smrg fi 5821e00de39Smrg 583b6f5cd12Smrg # Remove '-o $object'. 5841e00de39Smrg IFS=" " 5851e00de39Smrg for arg 5861e00de39Smrg do 5871e00de39Smrg case $arg in 5881e00de39Smrg -o) 5891e00de39Smrg shift 5901e00de39Smrg ;; 5911e00de39Smrg $object) 5921e00de39Smrg shift 5931e00de39Smrg ;; 5941e00de39Smrg *) 5951e00de39Smrg set fnord "$@" "$arg" 5961e00de39Smrg shift # fnord 5971e00de39Smrg shift # $arg 5981e00de39Smrg ;; 5991e00de39Smrg esac 6001e00de39Smrg done 6011e00de39Smrg 6021e00de39Smrg test -z "$dashmflag" && dashmflag=-M 603b6f5cd12Smrg # Require at least two characters before searching for ':' 6041e00de39Smrg # in the target name. This is to cope with DOS-style filenames: 605b6f5cd12Smrg # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. 6061e00de39Smrg "$@" $dashmflag | 607b6f5cd12Smrg sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile" 6081e00de39Smrg rm -f "$depfile" 6091e00de39Smrg cat < "$tmpdepfile" > "$depfile" 610b6f5cd12Smrg # Some versions of the HPUX 10.20 sed can't process this sed invocation 611b6f5cd12Smrg # correctly. Breaking it into two sed invocations is a workaround. 612b6f5cd12Smrg tr ' ' "$nl" < "$tmpdepfile" \ 613b6f5cd12Smrg | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ 614b6f5cd12Smrg | sed -e 's/$/ :/' >> "$depfile" 6151e00de39Smrg rm -f "$tmpdepfile" 6161e00de39Smrg ;; 6171e00de39Smrg 6181e00de39SmrgdashXmstdout) 6191e00de39Smrg # This case only exists to satisfy depend.m4. It is never actually 6201e00de39Smrg # run, as this mode is specially recognized in the preamble. 6211e00de39Smrg exit 1 6221e00de39Smrg ;; 6231e00de39Smrg 6241e00de39Smrgmakedepend) 6251e00de39Smrg "$@" || exit $? 6261e00de39Smrg # Remove any Libtool call 6271e00de39Smrg if test "$libtool" = yes; then 62821ecb1efSmrg while test "X$1" != 'X--mode=compile'; do 6291e00de39Smrg shift 6301e00de39Smrg done 6311e00de39Smrg shift 6321e00de39Smrg fi 6331e00de39Smrg # X makedepend 6341e00de39Smrg shift 63521ecb1efSmrg cleared=no eat=no 63621ecb1efSmrg for arg 63721ecb1efSmrg do 6381e00de39Smrg case $cleared in 6391e00de39Smrg no) 6401e00de39Smrg set ""; shift 6411e00de39Smrg cleared=yes ;; 6421e00de39Smrg esac 64321ecb1efSmrg if test $eat = yes; then 64421ecb1efSmrg eat=no 64521ecb1efSmrg continue 64621ecb1efSmrg fi 6471e00de39Smrg case "$arg" in 6481e00de39Smrg -D*|-I*) 6491e00de39Smrg set fnord "$@" "$arg"; shift ;; 6501e00de39Smrg # Strip any option that makedepend may not understand. Remove 6511e00de39Smrg # the object too, otherwise makedepend will parse it as a source file. 65221ecb1efSmrg -arch) 65321ecb1efSmrg eat=yes ;; 6541e00de39Smrg -*|$object) 6551e00de39Smrg ;; 6561e00de39Smrg *) 6571e00de39Smrg set fnord "$@" "$arg"; shift ;; 6581e00de39Smrg esac 6591e00de39Smrg done 66021ecb1efSmrg obj_suffix=`echo "$object" | sed 's/^.*\././'` 6611e00de39Smrg touch "$tmpdepfile" 6621e00de39Smrg ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" 6631e00de39Smrg rm -f "$depfile" 664b6f5cd12Smrg # makedepend may prepend the VPATH from the source file name to the object. 665b6f5cd12Smrg # No need to regex-escape $object, excess matching of '.' is harmless. 666b6f5cd12Smrg sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" 667b6f5cd12Smrg # Some versions of the HPUX 10.20 sed can't process the last invocation 668b6f5cd12Smrg # correctly. Breaking it into two sed invocations is a workaround. 669b6f5cd12Smrg sed '1,2d' "$tmpdepfile" \ 670b6f5cd12Smrg | tr ' ' "$nl" \ 671b6f5cd12Smrg | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ 672b6f5cd12Smrg | sed -e 's/$/ :/' >> "$depfile" 6731e00de39Smrg rm -f "$tmpdepfile" "$tmpdepfile".bak 6741e00de39Smrg ;; 6751e00de39Smrg 6761e00de39Smrgcpp) 6771e00de39Smrg # Important note: in order to support this mode, a compiler *must* 6781e00de39Smrg # always write the preprocessed file to stdout. 6791e00de39Smrg "$@" || exit $? 6801e00de39Smrg 6811e00de39Smrg # Remove the call to Libtool. 6821e00de39Smrg if test "$libtool" = yes; then 68321ecb1efSmrg while test "X$1" != 'X--mode=compile'; do 6841e00de39Smrg shift 6851e00de39Smrg done 6861e00de39Smrg shift 6871e00de39Smrg fi 6881e00de39Smrg 689b6f5cd12Smrg # Remove '-o $object'. 6901e00de39Smrg IFS=" " 6911e00de39Smrg for arg 6921e00de39Smrg do 6931e00de39Smrg case $arg in 6941e00de39Smrg -o) 6951e00de39Smrg shift 6961e00de39Smrg ;; 6971e00de39Smrg $object) 6981e00de39Smrg shift 6991e00de39Smrg ;; 7001e00de39Smrg *) 7011e00de39Smrg set fnord "$@" "$arg" 7021e00de39Smrg shift # fnord 7031e00de39Smrg shift # $arg 7041e00de39Smrg ;; 7051e00de39Smrg esac 7061e00de39Smrg done 7071e00de39Smrg 708b6f5cd12Smrg "$@" -E \ 709b6f5cd12Smrg | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ 710b6f5cd12Smrg -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ 711b6f5cd12Smrg | sed '$ s: \\$::' > "$tmpdepfile" 7121e00de39Smrg rm -f "$depfile" 7131e00de39Smrg echo "$object : \\" > "$depfile" 7141e00de39Smrg cat < "$tmpdepfile" >> "$depfile" 7151e00de39Smrg sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" 7161e00de39Smrg rm -f "$tmpdepfile" 7171e00de39Smrg ;; 7181e00de39Smrg 7191e00de39Smrgmsvisualcpp) 7201e00de39Smrg # Important note: in order to support this mode, a compiler *must* 72121ecb1efSmrg # always write the preprocessed file to stdout. 7221e00de39Smrg "$@" || exit $? 72321ecb1efSmrg 72421ecb1efSmrg # Remove the call to Libtool. 72521ecb1efSmrg if test "$libtool" = yes; then 72621ecb1efSmrg while test "X$1" != 'X--mode=compile'; do 72721ecb1efSmrg shift 72821ecb1efSmrg done 72921ecb1efSmrg shift 73021ecb1efSmrg fi 73121ecb1efSmrg 7321e00de39Smrg IFS=" " 7331e00de39Smrg for arg 7341e00de39Smrg do 7351e00de39Smrg case "$arg" in 73621ecb1efSmrg -o) 73721ecb1efSmrg shift 73821ecb1efSmrg ;; 73921ecb1efSmrg $object) 74021ecb1efSmrg shift 74121ecb1efSmrg ;; 7421e00de39Smrg "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") 743b6f5cd12Smrg set fnord "$@" 744b6f5cd12Smrg shift 745b6f5cd12Smrg shift 746b6f5cd12Smrg ;; 7471e00de39Smrg *) 748b6f5cd12Smrg set fnord "$@" "$arg" 749b6f5cd12Smrg shift 750b6f5cd12Smrg shift 751b6f5cd12Smrg ;; 7521e00de39Smrg esac 7531e00de39Smrg done 75421ecb1efSmrg "$@" -E 2>/dev/null | 75521ecb1efSmrg sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" 7561e00de39Smrg rm -f "$depfile" 7571e00de39Smrg echo "$object : \\" > "$depfile" 758b6f5cd12Smrg sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" 759b6f5cd12Smrg echo "$tab" >> "$depfile" 76021ecb1efSmrg sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" 7611e00de39Smrg rm -f "$tmpdepfile" 7621e00de39Smrg ;; 7631e00de39Smrg 76421ecb1efSmrgmsvcmsys) 76521ecb1efSmrg # This case exists only to let depend.m4 do its work. It works by 76621ecb1efSmrg # looking at the text of this script. This case will never be run, 76721ecb1efSmrg # since it is checked for above. 76821ecb1efSmrg exit 1 76921ecb1efSmrg ;; 77021ecb1efSmrg 7711e00de39Smrgnone) 7721e00de39Smrg exec "$@" 7731e00de39Smrg ;; 7741e00de39Smrg 7751e00de39Smrg*) 7761e00de39Smrg echo "Unknown depmode $depmode" 1>&2 7771e00de39Smrg exit 1 7781e00de39Smrg ;; 7791e00de39Smrgesac 7801e00de39Smrg 7811e00de39Smrgexit 0 7821e00de39Smrg 7831e00de39Smrg# Local Variables: 7841e00de39Smrg# mode: shell-script 7851e00de39Smrg# sh-indentation: 2 786d67195daSmrg# eval: (add-hook 'before-save-hook 'time-stamp) 7871e00de39Smrg# time-stamp-start: "scriptversion=" 7881e00de39Smrg# time-stamp-format: "%:y-%02m-%02d.%02H" 789d67195daSmrg# time-stamp-time-zone: "UTC0" 79021ecb1efSmrg# time-stamp-end: "; # UTC" 7911e00de39Smrg# End: 792