197e8a2e8Smrg#! /bin/sh
297e8a2e8Smrg# depcomp - compile a program generating dependencies as side-effects
3d7accfefSmrg
4bbfad078Smrgscriptversion=2024-06-19.01; # UTC
5d7accfefSmrg
6bbfad078Smrg# Copyright (C) 1999-2024 Free Software Foundation, Inc.
797e8a2e8Smrg
897e8a2e8Smrg# This program is free software; you can redistribute it and/or modify
997e8a2e8Smrg# it under the terms of the GNU General Public License as published by
1097e8a2e8Smrg# the Free Software Foundation; either version 2, or (at your option)
1197e8a2e8Smrg# any later version.
1297e8a2e8Smrg
1397e8a2e8Smrg# This program is distributed in the hope that it will be useful,
1497e8a2e8Smrg# but WITHOUT ANY WARRANTY; without even the implied warranty of
1597e8a2e8Smrg# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1697e8a2e8Smrg# GNU General Public License for more details.
1797e8a2e8Smrg
1897e8a2e8Smrg# You should have received a copy of the GNU General Public License
19219ffec0Smrg# along with this program.  If not, see <https://www.gnu.org/licenses/>.
2097e8a2e8Smrg
2197e8a2e8Smrg# As a special exception to the GNU General Public License, if you
2297e8a2e8Smrg# distribute this file as part of a program that contains a
2397e8a2e8Smrg# configuration script generated by Autoconf, you may include it under
2497e8a2e8Smrg# the same distribution terms that you use for the rest of that program.
2597e8a2e8Smrg
2697e8a2e8Smrg# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>.
2797e8a2e8Smrg
28d7accfefSmrgcase $1 in
29d7accfefSmrg  '')
3068af480fSmrg    echo "$0: No command.  Try '$0 --help' for more information." 1>&2
3168af480fSmrg    exit 1;
3268af480fSmrg    ;;
33d7accfefSmrg  -h | --h*)
34d7accfefSmrg    cat <<\EOF
35d7accfefSmrgUsage: depcomp [--help] [--version] PROGRAM [ARGS]
36d7accfefSmrg
37d7accfefSmrgRun PROGRAMS ARGS to compile a file, generating dependencies
38d7accfefSmrgas side-effects.
39d7accfefSmrg
40d7accfefSmrgEnvironment variables:
41d7accfefSmrg  depmode     Dependency tracking mode.
4268af480fSmrg  source      Source file read by 'PROGRAMS ARGS'.
4368af480fSmrg  object      Object file output by 'PROGRAMS ARGS'.
44d7accfefSmrg  DEPDIR      directory where to store dependencies.
45d7accfefSmrg  depfile     Dependency file to output.
4668af480fSmrg  tmpdepfile  Temporary file to use when outputting dependencies.
47d7accfefSmrg  libtool     Whether libtool is used (yes/no).
48d7accfefSmrg
49d7accfefSmrgReport bugs to <bug-automake@gnu.org>.
50bbfad078SmrgGNU Automake home page: <https://www.gnu.org/software/automake/>.
51bbfad078SmrgGeneral help using GNU software: <https://www.gnu.org/gethelp/>.
52d7accfefSmrgEOF
53d7accfefSmrg    exit $?
54d7accfefSmrg    ;;
55d7accfefSmrg  -v | --v*)
56bbfad078Smrg    echo "depcomp (GNU Automake) $scriptversion"
57d7accfefSmrg    exit $?
58d7accfefSmrg    ;;
59d7accfefSmrgesac
60d7accfefSmrg
6168af480fSmrg# Get the directory component of the given path, and save it in the
6268af480fSmrg# global variables '$dir'.  Note that this directory component will
6368af480fSmrg# be either empty or ending with a '/' character.  This is deliberate.
6468af480fSmrgset_dir_from ()
6568af480fSmrg{
6668af480fSmrg  case $1 in
6768af480fSmrg    */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;;
6868af480fSmrg      *) dir=;;
6968af480fSmrg  esac
7068af480fSmrg}
7168af480fSmrg
7268af480fSmrg# Get the suffix-stripped basename of the given path, and save it the
7368af480fSmrg# global variable '$base'.
7468af480fSmrgset_base_from ()
7568af480fSmrg{
7668af480fSmrg  base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'`
7768af480fSmrg}
7868af480fSmrg
7968af480fSmrg# If no dependency file was actually created by the compiler invocation,
8068af480fSmrg# we still have to create a dummy depfile, to avoid errors with the
8168af480fSmrg# Makefile "include basename.Plo" scheme.
8268af480fSmrgmake_dummy_depfile ()
8368af480fSmrg{
8468af480fSmrg  echo "#dummy" > "$depfile"
8568af480fSmrg}
8668af480fSmrg
8768af480fSmrg# Factor out some common post-processing of the generated depfile.
8868af480fSmrg# Requires the auxiliary global variable '$tmpdepfile' to be set.
8968af480fSmrgaix_post_process_depfile ()
9068af480fSmrg{
9168af480fSmrg  # If the compiler actually managed to produce a dependency file,
9268af480fSmrg  # post-process it.
9368af480fSmrg  if test -f "$tmpdepfile"; then
9468af480fSmrg    # Each line is of the form 'foo.o: dependency.h'.
9568af480fSmrg    # Do two passes, one to just change these to
9668af480fSmrg    #   $object: dependency.h
9768af480fSmrg    # and one to simply output
9868af480fSmrg    #   dependency.h:
9968af480fSmrg    # which is needed to avoid the deleted-header problem.
10068af480fSmrg    { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile"
10168af480fSmrg      sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile"
10268af480fSmrg    } > "$depfile"
10368af480fSmrg    rm -f "$tmpdepfile"
10468af480fSmrg  else
10568af480fSmrg    make_dummy_depfile
10668af480fSmrg  fi
10768af480fSmrg}
10868af480fSmrg
10968af480fSmrg# A tabulation character.
11068af480fSmrgtab='	'
11168af480fSmrg# A newline character.
11268af480fSmrgnl='
11368af480fSmrg'
11468af480fSmrg# Character ranges might be problematic outside the C locale.
11568af480fSmrg# These definitions help.
11668af480fSmrgupper=ABCDEFGHIJKLMNOPQRSTUVWXYZ
11768af480fSmrglower=abcdefghijklmnopqrstuvwxyz
11868af480fSmrgalpha=${upper}${lower}
11968af480fSmrg
12097e8a2e8Smrgif test -z "$depmode" || test -z "$source" || test -z "$object"; then
12197e8a2e8Smrg  echo "depcomp: Variables source, object and depmode must be set" 1>&2
12297e8a2e8Smrg  exit 1
12397e8a2e8Smrgfi
12497e8a2e8Smrg
125d7accfefSmrg# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.
126d7accfefSmrgdepfile=${depfile-`echo "$object" |
127d7accfefSmrg  sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`}
12897e8a2e8Smrgtmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
12997e8a2e8Smrg
13097e8a2e8Smrgrm -f "$tmpdepfile"
13197e8a2e8Smrg
132bbfad078Smrg# Avoid interference from the environment.
13368af480fSmrggccflag= dashmflag=
13468af480fSmrg
13597e8a2e8Smrg# Some modes work just like other modes, but use different flags.  We
13697e8a2e8Smrg# parameterize here, but still list the modes in the big case below,
13797e8a2e8Smrg# to make depend.m4 easier to write.  Note that we *cannot* use a case
13897e8a2e8Smrg# here, because this file can only contain one case statement.
13997e8a2e8Smrgif test "$depmode" = hp; then
14097e8a2e8Smrg  # HP compiler uses -M and no extra arg.
14197e8a2e8Smrg  gccflag=-M
14297e8a2e8Smrg  depmode=gcc
14397e8a2e8Smrgfi
14497e8a2e8Smrg
14597e8a2e8Smrgif test "$depmode" = dashXmstdout; then
14668af480fSmrg  # This is just like dashmstdout with a different argument.
14768af480fSmrg  dashmflag=-xM
14868af480fSmrg  depmode=dashmstdout
14997e8a2e8Smrgfi
15097e8a2e8Smrg
151d7accfefSmrgcygpath_u="cygpath -u -f -"
152d7accfefSmrgif test "$depmode" = msvcmsys; then
15368af480fSmrg  # This is just like msvisualcpp but w/o cygpath translation.
15468af480fSmrg  # Just convert the backslash-escaped backslashes to single forward
15568af480fSmrg  # slashes to satisfy depend.m4
15668af480fSmrg  cygpath_u='sed s,\\\\,/,g'
15768af480fSmrg  depmode=msvisualcpp
15868af480fSmrgfi
15968af480fSmrg
16068af480fSmrgif test "$depmode" = msvc7msys; then
16168af480fSmrg  # This is just like msvc7 but w/o cygpath translation.
16268af480fSmrg  # Just convert the backslash-escaped backslashes to single forward
16368af480fSmrg  # slashes to satisfy depend.m4
16468af480fSmrg  cygpath_u='sed s,\\\\,/,g'
16568af480fSmrg  depmode=msvc7
16668af480fSmrgfi
16768af480fSmrg
16868af480fSmrgif test "$depmode" = xlc; then
16968af480fSmrg  # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information.
17068af480fSmrg  gccflag=-qmakedep=gcc,-MF
17168af480fSmrg  depmode=gcc
172d7accfefSmrgfi
173d7accfefSmrg
17497e8a2e8Smrgcase "$depmode" in
17597e8a2e8Smrggcc3)
17697e8a2e8Smrg## gcc 3 implements dependency tracking that does exactly what
17797e8a2e8Smrg## we want.  Yay!  Note: for some reason libtool 1.4 doesn't like
17897e8a2e8Smrg## it if -MD -MP comes after the -MF stuff.  Hmm.
179d7accfefSmrg## Unfortunately, FreeBSD c89 acceptance of flags depends upon
180d7accfefSmrg## the command line argument order; so add the flags where they
181d7accfefSmrg## appear in depend2.am.  Note that the slowdown incurred here
182d7accfefSmrg## affects only configure: in makefiles, %FASTDEP% shortcuts this.
183d7accfefSmrg  for arg
184d7accfefSmrg  do
185d7accfefSmrg    case $arg in
186d7accfefSmrg    -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;;
187d7accfefSmrg    *)  set fnord "$@" "$arg" ;;
188d7accfefSmrg    esac
189d7accfefSmrg    shift # fnord
190d7accfefSmrg    shift # $arg
191d7accfefSmrg  done
192d7accfefSmrg  "$@"
19397e8a2e8Smrg  stat=$?
19468af480fSmrg  if test $stat -ne 0; then
19597e8a2e8Smrg    rm -f "$tmpdepfile"
19697e8a2e8Smrg    exit $stat
19797e8a2e8Smrg  fi
19897e8a2e8Smrg  mv "$tmpdepfile" "$depfile"
19997e8a2e8Smrg  ;;
20097e8a2e8Smrg
20197e8a2e8Smrggcc)
202bbfad078Smrg## Note that this doesn't just cater to obsolete pre-3.x GCC compilers.
203bbfad078Smrg## but also to in-use compilers like IBM xlc/xlC and the HP C compiler.
20468af480fSmrg## (see the conditional assignment to $gccflag above).
20597e8a2e8Smrg## There are various ways to get dependency output from gcc.  Here's
20697e8a2e8Smrg## why we pick this rather obscure method:
20797e8a2e8Smrg## - Don't want to use -MD because we'd like the dependencies to end
20897e8a2e8Smrg##   up in a subdir.  Having to rename by hand is ugly.
20997e8a2e8Smrg##   (We might end up doing this anyway to support other compilers.)
21097e8a2e8Smrg## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
21168af480fSmrg##   -MM, not -M (despite what the docs say).  Also, it might not be
21268af480fSmrg##   supported by the other compilers which use the 'gcc' depmode.
21397e8a2e8Smrg## - Using -M directly means running the compiler twice (even worse
21497e8a2e8Smrg##   than renaming).
21597e8a2e8Smrg  if test -z "$gccflag"; then
21697e8a2e8Smrg    gccflag=-MD,
21797e8a2e8Smrg  fi
21897e8a2e8Smrg  "$@" -Wp,"$gccflag$tmpdepfile"
21997e8a2e8Smrg  stat=$?
22068af480fSmrg  if test $stat -ne 0; then
22197e8a2e8Smrg    rm -f "$tmpdepfile"
22297e8a2e8Smrg    exit $stat
22397e8a2e8Smrg  fi
22497e8a2e8Smrg  rm -f "$depfile"
22597e8a2e8Smrg  echo "$object : \\" > "$depfile"
22668af480fSmrg  # The second -e expression handles DOS-style file names with drive
22768af480fSmrg  # letters.
22897e8a2e8Smrg  sed -e 's/^[^:]*: / /' \
22997e8a2e8Smrg      -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
23068af480fSmrg## This next piece of magic avoids the "deleted header file" problem.
23197e8a2e8Smrg## The problem is that when a header file which appears in a .P file
23297e8a2e8Smrg## is deleted, the dependency causes make to die (because there is
23397e8a2e8Smrg## typically no way to rebuild the header).  We avoid this by adding
23497e8a2e8Smrg## dummy dependencies for each header file.  Too bad gcc doesn't do
23597e8a2e8Smrg## this for us directly.
23668af480fSmrg## Some versions of gcc put a space before the ':'.  On the theory
23797e8a2e8Smrg## that the space means something, we add a space to the output as
23868af480fSmrg## well.  hp depmode also adds that space, but also prefixes the VPATH
23968af480fSmrg## to the object.  Take care to not repeat it in the output.
24097e8a2e8Smrg## Some versions of the HPUX 10.20 sed can't process this invocation
24197e8a2e8Smrg## correctly.  Breaking it into two sed invocations is a workaround.
24268af480fSmrg  tr ' ' "$nl" < "$tmpdepfile" \
24368af480fSmrg    | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \
24468af480fSmrg    | sed -e 's/$/ :/' >> "$depfile"
24597e8a2e8Smrg  rm -f "$tmpdepfile"
24697e8a2e8Smrg  ;;
24797e8a2e8Smrg
24897e8a2e8Smrghp)
24997e8a2e8Smrg  # This case exists only to let depend.m4 do its work.  It works by
25097e8a2e8Smrg  # looking at the text of this script.  This case will never be run,
25197e8a2e8Smrg  # since it is checked for above.
25297e8a2e8Smrg  exit 1
25397e8a2e8Smrg  ;;
25497e8a2e8Smrg
25597e8a2e8Smrgsgi)
25697e8a2e8Smrg  if test "$libtool" = yes; then
25797e8a2e8Smrg    "$@" "-Wp,-MDupdate,$tmpdepfile"
25897e8a2e8Smrg  else
25997e8a2e8Smrg    "$@" -MDupdate "$tmpdepfile"
26097e8a2e8Smrg  fi
26197e8a2e8Smrg  stat=$?
26268af480fSmrg  if test $stat -ne 0; then
26397e8a2e8Smrg    rm -f "$tmpdepfile"
26497e8a2e8Smrg    exit $stat
26597e8a2e8Smrg  fi
26697e8a2e8Smrg  rm -f "$depfile"
26797e8a2e8Smrg
26897e8a2e8Smrg  if test -f "$tmpdepfile"; then  # yes, the sourcefile depend on other files
26997e8a2e8Smrg    echo "$object : \\" > "$depfile"
27097e8a2e8Smrg    # Clip off the initial element (the dependent).  Don't try to be
27197e8a2e8Smrg    # clever and replace this with sed code, as IRIX sed won't handle
27297e8a2e8Smrg    # lines with more than a fixed number of characters (4096 in
27397e8a2e8Smrg    # IRIX 6.2 sed, 8192 in IRIX 6.5).  We also remove comment lines;
27468af480fSmrg    # the IRIX cc adds comments like '#:fec' to the end of the
27597e8a2e8Smrg    # dependency line.
27668af480fSmrg    tr ' ' "$nl" < "$tmpdepfile" \
27768af480fSmrg      | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \
27868af480fSmrg      | tr "$nl" ' ' >> "$depfile"
279d7accfefSmrg    echo >> "$depfile"
28097e8a2e8Smrg    # The second pass generates a dummy entry for each header file.
28168af480fSmrg    tr ' ' "$nl" < "$tmpdepfile" \
28268af480fSmrg      | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
28368af480fSmrg      >> "$depfile"
28497e8a2e8Smrg  else
28568af480fSmrg    make_dummy_depfile
28697e8a2e8Smrg  fi
28797e8a2e8Smrg  rm -f "$tmpdepfile"
28897e8a2e8Smrg  ;;
28997e8a2e8Smrg
29068af480fSmrgxlc)
29168af480fSmrg  # This case exists only to let depend.m4 do its work.  It works by
29268af480fSmrg  # looking at the text of this script.  This case will never be run,
29368af480fSmrg  # since it is checked for above.
29468af480fSmrg  exit 1
29568af480fSmrg  ;;
29668af480fSmrg
29797e8a2e8Smrgaix)
29897e8a2e8Smrg  # The C for AIX Compiler uses -M and outputs the dependencies
29997e8a2e8Smrg  # in a .u file.  In older versions, this file always lives in the
30068af480fSmrg  # current directory.  Also, the AIX compiler puts '$object:' at the
30197e8a2e8Smrg  # start of each line; $object doesn't have directory information.
30297e8a2e8Smrg  # Version 6 uses the directory in both cases.
30368af480fSmrg  set_dir_from "$object"
30468af480fSmrg  set_base_from "$object"
30597e8a2e8Smrg  if test "$libtool" = yes; then
306d7accfefSmrg    tmpdepfile1=$dir$base.u
307d7accfefSmrg    tmpdepfile2=$base.u
308d7accfefSmrg    tmpdepfile3=$dir.libs/$base.u
30997e8a2e8Smrg    "$@" -Wc,-M
31097e8a2e8Smrg  else
311d7accfefSmrg    tmpdepfile1=$dir$base.u
312d7accfefSmrg    tmpdepfile2=$dir$base.u
313d7accfefSmrg    tmpdepfile3=$dir$base.u
31497e8a2e8Smrg    "$@" -M
31597e8a2e8Smrg  fi
31697e8a2e8Smrg  stat=$?
31768af480fSmrg  if test $stat -ne 0; then
318d7accfefSmrg    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
31997e8a2e8Smrg    exit $stat
32097e8a2e8Smrg  fi
32197e8a2e8Smrg
322d7accfefSmrg  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
323d7accfefSmrg  do
324d7accfefSmrg    test -f "$tmpdepfile" && break
325d7accfefSmrg  done
32668af480fSmrg  aix_post_process_depfile
32768af480fSmrg  ;;
32868af480fSmrg
32968af480fSmrgtcc)
33068af480fSmrg  # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26
33168af480fSmrg  # FIXME: That version still under development at the moment of writing.
33268af480fSmrg  #        Make that this statement remains true also for stable, released
33368af480fSmrg  #        versions.
33468af480fSmrg  # It will wrap lines (doesn't matter whether long or short) with a
33568af480fSmrg  # trailing '\', as in:
33668af480fSmrg  #
33768af480fSmrg  #   foo.o : \
33868af480fSmrg  #    foo.c \
33968af480fSmrg  #    foo.h \
34068af480fSmrg  #
34168af480fSmrg  # It will put a trailing '\' even on the last line, and will use leading
34268af480fSmrg  # spaces rather than leading tabs (at least since its commit 0394caf7
34368af480fSmrg  # "Emit spaces for -MD").
34468af480fSmrg  "$@" -MD -MF "$tmpdepfile"
34568af480fSmrg  stat=$?
34668af480fSmrg  if test $stat -ne 0; then
34768af480fSmrg    rm -f "$tmpdepfile"
34868af480fSmrg    exit $stat
34997e8a2e8Smrg  fi
35068af480fSmrg  rm -f "$depfile"
35168af480fSmrg  # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'.
35268af480fSmrg  # We have to change lines of the first kind to '$object: \'.
35368af480fSmrg  sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile"
35468af480fSmrg  # And for each line of the second kind, we have to emit a 'dep.h:'
35568af480fSmrg  # dummy dependency, to avoid the deleted-header problem.
35668af480fSmrg  sed -n -e 's|^  *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile"
35797e8a2e8Smrg  rm -f "$tmpdepfile"
35897e8a2e8Smrg  ;;
35997e8a2e8Smrg
36068af480fSmrg## The order of this option in the case statement is important, since the
36168af480fSmrg## shell code in configure will try each of these formats in the order
36268af480fSmrg## listed in this file.  A plain '-MD' option would be understood by many
36368af480fSmrg## compilers, so we must ensure this comes after the gcc and icc options.
36468af480fSmrgpgcc)
36568af480fSmrg  # Portland's C compiler understands '-MD'.
36668af480fSmrg  # Will always output deps to 'file.d' where file is the root name of the
36768af480fSmrg  # source file under compilation, even if file resides in a subdirectory.
36868af480fSmrg  # The object file name does not affect the name of the '.d' file.
36968af480fSmrg  # pgcc 10.2 will output
37097e8a2e8Smrg  #    foo.o: sub/foo.c sub/foo.h
37168af480fSmrg  # and will wrap long lines using '\' :
37297e8a2e8Smrg  #    foo.o: sub/foo.c ... \
37397e8a2e8Smrg  #     sub/foo.h ... \
37497e8a2e8Smrg  #     ...
37568af480fSmrg  set_dir_from "$object"
37668af480fSmrg  # Use the source, not the object, to determine the base name, since
37768af480fSmrg  # that's sadly what pgcc will do too.
37868af480fSmrg  set_base_from "$source"
37968af480fSmrg  tmpdepfile=$base.d
38068af480fSmrg
38168af480fSmrg  # For projects that build the same source file twice into different object
38268af480fSmrg  # files, the pgcc approach of using the *source* file root name can cause
38368af480fSmrg  # problems in parallel builds.  Use a locking strategy to avoid stomping on
38468af480fSmrg  # the same $tmpdepfile.
38568af480fSmrg  lockdir=$base.d-lock
38668af480fSmrg  trap "
38768af480fSmrg    echo '$0: caught signal, cleaning up...' >&2
38868af480fSmrg    rmdir '$lockdir'
38968af480fSmrg    exit 1
39068af480fSmrg  " 1 2 13 15
39168af480fSmrg  numtries=100
39268af480fSmrg  i=$numtries
39368af480fSmrg  while test $i -gt 0; do
39468af480fSmrg    # mkdir is a portable test-and-set.
39568af480fSmrg    if mkdir "$lockdir" 2>/dev/null; then
39668af480fSmrg      # This process acquired the lock.
39768af480fSmrg      "$@" -MD
39868af480fSmrg      stat=$?
39968af480fSmrg      # Release the lock.
40068af480fSmrg      rmdir "$lockdir"
40168af480fSmrg      break
40268af480fSmrg    else
40368af480fSmrg      # If the lock is being held by a different process, wait
40468af480fSmrg      # until the winning process is done or we timeout.
40568af480fSmrg      while test -d "$lockdir" && test $i -gt 0; do
40668af480fSmrg        sleep 1
40768af480fSmrg        i=`expr $i - 1`
40868af480fSmrg      done
40968af480fSmrg    fi
41068af480fSmrg    i=`expr $i - 1`
41168af480fSmrg  done
41268af480fSmrg  trap - 1 2 13 15
41368af480fSmrg  if test $i -le 0; then
41468af480fSmrg    echo "$0: failed to acquire lock after $numtries attempts" >&2
41568af480fSmrg    echo "$0: check lockdir '$lockdir'" >&2
41668af480fSmrg    exit 1
41768af480fSmrg  fi
41897e8a2e8Smrg
41968af480fSmrg  if test $stat -ne 0; then
42097e8a2e8Smrg    rm -f "$tmpdepfile"
42197e8a2e8Smrg    exit $stat
42297e8a2e8Smrg  fi
42397e8a2e8Smrg  rm -f "$depfile"
42497e8a2e8Smrg  # Each line is of the form `foo.o: dependent.h',
42597e8a2e8Smrg  # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'.
42697e8a2e8Smrg  # Do two passes, one to just change these to
42797e8a2e8Smrg  # `$object: dependent.h' and one to simply `dependent.h:'.
42897e8a2e8Smrg  sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
42997e8a2e8Smrg  # Some versions of the HPUX 10.20 sed can't process this invocation
43097e8a2e8Smrg  # correctly.  Breaking it into two sed invocations is a workaround.
43168af480fSmrg  sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \
43268af480fSmrg    | sed -e 's/$/ :/' >> "$depfile"
43397e8a2e8Smrg  rm -f "$tmpdepfile"
43497e8a2e8Smrg  ;;
43597e8a2e8Smrg
436d7accfefSmrghp2)
437d7accfefSmrg  # The "hp" stanza above does not work with aCC (C++) and HP's ia64
438d7accfefSmrg  # compilers, which have integrated preprocessors.  The correct option
439d7accfefSmrg  # to use with these is +Maked; it writes dependencies to a file named
440d7accfefSmrg  # 'foo.d', which lands next to the object file, wherever that
441d7accfefSmrg  # happens to be.
442d7accfefSmrg  # Much of this is similar to the tru64 case; see comments there.
44368af480fSmrg  set_dir_from  "$object"
44468af480fSmrg  set_base_from "$object"
445d7accfefSmrg  if test "$libtool" = yes; then
446d7accfefSmrg    tmpdepfile1=$dir$base.d
447d7accfefSmrg    tmpdepfile2=$dir.libs/$base.d
448d7accfefSmrg    "$@" -Wc,+Maked
449d7accfefSmrg  else
450d7accfefSmrg    tmpdepfile1=$dir$base.d
451d7accfefSmrg    tmpdepfile2=$dir$base.d
452d7accfefSmrg    "$@" +Maked
453d7accfefSmrg  fi
454d7accfefSmrg  stat=$?
45568af480fSmrg  if test $stat -ne 0; then
456d7accfefSmrg     rm -f "$tmpdepfile1" "$tmpdepfile2"
457d7accfefSmrg     exit $stat
458d7accfefSmrg  fi
459d7accfefSmrg
460d7accfefSmrg  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2"
461d7accfefSmrg  do
462d7accfefSmrg    test -f "$tmpdepfile" && break
463d7accfefSmrg  done
464d7accfefSmrg  if test -f "$tmpdepfile"; then
46568af480fSmrg    sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile"
46668af480fSmrg    # Add 'dependent.h:' lines.
467d7accfefSmrg    sed -ne '2,${
46868af480fSmrg               s/^ *//
46968af480fSmrg               s/ \\*$//
47068af480fSmrg               s/$/:/
47168af480fSmrg               p
47268af480fSmrg             }' "$tmpdepfile" >> "$depfile"
473d7accfefSmrg  else
47468af480fSmrg    make_dummy_depfile
475d7accfefSmrg  fi
476d7accfefSmrg  rm -f "$tmpdepfile" "$tmpdepfile2"
477d7accfefSmrg  ;;
478d7accfefSmrg
47997e8a2e8Smrgtru64)
48068af480fSmrg  # The Tru64 compiler uses -MD to generate dependencies as a side
48168af480fSmrg  # effect.  'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'.
48268af480fSmrg  # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
48368af480fSmrg  # dependencies in 'foo.d' instead, so we check for that too.
48468af480fSmrg  # Subdirectories are respected.
48568af480fSmrg  set_dir_from  "$object"
48668af480fSmrg  set_base_from "$object"
48768af480fSmrg
48868af480fSmrg  if test "$libtool" = yes; then
48968af480fSmrg    # Libtool generates 2 separate objects for the 2 libraries.  These
49068af480fSmrg    # two compilations output dependencies in $dir.libs/$base.o.d and
49168af480fSmrg    # in $dir$base.o.d.  We have to check for both files, because
49268af480fSmrg    # one of the two compilations can be disabled.  We should prefer
49368af480fSmrg    # $dir$base.o.d over $dir.libs/$base.o.d because the latter is
49468af480fSmrg    # automatically cleaned when .libs/ is deleted, while ignoring
49568af480fSmrg    # the former would cause a distcleancheck panic.
49668af480fSmrg    tmpdepfile1=$dir$base.o.d          # libtool 1.5
49768af480fSmrg    tmpdepfile2=$dir.libs/$base.o.d    # Likewise.
49868af480fSmrg    tmpdepfile3=$dir.libs/$base.d      # Compaq CCC V6.2-504
49968af480fSmrg    "$@" -Wc,-MD
50068af480fSmrg  else
50168af480fSmrg    tmpdepfile1=$dir$base.d
50268af480fSmrg    tmpdepfile2=$dir$base.d
50368af480fSmrg    tmpdepfile3=$dir$base.d
50468af480fSmrg    "$@" -MD
50568af480fSmrg  fi
50668af480fSmrg
50768af480fSmrg  stat=$?
50868af480fSmrg  if test $stat -ne 0; then
50968af480fSmrg    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
51068af480fSmrg    exit $stat
51168af480fSmrg  fi
51268af480fSmrg
51368af480fSmrg  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
51468af480fSmrg  do
51568af480fSmrg    test -f "$tmpdepfile" && break
51668af480fSmrg  done
51768af480fSmrg  # Same post-processing that is required for AIX mode.
51868af480fSmrg  aix_post_process_depfile
51968af480fSmrg  ;;
52068af480fSmrg
52168af480fSmrgmsvc7)
52268af480fSmrg  if test "$libtool" = yes; then
52368af480fSmrg    showIncludes=-Wc,-showIncludes
52468af480fSmrg  else
52568af480fSmrg    showIncludes=-showIncludes
52668af480fSmrg  fi
52768af480fSmrg  "$@" $showIncludes > "$tmpdepfile"
52868af480fSmrg  stat=$?
52968af480fSmrg  grep -v '^Note: including file: ' "$tmpdepfile"
53068af480fSmrg  if test $stat -ne 0; then
53168af480fSmrg    rm -f "$tmpdepfile"
53268af480fSmrg    exit $stat
53368af480fSmrg  fi
53468af480fSmrg  rm -f "$depfile"
53568af480fSmrg  echo "$object : \\" > "$depfile"
53668af480fSmrg  # The first sed program below extracts the file names and escapes
53768af480fSmrg  # backslashes for cygpath.  The second sed program outputs the file
53868af480fSmrg  # name when reading, but also accumulates all include files in the
53968af480fSmrg  # hold buffer in order to output them again at the end.  This only
54068af480fSmrg  # works with sed implementations that can handle large buffers.
54168af480fSmrg  sed < "$tmpdepfile" -n '
54268af480fSmrg/^Note: including file:  *\(.*\)/ {
54368af480fSmrg  s//\1/
54468af480fSmrg  s/\\/\\\\/g
54568af480fSmrg  p
54668af480fSmrg}' | $cygpath_u | sort -u | sed -n '
54768af480fSmrgs/ /\\ /g
54868af480fSmrgs/\(.*\)/'"$tab"'\1 \\/p
54968af480fSmrgs/.\(.*\) \\/\1:/
55068af480fSmrgH
55168af480fSmrg$ {
55268af480fSmrg  s/.*/'"$tab"'/
55368af480fSmrg  G
55468af480fSmrg  p
55568af480fSmrg}' >> "$depfile"
55668af480fSmrg  echo >> "$depfile" # make sure the fragment doesn't end with a backslash
55768af480fSmrg  rm -f "$tmpdepfile"
55868af480fSmrg  ;;
55968af480fSmrg
56068af480fSmrgmsvc7msys)
56168af480fSmrg  # This case exists only to let depend.m4 do its work.  It works by
56268af480fSmrg  # looking at the text of this script.  This case will never be run,
56368af480fSmrg  # since it is checked for above.
56468af480fSmrg  exit 1
56568af480fSmrg  ;;
56697e8a2e8Smrg
56797e8a2e8Smrg#nosideeffect)
56897e8a2e8Smrg  # This comment above is used by automake to tell side-effect
56997e8a2e8Smrg  # dependency tracking mechanisms from slower ones.
57097e8a2e8Smrg
57197e8a2e8Smrgdashmstdout)
57297e8a2e8Smrg  # Important note: in order to support this mode, a compiler *must*
57397e8a2e8Smrg  # always write the preprocessed file to stdout, regardless of -o.
57497e8a2e8Smrg  "$@" || exit $?
57597e8a2e8Smrg
57697e8a2e8Smrg  # Remove the call to Libtool.
57797e8a2e8Smrg  if test "$libtool" = yes; then
578d7accfefSmrg    while test "X$1" != 'X--mode=compile'; do
57997e8a2e8Smrg      shift
58097e8a2e8Smrg    done
58197e8a2e8Smrg    shift
58297e8a2e8Smrg  fi
58397e8a2e8Smrg
58468af480fSmrg  # Remove '-o $object'.
58597e8a2e8Smrg  IFS=" "
58697e8a2e8Smrg  for arg
58797e8a2e8Smrg  do
58897e8a2e8Smrg    case $arg in
58997e8a2e8Smrg    -o)
59097e8a2e8Smrg      shift
59197e8a2e8Smrg      ;;
59297e8a2e8Smrg    $object)
59397e8a2e8Smrg      shift
59497e8a2e8Smrg      ;;
59597e8a2e8Smrg    *)
59697e8a2e8Smrg      set fnord "$@" "$arg"
59797e8a2e8Smrg      shift # fnord
59897e8a2e8Smrg      shift # $arg
59997e8a2e8Smrg      ;;
60097e8a2e8Smrg    esac
60197e8a2e8Smrg  done
60297e8a2e8Smrg
60397e8a2e8Smrg  test -z "$dashmflag" && dashmflag=-M
60468af480fSmrg  # Require at least two characters before searching for ':'
60597e8a2e8Smrg  # in the target name.  This is to cope with DOS-style filenames:
60668af480fSmrg  # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise.
60797e8a2e8Smrg  "$@" $dashmflag |
60868af480fSmrg    sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile"
60997e8a2e8Smrg  rm -f "$depfile"
61097e8a2e8Smrg  cat < "$tmpdepfile" > "$depfile"
61168af480fSmrg  # Some versions of the HPUX 10.20 sed can't process this sed invocation
61268af480fSmrg  # correctly.  Breaking it into two sed invocations is a workaround.
61368af480fSmrg  tr ' ' "$nl" < "$tmpdepfile" \
61468af480fSmrg    | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
61568af480fSmrg    | sed -e 's/$/ :/' >> "$depfile"
61697e8a2e8Smrg  rm -f "$tmpdepfile"
61797e8a2e8Smrg  ;;
61897e8a2e8Smrg
61997e8a2e8SmrgdashXmstdout)
62097e8a2e8Smrg  # This case only exists to satisfy depend.m4.  It is never actually
62197e8a2e8Smrg  # run, as this mode is specially recognized in the preamble.
62297e8a2e8Smrg  exit 1
62397e8a2e8Smrg  ;;
62497e8a2e8Smrg
62597e8a2e8Smrgmakedepend)
62697e8a2e8Smrg  "$@" || exit $?
62797e8a2e8Smrg  # Remove any Libtool call
62897e8a2e8Smrg  if test "$libtool" = yes; then
629d7accfefSmrg    while test "X$1" != 'X--mode=compile'; do
63097e8a2e8Smrg      shift
63197e8a2e8Smrg    done
63297e8a2e8Smrg    shift
63397e8a2e8Smrg  fi
63497e8a2e8Smrg  # X makedepend
63597e8a2e8Smrg  shift
636d7accfefSmrg  cleared=no eat=no
637d7accfefSmrg  for arg
638d7accfefSmrg  do
63997e8a2e8Smrg    case $cleared in
64097e8a2e8Smrg    no)
64197e8a2e8Smrg      set ""; shift
64297e8a2e8Smrg      cleared=yes ;;
64397e8a2e8Smrg    esac
644d7accfefSmrg    if test $eat = yes; then
645d7accfefSmrg      eat=no
646d7accfefSmrg      continue
647d7accfefSmrg    fi
64897e8a2e8Smrg    case "$arg" in
64997e8a2e8Smrg    -D*|-I*)
65097e8a2e8Smrg      set fnord "$@" "$arg"; shift ;;
65197e8a2e8Smrg    # Strip any option that makedepend may not understand.  Remove
65297e8a2e8Smrg    # the object too, otherwise makedepend will parse it as a source file.
653d7accfefSmrg    -arch)
654d7accfefSmrg      eat=yes ;;
65597e8a2e8Smrg    -*|$object)
65697e8a2e8Smrg      ;;
65797e8a2e8Smrg    *)
65897e8a2e8Smrg      set fnord "$@" "$arg"; shift ;;
65997e8a2e8Smrg    esac
66097e8a2e8Smrg  done
661d7accfefSmrg  obj_suffix=`echo "$object" | sed 's/^.*\././'`
66297e8a2e8Smrg  touch "$tmpdepfile"
66397e8a2e8Smrg  ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
66497e8a2e8Smrg  rm -f "$depfile"
66568af480fSmrg  # makedepend may prepend the VPATH from the source file name to the object.
66668af480fSmrg  # No need to regex-escape $object, excess matching of '.' is harmless.
66768af480fSmrg  sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile"
66868af480fSmrg  # Some versions of the HPUX 10.20 sed can't process the last invocation
66968af480fSmrg  # correctly.  Breaking it into two sed invocations is a workaround.
67068af480fSmrg  sed '1,2d' "$tmpdepfile" \
67168af480fSmrg    | tr ' ' "$nl" \
67268af480fSmrg    | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
67368af480fSmrg    | sed -e 's/$/ :/' >> "$depfile"
67497e8a2e8Smrg  rm -f "$tmpdepfile" "$tmpdepfile".bak
67597e8a2e8Smrg  ;;
67697e8a2e8Smrg
67797e8a2e8Smrgcpp)
67897e8a2e8Smrg  # Important note: in order to support this mode, a compiler *must*
67997e8a2e8Smrg  # always write the preprocessed file to stdout.
68097e8a2e8Smrg  "$@" || exit $?
68197e8a2e8Smrg
68297e8a2e8Smrg  # Remove the call to Libtool.
68397e8a2e8Smrg  if test "$libtool" = yes; then
684d7accfefSmrg    while test "X$1" != 'X--mode=compile'; do
68597e8a2e8Smrg      shift
68697e8a2e8Smrg    done
68797e8a2e8Smrg    shift
68897e8a2e8Smrg  fi
68997e8a2e8Smrg
69068af480fSmrg  # Remove '-o $object'.
69197e8a2e8Smrg  IFS=" "
69297e8a2e8Smrg  for arg
69397e8a2e8Smrg  do
69497e8a2e8Smrg    case $arg in
69597e8a2e8Smrg    -o)
69697e8a2e8Smrg      shift
69797e8a2e8Smrg      ;;
69897e8a2e8Smrg    $object)
69997e8a2e8Smrg      shift
70097e8a2e8Smrg      ;;
70197e8a2e8Smrg    *)
70297e8a2e8Smrg      set fnord "$@" "$arg"
70397e8a2e8Smrg      shift # fnord
70497e8a2e8Smrg      shift # $arg
70597e8a2e8Smrg      ;;
70697e8a2e8Smrg    esac
70797e8a2e8Smrg  done
70897e8a2e8Smrg
70968af480fSmrg  "$@" -E \
71068af480fSmrg    | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
71168af480fSmrg             -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
71268af480fSmrg    | sed '$ s: \\$::' > "$tmpdepfile"
71397e8a2e8Smrg  rm -f "$depfile"
71497e8a2e8Smrg  echo "$object : \\" > "$depfile"
71597e8a2e8Smrg  cat < "$tmpdepfile" >> "$depfile"
71697e8a2e8Smrg  sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
71797e8a2e8Smrg  rm -f "$tmpdepfile"
71897e8a2e8Smrg  ;;
71997e8a2e8Smrg
72097e8a2e8Smrgmsvisualcpp)
72197e8a2e8Smrg  # Important note: in order to support this mode, a compiler *must*
722d7accfefSmrg  # always write the preprocessed file to stdout.
72397e8a2e8Smrg  "$@" || exit $?
724d7accfefSmrg
725d7accfefSmrg  # Remove the call to Libtool.
726d7accfefSmrg  if test "$libtool" = yes; then
727d7accfefSmrg    while test "X$1" != 'X--mode=compile'; do
728d7accfefSmrg      shift
729d7accfefSmrg    done
730d7accfefSmrg    shift
731d7accfefSmrg  fi
732d7accfefSmrg
73397e8a2e8Smrg  IFS=" "
73497e8a2e8Smrg  for arg
73597e8a2e8Smrg  do
73697e8a2e8Smrg    case "$arg" in
737d7accfefSmrg    -o)
738d7accfefSmrg      shift
739d7accfefSmrg      ;;
740d7accfefSmrg    $object)
741d7accfefSmrg      shift
742d7accfefSmrg      ;;
74397e8a2e8Smrg    "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
74468af480fSmrg        set fnord "$@"
74568af480fSmrg        shift
74668af480fSmrg        shift
74768af480fSmrg        ;;
74897e8a2e8Smrg    *)
74968af480fSmrg        set fnord "$@" "$arg"
75068af480fSmrg        shift
75168af480fSmrg        shift
75268af480fSmrg        ;;
75397e8a2e8Smrg    esac
75497e8a2e8Smrg  done
755d7accfefSmrg  "$@" -E 2>/dev/null |
756d7accfefSmrg  sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile"
75797e8a2e8Smrg  rm -f "$depfile"
75897e8a2e8Smrg  echo "$object : \\" > "$depfile"
75968af480fSmrg  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile"
76068af480fSmrg  echo "$tab" >> "$depfile"
761d7accfefSmrg  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile"
76297e8a2e8Smrg  rm -f "$tmpdepfile"
76397e8a2e8Smrg  ;;
76497e8a2e8Smrg
765d7accfefSmrgmsvcmsys)
766d7accfefSmrg  # This case exists only to let depend.m4 do its work.  It works by
767d7accfefSmrg  # looking at the text of this script.  This case will never be run,
768d7accfefSmrg  # since it is checked for above.
769d7accfefSmrg  exit 1
770d7accfefSmrg  ;;
771d7accfefSmrg
77297e8a2e8Smrgnone)
77397e8a2e8Smrg  exec "$@"
77497e8a2e8Smrg  ;;
77597e8a2e8Smrg
77697e8a2e8Smrg*)
77797e8a2e8Smrg  echo "Unknown depmode $depmode" 1>&2
77897e8a2e8Smrg  exit 1
77997e8a2e8Smrg  ;;
78097e8a2e8Smrgesac
78197e8a2e8Smrg
78297e8a2e8Smrgexit 0
783d7accfefSmrg
784d7accfefSmrg# Local Variables:
785d7accfefSmrg# mode: shell-script
786d7accfefSmrg# sh-indentation: 2
787219ffec0Smrg# eval: (add-hook 'before-save-hook 'time-stamp)
788d7accfefSmrg# time-stamp-start: "scriptversion="
789d7accfefSmrg# time-stamp-format: "%:y-%02m-%02d.%02H"
790219ffec0Smrg# time-stamp-time-zone: "UTC0"
791d7accfefSmrg# time-stamp-end: "; # UTC"
792d7accfefSmrg# End:
793