1e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev#! /bin/sh
2e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev# depcomp - compile a program generating dependencies as side-effects
3e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev
4e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishevscriptversion=2007-03-29.01
5e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev
6e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007 Free Software
7e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev# Foundation, Inc.
8e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev
9e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev# This program is free software; you can redistribute it and/or modify
10e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev# it under the terms of the GNU General Public License as published by
11e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev# the Free Software Foundation; either version 2, or (at your option)
12e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev# any later version.
13e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev
14e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev# This program is distributed in the hope that it will be useful,
15e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev# but WITHOUT ANY WARRANTY; without even the implied warranty of
16e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev# GNU General Public License for more details.
18e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev
19e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev# You should have received a copy of the GNU General Public License
20e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev# along with this program; if not, write to the Free Software
21e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
22e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev# 02110-1301, USA.
23e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev
24e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev# As a special exception to the GNU General Public License, if you
25e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev# distribute this file as part of a program that contains a
26e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev# configuration script generated by Autoconf, you may include it under
27e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev# the same distribution terms that you use for the rest of that program.
28e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev
29e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>.
30e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev
31e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishevcase $1 in
32e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  '')
33e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev     echo "$0: No command.  Try \`$0 --help' for more information." 1>&2
34e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev     exit 1;
35e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev     ;;
36e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  -h | --h*)
37e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev    cat <<\EOF
38e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor GoulishevUsage: depcomp [--help] [--version] PROGRAM [ARGS]
39e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev
40e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor GoulishevRun PROGRAMS ARGS to compile a file, generating dependencies
41e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishevas side-effects.
42e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev
43e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor GoulishevEnvironment variables:
44e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  depmode     Dependency tracking mode.
45e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  source      Source file read by `PROGRAMS ARGS'.
46e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  object      Object file output by `PROGRAMS ARGS'.
47e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  DEPDIR      directory where to store dependencies.
48e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  depfile     Dependency file to output.
49e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  tmpdepfile  Temporary file to use when outputing dependencies.
50e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  libtool     Whether libtool is used (yes/no).
51e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev
52e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor GoulishevReport bugs to <bug-automake@gnu.org>.
53e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor GoulishevEOF
54e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev    exit $?
55e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev    ;;
56e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  -v | --v*)
57e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev    echo "depcomp $scriptversion"
58e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev    exit $?
59e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev    ;;
60e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishevesac
61e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev
62e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishevif test -z "$depmode" || test -z "$source" || test -z "$object"; then
63e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  echo "depcomp: Variables source, object and depmode must be set" 1>&2
64e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  exit 1
65e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishevfi
66e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev
67e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.
68e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishevdepfile=${depfile-`echo "$object" |
69e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`}
70e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishevtmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
71e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev
72e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishevrm -f "$tmpdepfile"
73e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev
74e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev# Some modes work just like other modes, but use different flags.  We
75e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev# parameterize here, but still list the modes in the big case below,
76e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev# to make depend.m4 easier to write.  Note that we *cannot* use a case
77e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev# here, because this file can only contain one case statement.
78e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishevif test "$depmode" = hp; then
79e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  # HP compiler uses -M and no extra arg.
80e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  gccflag=-M
81e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  depmode=gcc
82e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishevfi
83e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev
84e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishevif test "$depmode" = dashXmstdout; then
85e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev   # This is just like dashmstdout with a different argument.
86e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev   dashmflag=-xM
87e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev   depmode=dashmstdout
88e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishevfi
89e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev
90e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishevcase "$depmode" in
91e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishevgcc3)
92e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev## gcc 3 implements dependency tracking that does exactly what
93e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev## we want.  Yay!  Note: for some reason libtool 1.4 doesn't like
94e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev## it if -MD -MP comes after the -MF stuff.  Hmm.
95e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev## Unfortunately, FreeBSD c89 acceptance of flags depends upon
96e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev## the command line argument order; so add the flags where they
97e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev## appear in depend2.am.  Note that the slowdown incurred here
98e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev## affects only configure: in makefiles, %FASTDEP% shortcuts this.
99e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  for arg
100e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  do
101e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev    case $arg in
102e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev    -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;;
103e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev    *)  set fnord "$@" "$arg" ;;
104e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev    esac
105e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev    shift # fnord
106e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev    shift # $arg
107e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  done
108e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  "$@"
109e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  stat=$?
110e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  if test $stat -eq 0; then :
111e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  else
112e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev    rm -f "$tmpdepfile"
113e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev    exit $stat
114e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  fi
115e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  mv "$tmpdepfile" "$depfile"
116e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  ;;
117e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev
118e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishevgcc)
119e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev## There are various ways to get dependency output from gcc.  Here's
120e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev## why we pick this rather obscure method:
121e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev## - Don't want to use -MD because we'd like the dependencies to end
122e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev##   up in a subdir.  Having to rename by hand is ugly.
123e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev##   (We might end up doing this anyway to support other compilers.)
124e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
125e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev##   -MM, not -M (despite what the docs say).
126e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev## - Using -M directly means running the compiler twice (even worse
127e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev##   than renaming).
128e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  if test -z "$gccflag"; then
129e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev    gccflag=-MD,
130e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  fi
131e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  "$@" -Wp,"$gccflag$tmpdepfile"
132e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  stat=$?
133e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  if test $stat -eq 0; then :
134e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  else
135e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev    rm -f "$tmpdepfile"
136e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev    exit $stat
137e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  fi
138e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  rm -f "$depfile"
139e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  echo "$object : \\" > "$depfile"
140e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
141e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev## The second -e expression handles DOS-style file names with drive letters.
142e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  sed -e 's/^[^:]*: / /' \
143e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev      -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
144e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev## This next piece of magic avoids the `deleted header file' problem.
145e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev## The problem is that when a header file which appears in a .P file
146e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev## is deleted, the dependency causes make to die (because there is
147e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev## typically no way to rebuild the header).  We avoid this by adding
148e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev## dummy dependencies for each header file.  Too bad gcc doesn't do
149e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev## this for us directly.
150e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  tr ' ' '
151e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev' < "$tmpdepfile" |
152e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev## Some versions of gcc put a space before the `:'.  On the theory
153e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev## that the space means something, we add a space to the output as
154e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev## well.
155e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev## Some versions of the HPUX 10.20 sed can't process this invocation
156e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev## correctly.  Breaking it into two sed invocations is a workaround.
157e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev    sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
158e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  rm -f "$tmpdepfile"
159e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  ;;
160e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev
161e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishevhp)
162e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  # This case exists only to let depend.m4 do its work.  It works by
163e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  # looking at the text of this script.  This case will never be run,
164e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  # since it is checked for above.
165e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  exit 1
166e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  ;;
167e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev
168e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishevsgi)
169e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  if test "$libtool" = yes; then
170e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev    "$@" "-Wp,-MDupdate,$tmpdepfile"
171e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  else
172e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev    "$@" -MDupdate "$tmpdepfile"
173e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  fi
174e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  stat=$?
175e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  if test $stat -eq 0; then :
176e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  else
177e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev    rm -f "$tmpdepfile"
178e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev    exit $stat
179e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  fi
180e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  rm -f "$depfile"
181e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev
182e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  if test -f "$tmpdepfile"; then  # yes, the sourcefile depend on other files
183e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev    echo "$object : \\" > "$depfile"
184e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev
185e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev    # Clip off the initial element (the dependent).  Don't try to be
186e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev    # clever and replace this with sed code, as IRIX sed won't handle
187e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev    # lines with more than a fixed number of characters (4096 in
188e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev    # IRIX 6.2 sed, 8192 in IRIX 6.5).  We also remove comment lines;
189e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev    # the IRIX cc adds comments like `#:fec' to the end of the
190e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev    # dependency line.
191e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev    tr ' ' '
192e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev' < "$tmpdepfile" \
193e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev    | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \
194e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev    tr '
195e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev' ' ' >> $depfile
196e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev    echo >> $depfile
197e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev
198e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev    # The second pass generates a dummy entry for each header file.
199e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev    tr ' ' '
200e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev' < "$tmpdepfile" \
201e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev   | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
202e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev   >> $depfile
203e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  else
204e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev    # The sourcefile does not contain any dependencies, so just
205e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev    # store a dummy comment line, to avoid errors with the Makefile
206e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev    # "include basename.Plo" scheme.
207e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev    echo "#dummy" > "$depfile"
208e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  fi
209e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  rm -f "$tmpdepfile"
210e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  ;;
211e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev
212e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishevaix)
213e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  # The C for AIX Compiler uses -M and outputs the dependencies
214e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  # in a .u file.  In older versions, this file always lives in the
215e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  # current directory.  Also, the AIX compiler puts `$object:' at the
216e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  # start of each line; $object doesn't have directory information.
217e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  # Version 6 uses the directory in both cases.
218e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
219e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  test "x$dir" = "x$object" && dir=
220e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
221e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  if test "$libtool" = yes; then
222e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev    tmpdepfile1=$dir$base.u
223e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev    tmpdepfile2=$base.u
224e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev    tmpdepfile3=$dir.libs/$base.u
225e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev    "$@" -Wc,-M
226e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  else
227e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev    tmpdepfile1=$dir$base.u
228e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev    tmpdepfile2=$dir$base.u
229e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev    tmpdepfile3=$dir$base.u
230e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev    "$@" -M
231e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  fi
232e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  stat=$?
233e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev
234e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  if test $stat -eq 0; then :
235e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  else
236e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
237e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev    exit $stat
238e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  fi
239e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev
240e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
241e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  do
242e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev    test -f "$tmpdepfile" && break
243e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  done
244e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  if test -f "$tmpdepfile"; then
245e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev    # Each line is of the form `foo.o: dependent.h'.
246e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev    # Do two passes, one to just change these to
247e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev    # `$object: dependent.h' and one to simply `dependent.h:'.
248e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev    sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
249e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev    # That's a tab and a space in the [].
250e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev    sed -e 's,^.*\.[a-z]*:[	 ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
251e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  else
252e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev    # The sourcefile does not contain any dependencies, so just
253e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev    # store a dummy comment line, to avoid errors with the Makefile
254e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev    # "include basename.Plo" scheme.
255e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev    echo "#dummy" > "$depfile"
256e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  fi
257e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  rm -f "$tmpdepfile"
258e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  ;;
259e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev
260e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishevicc)
261e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  # Intel's C compiler understands `-MD -MF file'.  However on
262e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  #    icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c
263e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  # ICC 7.0 will fill foo.d with something like
264e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  #    foo.o: sub/foo.c
265e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  #    foo.o: sub/foo.h
266e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  # which is wrong.  We want:
267e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  #    sub/foo.o: sub/foo.c
268e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  #    sub/foo.o: sub/foo.h
269e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  #    sub/foo.c:
270e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  #    sub/foo.h:
271e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  # ICC 7.1 will output
272e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  #    foo.o: sub/foo.c sub/foo.h
273e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  # and will wrap long lines using \ :
274e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  #    foo.o: sub/foo.c ... \
275e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  #     sub/foo.h ... \
276e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  #     ...
277e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev
278e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  "$@" -MD -MF "$tmpdepfile"
279e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  stat=$?
280e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  if test $stat -eq 0; then :
281e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  else
282e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev    rm -f "$tmpdepfile"
283e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev    exit $stat
284e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  fi
285e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  rm -f "$depfile"
286e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  # Each line is of the form `foo.o: dependent.h',
287e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'.
288e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  # Do two passes, one to just change these to
289e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  # `$object: dependent.h' and one to simply `dependent.h:'.
290e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
291e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  # Some versions of the HPUX 10.20 sed can't process this invocation
292e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  # correctly.  Breaking it into two sed invocations is a workaround.
293e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" |
294e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev    sed -e 's/$/ :/' >> "$depfile"
295e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  rm -f "$tmpdepfile"
296e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  ;;
297e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev
298e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishevhp2)
299e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  # The "hp" stanza above does not work with aCC (C++) and HP's ia64
300e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  # compilers, which have integrated preprocessors.  The correct option
301e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  # to use with these is +Maked; it writes dependencies to a file named
302e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  # 'foo.d', which lands next to the object file, wherever that
303e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  # happens to be.
304e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  # Much of this is similar to the tru64 case; see comments there.
305e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
306e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  test "x$dir" = "x$object" && dir=
307e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
308e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  if test "$libtool" = yes; then
309e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev    tmpdepfile1=$dir$base.d
310e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev    tmpdepfile2=$dir.libs/$base.d
311e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev    "$@" -Wc,+Maked
312e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  else
313e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev    tmpdepfile1=$dir$base.d
314e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev    tmpdepfile2=$dir$base.d
315e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev    "$@" +Maked
316e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  fi
317e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  stat=$?
318e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  if test $stat -eq 0; then :
319e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  else
320e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev     rm -f "$tmpdepfile1" "$tmpdepfile2"
321e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev     exit $stat
322e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  fi
323e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev
324e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2"
325e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  do
326e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev    test -f "$tmpdepfile" && break
327e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  done
328e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  if test -f "$tmpdepfile"; then
329e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev    sed -e "s,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile"
330e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev    # Add `dependent.h:' lines.
331e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev    sed -ne '2,${; s/^ *//; s/ \\*$//; s/$/:/; p;}' "$tmpdepfile" >> "$depfile"
332e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  else
333e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev    echo "#dummy" > "$depfile"
334e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  fi
335e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  rm -f "$tmpdepfile" "$tmpdepfile2"
336e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  ;;
337e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev
338e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishevtru64)
339e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev   # The Tru64 compiler uses -MD to generate dependencies as a side
340e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev   # effect.  `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'.
341e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev   # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
342e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev   # dependencies in `foo.d' instead, so we check for that too.
343e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev   # Subdirectories are respected.
344e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev   dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
345e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev   test "x$dir" = "x$object" && dir=
346e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev   base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
347e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev
348e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev   if test "$libtool" = yes; then
349e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev      # With Tru64 cc, shared objects can also be used to make a
350e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev      # static library.  This mechanism is used in libtool 1.4 series to
351e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev      # handle both shared and static libraries in a single compilation.
352e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev      # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d.
353e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev      #
354e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev      # With libtool 1.5 this exception was removed, and libtool now
355e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev      # generates 2 separate objects for the 2 libraries.  These two
356e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev      # compilations output dependencies in $dir.libs/$base.o.d and
357e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev      # in $dir$base.o.d.  We have to check for both files, because
358e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev      # one of the two compilations can be disabled.  We should prefer
359e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev      # $dir$base.o.d over $dir.libs/$base.o.d because the latter is
360e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev      # automatically cleaned when .libs/ is deleted, while ignoring
361e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev      # the former would cause a distcleancheck panic.
362e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev      tmpdepfile1=$dir.libs/$base.lo.d   # libtool 1.4
363e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev      tmpdepfile2=$dir$base.o.d          # libtool 1.5
364e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev      tmpdepfile3=$dir.libs/$base.o.d    # libtool 1.5
365e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev      tmpdepfile4=$dir.libs/$base.d      # Compaq CCC V6.2-504
366e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev      "$@" -Wc,-MD
367e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev   else
368e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev      tmpdepfile1=$dir$base.o.d
369e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev      tmpdepfile2=$dir$base.d
370e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev      tmpdepfile3=$dir$base.d
371e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev      tmpdepfile4=$dir$base.d
372e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev      "$@" -MD
373e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev   fi
374e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev
375e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev   stat=$?
376e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev   if test $stat -eq 0; then :
377e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev   else
378e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev      rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
379e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev      exit $stat
380e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev   fi
381e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev
382e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev   for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
383e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev   do
384e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev     test -f "$tmpdepfile" && break
385e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev   done
386e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev   if test -f "$tmpdepfile"; then
387e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev      sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
388e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev      # That's a tab and a space in the [].
389e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev      sed -e 's,^.*\.[a-z]*:[	 ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
390e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev   else
391e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev      echo "#dummy" > "$depfile"
392e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev   fi
393e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev   rm -f "$tmpdepfile"
394e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev   ;;
395e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev
396e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev#nosideeffect)
397e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  # This comment above is used by automake to tell side-effect
398e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  # dependency tracking mechanisms from slower ones.
399e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev
400e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishevdashmstdout)
401e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  # Important note: in order to support this mode, a compiler *must*
402e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  # always write the preprocessed file to stdout, regardless of -o.
403e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  "$@" || exit $?
404e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev
405e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  # Remove the call to Libtool.
406e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  if test "$libtool" = yes; then
407e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev    while test $1 != '--mode=compile'; do
408e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev      shift
409e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev    done
410e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev    shift
411e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  fi
412e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev
413e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  # Remove `-o $object'.
414e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  IFS=" "
415e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  for arg
416e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  do
417e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev    case $arg in
418e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev    -o)
419e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev      shift
420e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev      ;;
421e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev    $object)
422e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev      shift
423e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev      ;;
424e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev    *)
425e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev      set fnord "$@" "$arg"
426e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev      shift # fnord
427e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev      shift # $arg
428e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev      ;;
429e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev    esac
430e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  done
431e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev
432e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  test -z "$dashmflag" && dashmflag=-M
433e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  # Require at least two characters before searching for `:'
434e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  # in the target name.  This is to cope with DOS-style filenames:
435e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise.
436e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  "$@" $dashmflag |
437e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev    sed 's:^[  ]*[^: ][^:][^:]*\:[    ]*:'"$object"'\: :' > "$tmpdepfile"
438e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  rm -f "$depfile"
439e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  cat < "$tmpdepfile" > "$depfile"
440e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  tr ' ' '
441e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev' < "$tmpdepfile" | \
442e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev## Some versions of the HPUX 10.20 sed can't process this invocation
443e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev## correctly.  Breaking it into two sed invocations is a workaround.
444e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev    sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
445e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  rm -f "$tmpdepfile"
446e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  ;;
447e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev
448e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor GoulishevdashXmstdout)
449e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  # This case only exists to satisfy depend.m4.  It is never actually
450e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  # run, as this mode is specially recognized in the preamble.
451e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  exit 1
452e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  ;;
453e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev
454e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishevmakedepend)
455e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  "$@" || exit $?
456e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  # Remove any Libtool call
457e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  if test "$libtool" = yes; then
458e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev    while test $1 != '--mode=compile'; do
459e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev      shift
460e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev    done
461e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev    shift
462e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  fi
463e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  # X makedepend
464e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  shift
465e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  cleared=no
466e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  for arg in "$@"; do
467e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev    case $cleared in
468e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev    no)
469e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev      set ""; shift
470e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev      cleared=yes ;;
471e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev    esac
472e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev    case "$arg" in
473e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev    -D*|-I*)
474e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev      set fnord "$@" "$arg"; shift ;;
475e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev    # Strip any option that makedepend may not understand.  Remove
476e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev    # the object too, otherwise makedepend will parse it as a source file.
477e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev    -*|$object)
478e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev      ;;
479e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev    *)
480e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev      set fnord "$@" "$arg"; shift ;;
481e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev    esac
482e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  done
483e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  obj_suffix="`echo $object | sed 's/^.*\././'`"
484e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  touch "$tmpdepfile"
485e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
486e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  rm -f "$depfile"
487e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  cat < "$tmpdepfile" > "$depfile"
488e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  sed '1,2d' "$tmpdepfile" | tr ' ' '
489e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev' | \
490e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev## Some versions of the HPUX 10.20 sed can't process this invocation
491e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev## correctly.  Breaking it into two sed invocations is a workaround.
492e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev    sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
493e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  rm -f "$tmpdepfile" "$tmpdepfile".bak
494e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  ;;
495e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev
496e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishevcpp)
497e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  # Important note: in order to support this mode, a compiler *must*
498e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  # always write the preprocessed file to stdout.
499e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  "$@" || exit $?
500e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev
501e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  # Remove the call to Libtool.
502e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  if test "$libtool" = yes; then
503e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev    while test $1 != '--mode=compile'; do
504e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev      shift
505e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev    done
506e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev    shift
507e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  fi
508e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev
509e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  # Remove `-o $object'.
510e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  IFS=" "
511e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  for arg
512e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  do
513e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev    case $arg in
514e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev    -o)
515e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev      shift
516e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev      ;;
517e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev    $object)
518e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev      shift
519e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev      ;;
520e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev    *)
521e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev      set fnord "$@" "$arg"
522e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev      shift # fnord
523e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev      shift # $arg
524e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev      ;;
525e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev    esac
526e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  done
527e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev
528e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  "$@" -E |
529e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev    sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
530e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev       -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' |
531e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev    sed '$ s: \\$::' > "$tmpdepfile"
532e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  rm -f "$depfile"
533e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  echo "$object : \\" > "$depfile"
534e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  cat < "$tmpdepfile" >> "$depfile"
535e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
536e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  rm -f "$tmpdepfile"
537e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  ;;
538e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev
539e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishevmsvisualcpp)
540e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  # Important note: in order to support this mode, a compiler *must*
541e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  # always write the preprocessed file to stdout, regardless of -o,
542e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  # because we must use -o when running libtool.
543e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  "$@" || exit $?
544e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  IFS=" "
545e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  for arg
546e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  do
547e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev    case "$arg" in
548e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev    "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
549e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev	set fnord "$@"
550e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev	shift
551e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev	shift
552e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev	;;
553e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev    *)
554e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev	set fnord "$@" "$arg"
555e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev	shift
556e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev	shift
557e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev	;;
558e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev    esac
559e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  done
560e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  "$@" -E |
561e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::echo "`cygpath -u \\"\1\\"`":p' | sort | uniq > "$tmpdepfile"
562e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  rm -f "$depfile"
563e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  echo "$object : \\" > "$depfile"
564e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::	\1 \\:p' >> "$depfile"
565e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  echo "	" >> "$depfile"
566e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::\1\::p' >> "$depfile"
567e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  rm -f "$tmpdepfile"
568e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  ;;
569e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev
570e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishevnone)
571e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  exec "$@"
572e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  ;;
573e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev
574e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev*)
575e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  echo "Unknown depmode $depmode" 1>&2
576e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  exit 1
577e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev  ;;
578e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishevesac
579e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev
580e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishevexit 0
581e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev
582e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev# Local Variables:
583e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev# mode: shell-script
584e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev# sh-indentation: 2
585e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev# eval: (add-hook 'write-file-hooks 'time-stamp)
586e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev# time-stamp-start: "scriptversion="
587e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev# time-stamp-format: "%:y-%02m-%02d.%02H"
588e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev# time-stamp-end: "$"
589e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev# End:
590