13da7aff1Smrg#! /bin/sh
23da7aff1Smrg# depcomp - compile a program generating dependencies as side-effects
3e531b1a7Smrg
41e42c052Smrgscriptversion=2024-06-19.01; # UTC
5e531b1a7Smrg
61e42c052Smrg# Copyright (C) 1999-2024 Free Software Foundation, Inc.
73da7aff1Smrg
83da7aff1Smrg# This program is free software; you can redistribute it and/or modify
93da7aff1Smrg# it under the terms of the GNU General Public License as published by
103da7aff1Smrg# the Free Software Foundation; either version 2, or (at your option)
113da7aff1Smrg# any later version.
123da7aff1Smrg
133da7aff1Smrg# This program is distributed in the hope that it will be useful,
143da7aff1Smrg# but WITHOUT ANY WARRANTY; without even the implied warranty of
153da7aff1Smrg# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
163da7aff1Smrg# GNU General Public License for more details.
173da7aff1Smrg
183da7aff1Smrg# You should have received a copy of the GNU General Public License
193a99fc18Smrg# along with this program.  If not, see <https://www.gnu.org/licenses/>.
203da7aff1Smrg
213da7aff1Smrg# As a special exception to the GNU General Public License, if you
223da7aff1Smrg# distribute this file as part of a program that contains a
233da7aff1Smrg# configuration script generated by Autoconf, you may include it under
243da7aff1Smrg# the same distribution terms that you use for the rest of that program.
253da7aff1Smrg
263da7aff1Smrg# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>.
273da7aff1Smrg
28e531b1a7Smrgcase $1 in
29e531b1a7Smrg  '')
303e999d35Smrg    echo "$0: No command.  Try '$0 --help' for more information." 1>&2
313e999d35Smrg    exit 1;
323e999d35Smrg    ;;
33e531b1a7Smrg  -h | --h*)
34e531b1a7Smrg    cat <<\EOF
35e531b1a7SmrgUsage: depcomp [--help] [--version] PROGRAM [ARGS]
36e531b1a7Smrg
37e531b1a7SmrgRun PROGRAMS ARGS to compile a file, generating dependencies
38e531b1a7Smrgas side-effects.
39e531b1a7Smrg
40e531b1a7SmrgEnvironment variables:
41e531b1a7Smrg  depmode     Dependency tracking mode.
423e999d35Smrg  source      Source file read by 'PROGRAMS ARGS'.
433e999d35Smrg  object      Object file output by 'PROGRAMS ARGS'.
44e531b1a7Smrg  DEPDIR      directory where to store dependencies.
45e531b1a7Smrg  depfile     Dependency file to output.
463e999d35Smrg  tmpdepfile  Temporary file to use when outputting dependencies.
47e531b1a7Smrg  libtool     Whether libtool is used (yes/no).
48e531b1a7Smrg
49e531b1a7SmrgReport bugs to <bug-automake@gnu.org>.
501e42c052SmrgGNU Automake home page: <https://www.gnu.org/software/automake/>.
511e42c052SmrgGeneral help using GNU software: <https://www.gnu.org/gethelp/>.
52e531b1a7SmrgEOF
53e531b1a7Smrg    exit $?
54e531b1a7Smrg    ;;
55e531b1a7Smrg  -v | --v*)
561e42c052Smrg    echo "depcomp (GNU Automake) $scriptversion"
57e531b1a7Smrg    exit $?
58e531b1a7Smrg    ;;
59e531b1a7Smrgesac
60e531b1a7Smrg
613e999d35Smrg# Get the directory component of the given path, and save it in the
623e999d35Smrg# global variables '$dir'.  Note that this directory component will
633e999d35Smrg# be either empty or ending with a '/' character.  This is deliberate.
643e999d35Smrgset_dir_from ()
653e999d35Smrg{
663e999d35Smrg  case $1 in
673e999d35Smrg    */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;;
683e999d35Smrg      *) dir=;;
693e999d35Smrg  esac
703e999d35Smrg}
713e999d35Smrg
723e999d35Smrg# Get the suffix-stripped basename of the given path, and save it the
733e999d35Smrg# global variable '$base'.
743e999d35Smrgset_base_from ()
753e999d35Smrg{
763e999d35Smrg  base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'`
773e999d35Smrg}
783e999d35Smrg
793e999d35Smrg# If no dependency file was actually created by the compiler invocation,
803e999d35Smrg# we still have to create a dummy depfile, to avoid errors with the
813e999d35Smrg# Makefile "include basename.Plo" scheme.
823e999d35Smrgmake_dummy_depfile ()
833e999d35Smrg{
843e999d35Smrg  echo "#dummy" > "$depfile"
853e999d35Smrg}
863e999d35Smrg
873e999d35Smrg# Factor out some common post-processing of the generated depfile.
883e999d35Smrg# Requires the auxiliary global variable '$tmpdepfile' to be set.
893e999d35Smrgaix_post_process_depfile ()
903e999d35Smrg{
913e999d35Smrg  # If the compiler actually managed to produce a dependency file,
923e999d35Smrg  # post-process it.
933e999d35Smrg  if test -f "$tmpdepfile"; then
943e999d35Smrg    # Each line is of the form 'foo.o: dependency.h'.
953e999d35Smrg    # Do two passes, one to just change these to
963e999d35Smrg    #   $object: dependency.h
973e999d35Smrg    # and one to simply output
983e999d35Smrg    #   dependency.h:
993e999d35Smrg    # which is needed to avoid the deleted-header problem.
1003e999d35Smrg    { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile"
1013e999d35Smrg      sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile"
1023e999d35Smrg    } > "$depfile"
1033e999d35Smrg    rm -f "$tmpdepfile"
1043e999d35Smrg  else
1053e999d35Smrg    make_dummy_depfile
1063e999d35Smrg  fi
1073e999d35Smrg}
1083e999d35Smrg
1093e999d35Smrg# A tabulation character.
1103e999d35Smrgtab='	'
1113e999d35Smrg# A newline character.
1123e999d35Smrgnl='
1133e999d35Smrg'
1143e999d35Smrg# Character ranges might be problematic outside the C locale.
1153e999d35Smrg# These definitions help.
1163e999d35Smrgupper=ABCDEFGHIJKLMNOPQRSTUVWXYZ
1173e999d35Smrglower=abcdefghijklmnopqrstuvwxyz
1183e999d35Smrgalpha=${upper}${lower}
1193e999d35Smrg
1203da7aff1Smrgif test -z "$depmode" || test -z "$source" || test -z "$object"; then
1213da7aff1Smrg  echo "depcomp: Variables source, object and depmode must be set" 1>&2
1223da7aff1Smrg  exit 1
1233da7aff1Smrgfi
1243da7aff1Smrg
125e531b1a7Smrg# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.
126e531b1a7Smrgdepfile=${depfile-`echo "$object" |
127e531b1a7Smrg  sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`}
1283da7aff1Smrgtmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
1293da7aff1Smrg
1303da7aff1Smrgrm -f "$tmpdepfile"
1313da7aff1Smrg
1321e42c052Smrg# Avoid interference from the environment.
1333e999d35Smrggccflag= dashmflag=
1343e999d35Smrg
1353da7aff1Smrg# Some modes work just like other modes, but use different flags.  We
1363da7aff1Smrg# parameterize here, but still list the modes in the big case below,
1373da7aff1Smrg# to make depend.m4 easier to write.  Note that we *cannot* use a case
1383da7aff1Smrg# here, because this file can only contain one case statement.
1393da7aff1Smrgif test "$depmode" = hp; then
1403da7aff1Smrg  # HP compiler uses -M and no extra arg.
1413da7aff1Smrg  gccflag=-M
1423da7aff1Smrg  depmode=gcc
1433da7aff1Smrgfi
1443da7aff1Smrg
1453da7aff1Smrgif test "$depmode" = dashXmstdout; then
1463e999d35Smrg  # This is just like dashmstdout with a different argument.
1473e999d35Smrg  dashmflag=-xM
1483e999d35Smrg  depmode=dashmstdout
1493da7aff1Smrgfi
1503da7aff1Smrg
151e531b1a7Smrgcygpath_u="cygpath -u -f -"
152e531b1a7Smrgif test "$depmode" = msvcmsys; then
1533e999d35Smrg  # This is just like msvisualcpp but w/o cygpath translation.
1543e999d35Smrg  # Just convert the backslash-escaped backslashes to single forward
1553e999d35Smrg  # slashes to satisfy depend.m4
1563e999d35Smrg  cygpath_u='sed s,\\\\,/,g'
1573e999d35Smrg  depmode=msvisualcpp
1583e999d35Smrgfi
1593e999d35Smrg
1603e999d35Smrgif test "$depmode" = msvc7msys; then
1613e999d35Smrg  # This is just like msvc7 but w/o cygpath translation.
1623e999d35Smrg  # Just convert the backslash-escaped backslashes to single forward
1633e999d35Smrg  # slashes to satisfy depend.m4
1643e999d35Smrg  cygpath_u='sed s,\\\\,/,g'
1653e999d35Smrg  depmode=msvc7
1663e999d35Smrgfi
1673e999d35Smrg
1683e999d35Smrgif test "$depmode" = xlc; then
1693e999d35Smrg  # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information.
1703e999d35Smrg  gccflag=-qmakedep=gcc,-MF
1713e999d35Smrg  depmode=gcc
172e531b1a7Smrgfi
173e531b1a7Smrg
1743da7aff1Smrgcase "$depmode" in
1753da7aff1Smrggcc3)
1763da7aff1Smrg## gcc 3 implements dependency tracking that does exactly what
1773da7aff1Smrg## we want.  Yay!  Note: for some reason libtool 1.4 doesn't like
1783da7aff1Smrg## it if -MD -MP comes after the -MF stuff.  Hmm.
179e531b1a7Smrg## Unfortunately, FreeBSD c89 acceptance of flags depends upon
180e531b1a7Smrg## the command line argument order; so add the flags where they
181e531b1a7Smrg## appear in depend2.am.  Note that the slowdown incurred here
182e531b1a7Smrg## affects only configure: in makefiles, %FASTDEP% shortcuts this.
183e531b1a7Smrg  for arg
184e531b1a7Smrg  do
185e531b1a7Smrg    case $arg in
186e531b1a7Smrg    -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;;
187e531b1a7Smrg    *)  set fnord "$@" "$arg" ;;
188e531b1a7Smrg    esac
189e531b1a7Smrg    shift # fnord
190e531b1a7Smrg    shift # $arg
191e531b1a7Smrg  done
192e531b1a7Smrg  "$@"
1933da7aff1Smrg  stat=$?
1943e999d35Smrg  if test $stat -ne 0; then
1953da7aff1Smrg    rm -f "$tmpdepfile"
1963da7aff1Smrg    exit $stat
1973da7aff1Smrg  fi
1983da7aff1Smrg  mv "$tmpdepfile" "$depfile"
1993da7aff1Smrg  ;;
2003da7aff1Smrg
2013da7aff1Smrggcc)
2021e42c052Smrg## Note that this doesn't just cater to obsolete pre-3.x GCC compilers.
2031e42c052Smrg## but also to in-use compilers like IBM xlc/xlC and the HP C compiler.
2043e999d35Smrg## (see the conditional assignment to $gccflag above).
2053da7aff1Smrg## There are various ways to get dependency output from gcc.  Here's
2063da7aff1Smrg## why we pick this rather obscure method:
2073da7aff1Smrg## - Don't want to use -MD because we'd like the dependencies to end
2083da7aff1Smrg##   up in a subdir.  Having to rename by hand is ugly.
2093da7aff1Smrg##   (We might end up doing this anyway to support other compilers.)
2103da7aff1Smrg## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
2113e999d35Smrg##   -MM, not -M (despite what the docs say).  Also, it might not be
2123e999d35Smrg##   supported by the other compilers which use the 'gcc' depmode.
2133da7aff1Smrg## - Using -M directly means running the compiler twice (even worse
2143da7aff1Smrg##   than renaming).
2153da7aff1Smrg  if test -z "$gccflag"; then
2163da7aff1Smrg    gccflag=-MD,
2173da7aff1Smrg  fi
2183da7aff1Smrg  "$@" -Wp,"$gccflag$tmpdepfile"
2193da7aff1Smrg  stat=$?
2203e999d35Smrg  if test $stat -ne 0; then
2213da7aff1Smrg    rm -f "$tmpdepfile"
2223da7aff1Smrg    exit $stat
2233da7aff1Smrg  fi
2243da7aff1Smrg  rm -f "$depfile"
2253da7aff1Smrg  echo "$object : \\" > "$depfile"
2263e999d35Smrg  # The second -e expression handles DOS-style file names with drive
2273e999d35Smrg  # letters.
2283da7aff1Smrg  sed -e 's/^[^:]*: / /' \
2293da7aff1Smrg      -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
2303e999d35Smrg## This next piece of magic avoids the "deleted header file" problem.
2313da7aff1Smrg## The problem is that when a header file which appears in a .P file
2323da7aff1Smrg## is deleted, the dependency causes make to die (because there is
2333da7aff1Smrg## typically no way to rebuild the header).  We avoid this by adding
2343da7aff1Smrg## dummy dependencies for each header file.  Too bad gcc doesn't do
2353da7aff1Smrg## this for us directly.
2363e999d35Smrg## Some versions of gcc put a space before the ':'.  On the theory
2373da7aff1Smrg## that the space means something, we add a space to the output as
2383e999d35Smrg## well.  hp depmode also adds that space, but also prefixes the VPATH
2393e999d35Smrg## to the object.  Take care to not repeat it in the output.
2403da7aff1Smrg## Some versions of the HPUX 10.20 sed can't process this invocation
2413da7aff1Smrg## correctly.  Breaking it into two sed invocations is a workaround.
2423e999d35Smrg  tr ' ' "$nl" < "$tmpdepfile" \
2433e999d35Smrg    | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \
2443e999d35Smrg    | sed -e 's/$/ :/' >> "$depfile"
2453da7aff1Smrg  rm -f "$tmpdepfile"
2463da7aff1Smrg  ;;
2473da7aff1Smrg
2483da7aff1Smrghp)
2493da7aff1Smrg  # This case exists only to let depend.m4 do its work.  It works by
2503da7aff1Smrg  # looking at the text of this script.  This case will never be run,
2513da7aff1Smrg  # since it is checked for above.
2523da7aff1Smrg  exit 1
2533da7aff1Smrg  ;;
2543da7aff1Smrg
2553da7aff1Smrgsgi)
2563da7aff1Smrg  if test "$libtool" = yes; then
2573da7aff1Smrg    "$@" "-Wp,-MDupdate,$tmpdepfile"
2583da7aff1Smrg  else
2593da7aff1Smrg    "$@" -MDupdate "$tmpdepfile"
2603da7aff1Smrg  fi
2613da7aff1Smrg  stat=$?
2623e999d35Smrg  if test $stat -ne 0; then
2633da7aff1Smrg    rm -f "$tmpdepfile"
2643da7aff1Smrg    exit $stat
2653da7aff1Smrg  fi
2663da7aff1Smrg  rm -f "$depfile"
2673da7aff1Smrg
2683da7aff1Smrg  if test -f "$tmpdepfile"; then  # yes, the sourcefile depend on other files
2693da7aff1Smrg    echo "$object : \\" > "$depfile"
2703da7aff1Smrg    # Clip off the initial element (the dependent).  Don't try to be
2713da7aff1Smrg    # clever and replace this with sed code, as IRIX sed won't handle
2723da7aff1Smrg    # lines with more than a fixed number of characters (4096 in
2733da7aff1Smrg    # IRIX 6.2 sed, 8192 in IRIX 6.5).  We also remove comment lines;
2743e999d35Smrg    # the IRIX cc adds comments like '#:fec' to the end of the
2753da7aff1Smrg    # dependency line.
2763e999d35Smrg    tr ' ' "$nl" < "$tmpdepfile" \
2773e999d35Smrg      | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \
2783e999d35Smrg      | tr "$nl" ' ' >> "$depfile"
279e531b1a7Smrg    echo >> "$depfile"
2803da7aff1Smrg    # The second pass generates a dummy entry for each header file.
2813e999d35Smrg    tr ' ' "$nl" < "$tmpdepfile" \
2823e999d35Smrg      | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
2833e999d35Smrg      >> "$depfile"
2843da7aff1Smrg  else
2853e999d35Smrg    make_dummy_depfile
2863da7aff1Smrg  fi
2873da7aff1Smrg  rm -f "$tmpdepfile"
2883da7aff1Smrg  ;;
2893da7aff1Smrg
2903e999d35Smrgxlc)
2913e999d35Smrg  # This case exists only to let depend.m4 do its work.  It works by
2923e999d35Smrg  # looking at the text of this script.  This case will never be run,
2933e999d35Smrg  # since it is checked for above.
2943e999d35Smrg  exit 1
2953e999d35Smrg  ;;
2963e999d35Smrg
2973da7aff1Smrgaix)
2983da7aff1Smrg  # The C for AIX Compiler uses -M and outputs the dependencies
2993da7aff1Smrg  # in a .u file.  In older versions, this file always lives in the
3003e999d35Smrg  # current directory.  Also, the AIX compiler puts '$object:' at the
3013da7aff1Smrg  # start of each line; $object doesn't have directory information.
3023da7aff1Smrg  # Version 6 uses the directory in both cases.
3033e999d35Smrg  set_dir_from "$object"
3043e999d35Smrg  set_base_from "$object"
3053da7aff1Smrg  if test "$libtool" = yes; then
306e531b1a7Smrg    tmpdepfile1=$dir$base.u
307e531b1a7Smrg    tmpdepfile2=$base.u
308e531b1a7Smrg    tmpdepfile3=$dir.libs/$base.u
3093da7aff1Smrg    "$@" -Wc,-M
3103da7aff1Smrg  else
311e531b1a7Smrg    tmpdepfile1=$dir$base.u
312e531b1a7Smrg    tmpdepfile2=$dir$base.u
313e531b1a7Smrg    tmpdepfile3=$dir$base.u
3143da7aff1Smrg    "$@" -M
3153da7aff1Smrg  fi
3163da7aff1Smrg  stat=$?
3173e999d35Smrg  if test $stat -ne 0; then
318e531b1a7Smrg    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
3193da7aff1Smrg    exit $stat
3203da7aff1Smrg  fi
3213da7aff1Smrg
322e531b1a7Smrg  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
323e531b1a7Smrg  do
324e531b1a7Smrg    test -f "$tmpdepfile" && break
325e531b1a7Smrg  done
3263e999d35Smrg  aix_post_process_depfile
3273e999d35Smrg  ;;
3283e999d35Smrg
3293e999d35Smrgtcc)
3303e999d35Smrg  # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26
3313e999d35Smrg  # FIXME: That version still under development at the moment of writing.
3323e999d35Smrg  #        Make that this statement remains true also for stable, released
3333e999d35Smrg  #        versions.
3343e999d35Smrg  # It will wrap lines (doesn't matter whether long or short) with a
3353e999d35Smrg  # trailing '\', as in:
3363e999d35Smrg  #
3373e999d35Smrg  #   foo.o : \
3383e999d35Smrg  #    foo.c \
3393e999d35Smrg  #    foo.h \
3403e999d35Smrg  #
3413e999d35Smrg  # It will put a trailing '\' even on the last line, and will use leading
3423e999d35Smrg  # spaces rather than leading tabs (at least since its commit 0394caf7
3433e999d35Smrg  # "Emit spaces for -MD").
3443e999d35Smrg  "$@" -MD -MF "$tmpdepfile"
3453e999d35Smrg  stat=$?
3463e999d35Smrg  if test $stat -ne 0; then
3473e999d35Smrg    rm -f "$tmpdepfile"
3483e999d35Smrg    exit $stat
3493da7aff1Smrg  fi
3503e999d35Smrg  rm -f "$depfile"
3513e999d35Smrg  # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'.
3523e999d35Smrg  # We have to change lines of the first kind to '$object: \'.
3533e999d35Smrg  sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile"
3543e999d35Smrg  # And for each line of the second kind, we have to emit a 'dep.h:'
3553e999d35Smrg  # dummy dependency, to avoid the deleted-header problem.
3563e999d35Smrg  sed -n -e 's|^  *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile"
3573da7aff1Smrg  rm -f "$tmpdepfile"
3583da7aff1Smrg  ;;
3593da7aff1Smrg
3603e999d35Smrg## The order of this option in the case statement is important, since the
3613e999d35Smrg## shell code in configure will try each of these formats in the order
3623e999d35Smrg## listed in this file.  A plain '-MD' option would be understood by many
3633e999d35Smrg## compilers, so we must ensure this comes after the gcc and icc options.
3643e999d35Smrgpgcc)
3653e999d35Smrg  # Portland's C compiler understands '-MD'.
3663e999d35Smrg  # Will always output deps to 'file.d' where file is the root name of the
3673e999d35Smrg  # source file under compilation, even if file resides in a subdirectory.
3683e999d35Smrg  # The object file name does not affect the name of the '.d' file.
3693e999d35Smrg  # pgcc 10.2 will output
3703da7aff1Smrg  #    foo.o: sub/foo.c sub/foo.h
3713e999d35Smrg  # and will wrap long lines using '\' :
3723da7aff1Smrg  #    foo.o: sub/foo.c ... \
3733da7aff1Smrg  #     sub/foo.h ... \
3743da7aff1Smrg  #     ...
3753e999d35Smrg  set_dir_from "$object"
3763e999d35Smrg  # Use the source, not the object, to determine the base name, since
3773e999d35Smrg  # that's sadly what pgcc will do too.
3783e999d35Smrg  set_base_from "$source"
3793e999d35Smrg  tmpdepfile=$base.d
3803e999d35Smrg
3813e999d35Smrg  # For projects that build the same source file twice into different object
3823e999d35Smrg  # files, the pgcc approach of using the *source* file root name can cause
3833e999d35Smrg  # problems in parallel builds.  Use a locking strategy to avoid stomping on
3843e999d35Smrg  # the same $tmpdepfile.
3853e999d35Smrg  lockdir=$base.d-lock
3863e999d35Smrg  trap "
3873e999d35Smrg    echo '$0: caught signal, cleaning up...' >&2
3883e999d35Smrg    rmdir '$lockdir'
3893e999d35Smrg    exit 1
3903e999d35Smrg  " 1 2 13 15
3913e999d35Smrg  numtries=100
3923e999d35Smrg  i=$numtries
3933e999d35Smrg  while test $i -gt 0; do
3943e999d35Smrg    # mkdir is a portable test-and-set.
3953e999d35Smrg    if mkdir "$lockdir" 2>/dev/null; then
3963e999d35Smrg      # This process acquired the lock.
3973e999d35Smrg      "$@" -MD
3983e999d35Smrg      stat=$?
3993e999d35Smrg      # Release the lock.
4003e999d35Smrg      rmdir "$lockdir"
4013e999d35Smrg      break
4023e999d35Smrg    else
4033e999d35Smrg      # If the lock is being held by a different process, wait
4043e999d35Smrg      # until the winning process is done or we timeout.
4053e999d35Smrg      while test -d "$lockdir" && test $i -gt 0; do
4063e999d35Smrg        sleep 1
4073e999d35Smrg        i=`expr $i - 1`
4083e999d35Smrg      done
4093e999d35Smrg    fi
4103e999d35Smrg    i=`expr $i - 1`
4113e999d35Smrg  done
4123e999d35Smrg  trap - 1 2 13 15
4133e999d35Smrg  if test $i -le 0; then
4143e999d35Smrg    echo "$0: failed to acquire lock after $numtries attempts" >&2
4153e999d35Smrg    echo "$0: check lockdir '$lockdir'" >&2
4163e999d35Smrg    exit 1
4173e999d35Smrg  fi
4183da7aff1Smrg
4193e999d35Smrg  if test $stat -ne 0; then
4203da7aff1Smrg    rm -f "$tmpdepfile"
4213da7aff1Smrg    exit $stat
4223da7aff1Smrg  fi
4233da7aff1Smrg  rm -f "$depfile"
4243da7aff1Smrg  # Each line is of the form `foo.o: dependent.h',
4253da7aff1Smrg  # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'.
4263da7aff1Smrg  # Do two passes, one to just change these to
4273da7aff1Smrg  # `$object: dependent.h' and one to simply `dependent.h:'.
4283da7aff1Smrg  sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
4293da7aff1Smrg  # Some versions of the HPUX 10.20 sed can't process this invocation
4303da7aff1Smrg  # correctly.  Breaking it into two sed invocations is a workaround.
4313e999d35Smrg  sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \
4323e999d35Smrg    | sed -e 's/$/ :/' >> "$depfile"
4333da7aff1Smrg  rm -f "$tmpdepfile"
4343da7aff1Smrg  ;;
4353da7aff1Smrg
436e531b1a7Smrghp2)
437e531b1a7Smrg  # The "hp" stanza above does not work with aCC (C++) and HP's ia64
438e531b1a7Smrg  # compilers, which have integrated preprocessors.  The correct option
439e531b1a7Smrg  # to use with these is +Maked; it writes dependencies to a file named
440e531b1a7Smrg  # 'foo.d', which lands next to the object file, wherever that
441e531b1a7Smrg  # happens to be.
442e531b1a7Smrg  # Much of this is similar to the tru64 case; see comments there.
4433e999d35Smrg  set_dir_from  "$object"
4443e999d35Smrg  set_base_from "$object"
445e531b1a7Smrg  if test "$libtool" = yes; then
446e531b1a7Smrg    tmpdepfile1=$dir$base.d
447e531b1a7Smrg    tmpdepfile2=$dir.libs/$base.d
448e531b1a7Smrg    "$@" -Wc,+Maked
449e531b1a7Smrg  else
450e531b1a7Smrg    tmpdepfile1=$dir$base.d
451e531b1a7Smrg    tmpdepfile2=$dir$base.d
452e531b1a7Smrg    "$@" +Maked
453e531b1a7Smrg  fi
454e531b1a7Smrg  stat=$?
4553e999d35Smrg  if test $stat -ne 0; then
456e531b1a7Smrg     rm -f "$tmpdepfile1" "$tmpdepfile2"
457e531b1a7Smrg     exit $stat
458e531b1a7Smrg  fi
459e531b1a7Smrg
460e531b1a7Smrg  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2"
461e531b1a7Smrg  do
462e531b1a7Smrg    test -f "$tmpdepfile" && break
463e531b1a7Smrg  done
464e531b1a7Smrg  if test -f "$tmpdepfile"; then
4653e999d35Smrg    sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile"
4663e999d35Smrg    # Add 'dependent.h:' lines.
467e531b1a7Smrg    sed -ne '2,${
4683e999d35Smrg               s/^ *//
4693e999d35Smrg               s/ \\*$//
4703e999d35Smrg               s/$/:/
4713e999d35Smrg               p
4723e999d35Smrg             }' "$tmpdepfile" >> "$depfile"
473e531b1a7Smrg  else
4743e999d35Smrg    make_dummy_depfile
475e531b1a7Smrg  fi
476e531b1a7Smrg  rm -f "$tmpdepfile" "$tmpdepfile2"
477e531b1a7Smrg  ;;
478e531b1a7Smrg
4793da7aff1Smrgtru64)
4803e999d35Smrg  # The Tru64 compiler uses -MD to generate dependencies as a side
4813e999d35Smrg  # effect.  'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'.
4823e999d35Smrg  # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
4833e999d35Smrg  # dependencies in 'foo.d' instead, so we check for that too.
4843e999d35Smrg  # Subdirectories are respected.
4853e999d35Smrg  set_dir_from  "$object"
4863e999d35Smrg  set_base_from "$object"
4873e999d35Smrg
4883e999d35Smrg  if test "$libtool" = yes; then
4893e999d35Smrg    # Libtool generates 2 separate objects for the 2 libraries.  These
4903e999d35Smrg    # two compilations output dependencies in $dir.libs/$base.o.d and
4913e999d35Smrg    # in $dir$base.o.d.  We have to check for both files, because
4923e999d35Smrg    # one of the two compilations can be disabled.  We should prefer
4933e999d35Smrg    # $dir$base.o.d over $dir.libs/$base.o.d because the latter is
4943e999d35Smrg    # automatically cleaned when .libs/ is deleted, while ignoring
4953e999d35Smrg    # the former would cause a distcleancheck panic.
4963e999d35Smrg    tmpdepfile1=$dir$base.o.d          # libtool 1.5
4973e999d35Smrg    tmpdepfile2=$dir.libs/$base.o.d    # Likewise.
4983e999d35Smrg    tmpdepfile3=$dir.libs/$base.d      # Compaq CCC V6.2-504
4993e999d35Smrg    "$@" -Wc,-MD
5003e999d35Smrg  else
5013e999d35Smrg    tmpdepfile1=$dir$base.d
5023e999d35Smrg    tmpdepfile2=$dir$base.d
5033e999d35Smrg    tmpdepfile3=$dir$base.d
5043e999d35Smrg    "$@" -MD
5053e999d35Smrg  fi
5063e999d35Smrg
5073e999d35Smrg  stat=$?
5083e999d35Smrg  if test $stat -ne 0; then
5093e999d35Smrg    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
5103e999d35Smrg    exit $stat
5113e999d35Smrg  fi
5123e999d35Smrg
5133e999d35Smrg  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
5143e999d35Smrg  do
5153e999d35Smrg    test -f "$tmpdepfile" && break
5163e999d35Smrg  done
5173e999d35Smrg  # Same post-processing that is required for AIX mode.
5183e999d35Smrg  aix_post_process_depfile
5193e999d35Smrg  ;;
5203e999d35Smrg
5213e999d35Smrgmsvc7)
5223e999d35Smrg  if test "$libtool" = yes; then
5233e999d35Smrg    showIncludes=-Wc,-showIncludes
5243e999d35Smrg  else
5253e999d35Smrg    showIncludes=-showIncludes
5263e999d35Smrg  fi
5273e999d35Smrg  "$@" $showIncludes > "$tmpdepfile"
5283e999d35Smrg  stat=$?
5293e999d35Smrg  grep -v '^Note: including file: ' "$tmpdepfile"
5303e999d35Smrg  if test $stat -ne 0; then
5313e999d35Smrg    rm -f "$tmpdepfile"
5323e999d35Smrg    exit $stat
5333e999d35Smrg  fi
5343e999d35Smrg  rm -f "$depfile"
5353e999d35Smrg  echo "$object : \\" > "$depfile"
5363e999d35Smrg  # The first sed program below extracts the file names and escapes
5373e999d35Smrg  # backslashes for cygpath.  The second sed program outputs the file
5383e999d35Smrg  # name when reading, but also accumulates all include files in the
5393e999d35Smrg  # hold buffer in order to output them again at the end.  This only
5403e999d35Smrg  # works with sed implementations that can handle large buffers.
5413e999d35Smrg  sed < "$tmpdepfile" -n '
5423e999d35Smrg/^Note: including file:  *\(.*\)/ {
5433e999d35Smrg  s//\1/
5443e999d35Smrg  s/\\/\\\\/g
5453e999d35Smrg  p
5463e999d35Smrg}' | $cygpath_u | sort -u | sed -n '
5473e999d35Smrgs/ /\\ /g
5483e999d35Smrgs/\(.*\)/'"$tab"'\1 \\/p
5493e999d35Smrgs/.\(.*\) \\/\1:/
5503e999d35SmrgH
5513e999d35Smrg$ {
5523e999d35Smrg  s/.*/'"$tab"'/
5533e999d35Smrg  G
5543e999d35Smrg  p
5553e999d35Smrg}' >> "$depfile"
5563e999d35Smrg  echo >> "$depfile" # make sure the fragment doesn't end with a backslash
5573e999d35Smrg  rm -f "$tmpdepfile"
5583e999d35Smrg  ;;
5593e999d35Smrg
5603e999d35Smrgmsvc7msys)
5613e999d35Smrg  # This case exists only to let depend.m4 do its work.  It works by
5623e999d35Smrg  # looking at the text of this script.  This case will never be run,
5633e999d35Smrg  # since it is checked for above.
5643e999d35Smrg  exit 1
5653e999d35Smrg  ;;
5663da7aff1Smrg
5673da7aff1Smrg#nosideeffect)
5683da7aff1Smrg  # This comment above is used by automake to tell side-effect
5693da7aff1Smrg  # dependency tracking mechanisms from slower ones.
5703da7aff1Smrg
5713da7aff1Smrgdashmstdout)
5723da7aff1Smrg  # Important note: in order to support this mode, a compiler *must*
5733da7aff1Smrg  # always write the preprocessed file to stdout, regardless of -o.
5743da7aff1Smrg  "$@" || exit $?
5753da7aff1Smrg
5763da7aff1Smrg  # Remove the call to Libtool.
5773da7aff1Smrg  if test "$libtool" = yes; then
578e531b1a7Smrg    while test "X$1" != 'X--mode=compile'; do
5793da7aff1Smrg      shift
5803da7aff1Smrg    done
5813da7aff1Smrg    shift
5823da7aff1Smrg  fi
5833da7aff1Smrg
5843e999d35Smrg  # Remove '-o $object'.
5853da7aff1Smrg  IFS=" "
5863da7aff1Smrg  for arg
5873da7aff1Smrg  do
5883da7aff1Smrg    case $arg in
5893da7aff1Smrg    -o)
5903da7aff1Smrg      shift
5913da7aff1Smrg      ;;
5923da7aff1Smrg    $object)
5933da7aff1Smrg      shift
5943da7aff1Smrg      ;;
5953da7aff1Smrg    *)
5963da7aff1Smrg      set fnord "$@" "$arg"
5973da7aff1Smrg      shift # fnord
5983da7aff1Smrg      shift # $arg
5993da7aff1Smrg      ;;
6003da7aff1Smrg    esac
6013da7aff1Smrg  done
6023da7aff1Smrg
6033da7aff1Smrg  test -z "$dashmflag" && dashmflag=-M
6043e999d35Smrg  # Require at least two characters before searching for ':'
6053da7aff1Smrg  # in the target name.  This is to cope with DOS-style filenames:
6063e999d35Smrg  # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise.
6073da7aff1Smrg  "$@" $dashmflag |
6083e999d35Smrg    sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile"
6093da7aff1Smrg  rm -f "$depfile"
6103da7aff1Smrg  cat < "$tmpdepfile" > "$depfile"
6113e999d35Smrg  # Some versions of the HPUX 10.20 sed can't process this sed invocation
6123e999d35Smrg  # correctly.  Breaking it into two sed invocations is a workaround.
6133e999d35Smrg  tr ' ' "$nl" < "$tmpdepfile" \
6143e999d35Smrg    | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
6153e999d35Smrg    | sed -e 's/$/ :/' >> "$depfile"
6163da7aff1Smrg  rm -f "$tmpdepfile"
6173da7aff1Smrg  ;;
6183da7aff1Smrg
6193da7aff1SmrgdashXmstdout)
6203da7aff1Smrg  # This case only exists to satisfy depend.m4.  It is never actually
6213da7aff1Smrg  # run, as this mode is specially recognized in the preamble.
6223da7aff1Smrg  exit 1
6233da7aff1Smrg  ;;
6243da7aff1Smrg
6253da7aff1Smrgmakedepend)
6263da7aff1Smrg  "$@" || exit $?
6273da7aff1Smrg  # Remove any Libtool call
6283da7aff1Smrg  if test "$libtool" = yes; then
629e531b1a7Smrg    while test "X$1" != 'X--mode=compile'; do
6303da7aff1Smrg      shift
6313da7aff1Smrg    done
6323da7aff1Smrg    shift
6333da7aff1Smrg  fi
6343da7aff1Smrg  # X makedepend
6353da7aff1Smrg  shift
636e531b1a7Smrg  cleared=no eat=no
637e531b1a7Smrg  for arg
638e531b1a7Smrg  do
6393da7aff1Smrg    case $cleared in
6403da7aff1Smrg    no)
6413da7aff1Smrg      set ""; shift
6423da7aff1Smrg      cleared=yes ;;
6433da7aff1Smrg    esac
644e531b1a7Smrg    if test $eat = yes; then
645e531b1a7Smrg      eat=no
646e531b1a7Smrg      continue
647e531b1a7Smrg    fi
6483da7aff1Smrg    case "$arg" in
6493da7aff1Smrg    -D*|-I*)
6503da7aff1Smrg      set fnord "$@" "$arg"; shift ;;
6513da7aff1Smrg    # Strip any option that makedepend may not understand.  Remove
6523da7aff1Smrg    # the object too, otherwise makedepend will parse it as a source file.
653e531b1a7Smrg    -arch)
654e531b1a7Smrg      eat=yes ;;
6553da7aff1Smrg    -*|$object)
6563da7aff1Smrg      ;;
6573da7aff1Smrg    *)
6583da7aff1Smrg      set fnord "$@" "$arg"; shift ;;
6593da7aff1Smrg    esac
6603da7aff1Smrg  done
661e531b1a7Smrg  obj_suffix=`echo "$object" | sed 's/^.*\././'`
6623da7aff1Smrg  touch "$tmpdepfile"
6633da7aff1Smrg  ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
6643da7aff1Smrg  rm -f "$depfile"
6653e999d35Smrg  # makedepend may prepend the VPATH from the source file name to the object.
6663e999d35Smrg  # No need to regex-escape $object, excess matching of '.' is harmless.
6673e999d35Smrg  sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile"
6683e999d35Smrg  # Some versions of the HPUX 10.20 sed can't process the last invocation
6693e999d35Smrg  # correctly.  Breaking it into two sed invocations is a workaround.
6703e999d35Smrg  sed '1,2d' "$tmpdepfile" \
6713e999d35Smrg    | tr ' ' "$nl" \
6723e999d35Smrg    | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
6733e999d35Smrg    | sed -e 's/$/ :/' >> "$depfile"
6743da7aff1Smrg  rm -f "$tmpdepfile" "$tmpdepfile".bak
6753da7aff1Smrg  ;;
6763da7aff1Smrg
6773da7aff1Smrgcpp)
6783da7aff1Smrg  # Important note: in order to support this mode, a compiler *must*
6793da7aff1Smrg  # always write the preprocessed file to stdout.
6803da7aff1Smrg  "$@" || exit $?
6813da7aff1Smrg
6823da7aff1Smrg  # Remove the call to Libtool.
6833da7aff1Smrg  if test "$libtool" = yes; then
684e531b1a7Smrg    while test "X$1" != 'X--mode=compile'; do
6853da7aff1Smrg      shift
6863da7aff1Smrg    done
6873da7aff1Smrg    shift
6883da7aff1Smrg  fi
6893da7aff1Smrg
6903e999d35Smrg  # Remove '-o $object'.
6913da7aff1Smrg  IFS=" "
6923da7aff1Smrg  for arg
6933da7aff1Smrg  do
6943da7aff1Smrg    case $arg in
6953da7aff1Smrg    -o)
6963da7aff1Smrg      shift
6973da7aff1Smrg      ;;
6983da7aff1Smrg    $object)
6993da7aff1Smrg      shift
7003da7aff1Smrg      ;;
7013da7aff1Smrg    *)
7023da7aff1Smrg      set fnord "$@" "$arg"
7033da7aff1Smrg      shift # fnord
7043da7aff1Smrg      shift # $arg
7053da7aff1Smrg      ;;
7063da7aff1Smrg    esac
7073da7aff1Smrg  done
7083da7aff1Smrg
7093e999d35Smrg  "$@" -E \
7103e999d35Smrg    | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
7113e999d35Smrg             -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
7123e999d35Smrg    | sed '$ s: \\$::' > "$tmpdepfile"
7133da7aff1Smrg  rm -f "$depfile"
7143da7aff1Smrg  echo "$object : \\" > "$depfile"
7153da7aff1Smrg  cat < "$tmpdepfile" >> "$depfile"
7163da7aff1Smrg  sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
7173da7aff1Smrg  rm -f "$tmpdepfile"
7183da7aff1Smrg  ;;
7193da7aff1Smrg
7203da7aff1Smrgmsvisualcpp)
7213da7aff1Smrg  # Important note: in order to support this mode, a compiler *must*
722e531b1a7Smrg  # always write the preprocessed file to stdout.
7233da7aff1Smrg  "$@" || exit $?
724e531b1a7Smrg
725e531b1a7Smrg  # Remove the call to Libtool.
726e531b1a7Smrg  if test "$libtool" = yes; then
727e531b1a7Smrg    while test "X$1" != 'X--mode=compile'; do
728e531b1a7Smrg      shift
729e531b1a7Smrg    done
730e531b1a7Smrg    shift
731e531b1a7Smrg  fi
732e531b1a7Smrg
7333da7aff1Smrg  IFS=" "
7343da7aff1Smrg  for arg
7353da7aff1Smrg  do
7363da7aff1Smrg    case "$arg" in
737e531b1a7Smrg    -o)
738e531b1a7Smrg      shift
739e531b1a7Smrg      ;;
740e531b1a7Smrg    $object)
741e531b1a7Smrg      shift
742e531b1a7Smrg      ;;
7433da7aff1Smrg    "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
7443e999d35Smrg        set fnord "$@"
7453e999d35Smrg        shift
7463e999d35Smrg        shift
7473e999d35Smrg        ;;
7483da7aff1Smrg    *)
7493e999d35Smrg        set fnord "$@" "$arg"
7503e999d35Smrg        shift
7513e999d35Smrg        shift
7523e999d35Smrg        ;;
7533da7aff1Smrg    esac
7543da7aff1Smrg  done
755e531b1a7Smrg  "$@" -E 2>/dev/null |
756e531b1a7Smrg  sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile"
7573da7aff1Smrg  rm -f "$depfile"
7583da7aff1Smrg  echo "$object : \\" > "$depfile"
7593e999d35Smrg  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile"
7603e999d35Smrg  echo "$tab" >> "$depfile"
761e531b1a7Smrg  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile"
7623da7aff1Smrg  rm -f "$tmpdepfile"
7633da7aff1Smrg  ;;
7643da7aff1Smrg
765e531b1a7Smrgmsvcmsys)
766e531b1a7Smrg  # This case exists only to let depend.m4 do its work.  It works by
767e531b1a7Smrg  # looking at the text of this script.  This case will never be run,
768e531b1a7Smrg  # since it is checked for above.
769e531b1a7Smrg  exit 1
770e531b1a7Smrg  ;;
771e531b1a7Smrg
7723da7aff1Smrgnone)
7733da7aff1Smrg  exec "$@"
7743da7aff1Smrg  ;;
7753da7aff1Smrg
7763da7aff1Smrg*)
7773da7aff1Smrg  echo "Unknown depmode $depmode" 1>&2
7783da7aff1Smrg  exit 1
7793da7aff1Smrg  ;;
7803da7aff1Smrgesac
7813da7aff1Smrg
7823da7aff1Smrgexit 0
783e531b1a7Smrg
784e531b1a7Smrg# Local Variables:
785e531b1a7Smrg# mode: shell-script
786e531b1a7Smrg# sh-indentation: 2
7873a99fc18Smrg# eval: (add-hook 'before-save-hook 'time-stamp)
788e531b1a7Smrg# time-stamp-start: "scriptversion="
789e531b1a7Smrg# time-stamp-format: "%:y-%02m-%02d.%02H"
7903a99fc18Smrg# time-stamp-time-zone: "UTC0"
791e531b1a7Smrg# time-stamp-end: "; # UTC"
792e531b1a7Smrg# End:
793