1e07dc26bSmrg#! /bin/sh 2e07dc26bSmrg# depcomp - compile a program generating dependencies as side-effects 3e07dc26bSmrg 4636c353eSmrgscriptversion=2018-03-07.03; # UTC 5e07dc26bSmrg 6636c353eSmrg# Copyright (C) 1999-2021 Free Software Foundation, Inc. 7e07dc26bSmrg 8e07dc26bSmrg# This program is free software; you can redistribute it and/or modify 9e07dc26bSmrg# it under the terms of the GNU General Public License as published by 10e07dc26bSmrg# the Free Software Foundation; either version 2, or (at your option) 11e07dc26bSmrg# any later version. 12e07dc26bSmrg 13e07dc26bSmrg# This program is distributed in the hope that it will be useful, 14e07dc26bSmrg# but WITHOUT ANY WARRANTY; without even the implied warranty of 15e07dc26bSmrg# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16e07dc26bSmrg# GNU General Public License for more details. 17e07dc26bSmrg 18e07dc26bSmrg# You should have received a copy of the GNU General Public License 19636c353eSmrg# along with this program. If not, see <https://www.gnu.org/licenses/>. 20e07dc26bSmrg 21e07dc26bSmrg# As a special exception to the GNU General Public License, if you 22e07dc26bSmrg# distribute this file as part of a program that contains a 23e07dc26bSmrg# configuration script generated by Autoconf, you may include it under 24e07dc26bSmrg# the same distribution terms that you use for the rest of that program. 25e07dc26bSmrg 26e07dc26bSmrg# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>. 27e07dc26bSmrg 28e07dc26bSmrgcase $1 in 29e07dc26bSmrg '') 30e07dc26bSmrg echo "$0: No command. Try '$0 --help' for more information." 1>&2 31e07dc26bSmrg exit 1; 32e07dc26bSmrg ;; 33e07dc26bSmrg -h | --h*) 34e07dc26bSmrg cat <<\EOF 35e07dc26bSmrgUsage: depcomp [--help] [--version] PROGRAM [ARGS] 36e07dc26bSmrg 37e07dc26bSmrgRun PROGRAMS ARGS to compile a file, generating dependencies 38e07dc26bSmrgas side-effects. 39e07dc26bSmrg 40e07dc26bSmrgEnvironment variables: 41e07dc26bSmrg depmode Dependency tracking mode. 42e07dc26bSmrg source Source file read by 'PROGRAMS ARGS'. 43e07dc26bSmrg object Object file output by 'PROGRAMS ARGS'. 44e07dc26bSmrg DEPDIR directory where to store dependencies. 45e07dc26bSmrg depfile Dependency file to output. 46e07dc26bSmrg tmpdepfile Temporary file to use when outputting dependencies. 47e07dc26bSmrg libtool Whether libtool is used (yes/no). 48e07dc26bSmrg 49e07dc26bSmrgReport bugs to <bug-automake@gnu.org>. 50e07dc26bSmrgEOF 51e07dc26bSmrg exit $? 52e07dc26bSmrg ;; 53e07dc26bSmrg -v | --v*) 54e07dc26bSmrg echo "depcomp $scriptversion" 55e07dc26bSmrg exit $? 56e07dc26bSmrg ;; 57e07dc26bSmrgesac 58e07dc26bSmrg 59e07dc26bSmrg# Get the directory component of the given path, and save it in the 60e07dc26bSmrg# global variables '$dir'. Note that this directory component will 61e07dc26bSmrg# be either empty or ending with a '/' character. This is deliberate. 62e07dc26bSmrgset_dir_from () 63e07dc26bSmrg{ 64e07dc26bSmrg case $1 in 65e07dc26bSmrg */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;; 66e07dc26bSmrg *) dir=;; 67e07dc26bSmrg esac 68e07dc26bSmrg} 69e07dc26bSmrg 70e07dc26bSmrg# Get the suffix-stripped basename of the given path, and save it the 71e07dc26bSmrg# global variable '$base'. 72e07dc26bSmrgset_base_from () 73e07dc26bSmrg{ 74e07dc26bSmrg base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'` 75e07dc26bSmrg} 76e07dc26bSmrg 77e07dc26bSmrg# If no dependency file was actually created by the compiler invocation, 78e07dc26bSmrg# we still have to create a dummy depfile, to avoid errors with the 79e07dc26bSmrg# Makefile "include basename.Plo" scheme. 80e07dc26bSmrgmake_dummy_depfile () 81e07dc26bSmrg{ 82e07dc26bSmrg echo "#dummy" > "$depfile" 83e07dc26bSmrg} 84e07dc26bSmrg 85e07dc26bSmrg# Factor out some common post-processing of the generated depfile. 86e07dc26bSmrg# Requires the auxiliary global variable '$tmpdepfile' to be set. 87e07dc26bSmrgaix_post_process_depfile () 88e07dc26bSmrg{ 89e07dc26bSmrg # If the compiler actually managed to produce a dependency file, 90e07dc26bSmrg # post-process it. 91e07dc26bSmrg if test -f "$tmpdepfile"; then 92e07dc26bSmrg # Each line is of the form 'foo.o: dependency.h'. 93e07dc26bSmrg # Do two passes, one to just change these to 94e07dc26bSmrg # $object: dependency.h 95e07dc26bSmrg # and one to simply output 96e07dc26bSmrg # dependency.h: 97e07dc26bSmrg # which is needed to avoid the deleted-header problem. 98e07dc26bSmrg { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile" 99e07dc26bSmrg sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile" 100e07dc26bSmrg } > "$depfile" 101e07dc26bSmrg rm -f "$tmpdepfile" 102e07dc26bSmrg else 103e07dc26bSmrg make_dummy_depfile 104e07dc26bSmrg fi 105e07dc26bSmrg} 106e07dc26bSmrg 107e07dc26bSmrg# A tabulation character. 108e07dc26bSmrgtab=' ' 109e07dc26bSmrg# A newline character. 110e07dc26bSmrgnl=' 111e07dc26bSmrg' 112e07dc26bSmrg# Character ranges might be problematic outside the C locale. 113e07dc26bSmrg# These definitions help. 114e07dc26bSmrgupper=ABCDEFGHIJKLMNOPQRSTUVWXYZ 115e07dc26bSmrglower=abcdefghijklmnopqrstuvwxyz 116e07dc26bSmrgdigits=0123456789 117e07dc26bSmrgalpha=${upper}${lower} 118e07dc26bSmrg 119e07dc26bSmrgif test -z "$depmode" || test -z "$source" || test -z "$object"; then 120e07dc26bSmrg echo "depcomp: Variables source, object and depmode must be set" 1>&2 121e07dc26bSmrg exit 1 122e07dc26bSmrgfi 123e07dc26bSmrg 124e07dc26bSmrg# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. 125e07dc26bSmrgdepfile=${depfile-`echo "$object" | 126e07dc26bSmrg sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} 127e07dc26bSmrgtmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} 128e07dc26bSmrg 129e07dc26bSmrgrm -f "$tmpdepfile" 130e07dc26bSmrg 131e07dc26bSmrg# Avoid interferences from the environment. 132e07dc26bSmrggccflag= dashmflag= 133e07dc26bSmrg 134e07dc26bSmrg# Some modes work just like other modes, but use different flags. We 135e07dc26bSmrg# parameterize here, but still list the modes in the big case below, 136e07dc26bSmrg# to make depend.m4 easier to write. Note that we *cannot* use a case 137e07dc26bSmrg# here, because this file can only contain one case statement. 138e07dc26bSmrgif test "$depmode" = hp; then 139e07dc26bSmrg # HP compiler uses -M and no extra arg. 140e07dc26bSmrg gccflag=-M 141e07dc26bSmrg depmode=gcc 142e07dc26bSmrgfi 143e07dc26bSmrg 144e07dc26bSmrgif test "$depmode" = dashXmstdout; then 145e07dc26bSmrg # This is just like dashmstdout with a different argument. 146e07dc26bSmrg dashmflag=-xM 147e07dc26bSmrg depmode=dashmstdout 148e07dc26bSmrgfi 149e07dc26bSmrg 150e07dc26bSmrgcygpath_u="cygpath -u -f -" 151e07dc26bSmrgif test "$depmode" = msvcmsys; then 152e07dc26bSmrg # This is just like msvisualcpp but w/o cygpath translation. 153e07dc26bSmrg # Just convert the backslash-escaped backslashes to single forward 154e07dc26bSmrg # slashes to satisfy depend.m4 155e07dc26bSmrg cygpath_u='sed s,\\\\,/,g' 156e07dc26bSmrg depmode=msvisualcpp 157e07dc26bSmrgfi 158e07dc26bSmrg 159e07dc26bSmrgif test "$depmode" = msvc7msys; then 160e07dc26bSmrg # This is just like msvc7 but w/o cygpath translation. 161e07dc26bSmrg # Just convert the backslash-escaped backslashes to single forward 162e07dc26bSmrg # slashes to satisfy depend.m4 163e07dc26bSmrg cygpath_u='sed s,\\\\,/,g' 164e07dc26bSmrg depmode=msvc7 165e07dc26bSmrgfi 166e07dc26bSmrg 167e07dc26bSmrgif test "$depmode" = xlc; then 168e07dc26bSmrg # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information. 169e07dc26bSmrg gccflag=-qmakedep=gcc,-MF 170e07dc26bSmrg depmode=gcc 171e07dc26bSmrgfi 172e07dc26bSmrg 173e07dc26bSmrgcase "$depmode" in 174e07dc26bSmrggcc3) 175e07dc26bSmrg## gcc 3 implements dependency tracking that does exactly what 176e07dc26bSmrg## we want. Yay! Note: for some reason libtool 1.4 doesn't like 177e07dc26bSmrg## it if -MD -MP comes after the -MF stuff. Hmm. 178e07dc26bSmrg## Unfortunately, FreeBSD c89 acceptance of flags depends upon 179e07dc26bSmrg## the command line argument order; so add the flags where they 180e07dc26bSmrg## appear in depend2.am. Note that the slowdown incurred here 181e07dc26bSmrg## affects only configure: in makefiles, %FASTDEP% shortcuts this. 182e07dc26bSmrg for arg 183e07dc26bSmrg do 184e07dc26bSmrg case $arg in 185e07dc26bSmrg -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; 186e07dc26bSmrg *) set fnord "$@" "$arg" ;; 187e07dc26bSmrg esac 188e07dc26bSmrg shift # fnord 189e07dc26bSmrg shift # $arg 190e07dc26bSmrg done 191e07dc26bSmrg "$@" 192e07dc26bSmrg stat=$? 193e07dc26bSmrg if test $stat -ne 0; then 194e07dc26bSmrg rm -f "$tmpdepfile" 195e07dc26bSmrg exit $stat 196e07dc26bSmrg fi 197e07dc26bSmrg mv "$tmpdepfile" "$depfile" 198e07dc26bSmrg ;; 199e07dc26bSmrg 200e07dc26bSmrggcc) 201e07dc26bSmrg## Note that this doesn't just cater to obsosete pre-3.x GCC compilers. 202e07dc26bSmrg## but also to in-use compilers like IMB xlc/xlC and the HP C compiler. 203e07dc26bSmrg## (see the conditional assignment to $gccflag above). 204e07dc26bSmrg## There are various ways to get dependency output from gcc. Here's 205e07dc26bSmrg## why we pick this rather obscure method: 206e07dc26bSmrg## - Don't want to use -MD because we'd like the dependencies to end 207e07dc26bSmrg## up in a subdir. Having to rename by hand is ugly. 208e07dc26bSmrg## (We might end up doing this anyway to support other compilers.) 209e07dc26bSmrg## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like 210e07dc26bSmrg## -MM, not -M (despite what the docs say). Also, it might not be 211e07dc26bSmrg## supported by the other compilers which use the 'gcc' depmode. 212e07dc26bSmrg## - Using -M directly means running the compiler twice (even worse 213e07dc26bSmrg## than renaming). 214e07dc26bSmrg if test -z "$gccflag"; then 215e07dc26bSmrg gccflag=-MD, 216e07dc26bSmrg fi 217e07dc26bSmrg "$@" -Wp,"$gccflag$tmpdepfile" 218e07dc26bSmrg stat=$? 219e07dc26bSmrg if test $stat -ne 0; then 220e07dc26bSmrg rm -f "$tmpdepfile" 221e07dc26bSmrg exit $stat 222e07dc26bSmrg fi 223e07dc26bSmrg rm -f "$depfile" 224e07dc26bSmrg echo "$object : \\" > "$depfile" 225e07dc26bSmrg # The second -e expression handles DOS-style file names with drive 226e07dc26bSmrg # letters. 227e07dc26bSmrg sed -e 's/^[^:]*: / /' \ 228e07dc26bSmrg -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" 229e07dc26bSmrg## This next piece of magic avoids the "deleted header file" problem. 230e07dc26bSmrg## The problem is that when a header file which appears in a .P file 231e07dc26bSmrg## is deleted, the dependency causes make to die (because there is 232e07dc26bSmrg## typically no way to rebuild the header). We avoid this by adding 233e07dc26bSmrg## dummy dependencies for each header file. Too bad gcc doesn't do 234e07dc26bSmrg## this for us directly. 235e07dc26bSmrg## Some versions of gcc put a space before the ':'. On the theory 236e07dc26bSmrg## that the space means something, we add a space to the output as 237e07dc26bSmrg## well. hp depmode also adds that space, but also prefixes the VPATH 238e07dc26bSmrg## to the object. Take care to not repeat it in the output. 239e07dc26bSmrg## Some versions of the HPUX 10.20 sed can't process this invocation 240e07dc26bSmrg## correctly. Breaking it into two sed invocations is a workaround. 241e07dc26bSmrg tr ' ' "$nl" < "$tmpdepfile" \ 242e07dc26bSmrg | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ 243e07dc26bSmrg | sed -e 's/$/ :/' >> "$depfile" 244e07dc26bSmrg rm -f "$tmpdepfile" 245e07dc26bSmrg ;; 246e07dc26bSmrg 247e07dc26bSmrghp) 248e07dc26bSmrg # This case exists only to let depend.m4 do its work. It works by 249e07dc26bSmrg # looking at the text of this script. This case will never be run, 250e07dc26bSmrg # since it is checked for above. 251e07dc26bSmrg exit 1 252e07dc26bSmrg ;; 253e07dc26bSmrg 254e07dc26bSmrgsgi) 255e07dc26bSmrg if test "$libtool" = yes; then 256e07dc26bSmrg "$@" "-Wp,-MDupdate,$tmpdepfile" 257e07dc26bSmrg else 258e07dc26bSmrg "$@" -MDupdate "$tmpdepfile" 259e07dc26bSmrg fi 260e07dc26bSmrg stat=$? 261e07dc26bSmrg if test $stat -ne 0; then 262e07dc26bSmrg rm -f "$tmpdepfile" 263e07dc26bSmrg exit $stat 264e07dc26bSmrg fi 265e07dc26bSmrg rm -f "$depfile" 266e07dc26bSmrg 267e07dc26bSmrg if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files 268e07dc26bSmrg echo "$object : \\" > "$depfile" 269e07dc26bSmrg # Clip off the initial element (the dependent). Don't try to be 270e07dc26bSmrg # clever and replace this with sed code, as IRIX sed won't handle 271e07dc26bSmrg # lines with more than a fixed number of characters (4096 in 272e07dc26bSmrg # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; 273e07dc26bSmrg # the IRIX cc adds comments like '#:fec' to the end of the 274e07dc26bSmrg # dependency line. 275e07dc26bSmrg tr ' ' "$nl" < "$tmpdepfile" \ 276e07dc26bSmrg | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \ 277e07dc26bSmrg | tr "$nl" ' ' >> "$depfile" 278e07dc26bSmrg echo >> "$depfile" 279e07dc26bSmrg # The second pass generates a dummy entry for each header file. 280e07dc26bSmrg tr ' ' "$nl" < "$tmpdepfile" \ 281e07dc26bSmrg | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ 282e07dc26bSmrg >> "$depfile" 283e07dc26bSmrg else 284e07dc26bSmrg make_dummy_depfile 285e07dc26bSmrg fi 286e07dc26bSmrg rm -f "$tmpdepfile" 287e07dc26bSmrg ;; 288e07dc26bSmrg 289e07dc26bSmrgxlc) 290e07dc26bSmrg # This case exists only to let depend.m4 do its work. It works by 291e07dc26bSmrg # looking at the text of this script. This case will never be run, 292e07dc26bSmrg # since it is checked for above. 293e07dc26bSmrg exit 1 294e07dc26bSmrg ;; 295e07dc26bSmrg 296e07dc26bSmrgaix) 297e07dc26bSmrg # The C for AIX Compiler uses -M and outputs the dependencies 298e07dc26bSmrg # in a .u file. In older versions, this file always lives in the 299e07dc26bSmrg # current directory. Also, the AIX compiler puts '$object:' at the 300e07dc26bSmrg # start of each line; $object doesn't have directory information. 301e07dc26bSmrg # Version 6 uses the directory in both cases. 302e07dc26bSmrg set_dir_from "$object" 303e07dc26bSmrg set_base_from "$object" 304e07dc26bSmrg if test "$libtool" = yes; then 305e07dc26bSmrg tmpdepfile1=$dir$base.u 306e07dc26bSmrg tmpdepfile2=$base.u 307e07dc26bSmrg tmpdepfile3=$dir.libs/$base.u 308e07dc26bSmrg "$@" -Wc,-M 309e07dc26bSmrg else 310e07dc26bSmrg tmpdepfile1=$dir$base.u 311e07dc26bSmrg tmpdepfile2=$dir$base.u 312e07dc26bSmrg tmpdepfile3=$dir$base.u 313e07dc26bSmrg "$@" -M 314e07dc26bSmrg fi 315e07dc26bSmrg stat=$? 316e07dc26bSmrg if test $stat -ne 0; then 317e07dc26bSmrg rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 318e07dc26bSmrg exit $stat 319e07dc26bSmrg fi 320e07dc26bSmrg 321e07dc26bSmrg for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 322e07dc26bSmrg do 323e07dc26bSmrg test -f "$tmpdepfile" && break 324e07dc26bSmrg done 325e07dc26bSmrg aix_post_process_depfile 326e07dc26bSmrg ;; 327e07dc26bSmrg 328e07dc26bSmrgtcc) 329e07dc26bSmrg # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26 330e07dc26bSmrg # FIXME: That version still under development at the moment of writing. 331e07dc26bSmrg # Make that this statement remains true also for stable, released 332e07dc26bSmrg # versions. 333e07dc26bSmrg # It will wrap lines (doesn't matter whether long or short) with a 334e07dc26bSmrg # trailing '\', as in: 335e07dc26bSmrg # 336e07dc26bSmrg # foo.o : \ 337e07dc26bSmrg # foo.c \ 338e07dc26bSmrg # foo.h \ 339e07dc26bSmrg # 340e07dc26bSmrg # It will put a trailing '\' even on the last line, and will use leading 341e07dc26bSmrg # spaces rather than leading tabs (at least since its commit 0394caf7 342e07dc26bSmrg # "Emit spaces for -MD"). 343e07dc26bSmrg "$@" -MD -MF "$tmpdepfile" 344e07dc26bSmrg stat=$? 345e07dc26bSmrg if test $stat -ne 0; then 346e07dc26bSmrg rm -f "$tmpdepfile" 347e07dc26bSmrg exit $stat 348e07dc26bSmrg fi 349e07dc26bSmrg rm -f "$depfile" 350e07dc26bSmrg # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'. 351e07dc26bSmrg # We have to change lines of the first kind to '$object: \'. 352e07dc26bSmrg sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile" 353e07dc26bSmrg # And for each line of the second kind, we have to emit a 'dep.h:' 354e07dc26bSmrg # dummy dependency, to avoid the deleted-header problem. 355e07dc26bSmrg sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile" 356e07dc26bSmrg rm -f "$tmpdepfile" 357e07dc26bSmrg ;; 358e07dc26bSmrg 359e07dc26bSmrg## The order of this option in the case statement is important, since the 360e07dc26bSmrg## shell code in configure will try each of these formats in the order 361e07dc26bSmrg## listed in this file. A plain '-MD' option would be understood by many 362e07dc26bSmrg## compilers, so we must ensure this comes after the gcc and icc options. 363e07dc26bSmrgpgcc) 364e07dc26bSmrg # Portland's C compiler understands '-MD'. 365e07dc26bSmrg # Will always output deps to 'file.d' where file is the root name of the 366e07dc26bSmrg # source file under compilation, even if file resides in a subdirectory. 367e07dc26bSmrg # The object file name does not affect the name of the '.d' file. 368e07dc26bSmrg # pgcc 10.2 will output 369e07dc26bSmrg # foo.o: sub/foo.c sub/foo.h 370e07dc26bSmrg # and will wrap long lines using '\' : 371e07dc26bSmrg # foo.o: sub/foo.c ... \ 372e07dc26bSmrg # sub/foo.h ... \ 373e07dc26bSmrg # ... 374e07dc26bSmrg set_dir_from "$object" 375e07dc26bSmrg # Use the source, not the object, to determine the base name, since 376e07dc26bSmrg # that's sadly what pgcc will do too. 377e07dc26bSmrg set_base_from "$source" 378e07dc26bSmrg tmpdepfile=$base.d 379e07dc26bSmrg 380e07dc26bSmrg # For projects that build the same source file twice into different object 381e07dc26bSmrg # files, the pgcc approach of using the *source* file root name can cause 382e07dc26bSmrg # problems in parallel builds. Use a locking strategy to avoid stomping on 383e07dc26bSmrg # the same $tmpdepfile. 384e07dc26bSmrg lockdir=$base.d-lock 385e07dc26bSmrg trap " 386e07dc26bSmrg echo '$0: caught signal, cleaning up...' >&2 387e07dc26bSmrg rmdir '$lockdir' 388e07dc26bSmrg exit 1 389e07dc26bSmrg " 1 2 13 15 390e07dc26bSmrg numtries=100 391e07dc26bSmrg i=$numtries 392e07dc26bSmrg while test $i -gt 0; do 393e07dc26bSmrg # mkdir is a portable test-and-set. 394e07dc26bSmrg if mkdir "$lockdir" 2>/dev/null; then 395e07dc26bSmrg # This process acquired the lock. 396e07dc26bSmrg "$@" -MD 397e07dc26bSmrg stat=$? 398e07dc26bSmrg # Release the lock. 399e07dc26bSmrg rmdir "$lockdir" 400e07dc26bSmrg break 401e07dc26bSmrg else 402e07dc26bSmrg # If the lock is being held by a different process, wait 403e07dc26bSmrg # until the winning process is done or we timeout. 404e07dc26bSmrg while test -d "$lockdir" && test $i -gt 0; do 405e07dc26bSmrg sleep 1 406e07dc26bSmrg i=`expr $i - 1` 407e07dc26bSmrg done 408e07dc26bSmrg fi 409e07dc26bSmrg i=`expr $i - 1` 410e07dc26bSmrg done 411e07dc26bSmrg trap - 1 2 13 15 412e07dc26bSmrg if test $i -le 0; then 413e07dc26bSmrg echo "$0: failed to acquire lock after $numtries attempts" >&2 414e07dc26bSmrg echo "$0: check lockdir '$lockdir'" >&2 415e07dc26bSmrg exit 1 416e07dc26bSmrg fi 417e07dc26bSmrg 418e07dc26bSmrg if test $stat -ne 0; then 419e07dc26bSmrg rm -f "$tmpdepfile" 420e07dc26bSmrg exit $stat 421e07dc26bSmrg fi 422e07dc26bSmrg rm -f "$depfile" 423e07dc26bSmrg # Each line is of the form `foo.o: dependent.h', 424e07dc26bSmrg # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. 425e07dc26bSmrg # Do two passes, one to just change these to 426e07dc26bSmrg # `$object: dependent.h' and one to simply `dependent.h:'. 427e07dc26bSmrg sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" 428e07dc26bSmrg # Some versions of the HPUX 10.20 sed can't process this invocation 429e07dc26bSmrg # correctly. Breaking it into two sed invocations is a workaround. 430e07dc26bSmrg sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \ 431e07dc26bSmrg | sed -e 's/$/ :/' >> "$depfile" 432e07dc26bSmrg rm -f "$tmpdepfile" 433e07dc26bSmrg ;; 434e07dc26bSmrg 435e07dc26bSmrghp2) 436e07dc26bSmrg # The "hp" stanza above does not work with aCC (C++) and HP's ia64 437e07dc26bSmrg # compilers, which have integrated preprocessors. The correct option 438e07dc26bSmrg # to use with these is +Maked; it writes dependencies to a file named 439e07dc26bSmrg # 'foo.d', which lands next to the object file, wherever that 440e07dc26bSmrg # happens to be. 441e07dc26bSmrg # Much of this is similar to the tru64 case; see comments there. 442e07dc26bSmrg set_dir_from "$object" 443e07dc26bSmrg set_base_from "$object" 444e07dc26bSmrg if test "$libtool" = yes; then 445e07dc26bSmrg tmpdepfile1=$dir$base.d 446e07dc26bSmrg tmpdepfile2=$dir.libs/$base.d 447e07dc26bSmrg "$@" -Wc,+Maked 448e07dc26bSmrg else 449e07dc26bSmrg tmpdepfile1=$dir$base.d 450e07dc26bSmrg tmpdepfile2=$dir$base.d 451e07dc26bSmrg "$@" +Maked 452e07dc26bSmrg fi 453e07dc26bSmrg stat=$? 454e07dc26bSmrg if test $stat -ne 0; then 455e07dc26bSmrg rm -f "$tmpdepfile1" "$tmpdepfile2" 456e07dc26bSmrg exit $stat 457e07dc26bSmrg fi 458e07dc26bSmrg 459e07dc26bSmrg for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" 460e07dc26bSmrg do 461e07dc26bSmrg test -f "$tmpdepfile" && break 462e07dc26bSmrg done 463e07dc26bSmrg if test -f "$tmpdepfile"; then 464e07dc26bSmrg sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile" 465e07dc26bSmrg # Add 'dependent.h:' lines. 466e07dc26bSmrg sed -ne '2,${ 467e07dc26bSmrg s/^ *// 468e07dc26bSmrg s/ \\*$// 469e07dc26bSmrg s/$/:/ 470e07dc26bSmrg p 471e07dc26bSmrg }' "$tmpdepfile" >> "$depfile" 472e07dc26bSmrg else 473e07dc26bSmrg make_dummy_depfile 474e07dc26bSmrg fi 475e07dc26bSmrg rm -f "$tmpdepfile" "$tmpdepfile2" 476e07dc26bSmrg ;; 477e07dc26bSmrg 478e07dc26bSmrgtru64) 479e07dc26bSmrg # The Tru64 compiler uses -MD to generate dependencies as a side 480e07dc26bSmrg # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. 481e07dc26bSmrg # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put 482e07dc26bSmrg # dependencies in 'foo.d' instead, so we check for that too. 483e07dc26bSmrg # Subdirectories are respected. 484e07dc26bSmrg set_dir_from "$object" 485e07dc26bSmrg set_base_from "$object" 486e07dc26bSmrg 487e07dc26bSmrg if test "$libtool" = yes; then 488e07dc26bSmrg # Libtool generates 2 separate objects for the 2 libraries. These 489e07dc26bSmrg # two compilations output dependencies in $dir.libs/$base.o.d and 490e07dc26bSmrg # in $dir$base.o.d. We have to check for both files, because 491e07dc26bSmrg # one of the two compilations can be disabled. We should prefer 492e07dc26bSmrg # $dir$base.o.d over $dir.libs/$base.o.d because the latter is 493e07dc26bSmrg # automatically cleaned when .libs/ is deleted, while ignoring 494e07dc26bSmrg # the former would cause a distcleancheck panic. 495e07dc26bSmrg tmpdepfile1=$dir$base.o.d # libtool 1.5 496e07dc26bSmrg tmpdepfile2=$dir.libs/$base.o.d # Likewise. 497e07dc26bSmrg tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504 498e07dc26bSmrg "$@" -Wc,-MD 499e07dc26bSmrg else 500e07dc26bSmrg tmpdepfile1=$dir$base.d 501e07dc26bSmrg tmpdepfile2=$dir$base.d 502e07dc26bSmrg tmpdepfile3=$dir$base.d 503e07dc26bSmrg "$@" -MD 504e07dc26bSmrg fi 505e07dc26bSmrg 506e07dc26bSmrg stat=$? 507e07dc26bSmrg if test $stat -ne 0; then 508e07dc26bSmrg rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 509e07dc26bSmrg exit $stat 510e07dc26bSmrg fi 511e07dc26bSmrg 512e07dc26bSmrg for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 513e07dc26bSmrg do 514e07dc26bSmrg test -f "$tmpdepfile" && break 515e07dc26bSmrg done 516e07dc26bSmrg # Same post-processing that is required for AIX mode. 517e07dc26bSmrg aix_post_process_depfile 518e07dc26bSmrg ;; 519e07dc26bSmrg 520e07dc26bSmrgmsvc7) 521e07dc26bSmrg if test "$libtool" = yes; then 522e07dc26bSmrg showIncludes=-Wc,-showIncludes 523e07dc26bSmrg else 524e07dc26bSmrg showIncludes=-showIncludes 525e07dc26bSmrg fi 526e07dc26bSmrg "$@" $showIncludes > "$tmpdepfile" 527e07dc26bSmrg stat=$? 528e07dc26bSmrg grep -v '^Note: including file: ' "$tmpdepfile" 529e07dc26bSmrg if test $stat -ne 0; then 530e07dc26bSmrg rm -f "$tmpdepfile" 531e07dc26bSmrg exit $stat 532e07dc26bSmrg fi 533e07dc26bSmrg rm -f "$depfile" 534e07dc26bSmrg echo "$object : \\" > "$depfile" 535e07dc26bSmrg # The first sed program below extracts the file names and escapes 536e07dc26bSmrg # backslashes for cygpath. The second sed program outputs the file 537e07dc26bSmrg # name when reading, but also accumulates all include files in the 538e07dc26bSmrg # hold buffer in order to output them again at the end. This only 539e07dc26bSmrg # works with sed implementations that can handle large buffers. 540e07dc26bSmrg sed < "$tmpdepfile" -n ' 541e07dc26bSmrg/^Note: including file: *\(.*\)/ { 542e07dc26bSmrg s//\1/ 543e07dc26bSmrg s/\\/\\\\/g 544e07dc26bSmrg p 545e07dc26bSmrg}' | $cygpath_u | sort -u | sed -n ' 546e07dc26bSmrgs/ /\\ /g 547e07dc26bSmrgs/\(.*\)/'"$tab"'\1 \\/p 548e07dc26bSmrgs/.\(.*\) \\/\1:/ 549e07dc26bSmrgH 550e07dc26bSmrg$ { 551e07dc26bSmrg s/.*/'"$tab"'/ 552e07dc26bSmrg G 553e07dc26bSmrg p 554e07dc26bSmrg}' >> "$depfile" 555e07dc26bSmrg echo >> "$depfile" # make sure the fragment doesn't end with a backslash 556e07dc26bSmrg rm -f "$tmpdepfile" 557e07dc26bSmrg ;; 558e07dc26bSmrg 559e07dc26bSmrgmsvc7msys) 560e07dc26bSmrg # This case exists only to let depend.m4 do its work. It works by 561e07dc26bSmrg # looking at the text of this script. This case will never be run, 562e07dc26bSmrg # since it is checked for above. 563e07dc26bSmrg exit 1 564e07dc26bSmrg ;; 565e07dc26bSmrg 566e07dc26bSmrg#nosideeffect) 567e07dc26bSmrg # This comment above is used by automake to tell side-effect 568e07dc26bSmrg # dependency tracking mechanisms from slower ones. 569e07dc26bSmrg 570e07dc26bSmrgdashmstdout) 571e07dc26bSmrg # Important note: in order to support this mode, a compiler *must* 572e07dc26bSmrg # always write the preprocessed file to stdout, regardless of -o. 573e07dc26bSmrg "$@" || exit $? 574e07dc26bSmrg 575e07dc26bSmrg # Remove the call to Libtool. 576e07dc26bSmrg if test "$libtool" = yes; then 577e07dc26bSmrg while test "X$1" != 'X--mode=compile'; do 578e07dc26bSmrg shift 579e07dc26bSmrg done 580e07dc26bSmrg shift 581e07dc26bSmrg fi 582e07dc26bSmrg 583e07dc26bSmrg # Remove '-o $object'. 584e07dc26bSmrg IFS=" " 585e07dc26bSmrg for arg 586e07dc26bSmrg do 587e07dc26bSmrg case $arg in 588e07dc26bSmrg -o) 589e07dc26bSmrg shift 590e07dc26bSmrg ;; 591e07dc26bSmrg $object) 592e07dc26bSmrg shift 593e07dc26bSmrg ;; 594e07dc26bSmrg *) 595e07dc26bSmrg set fnord "$@" "$arg" 596e07dc26bSmrg shift # fnord 597e07dc26bSmrg shift # $arg 598e07dc26bSmrg ;; 599e07dc26bSmrg esac 600e07dc26bSmrg done 601e07dc26bSmrg 602e07dc26bSmrg test -z "$dashmflag" && dashmflag=-M 603e07dc26bSmrg # Require at least two characters before searching for ':' 604e07dc26bSmrg # in the target name. This is to cope with DOS-style filenames: 605e07dc26bSmrg # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. 606e07dc26bSmrg "$@" $dashmflag | 607e07dc26bSmrg sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile" 608e07dc26bSmrg rm -f "$depfile" 609e07dc26bSmrg cat < "$tmpdepfile" > "$depfile" 610e07dc26bSmrg # Some versions of the HPUX 10.20 sed can't process this sed invocation 611e07dc26bSmrg # correctly. Breaking it into two sed invocations is a workaround. 612e07dc26bSmrg tr ' ' "$nl" < "$tmpdepfile" \ 613e07dc26bSmrg | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ 614e07dc26bSmrg | sed -e 's/$/ :/' >> "$depfile" 615e07dc26bSmrg rm -f "$tmpdepfile" 616e07dc26bSmrg ;; 617e07dc26bSmrg 618e07dc26bSmrgdashXmstdout) 619e07dc26bSmrg # This case only exists to satisfy depend.m4. It is never actually 620e07dc26bSmrg # run, as this mode is specially recognized in the preamble. 621e07dc26bSmrg exit 1 622e07dc26bSmrg ;; 623e07dc26bSmrg 624e07dc26bSmrgmakedepend) 625e07dc26bSmrg "$@" || exit $? 626e07dc26bSmrg # Remove any Libtool call 627e07dc26bSmrg if test "$libtool" = yes; then 628e07dc26bSmrg while test "X$1" != 'X--mode=compile'; do 629e07dc26bSmrg shift 630e07dc26bSmrg done 631e07dc26bSmrg shift 632e07dc26bSmrg fi 633e07dc26bSmrg # X makedepend 634e07dc26bSmrg shift 635e07dc26bSmrg cleared=no eat=no 636e07dc26bSmrg for arg 637e07dc26bSmrg do 638e07dc26bSmrg case $cleared in 639e07dc26bSmrg no) 640e07dc26bSmrg set ""; shift 641e07dc26bSmrg cleared=yes ;; 642e07dc26bSmrg esac 643e07dc26bSmrg if test $eat = yes; then 644e07dc26bSmrg eat=no 645e07dc26bSmrg continue 646e07dc26bSmrg fi 647e07dc26bSmrg case "$arg" in 648e07dc26bSmrg -D*|-I*) 649e07dc26bSmrg set fnord "$@" "$arg"; shift ;; 650e07dc26bSmrg # Strip any option that makedepend may not understand. Remove 651e07dc26bSmrg # the object too, otherwise makedepend will parse it as a source file. 652e07dc26bSmrg -arch) 653e07dc26bSmrg eat=yes ;; 654e07dc26bSmrg -*|$object) 655e07dc26bSmrg ;; 656e07dc26bSmrg *) 657e07dc26bSmrg set fnord "$@" "$arg"; shift ;; 658e07dc26bSmrg esac 659e07dc26bSmrg done 660e07dc26bSmrg obj_suffix=`echo "$object" | sed 's/^.*\././'` 661e07dc26bSmrg touch "$tmpdepfile" 662e07dc26bSmrg ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" 663e07dc26bSmrg rm -f "$depfile" 664e07dc26bSmrg # makedepend may prepend the VPATH from the source file name to the object. 665e07dc26bSmrg # No need to regex-escape $object, excess matching of '.' is harmless. 666e07dc26bSmrg sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" 667e07dc26bSmrg # Some versions of the HPUX 10.20 sed can't process the last invocation 668e07dc26bSmrg # correctly. Breaking it into two sed invocations is a workaround. 669e07dc26bSmrg sed '1,2d' "$tmpdepfile" \ 670e07dc26bSmrg | tr ' ' "$nl" \ 671e07dc26bSmrg | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ 672e07dc26bSmrg | sed -e 's/$/ :/' >> "$depfile" 673e07dc26bSmrg rm -f "$tmpdepfile" "$tmpdepfile".bak 674e07dc26bSmrg ;; 675e07dc26bSmrg 676e07dc26bSmrgcpp) 677e07dc26bSmrg # Important note: in order to support this mode, a compiler *must* 678e07dc26bSmrg # always write the preprocessed file to stdout. 679e07dc26bSmrg "$@" || exit $? 680e07dc26bSmrg 681e07dc26bSmrg # Remove the call to Libtool. 682e07dc26bSmrg if test "$libtool" = yes; then 683e07dc26bSmrg while test "X$1" != 'X--mode=compile'; do 684e07dc26bSmrg shift 685e07dc26bSmrg done 686e07dc26bSmrg shift 687e07dc26bSmrg fi 688e07dc26bSmrg 689e07dc26bSmrg # Remove '-o $object'. 690e07dc26bSmrg IFS=" " 691e07dc26bSmrg for arg 692e07dc26bSmrg do 693e07dc26bSmrg case $arg in 694e07dc26bSmrg -o) 695e07dc26bSmrg shift 696e07dc26bSmrg ;; 697e07dc26bSmrg $object) 698e07dc26bSmrg shift 699e07dc26bSmrg ;; 700e07dc26bSmrg *) 701e07dc26bSmrg set fnord "$@" "$arg" 702e07dc26bSmrg shift # fnord 703e07dc26bSmrg shift # $arg 704e07dc26bSmrg ;; 705e07dc26bSmrg esac 706e07dc26bSmrg done 707e07dc26bSmrg 708e07dc26bSmrg "$@" -E \ 709e07dc26bSmrg | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ 710e07dc26bSmrg -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ 711e07dc26bSmrg | sed '$ s: \\$::' > "$tmpdepfile" 712e07dc26bSmrg rm -f "$depfile" 713e07dc26bSmrg echo "$object : \\" > "$depfile" 714e07dc26bSmrg cat < "$tmpdepfile" >> "$depfile" 715e07dc26bSmrg sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" 716e07dc26bSmrg rm -f "$tmpdepfile" 717e07dc26bSmrg ;; 718e07dc26bSmrg 719e07dc26bSmrgmsvisualcpp) 720e07dc26bSmrg # Important note: in order to support this mode, a compiler *must* 721e07dc26bSmrg # always write the preprocessed file to stdout. 722e07dc26bSmrg "$@" || exit $? 723e07dc26bSmrg 724e07dc26bSmrg # Remove the call to Libtool. 725e07dc26bSmrg if test "$libtool" = yes; then 726e07dc26bSmrg while test "X$1" != 'X--mode=compile'; do 727e07dc26bSmrg shift 728e07dc26bSmrg done 729e07dc26bSmrg shift 730e07dc26bSmrg fi 731e07dc26bSmrg 732e07dc26bSmrg IFS=" " 733e07dc26bSmrg for arg 734e07dc26bSmrg do 735e07dc26bSmrg case "$arg" in 736e07dc26bSmrg -o) 737e07dc26bSmrg shift 738e07dc26bSmrg ;; 739e07dc26bSmrg $object) 740e07dc26bSmrg shift 741e07dc26bSmrg ;; 742e07dc26bSmrg "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") 743e07dc26bSmrg set fnord "$@" 744e07dc26bSmrg shift 745e07dc26bSmrg shift 746e07dc26bSmrg ;; 747e07dc26bSmrg *) 748e07dc26bSmrg set fnord "$@" "$arg" 749e07dc26bSmrg shift 750e07dc26bSmrg shift 751e07dc26bSmrg ;; 752e07dc26bSmrg esac 753e07dc26bSmrg done 754e07dc26bSmrg "$@" -E 2>/dev/null | 755e07dc26bSmrg sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" 756e07dc26bSmrg rm -f "$depfile" 757e07dc26bSmrg echo "$object : \\" > "$depfile" 758e07dc26bSmrg sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" 759e07dc26bSmrg echo "$tab" >> "$depfile" 760e07dc26bSmrg sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" 761e07dc26bSmrg rm -f "$tmpdepfile" 762e07dc26bSmrg ;; 763e07dc26bSmrg 764e07dc26bSmrgmsvcmsys) 765e07dc26bSmrg # This case exists only to let depend.m4 do its work. It works by 766e07dc26bSmrg # looking at the text of this script. This case will never be run, 767e07dc26bSmrg # since it is checked for above. 768e07dc26bSmrg exit 1 769e07dc26bSmrg ;; 770e07dc26bSmrg 771e07dc26bSmrgnone) 772e07dc26bSmrg exec "$@" 773e07dc26bSmrg ;; 774e07dc26bSmrg 775e07dc26bSmrg*) 776e07dc26bSmrg echo "Unknown depmode $depmode" 1>&2 777e07dc26bSmrg exit 1 778e07dc26bSmrg ;; 779e07dc26bSmrgesac 780e07dc26bSmrg 781e07dc26bSmrgexit 0 782e07dc26bSmrg 783e07dc26bSmrg# Local Variables: 784e07dc26bSmrg# mode: shell-script 785e07dc26bSmrg# sh-indentation: 2 786636c353eSmrg# eval: (add-hook 'before-save-hook 'time-stamp) 787e07dc26bSmrg# time-stamp-start: "scriptversion=" 788e07dc26bSmrg# time-stamp-format: "%:y-%02m-%02d.%02H" 789636c353eSmrg# time-stamp-time-zone: "UTC0" 790e07dc26bSmrg# time-stamp-end: "; # UTC" 791e07dc26bSmrg# End: 792