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