167f05d30Smrg#! /bin/sh
267f05d30Smrg# depcomp - compile a program generating dependencies as side-effects
3fffe5102Smrg
4051ceee6Smrgscriptversion=2018-03-07.03; # UTC
5fffe5102Smrg
6051ceee6Smrg# Copyright (C) 1999-2021 Free Software Foundation, Inc.
767f05d30Smrg
867f05d30Smrg# This program is free software; you can redistribute it and/or modify
967f05d30Smrg# it under the terms of the GNU General Public License as published by
1067f05d30Smrg# the Free Software Foundation; either version 2, or (at your option)
1167f05d30Smrg# any later version.
1267f05d30Smrg
1367f05d30Smrg# This program is distributed in the hope that it will be useful,
1467f05d30Smrg# but WITHOUT ANY WARRANTY; without even the implied warranty of
1567f05d30Smrg# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1667f05d30Smrg# GNU General Public License for more details.
1767f05d30Smrg
1867f05d30Smrg# You should have received a copy of the GNU General Public License
19051ceee6Smrg# along with this program.  If not, see <https://www.gnu.org/licenses/>.
2067f05d30Smrg
2167f05d30Smrg# As a special exception to the GNU General Public License, if you
2267f05d30Smrg# distribute this file as part of a program that contains a
2367f05d30Smrg# configuration script generated by Autoconf, you may include it under
2467f05d30Smrg# the same distribution terms that you use for the rest of that program.
2567f05d30Smrg
2667f05d30Smrg# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>.
2767f05d30Smrg
28fffe5102Smrgcase $1 in
29fffe5102Smrg  '')
30e90eff46Smrg    echo "$0: No command.  Try '$0 --help' for more information." 1>&2
31e90eff46Smrg    exit 1;
32e90eff46Smrg    ;;
33fffe5102Smrg  -h | --h*)
34fffe5102Smrg    cat <<\EOF
35fffe5102SmrgUsage: depcomp [--help] [--version] PROGRAM [ARGS]
36fffe5102Smrg
37fffe5102SmrgRun PROGRAMS ARGS to compile a file, generating dependencies
38fffe5102Smrgas side-effects.
39fffe5102Smrg
40fffe5102SmrgEnvironment variables:
41fffe5102Smrg  depmode     Dependency tracking mode.
42e90eff46Smrg  source      Source file read by 'PROGRAMS ARGS'.
43e90eff46Smrg  object      Object file output by 'PROGRAMS ARGS'.
44fffe5102Smrg  DEPDIR      directory where to store dependencies.
45fffe5102Smrg  depfile     Dependency file to output.
466dbd43aaSmrg  tmpdepfile  Temporary file to use when outputting dependencies.
47fffe5102Smrg  libtool     Whether libtool is used (yes/no).
48fffe5102Smrg
49fffe5102SmrgReport bugs to <bug-automake@gnu.org>.
50fffe5102SmrgEOF
51fffe5102Smrg    exit $?
52fffe5102Smrg    ;;
53fffe5102Smrg  -v | --v*)
54fffe5102Smrg    echo "depcomp $scriptversion"
55fffe5102Smrg    exit $?
56fffe5102Smrg    ;;
57fffe5102Smrgesac
58fffe5102Smrg
59e90eff46Smrg# Get the directory component of the given path, and save it in the
60e90eff46Smrg# global variables '$dir'.  Note that this directory component will
61e90eff46Smrg# be either empty or ending with a '/' character.  This is deliberate.
62e90eff46Smrgset_dir_from ()
63e90eff46Smrg{
64e90eff46Smrg  case $1 in
65e90eff46Smrg    */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;;
66e90eff46Smrg      *) dir=;;
67e90eff46Smrg  esac
68e90eff46Smrg}
69e90eff46Smrg
70e90eff46Smrg# Get the suffix-stripped basename of the given path, and save it the
71e90eff46Smrg# global variable '$base'.
72e90eff46Smrgset_base_from ()
73e90eff46Smrg{
74e90eff46Smrg  base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'`
75e90eff46Smrg}
76e90eff46Smrg
77e90eff46Smrg# If no dependency file was actually created by the compiler invocation,
78e90eff46Smrg# we still have to create a dummy depfile, to avoid errors with the
79e90eff46Smrg# Makefile "include basename.Plo" scheme.
80e90eff46Smrgmake_dummy_depfile ()
81e90eff46Smrg{
82e90eff46Smrg  echo "#dummy" > "$depfile"
83e90eff46Smrg}
84e90eff46Smrg
85e90eff46Smrg# Factor out some common post-processing of the generated depfile.
86e90eff46Smrg# Requires the auxiliary global variable '$tmpdepfile' to be set.
87e90eff46Smrgaix_post_process_depfile ()
88e90eff46Smrg{
89e90eff46Smrg  # If the compiler actually managed to produce a dependency file,
90e90eff46Smrg  # post-process it.
91e90eff46Smrg  if test -f "$tmpdepfile"; then
92e90eff46Smrg    # Each line is of the form 'foo.o: dependency.h'.
93e90eff46Smrg    # Do two passes, one to just change these to
94e90eff46Smrg    #   $object: dependency.h
95e90eff46Smrg    # and one to simply output
96e90eff46Smrg    #   dependency.h:
97e90eff46Smrg    # which is needed to avoid the deleted-header problem.
98e90eff46Smrg    { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile"
99e90eff46Smrg      sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile"
100e90eff46Smrg    } > "$depfile"
101e90eff46Smrg    rm -f "$tmpdepfile"
102e90eff46Smrg  else
103e90eff46Smrg    make_dummy_depfile
104e90eff46Smrg  fi
105e90eff46Smrg}
106e90eff46Smrg
107e90eff46Smrg# A tabulation character.
108e90eff46Smrgtab='	'
109e90eff46Smrg# A newline character.
110e90eff46Smrgnl='
111e90eff46Smrg'
112e90eff46Smrg# Character ranges might be problematic outside the C locale.
113e90eff46Smrg# These definitions help.
114e90eff46Smrgupper=ABCDEFGHIJKLMNOPQRSTUVWXYZ
115e90eff46Smrglower=abcdefghijklmnopqrstuvwxyz
116e90eff46Smrgdigits=0123456789
117e90eff46Smrgalpha=${upper}${lower}
118e90eff46Smrg
11967f05d30Smrgif test -z "$depmode" || test -z "$source" || test -z "$object"; then
12067f05d30Smrg  echo "depcomp: Variables source, object and depmode must be set" 1>&2
12167f05d30Smrg  exit 1
12267f05d30Smrgfi
12367f05d30Smrg
124fffe5102Smrg# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.
125fffe5102Smrgdepfile=${depfile-`echo "$object" |
126fffe5102Smrg  sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`}
12767f05d30Smrgtmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
12867f05d30Smrg
12967f05d30Smrgrm -f "$tmpdepfile"
13067f05d30Smrg
131e90eff46Smrg# Avoid interferences from the environment.
132e90eff46Smrggccflag= dashmflag=
133e90eff46Smrg
13467f05d30Smrg# Some modes work just like other modes, but use different flags.  We
13567f05d30Smrg# parameterize here, but still list the modes in the big case below,
13667f05d30Smrg# to make depend.m4 easier to write.  Note that we *cannot* use a case
13767f05d30Smrg# here, because this file can only contain one case statement.
13867f05d30Smrgif test "$depmode" = hp; then
13967f05d30Smrg  # HP compiler uses -M and no extra arg.
14067f05d30Smrg  gccflag=-M
14167f05d30Smrg  depmode=gcc
14267f05d30Smrgfi
14367f05d30Smrg
14467f05d30Smrgif test "$depmode" = dashXmstdout; then
145e90eff46Smrg  # This is just like dashmstdout with a different argument.
146e90eff46Smrg  dashmflag=-xM
147e90eff46Smrg  depmode=dashmstdout
14867f05d30Smrgfi
14967f05d30Smrg
150fffe5102Smrgcygpath_u="cygpath -u -f -"
151fffe5102Smrgif test "$depmode" = msvcmsys; then
152e90eff46Smrg  # This is just like msvisualcpp but w/o cygpath translation.
153e90eff46Smrg  # Just convert the backslash-escaped backslashes to single forward
154e90eff46Smrg  # slashes to satisfy depend.m4
155e90eff46Smrg  cygpath_u='sed s,\\\\,/,g'
156e90eff46Smrg  depmode=msvisualcpp
157fffe5102Smrgfi
158fffe5102Smrg
1596dbd43aaSmrgif test "$depmode" = msvc7msys; then
160e90eff46Smrg  # This is just like msvc7 but w/o cygpath translation.
161e90eff46Smrg  # Just convert the backslash-escaped backslashes to single forward
162e90eff46Smrg  # slashes to satisfy depend.m4
163e90eff46Smrg  cygpath_u='sed s,\\\\,/,g'
164e90eff46Smrg  depmode=msvc7
165e90eff46Smrgfi
166e90eff46Smrg
167e90eff46Smrgif test "$depmode" = xlc; then
168e90eff46Smrg  # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information.
169e90eff46Smrg  gccflag=-qmakedep=gcc,-MF
170e90eff46Smrg  depmode=gcc
1716dbd43aaSmrgfi
1726dbd43aaSmrg
17367f05d30Smrgcase "$depmode" in
17467f05d30Smrggcc3)
17567f05d30Smrg## gcc 3 implements dependency tracking that does exactly what
17667f05d30Smrg## we want.  Yay!  Note: for some reason libtool 1.4 doesn't like
17767f05d30Smrg## it if -MD -MP comes after the -MF stuff.  Hmm.
178fffe5102Smrg## Unfortunately, FreeBSD c89 acceptance of flags depends upon
179fffe5102Smrg## the command line argument order; so add the flags where they
180fffe5102Smrg## appear in depend2.am.  Note that the slowdown incurred here
181fffe5102Smrg## affects only configure: in makefiles, %FASTDEP% shortcuts this.
182fffe5102Smrg  for arg
183fffe5102Smrg  do
184fffe5102Smrg    case $arg in
185fffe5102Smrg    -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;;
186fffe5102Smrg    *)  set fnord "$@" "$arg" ;;
187fffe5102Smrg    esac
188fffe5102Smrg    shift # fnord
189fffe5102Smrg    shift # $arg
190fffe5102Smrg  done
191fffe5102Smrg  "$@"
19267f05d30Smrg  stat=$?
193e90eff46Smrg  if test $stat -ne 0; then
19467f05d30Smrg    rm -f "$tmpdepfile"
19567f05d30Smrg    exit $stat
19667f05d30Smrg  fi
19767f05d30Smrg  mv "$tmpdepfile" "$depfile"
19867f05d30Smrg  ;;
19967f05d30Smrg
20067f05d30Smrggcc)
201e90eff46Smrg## Note that this doesn't just cater to obsosete pre-3.x GCC compilers.
202e90eff46Smrg## but also to in-use compilers like IMB xlc/xlC and the HP C compiler.
203e90eff46Smrg## (see the conditional assignment to $gccflag above).
20467f05d30Smrg## There are various ways to get dependency output from gcc.  Here's
20567f05d30Smrg## why we pick this rather obscure method:
20667f05d30Smrg## - Don't want to use -MD because we'd like the dependencies to end
20767f05d30Smrg##   up in a subdir.  Having to rename by hand is ugly.
20867f05d30Smrg##   (We might end up doing this anyway to support other compilers.)
20967f05d30Smrg## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
210e90eff46Smrg##   -MM, not -M (despite what the docs say).  Also, it might not be
211e90eff46Smrg##   supported by the other compilers which use the 'gcc' depmode.
21267f05d30Smrg## - Using -M directly means running the compiler twice (even worse
21367f05d30Smrg##   than renaming).
21467f05d30Smrg  if test -z "$gccflag"; then
21567f05d30Smrg    gccflag=-MD,
21667f05d30Smrg  fi
21767f05d30Smrg  "$@" -Wp,"$gccflag$tmpdepfile"
21867f05d30Smrg  stat=$?
219e90eff46Smrg  if test $stat -ne 0; then
22067f05d30Smrg    rm -f "$tmpdepfile"
22167f05d30Smrg    exit $stat
22267f05d30Smrg  fi
22367f05d30Smrg  rm -f "$depfile"
22467f05d30Smrg  echo "$object : \\" > "$depfile"
225e90eff46Smrg  # The second -e expression handles DOS-style file names with drive
226e90eff46Smrg  # letters.
22767f05d30Smrg  sed -e 's/^[^:]*: / /' \
22867f05d30Smrg      -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
229e90eff46Smrg## This next piece of magic avoids the "deleted header file" problem.
23067f05d30Smrg## The problem is that when a header file which appears in a .P file
23167f05d30Smrg## is deleted, the dependency causes make to die (because there is
23267f05d30Smrg## typically no way to rebuild the header).  We avoid this by adding
23367f05d30Smrg## dummy dependencies for each header file.  Too bad gcc doesn't do
23467f05d30Smrg## this for us directly.
235e90eff46Smrg## Some versions of gcc put a space before the ':'.  On the theory
23667f05d30Smrg## that the space means something, we add a space to the output as
2376dbd43aaSmrg## well.  hp depmode also adds that space, but also prefixes the VPATH
2386dbd43aaSmrg## to the object.  Take care to not repeat it in the output.
23967f05d30Smrg## Some versions of the HPUX 10.20 sed can't process this invocation
24067f05d30Smrg## correctly.  Breaking it into two sed invocations is a workaround.
241e90eff46Smrg  tr ' ' "$nl" < "$tmpdepfile" \
242e90eff46Smrg    | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \
243e90eff46Smrg    | sed -e 's/$/ :/' >> "$depfile"
24467f05d30Smrg  rm -f "$tmpdepfile"
24567f05d30Smrg  ;;
24667f05d30Smrg
24767f05d30Smrghp)
24867f05d30Smrg  # This case exists only to let depend.m4 do its work.  It works by
24967f05d30Smrg  # looking at the text of this script.  This case will never be run,
25067f05d30Smrg  # since it is checked for above.
25167f05d30Smrg  exit 1
25267f05d30Smrg  ;;
25367f05d30Smrg
25467f05d30Smrgsgi)
25567f05d30Smrg  if test "$libtool" = yes; then
25667f05d30Smrg    "$@" "-Wp,-MDupdate,$tmpdepfile"
25767f05d30Smrg  else
25867f05d30Smrg    "$@" -MDupdate "$tmpdepfile"
25967f05d30Smrg  fi
26067f05d30Smrg  stat=$?
261e90eff46Smrg  if test $stat -ne 0; then
26267f05d30Smrg    rm -f "$tmpdepfile"
26367f05d30Smrg    exit $stat
26467f05d30Smrg  fi
26567f05d30Smrg  rm -f "$depfile"
26667f05d30Smrg
26767f05d30Smrg  if test -f "$tmpdepfile"; then  # yes, the sourcefile depend on other files
26867f05d30Smrg    echo "$object : \\" > "$depfile"
26967f05d30Smrg    # Clip off the initial element (the dependent).  Don't try to be
27067f05d30Smrg    # clever and replace this with sed code, as IRIX sed won't handle
27167f05d30Smrg    # lines with more than a fixed number of characters (4096 in
27267f05d30Smrg    # IRIX 6.2 sed, 8192 in IRIX 6.5).  We also remove comment lines;
273e90eff46Smrg    # the IRIX cc adds comments like '#:fec' to the end of the
27467f05d30Smrg    # dependency line.
275e90eff46Smrg    tr ' ' "$nl" < "$tmpdepfile" \
276e90eff46Smrg      | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \
277e90eff46Smrg      | tr "$nl" ' ' >> "$depfile"
278fffe5102Smrg    echo >> "$depfile"
27967f05d30Smrg    # The second pass generates a dummy entry for each header file.
280e90eff46Smrg    tr ' ' "$nl" < "$tmpdepfile" \
281e90eff46Smrg      | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
282e90eff46Smrg      >> "$depfile"
28367f05d30Smrg  else
284e90eff46Smrg    make_dummy_depfile
28567f05d30Smrg  fi
28667f05d30Smrg  rm -f "$tmpdepfile"
28767f05d30Smrg  ;;
28867f05d30Smrg
289e90eff46Smrgxlc)
290e90eff46Smrg  # This case exists only to let depend.m4 do its work.  It works by
291e90eff46Smrg  # looking at the text of this script.  This case will never be run,
292e90eff46Smrg  # since it is checked for above.
293e90eff46Smrg  exit 1
294e90eff46Smrg  ;;
295e90eff46Smrg
29667f05d30Smrgaix)
29767f05d30Smrg  # The C for AIX Compiler uses -M and outputs the dependencies
29867f05d30Smrg  # in a .u file.  In older versions, this file always lives in the
299e90eff46Smrg  # current directory.  Also, the AIX compiler puts '$object:' at the
30067f05d30Smrg  # start of each line; $object doesn't have directory information.
30167f05d30Smrg  # Version 6 uses the directory in both cases.
302e90eff46Smrg  set_dir_from "$object"
303e90eff46Smrg  set_base_from "$object"
30467f05d30Smrg  if test "$libtool" = yes; then
305fffe5102Smrg    tmpdepfile1=$dir$base.u
306fffe5102Smrg    tmpdepfile2=$base.u
307fffe5102Smrg    tmpdepfile3=$dir.libs/$base.u
30867f05d30Smrg    "$@" -Wc,-M
30967f05d30Smrg  else
310fffe5102Smrg    tmpdepfile1=$dir$base.u
311fffe5102Smrg    tmpdepfile2=$dir$base.u
312fffe5102Smrg    tmpdepfile3=$dir$base.u
31367f05d30Smrg    "$@" -M
31467f05d30Smrg  fi
31567f05d30Smrg  stat=$?
316e90eff46Smrg  if test $stat -ne 0; then
317fffe5102Smrg    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
31867f05d30Smrg    exit $stat
31967f05d30Smrg  fi
32067f05d30Smrg
321fffe5102Smrg  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
322fffe5102Smrg  do
323fffe5102Smrg    test -f "$tmpdepfile" && break
324fffe5102Smrg  done
325e90eff46Smrg  aix_post_process_depfile
326e90eff46Smrg  ;;
327e90eff46Smrg
328e90eff46Smrgtcc)
329e90eff46Smrg  # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26
330e90eff46Smrg  # FIXME: That version still under development at the moment of writing.
331e90eff46Smrg  #        Make that this statement remains true also for stable, released
332e90eff46Smrg  #        versions.
333e90eff46Smrg  # It will wrap lines (doesn't matter whether long or short) with a
334e90eff46Smrg  # trailing '\', as in:
335e90eff46Smrg  #
336e90eff46Smrg  #   foo.o : \
337e90eff46Smrg  #    foo.c \
338e90eff46Smrg  #    foo.h \
339e90eff46Smrg  #
340e90eff46Smrg  # It will put a trailing '\' even on the last line, and will use leading
341e90eff46Smrg  # spaces rather than leading tabs (at least since its commit 0394caf7
342e90eff46Smrg  # "Emit spaces for -MD").
343e90eff46Smrg  "$@" -MD -MF "$tmpdepfile"
344e90eff46Smrg  stat=$?
345e90eff46Smrg  if test $stat -ne 0; then
346e90eff46Smrg    rm -f "$tmpdepfile"
347e90eff46Smrg    exit $stat
34867f05d30Smrg  fi
349e90eff46Smrg  rm -f "$depfile"
350e90eff46Smrg  # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'.
351e90eff46Smrg  # We have to change lines of the first kind to '$object: \'.
352e90eff46Smrg  sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile"
353e90eff46Smrg  # And for each line of the second kind, we have to emit a 'dep.h:'
354e90eff46Smrg  # dummy dependency, to avoid the deleted-header problem.
355e90eff46Smrg  sed -n -e 's|^  *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile"
35667f05d30Smrg  rm -f "$tmpdepfile"
35767f05d30Smrg  ;;
35867f05d30Smrg
359e90eff46Smrg## The order of this option in the case statement is important, since the
360e90eff46Smrg## shell code in configure will try each of these formats in the order
361e90eff46Smrg## listed in this file.  A plain '-MD' option would be understood by many
362e90eff46Smrg## compilers, so we must ensure this comes after the gcc and icc options.
363e90eff46Smrgpgcc)
364e90eff46Smrg  # Portland's C compiler understands '-MD'.
365e90eff46Smrg  # Will always output deps to 'file.d' where file is the root name of the
366e90eff46Smrg  # source file under compilation, even if file resides in a subdirectory.
367e90eff46Smrg  # The object file name does not affect the name of the '.d' file.
368e90eff46Smrg  # pgcc 10.2 will output
36967f05d30Smrg  #    foo.o: sub/foo.c sub/foo.h
370e90eff46Smrg  # and will wrap long lines using '\' :
37167f05d30Smrg  #    foo.o: sub/foo.c ... \
37267f05d30Smrg  #     sub/foo.h ... \
37367f05d30Smrg  #     ...
374e90eff46Smrg  set_dir_from "$object"
375e90eff46Smrg  # Use the source, not the object, to determine the base name, since
376e90eff46Smrg  # that's sadly what pgcc will do too.
377e90eff46Smrg  set_base_from "$source"
378e90eff46Smrg  tmpdepfile=$base.d
379e90eff46Smrg
380e90eff46Smrg  # For projects that build the same source file twice into different object
381e90eff46Smrg  # files, the pgcc approach of using the *source* file root name can cause
382e90eff46Smrg  # problems in parallel builds.  Use a locking strategy to avoid stomping on
383e90eff46Smrg  # the same $tmpdepfile.
384e90eff46Smrg  lockdir=$base.d-lock
385e90eff46Smrg  trap "
386e90eff46Smrg    echo '$0: caught signal, cleaning up...' >&2
387e90eff46Smrg    rmdir '$lockdir'
388e90eff46Smrg    exit 1
389e90eff46Smrg  " 1 2 13 15
390e90eff46Smrg  numtries=100
391e90eff46Smrg  i=$numtries
392e90eff46Smrg  while test $i -gt 0; do
393e90eff46Smrg    # mkdir is a portable test-and-set.
394e90eff46Smrg    if mkdir "$lockdir" 2>/dev/null; then
395e90eff46Smrg      # This process acquired the lock.
396e90eff46Smrg      "$@" -MD
397e90eff46Smrg      stat=$?
398e90eff46Smrg      # Release the lock.
399e90eff46Smrg      rmdir "$lockdir"
400e90eff46Smrg      break
401e90eff46Smrg    else
402e90eff46Smrg      # If the lock is being held by a different process, wait
403e90eff46Smrg      # until the winning process is done or we timeout.
404e90eff46Smrg      while test -d "$lockdir" && test $i -gt 0; do
405e90eff46Smrg        sleep 1
406e90eff46Smrg        i=`expr $i - 1`
407e90eff46Smrg      done
408e90eff46Smrg    fi
409e90eff46Smrg    i=`expr $i - 1`
410e90eff46Smrg  done
411e90eff46Smrg  trap - 1 2 13 15
412e90eff46Smrg  if test $i -le 0; then
413e90eff46Smrg    echo "$0: failed to acquire lock after $numtries attempts" >&2
414e90eff46Smrg    echo "$0: check lockdir '$lockdir'" >&2
415e90eff46Smrg    exit 1
416e90eff46Smrg  fi
41767f05d30Smrg
418e90eff46Smrg  if test $stat -ne 0; then
41967f05d30Smrg    rm -f "$tmpdepfile"
42067f05d30Smrg    exit $stat
42167f05d30Smrg  fi
42267f05d30Smrg  rm -f "$depfile"
42367f05d30Smrg  # Each line is of the form `foo.o: dependent.h',
42467f05d30Smrg  # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'.
42567f05d30Smrg  # Do two passes, one to just change these to
42667f05d30Smrg  # `$object: dependent.h' and one to simply `dependent.h:'.
42767f05d30Smrg  sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
42867f05d30Smrg  # Some versions of the HPUX 10.20 sed can't process this invocation
42967f05d30Smrg  # correctly.  Breaking it into two sed invocations is a workaround.
430e90eff46Smrg  sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \
431e90eff46Smrg    | sed -e 's/$/ :/' >> "$depfile"
43267f05d30Smrg  rm -f "$tmpdepfile"
43367f05d30Smrg  ;;
43467f05d30Smrg
435fffe5102Smrghp2)
436fffe5102Smrg  # The "hp" stanza above does not work with aCC (C++) and HP's ia64
437fffe5102Smrg  # compilers, which have integrated preprocessors.  The correct option
438fffe5102Smrg  # to use with these is +Maked; it writes dependencies to a file named
439fffe5102Smrg  # 'foo.d', which lands next to the object file, wherever that
440fffe5102Smrg  # happens to be.
441fffe5102Smrg  # Much of this is similar to the tru64 case; see comments there.
442e90eff46Smrg  set_dir_from  "$object"
443e90eff46Smrg  set_base_from "$object"
444fffe5102Smrg  if test "$libtool" = yes; then
445fffe5102Smrg    tmpdepfile1=$dir$base.d
446fffe5102Smrg    tmpdepfile2=$dir.libs/$base.d
447fffe5102Smrg    "$@" -Wc,+Maked
448fffe5102Smrg  else
449fffe5102Smrg    tmpdepfile1=$dir$base.d
450fffe5102Smrg    tmpdepfile2=$dir$base.d
451fffe5102Smrg    "$@" +Maked
452fffe5102Smrg  fi
453fffe5102Smrg  stat=$?
454e90eff46Smrg  if test $stat -ne 0; then
455fffe5102Smrg     rm -f "$tmpdepfile1" "$tmpdepfile2"
456fffe5102Smrg     exit $stat
457fffe5102Smrg  fi
458fffe5102Smrg
459fffe5102Smrg  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2"
460fffe5102Smrg  do
461fffe5102Smrg    test -f "$tmpdepfile" && break
462fffe5102Smrg  done
463fffe5102Smrg  if test -f "$tmpdepfile"; then
464e90eff46Smrg    sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile"
465e90eff46Smrg    # Add 'dependent.h:' lines.
466fffe5102Smrg    sed -ne '2,${
467e90eff46Smrg               s/^ *//
468e90eff46Smrg               s/ \\*$//
469e90eff46Smrg               s/$/:/
470e90eff46Smrg               p
471e90eff46Smrg             }' "$tmpdepfile" >> "$depfile"
472fffe5102Smrg  else
473e90eff46Smrg    make_dummy_depfile
474fffe5102Smrg  fi
475fffe5102Smrg  rm -f "$tmpdepfile" "$tmpdepfile2"
476fffe5102Smrg  ;;
477fffe5102Smrg
47867f05d30Smrgtru64)
479e90eff46Smrg  # The Tru64 compiler uses -MD to generate dependencies as a side
480e90eff46Smrg  # effect.  'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'.
481e90eff46Smrg  # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
482e90eff46Smrg  # dependencies in 'foo.d' instead, so we check for that too.
483e90eff46Smrg  # Subdirectories are respected.
484e90eff46Smrg  set_dir_from  "$object"
485e90eff46Smrg  set_base_from "$object"
486e90eff46Smrg
487e90eff46Smrg  if test "$libtool" = yes; then
488e90eff46Smrg    # Libtool generates 2 separate objects for the 2 libraries.  These
489e90eff46Smrg    # two compilations output dependencies in $dir.libs/$base.o.d and
490e90eff46Smrg    # in $dir$base.o.d.  We have to check for both files, because
491e90eff46Smrg    # one of the two compilations can be disabled.  We should prefer
492e90eff46Smrg    # $dir$base.o.d over $dir.libs/$base.o.d because the latter is
493e90eff46Smrg    # automatically cleaned when .libs/ is deleted, while ignoring
494e90eff46Smrg    # the former would cause a distcleancheck panic.
495e90eff46Smrg    tmpdepfile1=$dir$base.o.d          # libtool 1.5
496e90eff46Smrg    tmpdepfile2=$dir.libs/$base.o.d    # Likewise.
497e90eff46Smrg    tmpdepfile3=$dir.libs/$base.d      # Compaq CCC V6.2-504
498e90eff46Smrg    "$@" -Wc,-MD
499e90eff46Smrg  else
500e90eff46Smrg    tmpdepfile1=$dir$base.d
501e90eff46Smrg    tmpdepfile2=$dir$base.d
502e90eff46Smrg    tmpdepfile3=$dir$base.d
503e90eff46Smrg    "$@" -MD
504e90eff46Smrg  fi
505e90eff46Smrg
506e90eff46Smrg  stat=$?
507e90eff46Smrg  if test $stat -ne 0; then
508e90eff46Smrg    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
509e90eff46Smrg    exit $stat
510e90eff46Smrg  fi
511e90eff46Smrg
512e90eff46Smrg  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
513e90eff46Smrg  do
514e90eff46Smrg    test -f "$tmpdepfile" && break
515e90eff46Smrg  done
516e90eff46Smrg  # Same post-processing that is required for AIX mode.
517e90eff46Smrg  aix_post_process_depfile
518e90eff46Smrg  ;;
51967f05d30Smrg
5206dbd43aaSmrgmsvc7)
5216dbd43aaSmrg  if test "$libtool" = yes; then
5226dbd43aaSmrg    showIncludes=-Wc,-showIncludes
5236dbd43aaSmrg  else
5246dbd43aaSmrg    showIncludes=-showIncludes
5256dbd43aaSmrg  fi
5266dbd43aaSmrg  "$@" $showIncludes > "$tmpdepfile"
5276dbd43aaSmrg  stat=$?
5286dbd43aaSmrg  grep -v '^Note: including file: ' "$tmpdepfile"
529e90eff46Smrg  if test $stat -ne 0; then
5306dbd43aaSmrg    rm -f "$tmpdepfile"
5316dbd43aaSmrg    exit $stat
5326dbd43aaSmrg  fi
5336dbd43aaSmrg  rm -f "$depfile"
5346dbd43aaSmrg  echo "$object : \\" > "$depfile"
5356dbd43aaSmrg  # The first sed program below extracts the file names and escapes
5366dbd43aaSmrg  # backslashes for cygpath.  The second sed program outputs the file
5376dbd43aaSmrg  # name when reading, but also accumulates all include files in the
5386dbd43aaSmrg  # hold buffer in order to output them again at the end.  This only
5396dbd43aaSmrg  # works with sed implementations that can handle large buffers.
5406dbd43aaSmrg  sed < "$tmpdepfile" -n '
5416dbd43aaSmrg/^Note: including file:  *\(.*\)/ {
5426dbd43aaSmrg  s//\1/
5436dbd43aaSmrg  s/\\/\\\\/g
5446dbd43aaSmrg  p
5456dbd43aaSmrg}' | $cygpath_u | sort -u | sed -n '
5466dbd43aaSmrgs/ /\\ /g
547e90eff46Smrgs/\(.*\)/'"$tab"'\1 \\/p
5486dbd43aaSmrgs/.\(.*\) \\/\1:/
5496dbd43aaSmrgH
5506dbd43aaSmrg$ {
551e90eff46Smrg  s/.*/'"$tab"'/
5526dbd43aaSmrg  G
5536dbd43aaSmrg  p
5546dbd43aaSmrg}' >> "$depfile"
555e90eff46Smrg  echo >> "$depfile" # make sure the fragment doesn't end with a backslash
5566dbd43aaSmrg  rm -f "$tmpdepfile"
5576dbd43aaSmrg  ;;
5586dbd43aaSmrg
5596dbd43aaSmrgmsvc7msys)
5606dbd43aaSmrg  # This case exists only to let depend.m4 do its work.  It works by
5616dbd43aaSmrg  # looking at the text of this script.  This case will never be run,
5626dbd43aaSmrg  # since it is checked for above.
5636dbd43aaSmrg  exit 1
5646dbd43aaSmrg  ;;
5656dbd43aaSmrg
56667f05d30Smrg#nosideeffect)
56767f05d30Smrg  # This comment above is used by automake to tell side-effect
56867f05d30Smrg  # dependency tracking mechanisms from slower ones.
56967f05d30Smrg
57067f05d30Smrgdashmstdout)
57167f05d30Smrg  # Important note: in order to support this mode, a compiler *must*
57267f05d30Smrg  # always write the preprocessed file to stdout, regardless of -o.
57367f05d30Smrg  "$@" || exit $?
57467f05d30Smrg
57567f05d30Smrg  # Remove the call to Libtool.
57667f05d30Smrg  if test "$libtool" = yes; then
577fffe5102Smrg    while test "X$1" != 'X--mode=compile'; do
57867f05d30Smrg      shift
57967f05d30Smrg    done
58067f05d30Smrg    shift
58167f05d30Smrg  fi
58267f05d30Smrg
583e90eff46Smrg  # Remove '-o $object'.
58467f05d30Smrg  IFS=" "
58567f05d30Smrg  for arg
58667f05d30Smrg  do
58767f05d30Smrg    case $arg in
58867f05d30Smrg    -o)
58967f05d30Smrg      shift
59067f05d30Smrg      ;;
59167f05d30Smrg    $object)
59267f05d30Smrg      shift
59367f05d30Smrg      ;;
59467f05d30Smrg    *)
59567f05d30Smrg      set fnord "$@" "$arg"
59667f05d30Smrg      shift # fnord
59767f05d30Smrg      shift # $arg
59867f05d30Smrg      ;;
59967f05d30Smrg    esac
60067f05d30Smrg  done
60167f05d30Smrg
60267f05d30Smrg  test -z "$dashmflag" && dashmflag=-M
603e90eff46Smrg  # Require at least two characters before searching for ':'
60467f05d30Smrg  # in the target name.  This is to cope with DOS-style filenames:
605e90eff46Smrg  # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise.
60667f05d30Smrg  "$@" $dashmflag |
607e90eff46Smrg    sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile"
60867f05d30Smrg  rm -f "$depfile"
60967f05d30Smrg  cat < "$tmpdepfile" > "$depfile"
610e90eff46Smrg  # Some versions of the HPUX 10.20 sed can't process this sed invocation
611e90eff46Smrg  # correctly.  Breaking it into two sed invocations is a workaround.
612e90eff46Smrg  tr ' ' "$nl" < "$tmpdepfile" \
613e90eff46Smrg    | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
614e90eff46Smrg    | sed -e 's/$/ :/' >> "$depfile"
61567f05d30Smrg  rm -f "$tmpdepfile"
61667f05d30Smrg  ;;
61767f05d30Smrg
61867f05d30SmrgdashXmstdout)
61967f05d30Smrg  # This case only exists to satisfy depend.m4.  It is never actually
62067f05d30Smrg  # run, as this mode is specially recognized in the preamble.
62167f05d30Smrg  exit 1
62267f05d30Smrg  ;;
62367f05d30Smrg
62467f05d30Smrgmakedepend)
62567f05d30Smrg  "$@" || exit $?
62667f05d30Smrg  # Remove any Libtool call
62767f05d30Smrg  if test "$libtool" = yes; then
628fffe5102Smrg    while test "X$1" != 'X--mode=compile'; do
62967f05d30Smrg      shift
63067f05d30Smrg    done
63167f05d30Smrg    shift
63267f05d30Smrg  fi
63367f05d30Smrg  # X makedepend
63467f05d30Smrg  shift
635fffe5102Smrg  cleared=no eat=no
636fffe5102Smrg  for arg
637fffe5102Smrg  do
63867f05d30Smrg    case $cleared in
63967f05d30Smrg    no)
64067f05d30Smrg      set ""; shift
64167f05d30Smrg      cleared=yes ;;
64267f05d30Smrg    esac
643fffe5102Smrg    if test $eat = yes; then
644fffe5102Smrg      eat=no
645fffe5102Smrg      continue
646fffe5102Smrg    fi
64767f05d30Smrg    case "$arg" in
64867f05d30Smrg    -D*|-I*)
64967f05d30Smrg      set fnord "$@" "$arg"; shift ;;
65067f05d30Smrg    # Strip any option that makedepend may not understand.  Remove
65167f05d30Smrg    # the object too, otherwise makedepend will parse it as a source file.
652fffe5102Smrg    -arch)
653fffe5102Smrg      eat=yes ;;
65467f05d30Smrg    -*|$object)
65567f05d30Smrg      ;;
65667f05d30Smrg    *)
65767f05d30Smrg      set fnord "$@" "$arg"; shift ;;
65867f05d30Smrg    esac
65967f05d30Smrg  done
660fffe5102Smrg  obj_suffix=`echo "$object" | sed 's/^.*\././'`
66167f05d30Smrg  touch "$tmpdepfile"
66267f05d30Smrg  ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
66367f05d30Smrg  rm -f "$depfile"
6646dbd43aaSmrg  # makedepend may prepend the VPATH from the source file name to the object.
6656dbd43aaSmrg  # No need to regex-escape $object, excess matching of '.' is harmless.
6666dbd43aaSmrg  sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile"
667e90eff46Smrg  # Some versions of the HPUX 10.20 sed can't process the last invocation
668e90eff46Smrg  # correctly.  Breaking it into two sed invocations is a workaround.
669e90eff46Smrg  sed '1,2d' "$tmpdepfile" \
670e90eff46Smrg    | tr ' ' "$nl" \
671e90eff46Smrg    | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
672e90eff46Smrg    | sed -e 's/$/ :/' >> "$depfile"
67367f05d30Smrg  rm -f "$tmpdepfile" "$tmpdepfile".bak
67467f05d30Smrg  ;;
67567f05d30Smrg
67667f05d30Smrgcpp)
67767f05d30Smrg  # Important note: in order to support this mode, a compiler *must*
67867f05d30Smrg  # always write the preprocessed file to stdout.
67967f05d30Smrg  "$@" || exit $?
68067f05d30Smrg
68167f05d30Smrg  # Remove the call to Libtool.
68267f05d30Smrg  if test "$libtool" = yes; then
683fffe5102Smrg    while test "X$1" != 'X--mode=compile'; do
68467f05d30Smrg      shift
68567f05d30Smrg    done
68667f05d30Smrg    shift
68767f05d30Smrg  fi
68867f05d30Smrg
689e90eff46Smrg  # Remove '-o $object'.
69067f05d30Smrg  IFS=" "
69167f05d30Smrg  for arg
69267f05d30Smrg  do
69367f05d30Smrg    case $arg in
69467f05d30Smrg    -o)
69567f05d30Smrg      shift
69667f05d30Smrg      ;;
69767f05d30Smrg    $object)
69867f05d30Smrg      shift
69967f05d30Smrg      ;;
70067f05d30Smrg    *)
70167f05d30Smrg      set fnord "$@" "$arg"
70267f05d30Smrg      shift # fnord
70367f05d30Smrg      shift # $arg
70467f05d30Smrg      ;;
70567f05d30Smrg    esac
70667f05d30Smrg  done
70767f05d30Smrg
708e90eff46Smrg  "$@" -E \
709e90eff46Smrg    | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
710e90eff46Smrg             -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
711e90eff46Smrg    | sed '$ s: \\$::' > "$tmpdepfile"
71267f05d30Smrg  rm -f "$depfile"
71367f05d30Smrg  echo "$object : \\" > "$depfile"
71467f05d30Smrg  cat < "$tmpdepfile" >> "$depfile"
71567f05d30Smrg  sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
71667f05d30Smrg  rm -f "$tmpdepfile"
71767f05d30Smrg  ;;
71867f05d30Smrg
71967f05d30Smrgmsvisualcpp)
72067f05d30Smrg  # Important note: in order to support this mode, a compiler *must*
721fffe5102Smrg  # always write the preprocessed file to stdout.
72267f05d30Smrg  "$@" || exit $?
723fffe5102Smrg
724fffe5102Smrg  # Remove the call to Libtool.
725fffe5102Smrg  if test "$libtool" = yes; then
726fffe5102Smrg    while test "X$1" != 'X--mode=compile'; do
727fffe5102Smrg      shift
728fffe5102Smrg    done
729fffe5102Smrg    shift
730fffe5102Smrg  fi
731fffe5102Smrg
73267f05d30Smrg  IFS=" "
73367f05d30Smrg  for arg
73467f05d30Smrg  do
73567f05d30Smrg    case "$arg" in
736fffe5102Smrg    -o)
737fffe5102Smrg      shift
738fffe5102Smrg      ;;
739fffe5102Smrg    $object)
740fffe5102Smrg      shift
741fffe5102Smrg      ;;
74267f05d30Smrg    "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
743e90eff46Smrg        set fnord "$@"
744e90eff46Smrg        shift
745e90eff46Smrg        shift
746e90eff46Smrg        ;;
74767f05d30Smrg    *)
748e90eff46Smrg        set fnord "$@" "$arg"
749e90eff46Smrg        shift
750e90eff46Smrg        shift
751e90eff46Smrg        ;;
75267f05d30Smrg    esac
75367f05d30Smrg  done
754fffe5102Smrg  "$@" -E 2>/dev/null |
755fffe5102Smrg  sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile"
75667f05d30Smrg  rm -f "$depfile"
75767f05d30Smrg  echo "$object : \\" > "$depfile"
758e90eff46Smrg  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile"
759e90eff46Smrg  echo "$tab" >> "$depfile"
760fffe5102Smrg  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile"
76167f05d30Smrg  rm -f "$tmpdepfile"
76267f05d30Smrg  ;;
76367f05d30Smrg
764fffe5102Smrgmsvcmsys)
765fffe5102Smrg  # This case exists only to let depend.m4 do its work.  It works by
766fffe5102Smrg  # looking at the text of this script.  This case will never be run,
767fffe5102Smrg  # since it is checked for above.
768fffe5102Smrg  exit 1
769fffe5102Smrg  ;;
770fffe5102Smrg
77167f05d30Smrgnone)
77267f05d30Smrg  exec "$@"
77367f05d30Smrg  ;;
77467f05d30Smrg
77567f05d30Smrg*)
77667f05d30Smrg  echo "Unknown depmode $depmode" 1>&2
77767f05d30Smrg  exit 1
77867f05d30Smrg  ;;
77967f05d30Smrgesac
78067f05d30Smrg
78167f05d30Smrgexit 0
782fffe5102Smrg
783fffe5102Smrg# Local Variables:
784fffe5102Smrg# mode: shell-script
785fffe5102Smrg# sh-indentation: 2
786051ceee6Smrg# eval: (add-hook 'before-save-hook 'time-stamp)
787fffe5102Smrg# time-stamp-start: "scriptversion="
788fffe5102Smrg# time-stamp-format: "%:y-%02m-%02d.%02H"
789051ceee6Smrg# time-stamp-time-zone: "UTC0"
790fffe5102Smrg# time-stamp-end: "; # UTC"
791fffe5102Smrg# End:
792