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