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