depcomp revision 68af480f
197e8a2e8Smrg#! /bin/sh
297e8a2e8Smrg# depcomp - compile a program generating dependencies as side-effects
3d7accfefSmrg
468af480fSmrgscriptversion=2013-05-30.07; # UTC
5d7accfefSmrg
668af480fSmrg# Copyright (C) 1999-2013 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
19d7accfefSmrg# along with this program.  If not, see <http://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>.
50d7accfefSmrgEOF
51d7accfefSmrg    exit $?
52d7accfefSmrg    ;;
53d7accfefSmrg  -v | --v*)
54d7accfefSmrg    echo "depcomp $scriptversion"
55d7accfefSmrg    exit $?
56d7accfefSmrg    ;;
57d7accfefSmrgesac
58d7accfefSmrg
5968af480fSmrg# Get the directory component of the given path, and save it in the
6068af480fSmrg# global variables '$dir'.  Note that this directory component will
6168af480fSmrg# be either empty or ending with a '/' character.  This is deliberate.
6268af480fSmrgset_dir_from ()
6368af480fSmrg{
6468af480fSmrg  case $1 in
6568af480fSmrg    */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;;
6668af480fSmrg      *) dir=;;
6768af480fSmrg  esac
6868af480fSmrg}
6968af480fSmrg
7068af480fSmrg# Get the suffix-stripped basename of the given path, and save it the
7168af480fSmrg# global variable '$base'.
7268af480fSmrgset_base_from ()
7368af480fSmrg{
7468af480fSmrg  base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'`
7568af480fSmrg}
7668af480fSmrg
7768af480fSmrg# If no dependency file was actually created by the compiler invocation,
7868af480fSmrg# we still have to create a dummy depfile, to avoid errors with the
7968af480fSmrg# Makefile "include basename.Plo" scheme.
8068af480fSmrgmake_dummy_depfile ()
8168af480fSmrg{
8268af480fSmrg  echo "#dummy" > "$depfile"
8368af480fSmrg}
8468af480fSmrg
8568af480fSmrg# Factor out some common post-processing of the generated depfile.
8668af480fSmrg# Requires the auxiliary global variable '$tmpdepfile' to be set.
8768af480fSmrgaix_post_process_depfile ()
8868af480fSmrg{
8968af480fSmrg  # If the compiler actually managed to produce a dependency file,
9068af480fSmrg  # post-process it.
9168af480fSmrg  if test -f "$tmpdepfile"; then
9268af480fSmrg    # Each line is of the form 'foo.o: dependency.h'.
9368af480fSmrg    # Do two passes, one to just change these to
9468af480fSmrg    #   $object: dependency.h
9568af480fSmrg    # and one to simply output
9668af480fSmrg    #   dependency.h:
9768af480fSmrg    # which is needed to avoid the deleted-header problem.
9868af480fSmrg    { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile"
9968af480fSmrg      sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile"
10068af480fSmrg    } > "$depfile"
10168af480fSmrg    rm -f "$tmpdepfile"
10268af480fSmrg  else
10368af480fSmrg    make_dummy_depfile
10468af480fSmrg  fi
10568af480fSmrg}
10668af480fSmrg
10768af480fSmrg# A tabulation character.
10868af480fSmrgtab='	'
10968af480fSmrg# A newline character.
11068af480fSmrgnl='
11168af480fSmrg'
11268af480fSmrg# Character ranges might be problematic outside the C locale.
11368af480fSmrg# These definitions help.
11468af480fSmrgupper=ABCDEFGHIJKLMNOPQRSTUVWXYZ
11568af480fSmrglower=abcdefghijklmnopqrstuvwxyz
11668af480fSmrgdigits=0123456789
11768af480fSmrgalpha=${upper}${lower}
11868af480fSmrg
11997e8a2e8Smrgif test -z "$depmode" || test -z "$source" || test -z "$object"; then
12097e8a2e8Smrg  echo "depcomp: Variables source, object and depmode must be set" 1>&2
12197e8a2e8Smrg  exit 1
12297e8a2e8Smrgfi
12397e8a2e8Smrg
124d7accfefSmrg# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.
125d7accfefSmrgdepfile=${depfile-`echo "$object" |
126d7accfefSmrg  sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`}
12797e8a2e8Smrgtmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
12897e8a2e8Smrg
12997e8a2e8Smrgrm -f "$tmpdepfile"
13097e8a2e8Smrg
13168af480fSmrg# Avoid interferences from the environment.
13268af480fSmrggccflag= dashmflag=
13368af480fSmrg
13497e8a2e8Smrg# Some modes work just like other modes, but use different flags.  We
13597e8a2e8Smrg# parameterize here, but still list the modes in the big case below,
13697e8a2e8Smrg# to make depend.m4 easier to write.  Note that we *cannot* use a case
13797e8a2e8Smrg# here, because this file can only contain one case statement.
13897e8a2e8Smrgif test "$depmode" = hp; then
13997e8a2e8Smrg  # HP compiler uses -M and no extra arg.
14097e8a2e8Smrg  gccflag=-M
14197e8a2e8Smrg  depmode=gcc
14297e8a2e8Smrgfi
14397e8a2e8Smrg
14497e8a2e8Smrgif test "$depmode" = dashXmstdout; then
14568af480fSmrg  # This is just like dashmstdout with a different argument.
14668af480fSmrg  dashmflag=-xM
14768af480fSmrg  depmode=dashmstdout
14897e8a2e8Smrgfi
14997e8a2e8Smrg
150d7accfefSmrgcygpath_u="cygpath -u -f -"
151d7accfefSmrgif test "$depmode" = msvcmsys; then
15268af480fSmrg  # This is just like msvisualcpp but w/o cygpath translation.
15368af480fSmrg  # Just convert the backslash-escaped backslashes to single forward
15468af480fSmrg  # slashes to satisfy depend.m4
15568af480fSmrg  cygpath_u='sed s,\\\\,/,g'
15668af480fSmrg  depmode=msvisualcpp
15768af480fSmrgfi
15868af480fSmrg
15968af480fSmrgif test "$depmode" = msvc7msys; then
16068af480fSmrg  # This is just like msvc7 but w/o cygpath translation.
16168af480fSmrg  # Just convert the backslash-escaped backslashes to single forward
16268af480fSmrg  # slashes to satisfy depend.m4
16368af480fSmrg  cygpath_u='sed s,\\\\,/,g'
16468af480fSmrg  depmode=msvc7
16568af480fSmrgfi
16668af480fSmrg
16768af480fSmrgif test "$depmode" = xlc; then
16868af480fSmrg  # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information.
16968af480fSmrg  gccflag=-qmakedep=gcc,-MF
17068af480fSmrg  depmode=gcc
171d7accfefSmrgfi
172d7accfefSmrg
17397e8a2e8Smrgcase "$depmode" in
17497e8a2e8Smrggcc3)
17597e8a2e8Smrg## gcc 3 implements dependency tracking that does exactly what
17697e8a2e8Smrg## we want.  Yay!  Note: for some reason libtool 1.4 doesn't like
17797e8a2e8Smrg## it if -MD -MP comes after the -MF stuff.  Hmm.
178d7accfefSmrg## Unfortunately, FreeBSD c89 acceptance of flags depends upon
179d7accfefSmrg## the command line argument order; so add the flags where they
180d7accfefSmrg## appear in depend2.am.  Note that the slowdown incurred here
181d7accfefSmrg## affects only configure: in makefiles, %FASTDEP% shortcuts this.
182d7accfefSmrg  for arg
183d7accfefSmrg  do
184d7accfefSmrg    case $arg in
185d7accfefSmrg    -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;;
186d7accfefSmrg    *)  set fnord "$@" "$arg" ;;
187d7accfefSmrg    esac
188d7accfefSmrg    shift # fnord
189d7accfefSmrg    shift # $arg
190d7accfefSmrg  done
191d7accfefSmrg  "$@"
19297e8a2e8Smrg  stat=$?
19368af480fSmrg  if test $stat -ne 0; then
19497e8a2e8Smrg    rm -f "$tmpdepfile"
19597e8a2e8Smrg    exit $stat
19697e8a2e8Smrg  fi
19797e8a2e8Smrg  mv "$tmpdepfile" "$depfile"
19897e8a2e8Smrg  ;;
19997e8a2e8Smrg
20097e8a2e8Smrggcc)
20168af480fSmrg## Note that this doesn't just cater to obsosete pre-3.x GCC compilers.
20268af480fSmrg## but also to in-use compilers like IMB xlc/xlC and the HP C compiler.
20368af480fSmrg## (see the conditional assignment to $gccflag above).
20497e8a2e8Smrg## There are various ways to get dependency output from gcc.  Here's
20597e8a2e8Smrg## why we pick this rather obscure method:
20697e8a2e8Smrg## - Don't want to use -MD because we'd like the dependencies to end
20797e8a2e8Smrg##   up in a subdir.  Having to rename by hand is ugly.
20897e8a2e8Smrg##   (We might end up doing this anyway to support other compilers.)
20997e8a2e8Smrg## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
21068af480fSmrg##   -MM, not -M (despite what the docs say).  Also, it might not be
21168af480fSmrg##   supported by the other compilers which use the 'gcc' depmode.
21297e8a2e8Smrg## - Using -M directly means running the compiler twice (even worse
21397e8a2e8Smrg##   than renaming).
21497e8a2e8Smrg  if test -z "$gccflag"; then
21597e8a2e8Smrg    gccflag=-MD,
21697e8a2e8Smrg  fi
21797e8a2e8Smrg  "$@" -Wp,"$gccflag$tmpdepfile"
21897e8a2e8Smrg  stat=$?
21968af480fSmrg  if test $stat -ne 0; then
22097e8a2e8Smrg    rm -f "$tmpdepfile"
22197e8a2e8Smrg    exit $stat
22297e8a2e8Smrg  fi
22397e8a2e8Smrg  rm -f "$depfile"
22497e8a2e8Smrg  echo "$object : \\" > "$depfile"
22568af480fSmrg  # The second -e expression handles DOS-style file names with drive
22668af480fSmrg  # letters.
22797e8a2e8Smrg  sed -e 's/^[^:]*: / /' \
22897e8a2e8Smrg      -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
22968af480fSmrg## This next piece of magic avoids the "deleted header file" problem.
23097e8a2e8Smrg## The problem is that when a header file which appears in a .P file
23197e8a2e8Smrg## is deleted, the dependency causes make to die (because there is
23297e8a2e8Smrg## typically no way to rebuild the header).  We avoid this by adding
23397e8a2e8Smrg## dummy dependencies for each header file.  Too bad gcc doesn't do
23497e8a2e8Smrg## this for us directly.
23568af480fSmrg## Some versions of gcc put a space before the ':'.  On the theory
23697e8a2e8Smrg## that the space means something, we add a space to the output as
23768af480fSmrg## well.  hp depmode also adds that space, but also prefixes the VPATH
23868af480fSmrg## to the object.  Take care to not repeat it in the output.
23997e8a2e8Smrg## Some versions of the HPUX 10.20 sed can't process this invocation
24097e8a2e8Smrg## correctly.  Breaking it into two sed invocations is a workaround.
24168af480fSmrg  tr ' ' "$nl" < "$tmpdepfile" \
24268af480fSmrg    | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \
24368af480fSmrg    | sed -e 's/$/ :/' >> "$depfile"
24497e8a2e8Smrg  rm -f "$tmpdepfile"
24597e8a2e8Smrg  ;;
24697e8a2e8Smrg
24797e8a2e8Smrghp)
24897e8a2e8Smrg  # This case exists only to let depend.m4 do its work.  It works by
24997e8a2e8Smrg  # looking at the text of this script.  This case will never be run,
25097e8a2e8Smrg  # since it is checked for above.
25197e8a2e8Smrg  exit 1
25297e8a2e8Smrg  ;;
25397e8a2e8Smrg
25497e8a2e8Smrgsgi)
25597e8a2e8Smrg  if test "$libtool" = yes; then
25697e8a2e8Smrg    "$@" "-Wp,-MDupdate,$tmpdepfile"
25797e8a2e8Smrg  else
25897e8a2e8Smrg    "$@" -MDupdate "$tmpdepfile"
25997e8a2e8Smrg  fi
26097e8a2e8Smrg  stat=$?
26168af480fSmrg  if test $stat -ne 0; then
26297e8a2e8Smrg    rm -f "$tmpdepfile"
26397e8a2e8Smrg    exit $stat
26497e8a2e8Smrg  fi
26597e8a2e8Smrg  rm -f "$depfile"
26697e8a2e8Smrg
26797e8a2e8Smrg  if test -f "$tmpdepfile"; then  # yes, the sourcefile depend on other files
26897e8a2e8Smrg    echo "$object : \\" > "$depfile"
26997e8a2e8Smrg    # Clip off the initial element (the dependent).  Don't try to be
27097e8a2e8Smrg    # clever and replace this with sed code, as IRIX sed won't handle
27197e8a2e8Smrg    # lines with more than a fixed number of characters (4096 in
27297e8a2e8Smrg    # IRIX 6.2 sed, 8192 in IRIX 6.5).  We also remove comment lines;
27368af480fSmrg    # the IRIX cc adds comments like '#:fec' to the end of the
27497e8a2e8Smrg    # dependency line.
27568af480fSmrg    tr ' ' "$nl" < "$tmpdepfile" \
27668af480fSmrg      | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \
27768af480fSmrg      | tr "$nl" ' ' >> "$depfile"
278d7accfefSmrg    echo >> "$depfile"
27997e8a2e8Smrg    # The second pass generates a dummy entry for each header file.
28068af480fSmrg    tr ' ' "$nl" < "$tmpdepfile" \
28168af480fSmrg      | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
28268af480fSmrg      >> "$depfile"
28397e8a2e8Smrg  else
28468af480fSmrg    make_dummy_depfile
28597e8a2e8Smrg  fi
28697e8a2e8Smrg  rm -f "$tmpdepfile"
28797e8a2e8Smrg  ;;
28897e8a2e8Smrg
28968af480fSmrgxlc)
29068af480fSmrg  # This case exists only to let depend.m4 do its work.  It works by
29168af480fSmrg  # looking at the text of this script.  This case will never be run,
29268af480fSmrg  # since it is checked for above.
29368af480fSmrg  exit 1
29468af480fSmrg  ;;
29568af480fSmrg
29697e8a2e8Smrgaix)
29797e8a2e8Smrg  # The C for AIX Compiler uses -M and outputs the dependencies
29897e8a2e8Smrg  # in a .u file.  In older versions, this file always lives in the
29968af480fSmrg  # current directory.  Also, the AIX compiler puts '$object:' at the
30097e8a2e8Smrg  # start of each line; $object doesn't have directory information.
30197e8a2e8Smrg  # Version 6 uses the directory in both cases.
30268af480fSmrg  set_dir_from "$object"
30368af480fSmrg  set_base_from "$object"
30497e8a2e8Smrg  if test "$libtool" = yes; then
305d7accfefSmrg    tmpdepfile1=$dir$base.u
306d7accfefSmrg    tmpdepfile2=$base.u
307d7accfefSmrg    tmpdepfile3=$dir.libs/$base.u
30897e8a2e8Smrg    "$@" -Wc,-M
30997e8a2e8Smrg  else
310d7accfefSmrg    tmpdepfile1=$dir$base.u
311d7accfefSmrg    tmpdepfile2=$dir$base.u
312d7accfefSmrg    tmpdepfile3=$dir$base.u
31397e8a2e8Smrg    "$@" -M
31497e8a2e8Smrg  fi
31597e8a2e8Smrg  stat=$?
31668af480fSmrg  if test $stat -ne 0; then
317d7accfefSmrg    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
31897e8a2e8Smrg    exit $stat
31997e8a2e8Smrg  fi
32097e8a2e8Smrg
321d7accfefSmrg  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
322d7accfefSmrg  do
323d7accfefSmrg    test -f "$tmpdepfile" && break
324d7accfefSmrg  done
32568af480fSmrg  aix_post_process_depfile
32668af480fSmrg  ;;
32768af480fSmrg
32868af480fSmrgtcc)
32968af480fSmrg  # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26
33068af480fSmrg  # FIXME: That version still under development at the moment of writing.
33168af480fSmrg  #        Make that this statement remains true also for stable, released
33268af480fSmrg  #        versions.
33368af480fSmrg  # It will wrap lines (doesn't matter whether long or short) with a
33468af480fSmrg  # trailing '\', as in:
33568af480fSmrg  #
33668af480fSmrg  #   foo.o : \
33768af480fSmrg  #    foo.c \
33868af480fSmrg  #    foo.h \
33968af480fSmrg  #
34068af480fSmrg  # It will put a trailing '\' even on the last line, and will use leading
34168af480fSmrg  # spaces rather than leading tabs (at least since its commit 0394caf7
34268af480fSmrg  # "Emit spaces for -MD").
34368af480fSmrg  "$@" -MD -MF "$tmpdepfile"
34468af480fSmrg  stat=$?
34568af480fSmrg  if test $stat -ne 0; then
34668af480fSmrg    rm -f "$tmpdepfile"
34768af480fSmrg    exit $stat
34897e8a2e8Smrg  fi
34968af480fSmrg  rm -f "$depfile"
35068af480fSmrg  # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'.
35168af480fSmrg  # We have to change lines of the first kind to '$object: \'.
35268af480fSmrg  sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile"
35368af480fSmrg  # And for each line of the second kind, we have to emit a 'dep.h:'
35468af480fSmrg  # dummy dependency, to avoid the deleted-header problem.
35568af480fSmrg  sed -n -e 's|^  *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile"
35697e8a2e8Smrg  rm -f "$tmpdepfile"
35797e8a2e8Smrg  ;;
35897e8a2e8Smrg
35968af480fSmrg## The order of this option in the case statement is important, since the
36068af480fSmrg## shell code in configure will try each of these formats in the order
36168af480fSmrg## listed in this file.  A plain '-MD' option would be understood by many
36268af480fSmrg## compilers, so we must ensure this comes after the gcc and icc options.
36368af480fSmrgpgcc)
36468af480fSmrg  # Portland's C compiler understands '-MD'.
36568af480fSmrg  # Will always output deps to 'file.d' where file is the root name of the
36668af480fSmrg  # source file under compilation, even if file resides in a subdirectory.
36768af480fSmrg  # The object file name does not affect the name of the '.d' file.
36868af480fSmrg  # pgcc 10.2 will output
36997e8a2e8Smrg  #    foo.o: sub/foo.c sub/foo.h
37068af480fSmrg  # and will wrap long lines using '\' :
37197e8a2e8Smrg  #    foo.o: sub/foo.c ... \
37297e8a2e8Smrg  #     sub/foo.h ... \
37397e8a2e8Smrg  #     ...
37468af480fSmrg  set_dir_from "$object"
37568af480fSmrg  # Use the source, not the object, to determine the base name, since
37668af480fSmrg  # that's sadly what pgcc will do too.
37768af480fSmrg  set_base_from "$source"
37868af480fSmrg  tmpdepfile=$base.d
37968af480fSmrg
38068af480fSmrg  # For projects that build the same source file twice into different object
38168af480fSmrg  # files, the pgcc approach of using the *source* file root name can cause
38268af480fSmrg  # problems in parallel builds.  Use a locking strategy to avoid stomping on
38368af480fSmrg  # the same $tmpdepfile.
38468af480fSmrg  lockdir=$base.d-lock
38568af480fSmrg  trap "
38668af480fSmrg    echo '$0: caught signal, cleaning up...' >&2
38768af480fSmrg    rmdir '$lockdir'
38868af480fSmrg    exit 1
38968af480fSmrg  " 1 2 13 15
39068af480fSmrg  numtries=100
39168af480fSmrg  i=$numtries
39268af480fSmrg  while test $i -gt 0; do
39368af480fSmrg    # mkdir is a portable test-and-set.
39468af480fSmrg    if mkdir "$lockdir" 2>/dev/null; then
39568af480fSmrg      # This process acquired the lock.
39668af480fSmrg      "$@" -MD
39768af480fSmrg      stat=$?
39868af480fSmrg      # Release the lock.
39968af480fSmrg      rmdir "$lockdir"
40068af480fSmrg      break
40168af480fSmrg    else
40268af480fSmrg      # If the lock is being held by a different process, wait
40368af480fSmrg      # until the winning process is done or we timeout.
40468af480fSmrg      while test -d "$lockdir" && test $i -gt 0; do
40568af480fSmrg        sleep 1
40668af480fSmrg        i=`expr $i - 1`
40768af480fSmrg      done
40868af480fSmrg    fi
40968af480fSmrg    i=`expr $i - 1`
41068af480fSmrg  done
41168af480fSmrg  trap - 1 2 13 15
41268af480fSmrg  if test $i -le 0; then
41368af480fSmrg    echo "$0: failed to acquire lock after $numtries attempts" >&2
41468af480fSmrg    echo "$0: check lockdir '$lockdir'" >&2
41568af480fSmrg    exit 1
41668af480fSmrg  fi
41797e8a2e8Smrg
41868af480fSmrg  if test $stat -ne 0; then
41997e8a2e8Smrg    rm -f "$tmpdepfile"
42097e8a2e8Smrg    exit $stat
42197e8a2e8Smrg  fi
42297e8a2e8Smrg  rm -f "$depfile"
42397e8a2e8Smrg  # Each line is of the form `foo.o: dependent.h',
42497e8a2e8Smrg  # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'.
42597e8a2e8Smrg  # Do two passes, one to just change these to
42697e8a2e8Smrg  # `$object: dependent.h' and one to simply `dependent.h:'.
42797e8a2e8Smrg  sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
42897e8a2e8Smrg  # Some versions of the HPUX 10.20 sed can't process this invocation
42997e8a2e8Smrg  # correctly.  Breaking it into two sed invocations is a workaround.
43068af480fSmrg  sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \
43168af480fSmrg    | sed -e 's/$/ :/' >> "$depfile"
43297e8a2e8Smrg  rm -f "$tmpdepfile"
43397e8a2e8Smrg  ;;
43497e8a2e8Smrg
435d7accfefSmrghp2)
436d7accfefSmrg  # The "hp" stanza above does not work with aCC (C++) and HP's ia64
437d7accfefSmrg  # compilers, which have integrated preprocessors.  The correct option
438d7accfefSmrg  # to use with these is +Maked; it writes dependencies to a file named
439d7accfefSmrg  # 'foo.d', which lands next to the object file, wherever that
440d7accfefSmrg  # happens to be.
441d7accfefSmrg  # Much of this is similar to the tru64 case; see comments there.
44268af480fSmrg  set_dir_from  "$object"
44368af480fSmrg  set_base_from "$object"
444d7accfefSmrg  if test "$libtool" = yes; then
445d7accfefSmrg    tmpdepfile1=$dir$base.d
446d7accfefSmrg    tmpdepfile2=$dir.libs/$base.d
447d7accfefSmrg    "$@" -Wc,+Maked
448d7accfefSmrg  else
449d7accfefSmrg    tmpdepfile1=$dir$base.d
450d7accfefSmrg    tmpdepfile2=$dir$base.d
451d7accfefSmrg    "$@" +Maked
452d7accfefSmrg  fi
453d7accfefSmrg  stat=$?
45468af480fSmrg  if test $stat -ne 0; then
455d7accfefSmrg     rm -f "$tmpdepfile1" "$tmpdepfile2"
456d7accfefSmrg     exit $stat
457d7accfefSmrg  fi
458d7accfefSmrg
459d7accfefSmrg  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2"
460d7accfefSmrg  do
461d7accfefSmrg    test -f "$tmpdepfile" && break
462d7accfefSmrg  done
463d7accfefSmrg  if test -f "$tmpdepfile"; then
46468af480fSmrg    sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile"
46568af480fSmrg    # Add 'dependent.h:' lines.
466d7accfefSmrg    sed -ne '2,${
46768af480fSmrg               s/^ *//
46868af480fSmrg               s/ \\*$//
46968af480fSmrg               s/$/:/
47068af480fSmrg               p
47168af480fSmrg             }' "$tmpdepfile" >> "$depfile"
472d7accfefSmrg  else
47368af480fSmrg    make_dummy_depfile
474d7accfefSmrg  fi
475d7accfefSmrg  rm -f "$tmpdepfile" "$tmpdepfile2"
476d7accfefSmrg  ;;
477d7accfefSmrg
47897e8a2e8Smrgtru64)
47968af480fSmrg  # The Tru64 compiler uses -MD to generate dependencies as a side
48068af480fSmrg  # effect.  'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'.
48168af480fSmrg  # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
48268af480fSmrg  # dependencies in 'foo.d' instead, so we check for that too.
48368af480fSmrg  # Subdirectories are respected.
48468af480fSmrg  set_dir_from  "$object"
48568af480fSmrg  set_base_from "$object"
48668af480fSmrg
48768af480fSmrg  if test "$libtool" = yes; then
48868af480fSmrg    # Libtool generates 2 separate objects for the 2 libraries.  These
48968af480fSmrg    # two compilations output dependencies in $dir.libs/$base.o.d and
49068af480fSmrg    # in $dir$base.o.d.  We have to check for both files, because
49168af480fSmrg    # one of the two compilations can be disabled.  We should prefer
49268af480fSmrg    # $dir$base.o.d over $dir.libs/$base.o.d because the latter is
49368af480fSmrg    # automatically cleaned when .libs/ is deleted, while ignoring
49468af480fSmrg    # the former would cause a distcleancheck panic.
49568af480fSmrg    tmpdepfile1=$dir$base.o.d          # libtool 1.5
49668af480fSmrg    tmpdepfile2=$dir.libs/$base.o.d    # Likewise.
49768af480fSmrg    tmpdepfile3=$dir.libs/$base.d      # Compaq CCC V6.2-504
49868af480fSmrg    "$@" -Wc,-MD
49968af480fSmrg  else
50068af480fSmrg    tmpdepfile1=$dir$base.d
50168af480fSmrg    tmpdepfile2=$dir$base.d
50268af480fSmrg    tmpdepfile3=$dir$base.d
50368af480fSmrg    "$@" -MD
50468af480fSmrg  fi
50568af480fSmrg
50668af480fSmrg  stat=$?
50768af480fSmrg  if test $stat -ne 0; then
50868af480fSmrg    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
50968af480fSmrg    exit $stat
51068af480fSmrg  fi
51168af480fSmrg
51268af480fSmrg  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
51368af480fSmrg  do
51468af480fSmrg    test -f "$tmpdepfile" && break
51568af480fSmrg  done
51668af480fSmrg  # Same post-processing that is required for AIX mode.
51768af480fSmrg  aix_post_process_depfile
51868af480fSmrg  ;;
51968af480fSmrg
52068af480fSmrgmsvc7)
52168af480fSmrg  if test "$libtool" = yes; then
52268af480fSmrg    showIncludes=-Wc,-showIncludes
52368af480fSmrg  else
52468af480fSmrg    showIncludes=-showIncludes
52568af480fSmrg  fi
52668af480fSmrg  "$@" $showIncludes > "$tmpdepfile"
52768af480fSmrg  stat=$?
52868af480fSmrg  grep -v '^Note: including file: ' "$tmpdepfile"
52968af480fSmrg  if test $stat -ne 0; then
53068af480fSmrg    rm -f "$tmpdepfile"
53168af480fSmrg    exit $stat
53268af480fSmrg  fi
53368af480fSmrg  rm -f "$depfile"
53468af480fSmrg  echo "$object : \\" > "$depfile"
53568af480fSmrg  # The first sed program below extracts the file names and escapes
53668af480fSmrg  # backslashes for cygpath.  The second sed program outputs the file
53768af480fSmrg  # name when reading, but also accumulates all include files in the
53868af480fSmrg  # hold buffer in order to output them again at the end.  This only
53968af480fSmrg  # works with sed implementations that can handle large buffers.
54068af480fSmrg  sed < "$tmpdepfile" -n '
54168af480fSmrg/^Note: including file:  *\(.*\)/ {
54268af480fSmrg  s//\1/
54368af480fSmrg  s/\\/\\\\/g
54468af480fSmrg  p
54568af480fSmrg}' | $cygpath_u | sort -u | sed -n '
54668af480fSmrgs/ /\\ /g
54768af480fSmrgs/\(.*\)/'"$tab"'\1 \\/p
54868af480fSmrgs/.\(.*\) \\/\1:/
54968af480fSmrgH
55068af480fSmrg$ {
55168af480fSmrg  s/.*/'"$tab"'/
55268af480fSmrg  G
55368af480fSmrg  p
55468af480fSmrg}' >> "$depfile"
55568af480fSmrg  echo >> "$depfile" # make sure the fragment doesn't end with a backslash
55668af480fSmrg  rm -f "$tmpdepfile"
55768af480fSmrg  ;;
55868af480fSmrg
55968af480fSmrgmsvc7msys)
56068af480fSmrg  # This case exists only to let depend.m4 do its work.  It works by
56168af480fSmrg  # looking at the text of this script.  This case will never be run,
56268af480fSmrg  # since it is checked for above.
56368af480fSmrg  exit 1
56468af480fSmrg  ;;
56597e8a2e8Smrg
56697e8a2e8Smrg#nosideeffect)
56797e8a2e8Smrg  # This comment above is used by automake to tell side-effect
56897e8a2e8Smrg  # dependency tracking mechanisms from slower ones.
56997e8a2e8Smrg
57097e8a2e8Smrgdashmstdout)
57197e8a2e8Smrg  # Important note: in order to support this mode, a compiler *must*
57297e8a2e8Smrg  # always write the preprocessed file to stdout, regardless of -o.
57397e8a2e8Smrg  "$@" || exit $?
57497e8a2e8Smrg
57597e8a2e8Smrg  # Remove the call to Libtool.
57697e8a2e8Smrg  if test "$libtool" = yes; then
577d7accfefSmrg    while test "X$1" != 'X--mode=compile'; do
57897e8a2e8Smrg      shift
57997e8a2e8Smrg    done
58097e8a2e8Smrg    shift
58197e8a2e8Smrg  fi
58297e8a2e8Smrg
58368af480fSmrg  # Remove '-o $object'.
58497e8a2e8Smrg  IFS=" "
58597e8a2e8Smrg  for arg
58697e8a2e8Smrg  do
58797e8a2e8Smrg    case $arg in
58897e8a2e8Smrg    -o)
58997e8a2e8Smrg      shift
59097e8a2e8Smrg      ;;
59197e8a2e8Smrg    $object)
59297e8a2e8Smrg      shift
59397e8a2e8Smrg      ;;
59497e8a2e8Smrg    *)
59597e8a2e8Smrg      set fnord "$@" "$arg"
59697e8a2e8Smrg      shift # fnord
59797e8a2e8Smrg      shift # $arg
59897e8a2e8Smrg      ;;
59997e8a2e8Smrg    esac
60097e8a2e8Smrg  done
60197e8a2e8Smrg
60297e8a2e8Smrg  test -z "$dashmflag" && dashmflag=-M
60368af480fSmrg  # Require at least two characters before searching for ':'
60497e8a2e8Smrg  # in the target name.  This is to cope with DOS-style filenames:
60568af480fSmrg  # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise.
60697e8a2e8Smrg  "$@" $dashmflag |
60768af480fSmrg    sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile"
60897e8a2e8Smrg  rm -f "$depfile"
60997e8a2e8Smrg  cat < "$tmpdepfile" > "$depfile"
61068af480fSmrg  # Some versions of the HPUX 10.20 sed can't process this sed invocation
61168af480fSmrg  # correctly.  Breaking it into two sed invocations is a workaround.
61268af480fSmrg  tr ' ' "$nl" < "$tmpdepfile" \
61368af480fSmrg    | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
61468af480fSmrg    | sed -e 's/$/ :/' >> "$depfile"
61597e8a2e8Smrg  rm -f "$tmpdepfile"
61697e8a2e8Smrg  ;;
61797e8a2e8Smrg
61897e8a2e8SmrgdashXmstdout)
61997e8a2e8Smrg  # This case only exists to satisfy depend.m4.  It is never actually
62097e8a2e8Smrg  # run, as this mode is specially recognized in the preamble.
62197e8a2e8Smrg  exit 1
62297e8a2e8Smrg  ;;
62397e8a2e8Smrg
62497e8a2e8Smrgmakedepend)
62597e8a2e8Smrg  "$@" || exit $?
62697e8a2e8Smrg  # Remove any Libtool call
62797e8a2e8Smrg  if test "$libtool" = yes; then
628d7accfefSmrg    while test "X$1" != 'X--mode=compile'; do
62997e8a2e8Smrg      shift
63097e8a2e8Smrg    done
63197e8a2e8Smrg    shift
63297e8a2e8Smrg  fi
63397e8a2e8Smrg  # X makedepend
63497e8a2e8Smrg  shift
635d7accfefSmrg  cleared=no eat=no
636d7accfefSmrg  for arg
637d7accfefSmrg  do
63897e8a2e8Smrg    case $cleared in
63997e8a2e8Smrg    no)
64097e8a2e8Smrg      set ""; shift
64197e8a2e8Smrg      cleared=yes ;;
64297e8a2e8Smrg    esac
643d7accfefSmrg    if test $eat = yes; then
644d7accfefSmrg      eat=no
645d7accfefSmrg      continue
646d7accfefSmrg    fi
64797e8a2e8Smrg    case "$arg" in
64897e8a2e8Smrg    -D*|-I*)
64997e8a2e8Smrg      set fnord "$@" "$arg"; shift ;;
65097e8a2e8Smrg    # Strip any option that makedepend may not understand.  Remove
65197e8a2e8Smrg    # the object too, otherwise makedepend will parse it as a source file.
652d7accfefSmrg    -arch)
653d7accfefSmrg      eat=yes ;;
65497e8a2e8Smrg    -*|$object)
65597e8a2e8Smrg      ;;
65697e8a2e8Smrg    *)
65797e8a2e8Smrg      set fnord "$@" "$arg"; shift ;;
65897e8a2e8Smrg    esac
65997e8a2e8Smrg  done
660d7accfefSmrg  obj_suffix=`echo "$object" | sed 's/^.*\././'`
66197e8a2e8Smrg  touch "$tmpdepfile"
66297e8a2e8Smrg  ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
66397e8a2e8Smrg  rm -f "$depfile"
66468af480fSmrg  # makedepend may prepend the VPATH from the source file name to the object.
66568af480fSmrg  # No need to regex-escape $object, excess matching of '.' is harmless.
66668af480fSmrg  sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile"
66768af480fSmrg  # Some versions of the HPUX 10.20 sed can't process the last invocation
66868af480fSmrg  # correctly.  Breaking it into two sed invocations is a workaround.
66968af480fSmrg  sed '1,2d' "$tmpdepfile" \
67068af480fSmrg    | tr ' ' "$nl" \
67168af480fSmrg    | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
67268af480fSmrg    | sed -e 's/$/ :/' >> "$depfile"
67397e8a2e8Smrg  rm -f "$tmpdepfile" "$tmpdepfile".bak
67497e8a2e8Smrg  ;;
67597e8a2e8Smrg
67697e8a2e8Smrgcpp)
67797e8a2e8Smrg  # Important note: in order to support this mode, a compiler *must*
67897e8a2e8Smrg  # always write the preprocessed file to stdout.
67997e8a2e8Smrg  "$@" || exit $?
68097e8a2e8Smrg
68197e8a2e8Smrg  # Remove the call to Libtool.
68297e8a2e8Smrg  if test "$libtool" = yes; then
683d7accfefSmrg    while test "X$1" != 'X--mode=compile'; do
68497e8a2e8Smrg      shift
68597e8a2e8Smrg    done
68697e8a2e8Smrg    shift
68797e8a2e8Smrg  fi
68897e8a2e8Smrg
68968af480fSmrg  # Remove '-o $object'.
69097e8a2e8Smrg  IFS=" "
69197e8a2e8Smrg  for arg
69297e8a2e8Smrg  do
69397e8a2e8Smrg    case $arg in
69497e8a2e8Smrg    -o)
69597e8a2e8Smrg      shift
69697e8a2e8Smrg      ;;
69797e8a2e8Smrg    $object)
69897e8a2e8Smrg      shift
69997e8a2e8Smrg      ;;
70097e8a2e8Smrg    *)
70197e8a2e8Smrg      set fnord "$@" "$arg"
70297e8a2e8Smrg      shift # fnord
70397e8a2e8Smrg      shift # $arg
70497e8a2e8Smrg      ;;
70597e8a2e8Smrg    esac
70697e8a2e8Smrg  done
70797e8a2e8Smrg
70868af480fSmrg  "$@" -E \
70968af480fSmrg    | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
71068af480fSmrg             -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
71168af480fSmrg    | sed '$ s: \\$::' > "$tmpdepfile"
71297e8a2e8Smrg  rm -f "$depfile"
71397e8a2e8Smrg  echo "$object : \\" > "$depfile"
71497e8a2e8Smrg  cat < "$tmpdepfile" >> "$depfile"
71597e8a2e8Smrg  sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
71697e8a2e8Smrg  rm -f "$tmpdepfile"
71797e8a2e8Smrg  ;;
71897e8a2e8Smrg
71997e8a2e8Smrgmsvisualcpp)
72097e8a2e8Smrg  # Important note: in order to support this mode, a compiler *must*
721d7accfefSmrg  # always write the preprocessed file to stdout.
72297e8a2e8Smrg  "$@" || exit $?
723d7accfefSmrg
724d7accfefSmrg  # Remove the call to Libtool.
725d7accfefSmrg  if test "$libtool" = yes; then
726d7accfefSmrg    while test "X$1" != 'X--mode=compile'; do
727d7accfefSmrg      shift
728d7accfefSmrg    done
729d7accfefSmrg    shift
730d7accfefSmrg  fi
731d7accfefSmrg
73297e8a2e8Smrg  IFS=" "
73397e8a2e8Smrg  for arg
73497e8a2e8Smrg  do
73597e8a2e8Smrg    case "$arg" in
736d7accfefSmrg    -o)
737d7accfefSmrg      shift
738d7accfefSmrg      ;;
739d7accfefSmrg    $object)
740d7accfefSmrg      shift
741d7accfefSmrg      ;;
74297e8a2e8Smrg    "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
74368af480fSmrg        set fnord "$@"
74468af480fSmrg        shift
74568af480fSmrg        shift
74668af480fSmrg        ;;
74797e8a2e8Smrg    *)
74868af480fSmrg        set fnord "$@" "$arg"
74968af480fSmrg        shift
75068af480fSmrg        shift
75168af480fSmrg        ;;
75297e8a2e8Smrg    esac
75397e8a2e8Smrg  done
754d7accfefSmrg  "$@" -E 2>/dev/null |
755d7accfefSmrg  sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile"
75697e8a2e8Smrg  rm -f "$depfile"
75797e8a2e8Smrg  echo "$object : \\" > "$depfile"
75868af480fSmrg  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile"
75968af480fSmrg  echo "$tab" >> "$depfile"
760d7accfefSmrg  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile"
76197e8a2e8Smrg  rm -f "$tmpdepfile"
76297e8a2e8Smrg  ;;
76397e8a2e8Smrg
764d7accfefSmrgmsvcmsys)
765d7accfefSmrg  # This case exists only to let depend.m4 do its work.  It works by
766d7accfefSmrg  # looking at the text of this script.  This case will never be run,
767d7accfefSmrg  # since it is checked for above.
768d7accfefSmrg  exit 1
769d7accfefSmrg  ;;
770d7accfefSmrg
77197e8a2e8Smrgnone)
77297e8a2e8Smrg  exec "$@"
77397e8a2e8Smrg  ;;
77497e8a2e8Smrg
77597e8a2e8Smrg*)
77697e8a2e8Smrg  echo "Unknown depmode $depmode" 1>&2
77797e8a2e8Smrg  exit 1
77897e8a2e8Smrg  ;;
77997e8a2e8Smrgesac
78097e8a2e8Smrg
78197e8a2e8Smrgexit 0
782d7accfefSmrg
783d7accfefSmrg# Local Variables:
784d7accfefSmrg# mode: shell-script
785d7accfefSmrg# sh-indentation: 2
786d7accfefSmrg# eval: (add-hook 'write-file-hooks 'time-stamp)
787d7accfefSmrg# time-stamp-start: "scriptversion="
788d7accfefSmrg# time-stamp-format: "%:y-%02m-%02d.%02H"
789d7accfefSmrg# time-stamp-time-zone: "UTC"
790d7accfefSmrg# time-stamp-end: "; # UTC"
791d7accfefSmrg# End:
792