1ab47cfaaSmrg#! /bin/sh
2ab47cfaaSmrg# depcomp - compile a program generating dependencies as side-effects
3ab47cfaaSmrg
42b2b4fcbSmrgscriptversion=2018-03-07.03; # UTC
5ab47cfaaSmrg
62b2b4fcbSmrg# Copyright (C) 1999-2021 Free Software Foundation, Inc.
7ab47cfaaSmrg
8ab47cfaaSmrg# This program is free software; you can redistribute it and/or modify
9ab47cfaaSmrg# it under the terms of the GNU General Public License as published by
10ab47cfaaSmrg# the Free Software Foundation; either version 2, or (at your option)
11ab47cfaaSmrg# any later version.
12ab47cfaaSmrg
13ab47cfaaSmrg# This program is distributed in the hope that it will be useful,
14ab47cfaaSmrg# but WITHOUT ANY WARRANTY; without even the implied warranty of
15ab47cfaaSmrg# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16ab47cfaaSmrg# GNU General Public License for more details.
17ab47cfaaSmrg
18ab47cfaaSmrg# You should have received a copy of the GNU General Public License
192b2b4fcbSmrg# along with this program.  If not, see <https://www.gnu.org/licenses/>.
20ab47cfaaSmrg
21ab47cfaaSmrg# As a special exception to the GNU General Public License, if you
22ab47cfaaSmrg# distribute this file as part of a program that contains a
23ab47cfaaSmrg# configuration script generated by Autoconf, you may include it under
24ab47cfaaSmrg# the same distribution terms that you use for the rest of that program.
25ab47cfaaSmrg
26ab47cfaaSmrg# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>.
27ab47cfaaSmrg
28ab47cfaaSmrgcase $1 in
29ab47cfaaSmrg  '')
301e449e82Smrg    echo "$0: No command.  Try '$0 --help' for more information." 1>&2
311e449e82Smrg    exit 1;
321e449e82Smrg    ;;
33ab47cfaaSmrg  -h | --h*)
34ab47cfaaSmrg    cat <<\EOF
35ab47cfaaSmrgUsage: depcomp [--help] [--version] PROGRAM [ARGS]
36ab47cfaaSmrg
37ab47cfaaSmrgRun PROGRAMS ARGS to compile a file, generating dependencies
38ab47cfaaSmrgas side-effects.
39ab47cfaaSmrg
40ab47cfaaSmrgEnvironment variables:
41ab47cfaaSmrg  depmode     Dependency tracking mode.
421e449e82Smrg  source      Source file read by 'PROGRAMS ARGS'.
431e449e82Smrg  object      Object file output by 'PROGRAMS ARGS'.
44ab47cfaaSmrg  DEPDIR      directory where to store dependencies.
45ab47cfaaSmrg  depfile     Dependency file to output.
46aa9e3350Smrg  tmpdepfile  Temporary file to use when outputting dependencies.
47ab47cfaaSmrg  libtool     Whether libtool is used (yes/no).
48ab47cfaaSmrg
49ab47cfaaSmrgReport bugs to <bug-automake@gnu.org>.
50ab47cfaaSmrgEOF
51ab47cfaaSmrg    exit $?
52ab47cfaaSmrg    ;;
53ab47cfaaSmrg  -v | --v*)
54ab47cfaaSmrg    echo "depcomp $scriptversion"
55ab47cfaaSmrg    exit $?
56ab47cfaaSmrg    ;;
57ab47cfaaSmrgesac
58ab47cfaaSmrg
591e449e82Smrg# Get the directory component of the given path, and save it in the
601e449e82Smrg# global variables '$dir'.  Note that this directory component will
611e449e82Smrg# be either empty or ending with a '/' character.  This is deliberate.
621e449e82Smrgset_dir_from ()
631e449e82Smrg{
641e449e82Smrg  case $1 in
651e449e82Smrg    */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;;
661e449e82Smrg      *) dir=;;
671e449e82Smrg  esac
681e449e82Smrg}
691e449e82Smrg
701e449e82Smrg# Get the suffix-stripped basename of the given path, and save it the
711e449e82Smrg# global variable '$base'.
721e449e82Smrgset_base_from ()
731e449e82Smrg{
741e449e82Smrg  base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'`
751e449e82Smrg}
761e449e82Smrg
771e449e82Smrg# If no dependency file was actually created by the compiler invocation,
781e449e82Smrg# we still have to create a dummy depfile, to avoid errors with the
791e449e82Smrg# Makefile "include basename.Plo" scheme.
801e449e82Smrgmake_dummy_depfile ()
811e449e82Smrg{
821e449e82Smrg  echo "#dummy" > "$depfile"
831e449e82Smrg}
841e449e82Smrg
851e449e82Smrg# Factor out some common post-processing of the generated depfile.
861e449e82Smrg# Requires the auxiliary global variable '$tmpdepfile' to be set.
871e449e82Smrgaix_post_process_depfile ()
881e449e82Smrg{
891e449e82Smrg  # If the compiler actually managed to produce a dependency file,
901e449e82Smrg  # post-process it.
911e449e82Smrg  if test -f "$tmpdepfile"; then
921e449e82Smrg    # Each line is of the form 'foo.o: dependency.h'.
931e449e82Smrg    # Do two passes, one to just change these to
941e449e82Smrg    #   $object: dependency.h
951e449e82Smrg    # and one to simply output
961e449e82Smrg    #   dependency.h:
971e449e82Smrg    # which is needed to avoid the deleted-header problem.
981e449e82Smrg    { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile"
991e449e82Smrg      sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile"
1001e449e82Smrg    } > "$depfile"
1011e449e82Smrg    rm -f "$tmpdepfile"
1021e449e82Smrg  else
1031e449e82Smrg    make_dummy_depfile
1041e449e82Smrg  fi
1051e449e82Smrg}
1061e449e82Smrg
1071e449e82Smrg# A tabulation character.
1081e449e82Smrgtab='	'
1091e449e82Smrg# A newline character.
1101e449e82Smrgnl='
1111e449e82Smrg'
1121e449e82Smrg# Character ranges might be problematic outside the C locale.
1131e449e82Smrg# These definitions help.
1141e449e82Smrgupper=ABCDEFGHIJKLMNOPQRSTUVWXYZ
1151e449e82Smrglower=abcdefghijklmnopqrstuvwxyz
1161e449e82Smrgdigits=0123456789
1171e449e82Smrgalpha=${upper}${lower}
1181e449e82Smrg
119ab47cfaaSmrgif test -z "$depmode" || test -z "$source" || test -z "$object"; then
120ab47cfaaSmrg  echo "depcomp: Variables source, object and depmode must be set" 1>&2
121ab47cfaaSmrg  exit 1
122ab47cfaaSmrgfi
123ab47cfaaSmrg
124ab47cfaaSmrg# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.
125ab47cfaaSmrgdepfile=${depfile-`echo "$object" |
126ab47cfaaSmrg  sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`}
127ab47cfaaSmrgtmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
128ab47cfaaSmrg
129ab47cfaaSmrgrm -f "$tmpdepfile"
130ab47cfaaSmrg
1311e449e82Smrg# Avoid interferences from the environment.
1321e449e82Smrggccflag= dashmflag=
1331e449e82Smrg
134ab47cfaaSmrg# Some modes work just like other modes, but use different flags.  We
135ab47cfaaSmrg# parameterize here, but still list the modes in the big case below,
136ab47cfaaSmrg# to make depend.m4 easier to write.  Note that we *cannot* use a case
137ab47cfaaSmrg# here, because this file can only contain one case statement.
138ab47cfaaSmrgif test "$depmode" = hp; then
139ab47cfaaSmrg  # HP compiler uses -M and no extra arg.
140ab47cfaaSmrg  gccflag=-M
141ab47cfaaSmrg  depmode=gcc
142ab47cfaaSmrgfi
143ab47cfaaSmrg
144ab47cfaaSmrgif test "$depmode" = dashXmstdout; then
1451e449e82Smrg  # This is just like dashmstdout with a different argument.
1461e449e82Smrg  dashmflag=-xM
1471e449e82Smrg  depmode=dashmstdout
148ab47cfaaSmrgfi
149ab47cfaaSmrg
1505c42550eSmrgcygpath_u="cygpath -u -f -"
1515c42550eSmrgif test "$depmode" = msvcmsys; then
1521e449e82Smrg  # This is just like msvisualcpp but w/o cygpath translation.
1531e449e82Smrg  # Just convert the backslash-escaped backslashes to single forward
1541e449e82Smrg  # slashes to satisfy depend.m4
1551e449e82Smrg  cygpath_u='sed s,\\\\,/,g'
1561e449e82Smrg  depmode=msvisualcpp
1575c42550eSmrgfi
1585c42550eSmrg
159aa9e3350Smrgif test "$depmode" = msvc7msys; then
1601e449e82Smrg  # This is just like msvc7 but w/o cygpath translation.
1611e449e82Smrg  # Just convert the backslash-escaped backslashes to single forward
1621e449e82Smrg  # slashes to satisfy depend.m4
1631e449e82Smrg  cygpath_u='sed s,\\\\,/,g'
1641e449e82Smrg  depmode=msvc7
1651e449e82Smrgfi
1661e449e82Smrg
1671e449e82Smrgif test "$depmode" = xlc; then
1681e449e82Smrg  # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information.
1691e449e82Smrg  gccflag=-qmakedep=gcc,-MF
1701e449e82Smrg  depmode=gcc
171aa9e3350Smrgfi
172aa9e3350Smrg
173ab47cfaaSmrgcase "$depmode" in
174ab47cfaaSmrggcc3)
175ab47cfaaSmrg## gcc 3 implements dependency tracking that does exactly what
176ab47cfaaSmrg## we want.  Yay!  Note: for some reason libtool 1.4 doesn't like
177ab47cfaaSmrg## it if -MD -MP comes after the -MF stuff.  Hmm.
1788697ee19Smrg## Unfortunately, FreeBSD c89 acceptance of flags depends upon
1798697ee19Smrg## the command line argument order; so add the flags where they
1808697ee19Smrg## appear in depend2.am.  Note that the slowdown incurred here
1818697ee19Smrg## affects only configure: in makefiles, %FASTDEP% shortcuts this.
1828697ee19Smrg  for arg
1838697ee19Smrg  do
1848697ee19Smrg    case $arg in
1858697ee19Smrg    -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;;
1868697ee19Smrg    *)  set fnord "$@" "$arg" ;;
1878697ee19Smrg    esac
1888697ee19Smrg    shift # fnord
1898697ee19Smrg    shift # $arg
1908697ee19Smrg  done
1918697ee19Smrg  "$@"
192ab47cfaaSmrg  stat=$?
1931e449e82Smrg  if test $stat -ne 0; then
194ab47cfaaSmrg    rm -f "$tmpdepfile"
195ab47cfaaSmrg    exit $stat
196ab47cfaaSmrg  fi
197ab47cfaaSmrg  mv "$tmpdepfile" "$depfile"
198ab47cfaaSmrg  ;;
199ab47cfaaSmrg
200ab47cfaaSmrggcc)
2011e449e82Smrg## Note that this doesn't just cater to obsosete pre-3.x GCC compilers.
2021e449e82Smrg## but also to in-use compilers like IMB xlc/xlC and the HP C compiler.
2031e449e82Smrg## (see the conditional assignment to $gccflag above).
204ab47cfaaSmrg## There are various ways to get dependency output from gcc.  Here's
205ab47cfaaSmrg## why we pick this rather obscure method:
206ab47cfaaSmrg## - Don't want to use -MD because we'd like the dependencies to end
207ab47cfaaSmrg##   up in a subdir.  Having to rename by hand is ugly.
208ab47cfaaSmrg##   (We might end up doing this anyway to support other compilers.)
209ab47cfaaSmrg## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
2101e449e82Smrg##   -MM, not -M (despite what the docs say).  Also, it might not be
2111e449e82Smrg##   supported by the other compilers which use the 'gcc' depmode.
212ab47cfaaSmrg## - Using -M directly means running the compiler twice (even worse
213ab47cfaaSmrg##   than renaming).
214ab47cfaaSmrg  if test -z "$gccflag"; then
215ab47cfaaSmrg    gccflag=-MD,
216ab47cfaaSmrg  fi
217ab47cfaaSmrg  "$@" -Wp,"$gccflag$tmpdepfile"
218ab47cfaaSmrg  stat=$?
2191e449e82Smrg  if test $stat -ne 0; then
220ab47cfaaSmrg    rm -f "$tmpdepfile"
221ab47cfaaSmrg    exit $stat
222ab47cfaaSmrg  fi
223ab47cfaaSmrg  rm -f "$depfile"
224ab47cfaaSmrg  echo "$object : \\" > "$depfile"
2251e449e82Smrg  # The second -e expression handles DOS-style file names with drive
2261e449e82Smrg  # letters.
227ab47cfaaSmrg  sed -e 's/^[^:]*: / /' \
228ab47cfaaSmrg      -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
2291e449e82Smrg## This next piece of magic avoids the "deleted header file" problem.
230ab47cfaaSmrg## The problem is that when a header file which appears in a .P file
231ab47cfaaSmrg## is deleted, the dependency causes make to die (because there is
232ab47cfaaSmrg## typically no way to rebuild the header).  We avoid this by adding
233ab47cfaaSmrg## dummy dependencies for each header file.  Too bad gcc doesn't do
234ab47cfaaSmrg## this for us directly.
2351e449e82Smrg## Some versions of gcc put a space before the ':'.  On the theory
236ab47cfaaSmrg## that the space means something, we add a space to the output as
237aa9e3350Smrg## well.  hp depmode also adds that space, but also prefixes the VPATH
238aa9e3350Smrg## to the object.  Take care to not repeat it in the output.
239ab47cfaaSmrg## Some versions of the HPUX 10.20 sed can't process this invocation
240ab47cfaaSmrg## correctly.  Breaking it into two sed invocations is a workaround.
2411e449e82Smrg  tr ' ' "$nl" < "$tmpdepfile" \
2421e449e82Smrg    | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \
2431e449e82Smrg    | sed -e 's/$/ :/' >> "$depfile"
244ab47cfaaSmrg  rm -f "$tmpdepfile"
245ab47cfaaSmrg  ;;
246ab47cfaaSmrg
247ab47cfaaSmrghp)
248ab47cfaaSmrg  # This case exists only to let depend.m4 do its work.  It works by
249ab47cfaaSmrg  # looking at the text of this script.  This case will never be run,
250ab47cfaaSmrg  # since it is checked for above.
251ab47cfaaSmrg  exit 1
252ab47cfaaSmrg  ;;
253ab47cfaaSmrg
254ab47cfaaSmrgsgi)
255ab47cfaaSmrg  if test "$libtool" = yes; then
256ab47cfaaSmrg    "$@" "-Wp,-MDupdate,$tmpdepfile"
257ab47cfaaSmrg  else
258ab47cfaaSmrg    "$@" -MDupdate "$tmpdepfile"
259ab47cfaaSmrg  fi
260ab47cfaaSmrg  stat=$?
2611e449e82Smrg  if test $stat -ne 0; then
262ab47cfaaSmrg    rm -f "$tmpdepfile"
263ab47cfaaSmrg    exit $stat
264ab47cfaaSmrg  fi
265ab47cfaaSmrg  rm -f "$depfile"
266ab47cfaaSmrg
267ab47cfaaSmrg  if test -f "$tmpdepfile"; then  # yes, the sourcefile depend on other files
268ab47cfaaSmrg    echo "$object : \\" > "$depfile"
269ab47cfaaSmrg    # Clip off the initial element (the dependent).  Don't try to be
270ab47cfaaSmrg    # clever and replace this with sed code, as IRIX sed won't handle
271ab47cfaaSmrg    # lines with more than a fixed number of characters (4096 in
272ab47cfaaSmrg    # IRIX 6.2 sed, 8192 in IRIX 6.5).  We also remove comment lines;
2731e449e82Smrg    # the IRIX cc adds comments like '#:fec' to the end of the
274ab47cfaaSmrg    # dependency line.
2751e449e82Smrg    tr ' ' "$nl" < "$tmpdepfile" \
2761e449e82Smrg      | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \
2771e449e82Smrg      | tr "$nl" ' ' >> "$depfile"
2785c42550eSmrg    echo >> "$depfile"
279ab47cfaaSmrg    # The second pass generates a dummy entry for each header file.
2801e449e82Smrg    tr ' ' "$nl" < "$tmpdepfile" \
2811e449e82Smrg      | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
2821e449e82Smrg      >> "$depfile"
283ab47cfaaSmrg  else
2841e449e82Smrg    make_dummy_depfile
285ab47cfaaSmrg  fi
286ab47cfaaSmrg  rm -f "$tmpdepfile"
287ab47cfaaSmrg  ;;
288ab47cfaaSmrg
2891e449e82Smrgxlc)
2901e449e82Smrg  # This case exists only to let depend.m4 do its work.  It works by
2911e449e82Smrg  # looking at the text of this script.  This case will never be run,
2921e449e82Smrg  # since it is checked for above.
2931e449e82Smrg  exit 1
2941e449e82Smrg  ;;
2951e449e82Smrg
296ab47cfaaSmrgaix)
297ab47cfaaSmrg  # The C for AIX Compiler uses -M and outputs the dependencies
298ab47cfaaSmrg  # in a .u file.  In older versions, this file always lives in the
2991e449e82Smrg  # current directory.  Also, the AIX compiler puts '$object:' at the
300ab47cfaaSmrg  # start of each line; $object doesn't have directory information.
301ab47cfaaSmrg  # Version 6 uses the directory in both cases.
3021e449e82Smrg  set_dir_from "$object"
3031e449e82Smrg  set_base_from "$object"
304ab47cfaaSmrg  if test "$libtool" = yes; then
3051473d951Smrg    tmpdepfile1=$dir$base.u
3061473d951Smrg    tmpdepfile2=$base.u
3071473d951Smrg    tmpdepfile3=$dir.libs/$base.u
308ab47cfaaSmrg    "$@" -Wc,-M
309ab47cfaaSmrg  else
3101473d951Smrg    tmpdepfile1=$dir$base.u
3111473d951Smrg    tmpdepfile2=$dir$base.u
3121473d951Smrg    tmpdepfile3=$dir$base.u
313ab47cfaaSmrg    "$@" -M
314ab47cfaaSmrg  fi
315ab47cfaaSmrg  stat=$?
3161e449e82Smrg  if test $stat -ne 0; then
3171473d951Smrg    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
318ab47cfaaSmrg    exit $stat
319ab47cfaaSmrg  fi
320ab47cfaaSmrg
3211473d951Smrg  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
3221473d951Smrg  do
3231473d951Smrg    test -f "$tmpdepfile" && break
3241473d951Smrg  done
3251e449e82Smrg  aix_post_process_depfile
3261e449e82Smrg  ;;
3271e449e82Smrg
3281e449e82Smrgtcc)
3291e449e82Smrg  # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26
3301e449e82Smrg  # FIXME: That version still under development at the moment of writing.
3311e449e82Smrg  #        Make that this statement remains true also for stable, released
3321e449e82Smrg  #        versions.
3331e449e82Smrg  # It will wrap lines (doesn't matter whether long or short) with a
3341e449e82Smrg  # trailing '\', as in:
3351e449e82Smrg  #
3361e449e82Smrg  #   foo.o : \
3371e449e82Smrg  #    foo.c \
3381e449e82Smrg  #    foo.h \
3391e449e82Smrg  #
3401e449e82Smrg  # It will put a trailing '\' even on the last line, and will use leading
3411e449e82Smrg  # spaces rather than leading tabs (at least since its commit 0394caf7
3421e449e82Smrg  # "Emit spaces for -MD").
3431e449e82Smrg  "$@" -MD -MF "$tmpdepfile"
3441e449e82Smrg  stat=$?
3451e449e82Smrg  if test $stat -ne 0; then
3461e449e82Smrg    rm -f "$tmpdepfile"
3471e449e82Smrg    exit $stat
348ab47cfaaSmrg  fi
3491e449e82Smrg  rm -f "$depfile"
3501e449e82Smrg  # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'.
3511e449e82Smrg  # We have to change lines of the first kind to '$object: \'.
3521e449e82Smrg  sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile"
3531e449e82Smrg  # And for each line of the second kind, we have to emit a 'dep.h:'
3541e449e82Smrg  # dummy dependency, to avoid the deleted-header problem.
3551e449e82Smrg  sed -n -e 's|^  *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile"
356ab47cfaaSmrg  rm -f "$tmpdepfile"
357ab47cfaaSmrg  ;;
358ab47cfaaSmrg
3591e449e82Smrg## The order of this option in the case statement is important, since the
3601e449e82Smrg## shell code in configure will try each of these formats in the order
3611e449e82Smrg## listed in this file.  A plain '-MD' option would be understood by many
3621e449e82Smrg## compilers, so we must ensure this comes after the gcc and icc options.
3631e449e82Smrgpgcc)
3641e449e82Smrg  # Portland's C compiler understands '-MD'.
3651e449e82Smrg  # Will always output deps to 'file.d' where file is the root name of the
3661e449e82Smrg  # source file under compilation, even if file resides in a subdirectory.
3671e449e82Smrg  # The object file name does not affect the name of the '.d' file.
3681e449e82Smrg  # pgcc 10.2 will output
369ab47cfaaSmrg  #    foo.o: sub/foo.c sub/foo.h
3701e449e82Smrg  # and will wrap long lines using '\' :
371ab47cfaaSmrg  #    foo.o: sub/foo.c ... \
372ab47cfaaSmrg  #     sub/foo.h ... \
373ab47cfaaSmrg  #     ...
3741e449e82Smrg  set_dir_from "$object"
3751e449e82Smrg  # Use the source, not the object, to determine the base name, since
3761e449e82Smrg  # that's sadly what pgcc will do too.
3771e449e82Smrg  set_base_from "$source"
3781e449e82Smrg  tmpdepfile=$base.d
3791e449e82Smrg
3801e449e82Smrg  # For projects that build the same source file twice into different object
3811e449e82Smrg  # files, the pgcc approach of using the *source* file root name can cause
3821e449e82Smrg  # problems in parallel builds.  Use a locking strategy to avoid stomping on
3831e449e82Smrg  # the same $tmpdepfile.
3841e449e82Smrg  lockdir=$base.d-lock
3851e449e82Smrg  trap "
3861e449e82Smrg    echo '$0: caught signal, cleaning up...' >&2
3871e449e82Smrg    rmdir '$lockdir'
3881e449e82Smrg    exit 1
3891e449e82Smrg  " 1 2 13 15
3901e449e82Smrg  numtries=100
3911e449e82Smrg  i=$numtries
3921e449e82Smrg  while test $i -gt 0; do
3931e449e82Smrg    # mkdir is a portable test-and-set.
3941e449e82Smrg    if mkdir "$lockdir" 2>/dev/null; then
3951e449e82Smrg      # This process acquired the lock.
3961e449e82Smrg      "$@" -MD
3971e449e82Smrg      stat=$?
3981e449e82Smrg      # Release the lock.
3991e449e82Smrg      rmdir "$lockdir"
4001e449e82Smrg      break
4011e449e82Smrg    else
4021e449e82Smrg      # If the lock is being held by a different process, wait
4031e449e82Smrg      # until the winning process is done or we timeout.
4041e449e82Smrg      while test -d "$lockdir" && test $i -gt 0; do
4051e449e82Smrg        sleep 1
4061e449e82Smrg        i=`expr $i - 1`
4071e449e82Smrg      done
4081e449e82Smrg    fi
4091e449e82Smrg    i=`expr $i - 1`
4101e449e82Smrg  done
4111e449e82Smrg  trap - 1 2 13 15
4121e449e82Smrg  if test $i -le 0; then
4131e449e82Smrg    echo "$0: failed to acquire lock after $numtries attempts" >&2
4141e449e82Smrg    echo "$0: check lockdir '$lockdir'" >&2
4151e449e82Smrg    exit 1
4161e449e82Smrg  fi
417ab47cfaaSmrg
4181e449e82Smrg  if test $stat -ne 0; then
419ab47cfaaSmrg    rm -f "$tmpdepfile"
420ab47cfaaSmrg    exit $stat
421ab47cfaaSmrg  fi
422ab47cfaaSmrg  rm -f "$depfile"
423ab47cfaaSmrg  # Each line is of the form `foo.o: dependent.h',
424ab47cfaaSmrg  # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'.
425ab47cfaaSmrg  # Do two passes, one to just change these to
426ab47cfaaSmrg  # `$object: dependent.h' and one to simply `dependent.h:'.
427ab47cfaaSmrg  sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
428ab47cfaaSmrg  # Some versions of the HPUX 10.20 sed can't process this invocation
429ab47cfaaSmrg  # correctly.  Breaking it into two sed invocations is a workaround.
4301e449e82Smrg  sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \
4311e449e82Smrg    | sed -e 's/$/ :/' >> "$depfile"
432ab47cfaaSmrg  rm -f "$tmpdepfile"
433ab47cfaaSmrg  ;;
434ab47cfaaSmrg
4358697ee19Smrghp2)
4368697ee19Smrg  # The "hp" stanza above does not work with aCC (C++) and HP's ia64
4378697ee19Smrg  # compilers, which have integrated preprocessors.  The correct option
4388697ee19Smrg  # to use with these is +Maked; it writes dependencies to a file named
4398697ee19Smrg  # 'foo.d', which lands next to the object file, wherever that
4408697ee19Smrg  # happens to be.
4418697ee19Smrg  # Much of this is similar to the tru64 case; see comments there.
4421e449e82Smrg  set_dir_from  "$object"
4431e449e82Smrg  set_base_from "$object"
4448697ee19Smrg  if test "$libtool" = yes; then
4458697ee19Smrg    tmpdepfile1=$dir$base.d
4468697ee19Smrg    tmpdepfile2=$dir.libs/$base.d
4478697ee19Smrg    "$@" -Wc,+Maked
4488697ee19Smrg  else
4498697ee19Smrg    tmpdepfile1=$dir$base.d
4508697ee19Smrg    tmpdepfile2=$dir$base.d
4518697ee19Smrg    "$@" +Maked
4528697ee19Smrg  fi
4538697ee19Smrg  stat=$?
4541e449e82Smrg  if test $stat -ne 0; then
4558697ee19Smrg     rm -f "$tmpdepfile1" "$tmpdepfile2"
4568697ee19Smrg     exit $stat
4578697ee19Smrg  fi
4588697ee19Smrg
4598697ee19Smrg  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2"
4608697ee19Smrg  do
4618697ee19Smrg    test -f "$tmpdepfile" && break
4628697ee19Smrg  done
4638697ee19Smrg  if test -f "$tmpdepfile"; then
4641e449e82Smrg    sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile"
4651e449e82Smrg    # Add 'dependent.h:' lines.
4665c42550eSmrg    sed -ne '2,${
4671e449e82Smrg               s/^ *//
4681e449e82Smrg               s/ \\*$//
4691e449e82Smrg               s/$/:/
4701e449e82Smrg               p
4711e449e82Smrg             }' "$tmpdepfile" >> "$depfile"
4728697ee19Smrg  else
4731e449e82Smrg    make_dummy_depfile
4748697ee19Smrg  fi
4758697ee19Smrg  rm -f "$tmpdepfile" "$tmpdepfile2"
4768697ee19Smrg  ;;
4778697ee19Smrg
478ab47cfaaSmrgtru64)
4791e449e82Smrg  # The Tru64 compiler uses -MD to generate dependencies as a side
4801e449e82Smrg  # effect.  'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'.
4811e449e82Smrg  # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
4821e449e82Smrg  # dependencies in 'foo.d' instead, so we check for that too.
4831e449e82Smrg  # Subdirectories are respected.
4841e449e82Smrg  set_dir_from  "$object"
4851e449e82Smrg  set_base_from "$object"
4861e449e82Smrg
4871e449e82Smrg  if test "$libtool" = yes; then
4881e449e82Smrg    # Libtool generates 2 separate objects for the 2 libraries.  These
4891e449e82Smrg    # two compilations output dependencies in $dir.libs/$base.o.d and
4901e449e82Smrg    # in $dir$base.o.d.  We have to check for both files, because
4911e449e82Smrg    # one of the two compilations can be disabled.  We should prefer
4921e449e82Smrg    # $dir$base.o.d over $dir.libs/$base.o.d because the latter is
4931e449e82Smrg    # automatically cleaned when .libs/ is deleted, while ignoring
4941e449e82Smrg    # the former would cause a distcleancheck panic.
4951e449e82Smrg    tmpdepfile1=$dir$base.o.d          # libtool 1.5
4961e449e82Smrg    tmpdepfile2=$dir.libs/$base.o.d    # Likewise.
4971e449e82Smrg    tmpdepfile3=$dir.libs/$base.d      # Compaq CCC V6.2-504
4981e449e82Smrg    "$@" -Wc,-MD
4991e449e82Smrg  else
5001e449e82Smrg    tmpdepfile1=$dir$base.d
5011e449e82Smrg    tmpdepfile2=$dir$base.d
5021e449e82Smrg    tmpdepfile3=$dir$base.d
5031e449e82Smrg    "$@" -MD
5041e449e82Smrg  fi
5051e449e82Smrg
5061e449e82Smrg  stat=$?
5071e449e82Smrg  if test $stat -ne 0; then
5081e449e82Smrg    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
5091e449e82Smrg    exit $stat
5101e449e82Smrg  fi
5111e449e82Smrg
5121e449e82Smrg  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
5131e449e82Smrg  do
5141e449e82Smrg    test -f "$tmpdepfile" && break
5151e449e82Smrg  done
5161e449e82Smrg  # Same post-processing that is required for AIX mode.
5171e449e82Smrg  aix_post_process_depfile
5181e449e82Smrg  ;;
519ab47cfaaSmrg
520aa9e3350Smrgmsvc7)
521aa9e3350Smrg  if test "$libtool" = yes; then
522aa9e3350Smrg    showIncludes=-Wc,-showIncludes
523aa9e3350Smrg  else
524aa9e3350Smrg    showIncludes=-showIncludes
525aa9e3350Smrg  fi
526aa9e3350Smrg  "$@" $showIncludes > "$tmpdepfile"
527aa9e3350Smrg  stat=$?
528aa9e3350Smrg  grep -v '^Note: including file: ' "$tmpdepfile"
5291e449e82Smrg  if test $stat -ne 0; then
530aa9e3350Smrg    rm -f "$tmpdepfile"
531aa9e3350Smrg    exit $stat
532aa9e3350Smrg  fi
533aa9e3350Smrg  rm -f "$depfile"
534aa9e3350Smrg  echo "$object : \\" > "$depfile"
535aa9e3350Smrg  # The first sed program below extracts the file names and escapes
536aa9e3350Smrg  # backslashes for cygpath.  The second sed program outputs the file
537aa9e3350Smrg  # name when reading, but also accumulates all include files in the
538aa9e3350Smrg  # hold buffer in order to output them again at the end.  This only
539aa9e3350Smrg  # works with sed implementations that can handle large buffers.
540aa9e3350Smrg  sed < "$tmpdepfile" -n '
541aa9e3350Smrg/^Note: including file:  *\(.*\)/ {
542aa9e3350Smrg  s//\1/
543aa9e3350Smrg  s/\\/\\\\/g
544aa9e3350Smrg  p
545aa9e3350Smrg}' | $cygpath_u | sort -u | sed -n '
546aa9e3350Smrgs/ /\\ /g
5471e449e82Smrgs/\(.*\)/'"$tab"'\1 \\/p
548aa9e3350Smrgs/.\(.*\) \\/\1:/
549aa9e3350SmrgH
550aa9e3350Smrg$ {
5511e449e82Smrg  s/.*/'"$tab"'/
552aa9e3350Smrg  G
553aa9e3350Smrg  p
554aa9e3350Smrg}' >> "$depfile"
5551e449e82Smrg  echo >> "$depfile" # make sure the fragment doesn't end with a backslash
556aa9e3350Smrg  rm -f "$tmpdepfile"
557aa9e3350Smrg  ;;
558aa9e3350Smrg
559aa9e3350Smrgmsvc7msys)
560aa9e3350Smrg  # This case exists only to let depend.m4 do its work.  It works by
561aa9e3350Smrg  # looking at the text of this script.  This case will never be run,
562aa9e3350Smrg  # since it is checked for above.
563aa9e3350Smrg  exit 1
564aa9e3350Smrg  ;;
565aa9e3350Smrg
566ab47cfaaSmrg#nosideeffect)
567ab47cfaaSmrg  # This comment above is used by automake to tell side-effect
568ab47cfaaSmrg  # dependency tracking mechanisms from slower ones.
569ab47cfaaSmrg
570ab47cfaaSmrgdashmstdout)
571ab47cfaaSmrg  # Important note: in order to support this mode, a compiler *must*
572ab47cfaaSmrg  # always write the preprocessed file to stdout, regardless of -o.
573ab47cfaaSmrg  "$@" || exit $?
574ab47cfaaSmrg
575ab47cfaaSmrg  # Remove the call to Libtool.
576ab47cfaaSmrg  if test "$libtool" = yes; then
5775c42550eSmrg    while test "X$1" != 'X--mode=compile'; do
578ab47cfaaSmrg      shift
579ab47cfaaSmrg    done
580ab47cfaaSmrg    shift
581ab47cfaaSmrg  fi
582ab47cfaaSmrg
5831e449e82Smrg  # Remove '-o $object'.
584ab47cfaaSmrg  IFS=" "
585ab47cfaaSmrg  for arg
586ab47cfaaSmrg  do
587ab47cfaaSmrg    case $arg in
588ab47cfaaSmrg    -o)
589ab47cfaaSmrg      shift
590ab47cfaaSmrg      ;;
591ab47cfaaSmrg    $object)
592ab47cfaaSmrg      shift
593ab47cfaaSmrg      ;;
594ab47cfaaSmrg    *)
595ab47cfaaSmrg      set fnord "$@" "$arg"
596ab47cfaaSmrg      shift # fnord
597ab47cfaaSmrg      shift # $arg
598ab47cfaaSmrg      ;;
599ab47cfaaSmrg    esac
600ab47cfaaSmrg  done
601ab47cfaaSmrg
602ab47cfaaSmrg  test -z "$dashmflag" && dashmflag=-M
6031e449e82Smrg  # Require at least two characters before searching for ':'
604ab47cfaaSmrg  # in the target name.  This is to cope with DOS-style filenames:
6051e449e82Smrg  # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise.
606ab47cfaaSmrg  "$@" $dashmflag |
6071e449e82Smrg    sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile"
608ab47cfaaSmrg  rm -f "$depfile"
609ab47cfaaSmrg  cat < "$tmpdepfile" > "$depfile"
6101e449e82Smrg  # Some versions of the HPUX 10.20 sed can't process this sed invocation
6111e449e82Smrg  # correctly.  Breaking it into two sed invocations is a workaround.
6121e449e82Smrg  tr ' ' "$nl" < "$tmpdepfile" \
6131e449e82Smrg    | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
6141e449e82Smrg    | sed -e 's/$/ :/' >> "$depfile"
615ab47cfaaSmrg  rm -f "$tmpdepfile"
616ab47cfaaSmrg  ;;
617ab47cfaaSmrg
618ab47cfaaSmrgdashXmstdout)
619ab47cfaaSmrg  # This case only exists to satisfy depend.m4.  It is never actually
620ab47cfaaSmrg  # run, as this mode is specially recognized in the preamble.
621ab47cfaaSmrg  exit 1
622ab47cfaaSmrg  ;;
623ab47cfaaSmrg
624ab47cfaaSmrgmakedepend)
625ab47cfaaSmrg  "$@" || exit $?
626ab47cfaaSmrg  # Remove any Libtool call
627ab47cfaaSmrg  if test "$libtool" = yes; then
6285c42550eSmrg    while test "X$1" != 'X--mode=compile'; do
629ab47cfaaSmrg      shift
630ab47cfaaSmrg    done
631ab47cfaaSmrg    shift
632ab47cfaaSmrg  fi
633ab47cfaaSmrg  # X makedepend
634ab47cfaaSmrg  shift
6355c42550eSmrg  cleared=no eat=no
6365c42550eSmrg  for arg
6375c42550eSmrg  do
638ab47cfaaSmrg    case $cleared in
639ab47cfaaSmrg    no)
640ab47cfaaSmrg      set ""; shift
641ab47cfaaSmrg      cleared=yes ;;
642ab47cfaaSmrg    esac
6435c42550eSmrg    if test $eat = yes; then
6445c42550eSmrg      eat=no
6455c42550eSmrg      continue
6465c42550eSmrg    fi
647ab47cfaaSmrg    case "$arg" in
648ab47cfaaSmrg    -D*|-I*)
649ab47cfaaSmrg      set fnord "$@" "$arg"; shift ;;
650ab47cfaaSmrg    # Strip any option that makedepend may not understand.  Remove
651ab47cfaaSmrg    # the object too, otherwise makedepend will parse it as a source file.
6525c42550eSmrg    -arch)
6535c42550eSmrg      eat=yes ;;
654ab47cfaaSmrg    -*|$object)
655ab47cfaaSmrg      ;;
656ab47cfaaSmrg    *)
657ab47cfaaSmrg      set fnord "$@" "$arg"; shift ;;
658ab47cfaaSmrg    esac
659ab47cfaaSmrg  done
6605c42550eSmrg  obj_suffix=`echo "$object" | sed 's/^.*\././'`
661ab47cfaaSmrg  touch "$tmpdepfile"
662ab47cfaaSmrg  ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
663ab47cfaaSmrg  rm -f "$depfile"
664aa9e3350Smrg  # makedepend may prepend the VPATH from the source file name to the object.
665aa9e3350Smrg  # No need to regex-escape $object, excess matching of '.' is harmless.
666aa9e3350Smrg  sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile"
6671e449e82Smrg  # Some versions of the HPUX 10.20 sed can't process the last invocation
6681e449e82Smrg  # correctly.  Breaking it into two sed invocations is a workaround.
6691e449e82Smrg  sed '1,2d' "$tmpdepfile" \
6701e449e82Smrg    | tr ' ' "$nl" \
6711e449e82Smrg    | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
6721e449e82Smrg    | sed -e 's/$/ :/' >> "$depfile"
673ab47cfaaSmrg  rm -f "$tmpdepfile" "$tmpdepfile".bak
674ab47cfaaSmrg  ;;
675ab47cfaaSmrg
676ab47cfaaSmrgcpp)
677ab47cfaaSmrg  # Important note: in order to support this mode, a compiler *must*
678ab47cfaaSmrg  # always write the preprocessed file to stdout.
679ab47cfaaSmrg  "$@" || exit $?
680ab47cfaaSmrg
681ab47cfaaSmrg  # Remove the call to Libtool.
682ab47cfaaSmrg  if test "$libtool" = yes; then
6835c42550eSmrg    while test "X$1" != 'X--mode=compile'; do
684ab47cfaaSmrg      shift
685ab47cfaaSmrg    done
686ab47cfaaSmrg    shift
687ab47cfaaSmrg  fi
688ab47cfaaSmrg
6891e449e82Smrg  # Remove '-o $object'.
690ab47cfaaSmrg  IFS=" "
691ab47cfaaSmrg  for arg
692ab47cfaaSmrg  do
693ab47cfaaSmrg    case $arg in
694ab47cfaaSmrg    -o)
695ab47cfaaSmrg      shift
696ab47cfaaSmrg      ;;
697ab47cfaaSmrg    $object)
698ab47cfaaSmrg      shift
699ab47cfaaSmrg      ;;
700ab47cfaaSmrg    *)
701ab47cfaaSmrg      set fnord "$@" "$arg"
702ab47cfaaSmrg      shift # fnord
703ab47cfaaSmrg      shift # $arg
704ab47cfaaSmrg      ;;
705ab47cfaaSmrg    esac
706ab47cfaaSmrg  done
707ab47cfaaSmrg
7081e449e82Smrg  "$@" -E \
7091e449e82Smrg    | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
7101e449e82Smrg             -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
7111e449e82Smrg    | sed '$ s: \\$::' > "$tmpdepfile"
712ab47cfaaSmrg  rm -f "$depfile"
713ab47cfaaSmrg  echo "$object : \\" > "$depfile"
714ab47cfaaSmrg  cat < "$tmpdepfile" >> "$depfile"
715ab47cfaaSmrg  sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
716ab47cfaaSmrg  rm -f "$tmpdepfile"
717ab47cfaaSmrg  ;;
718ab47cfaaSmrg
719ab47cfaaSmrgmsvisualcpp)
720ab47cfaaSmrg  # Important note: in order to support this mode, a compiler *must*
7215c42550eSmrg  # always write the preprocessed file to stdout.
722ab47cfaaSmrg  "$@" || exit $?
7235c42550eSmrg
7245c42550eSmrg  # Remove the call to Libtool.
7255c42550eSmrg  if test "$libtool" = yes; then
7265c42550eSmrg    while test "X$1" != 'X--mode=compile'; do
7275c42550eSmrg      shift
7285c42550eSmrg    done
7295c42550eSmrg    shift
7305c42550eSmrg  fi
7315c42550eSmrg
732ab47cfaaSmrg  IFS=" "
733ab47cfaaSmrg  for arg
734ab47cfaaSmrg  do
735ab47cfaaSmrg    case "$arg" in
7365c42550eSmrg    -o)
7375c42550eSmrg      shift
7385c42550eSmrg      ;;
7395c42550eSmrg    $object)
7405c42550eSmrg      shift
7415c42550eSmrg      ;;
742ab47cfaaSmrg    "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
7431e449e82Smrg        set fnord "$@"
7441e449e82Smrg        shift
7451e449e82Smrg        shift
7461e449e82Smrg        ;;
747ab47cfaaSmrg    *)
7481e449e82Smrg        set fnord "$@" "$arg"
7491e449e82Smrg        shift
7501e449e82Smrg        shift
7511e449e82Smrg        ;;
752ab47cfaaSmrg    esac
753ab47cfaaSmrg  done
7545c42550eSmrg  "$@" -E 2>/dev/null |
7555c42550eSmrg  sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile"
756ab47cfaaSmrg  rm -f "$depfile"
757ab47cfaaSmrg  echo "$object : \\" > "$depfile"
7581e449e82Smrg  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile"
7591e449e82Smrg  echo "$tab" >> "$depfile"
7605c42550eSmrg  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile"
761ab47cfaaSmrg  rm -f "$tmpdepfile"
762ab47cfaaSmrg  ;;
763ab47cfaaSmrg
7645c42550eSmrgmsvcmsys)
7655c42550eSmrg  # This case exists only to let depend.m4 do its work.  It works by
7665c42550eSmrg  # looking at the text of this script.  This case will never be run,
7675c42550eSmrg  # since it is checked for above.
7685c42550eSmrg  exit 1
7695c42550eSmrg  ;;
7705c42550eSmrg
771ab47cfaaSmrgnone)
772ab47cfaaSmrg  exec "$@"
773ab47cfaaSmrg  ;;
774ab47cfaaSmrg
775ab47cfaaSmrg*)
776ab47cfaaSmrg  echo "Unknown depmode $depmode" 1>&2
777ab47cfaaSmrg  exit 1
778ab47cfaaSmrg  ;;
779ab47cfaaSmrgesac
780ab47cfaaSmrg
781ab47cfaaSmrgexit 0
782ab47cfaaSmrg
783ab47cfaaSmrg# Local Variables:
784ab47cfaaSmrg# mode: shell-script
785ab47cfaaSmrg# sh-indentation: 2
7862b2b4fcbSmrg# eval: (add-hook 'before-save-hook 'time-stamp)
787ab47cfaaSmrg# time-stamp-start: "scriptversion="
788ab47cfaaSmrg# time-stamp-format: "%:y-%02m-%02d.%02H"
7892b2b4fcbSmrg# time-stamp-time-zone: "UTC0"
7905c42550eSmrg# time-stamp-end: "; # UTC"
791ab47cfaaSmrg# End:
792