xref: /libtiff-4.0.7/config/depcomp (revision a17a6e5e)
1d1e97bf2SAndrey Kiselev#! /bin/sh
2d1e97bf2SAndrey Kiselev# depcomp - compile a program generating dependencies as side-effects
3d1e97bf2SAndrey Kiselev
4d1be5cb7SEven Rouaultscriptversion=2013-05-30.07; # UTC
5d1e97bf2SAndrey Kiselev
6*a17a6e5eSEven Rouault# Copyright (C) 1999-2014 Free Software Foundation, Inc.
7d1e97bf2SAndrey Kiselev
8d1e97bf2SAndrey Kiselev# This program is free software; you can redistribute it and/or modify
9d1e97bf2SAndrey Kiselev# it under the terms of the GNU General Public License as published by
10d1e97bf2SAndrey Kiselev# the Free Software Foundation; either version 2, or (at your option)
11d1e97bf2SAndrey Kiselev# any later version.
12d1e97bf2SAndrey Kiselev
13d1e97bf2SAndrey Kiselev# This program is distributed in the hope that it will be useful,
14d1e97bf2SAndrey Kiselev# but WITHOUT ANY WARRANTY; without even the implied warranty of
15d1e97bf2SAndrey Kiselev# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16d1e97bf2SAndrey Kiselev# GNU General Public License for more details.
17d1e97bf2SAndrey Kiselev
18d1e97bf2SAndrey Kiselev# You should have received a copy of the GNU General Public License
19d1be5cb7SEven Rouault# along with this program.  If not, see <http://www.gnu.org/licenses/>.
20d1e97bf2SAndrey Kiselev
21d1e97bf2SAndrey Kiselev# As a special exception to the GNU General Public License, if you
22d1e97bf2SAndrey Kiselev# distribute this file as part of a program that contains a
23d1e97bf2SAndrey Kiselev# configuration script generated by Autoconf, you may include it under
24d1e97bf2SAndrey Kiselev# the same distribution terms that you use for the rest of that program.
25d1e97bf2SAndrey Kiselev
26d1e97bf2SAndrey Kiselev# Originally written by Alexandre Oliva <[email protected]>.
27d1e97bf2SAndrey Kiselev
28d1e97bf2SAndrey Kiselevcase $1 in
29d1e97bf2SAndrey Kiselev  '')
30d1be5cb7SEven Rouault    echo "$0: No command.  Try '$0 --help' for more information." 1>&2
31d1e97bf2SAndrey Kiselev    exit 1;
32d1e97bf2SAndrey Kiselev    ;;
33d1e97bf2SAndrey Kiselev  -h | --h*)
34d1e97bf2SAndrey Kiselev    cat <<\EOF
35d1e97bf2SAndrey KiselevUsage: depcomp [--help] [--version] PROGRAM [ARGS]
36d1e97bf2SAndrey Kiselev
37d1e97bf2SAndrey KiselevRun PROGRAMS ARGS to compile a file, generating dependencies
38d1e97bf2SAndrey Kiselevas side-effects.
39d1e97bf2SAndrey Kiselev
40d1e97bf2SAndrey KiselevEnvironment variables:
41d1e97bf2SAndrey Kiselev  depmode     Dependency tracking mode.
42d1be5cb7SEven Rouault  source      Source file read by 'PROGRAMS ARGS'.
43d1be5cb7SEven Rouault  object      Object file output by 'PROGRAMS ARGS'.
44f714980aSAndrey Kiselev  DEPDIR      directory where to store dependencies.
45d1e97bf2SAndrey Kiselev  depfile     Dependency file to output.
46d1be5cb7SEven Rouault  tmpdepfile  Temporary file to use when outputting dependencies.
47d1e97bf2SAndrey Kiselev  libtool     Whether libtool is used (yes/no).
48d1e97bf2SAndrey Kiselev
49d1e97bf2SAndrey KiselevReport bugs to <bug-automake@gnu.org>.
50d1e97bf2SAndrey KiselevEOF
51f714980aSAndrey Kiselev    exit $?
52d1e97bf2SAndrey Kiselev    ;;
53d1e97bf2SAndrey Kiselev  -v | --v*)
54d1e97bf2SAndrey Kiselev    echo "depcomp $scriptversion"
55f714980aSAndrey Kiselev    exit $?
56d1e97bf2SAndrey Kiselev    ;;
57d1e97bf2SAndrey Kiselevesac
58d1e97bf2SAndrey Kiselev
59d1be5cb7SEven Rouault# Get the directory component of the given path, and save it in the
60d1be5cb7SEven Rouault# global variables '$dir'.  Note that this directory component will
61d1be5cb7SEven Rouault# be either empty or ending with a '/' character.  This is deliberate.
62d1be5cb7SEven Rouaultset_dir_from ()
63d1be5cb7SEven Rouault{
64d1be5cb7SEven Rouault  case $1 in
65d1be5cb7SEven Rouault    */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;;
66d1be5cb7SEven Rouault      *) dir=;;
67d1be5cb7SEven Rouault  esac
68d1be5cb7SEven Rouault}
69d1be5cb7SEven Rouault
70d1be5cb7SEven Rouault# Get the suffix-stripped basename of the given path, and save it the
71d1be5cb7SEven Rouault# global variable '$base'.
72d1be5cb7SEven Rouaultset_base_from ()
73d1be5cb7SEven Rouault{
74d1be5cb7SEven Rouault  base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'`
75d1be5cb7SEven Rouault}
76d1be5cb7SEven Rouault
77d1be5cb7SEven Rouault# If no dependency file was actually created by the compiler invocation,
78d1be5cb7SEven Rouault# we still have to create a dummy depfile, to avoid errors with the
79d1be5cb7SEven Rouault# Makefile "include basename.Plo" scheme.
80d1be5cb7SEven Rouaultmake_dummy_depfile ()
81d1be5cb7SEven Rouault{
82d1be5cb7SEven Rouault  echo "#dummy" > "$depfile"
83d1be5cb7SEven Rouault}
84d1be5cb7SEven Rouault
85d1be5cb7SEven Rouault# Factor out some common post-processing of the generated depfile.
86d1be5cb7SEven Rouault# Requires the auxiliary global variable '$tmpdepfile' to be set.
87d1be5cb7SEven Rouaultaix_post_process_depfile ()
88d1be5cb7SEven Rouault{
89d1be5cb7SEven Rouault  # If the compiler actually managed to produce a dependency file,
90d1be5cb7SEven Rouault  # post-process it.
91d1be5cb7SEven Rouault  if test -f "$tmpdepfile"; then
92d1be5cb7SEven Rouault    # Each line is of the form 'foo.o: dependency.h'.
93d1be5cb7SEven Rouault    # Do two passes, one to just change these to
94d1be5cb7SEven Rouault    #   $object: dependency.h
95d1be5cb7SEven Rouault    # and one to simply output
96d1be5cb7SEven Rouault    #   dependency.h:
97d1be5cb7SEven Rouault    # which is needed to avoid the deleted-header problem.
98d1be5cb7SEven Rouault    { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile"
99d1be5cb7SEven Rouault      sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile"
100d1be5cb7SEven Rouault    } > "$depfile"
101d1be5cb7SEven Rouault    rm -f "$tmpdepfile"
102d1be5cb7SEven Rouault  else
103d1be5cb7SEven Rouault    make_dummy_depfile
104d1be5cb7SEven Rouault  fi
105d1be5cb7SEven Rouault}
106d1be5cb7SEven Rouault
107d1be5cb7SEven Rouault# A tabulation character.
108d1be5cb7SEven Rouaulttab='	'
109d1be5cb7SEven Rouault# A newline character.
110d1be5cb7SEven Rouaultnl='
111d1be5cb7SEven Rouault'
112d1be5cb7SEven Rouault# Character ranges might be problematic outside the C locale.
113d1be5cb7SEven Rouault# These definitions help.
114d1be5cb7SEven Rouaultupper=ABCDEFGHIJKLMNOPQRSTUVWXYZ
115d1be5cb7SEven Rouaultlower=abcdefghijklmnopqrstuvwxyz
116d1be5cb7SEven Rouaultdigits=0123456789
117d1be5cb7SEven Rouaultalpha=${upper}${lower}
118d1be5cb7SEven Rouault
119d1e97bf2SAndrey Kiselevif test -z "$depmode" || test -z "$source" || test -z "$object"; then
120d1e97bf2SAndrey Kiselev  echo "depcomp: Variables source, object and depmode must be set" 1>&2
121d1e97bf2SAndrey Kiselev  exit 1
122d1e97bf2SAndrey Kiselevfi
123d1e97bf2SAndrey Kiselev
124f714980aSAndrey Kiselev# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.
125f714980aSAndrey Kiselevdepfile=${depfile-`echo "$object" |
126f714980aSAndrey Kiselev  sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`}
127d1e97bf2SAndrey Kiselevtmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
128d1e97bf2SAndrey Kiselev
129d1e97bf2SAndrey Kiselevrm -f "$tmpdepfile"
130d1e97bf2SAndrey Kiselev
131d1be5cb7SEven Rouault# Avoid interferences from the environment.
132d1be5cb7SEven Rouaultgccflag= dashmflag=
133d1be5cb7SEven Rouault
134d1e97bf2SAndrey Kiselev# Some modes work just like other modes, but use different flags.  We
135d1e97bf2SAndrey Kiselev# parameterize here, but still list the modes in the big case below,
136d1e97bf2SAndrey Kiselev# to make depend.m4 easier to write.  Note that we *cannot* use a case
137d1e97bf2SAndrey Kiselev# here, because this file can only contain one case statement.
138d1e97bf2SAndrey Kiselevif test "$depmode" = hp; then
139d1e97bf2SAndrey Kiselev  # HP compiler uses -M and no extra arg.
140d1e97bf2SAndrey Kiselev  gccflag=-M
141d1e97bf2SAndrey Kiselev  depmode=gcc
142d1e97bf2SAndrey Kiselevfi
143d1e97bf2SAndrey Kiselev
144d1e97bf2SAndrey Kiselevif test "$depmode" = dashXmstdout; then
145d1e97bf2SAndrey Kiselev  # This is just like dashmstdout with a different argument.
146d1e97bf2SAndrey Kiselev  dashmflag=-xM
147d1e97bf2SAndrey Kiselev  depmode=dashmstdout
148d1e97bf2SAndrey Kiselevfi
149d1e97bf2SAndrey Kiselev
150d1be5cb7SEven Rouaultcygpath_u="cygpath -u -f -"
151d1be5cb7SEven Rouaultif test "$depmode" = msvcmsys; then
152d1be5cb7SEven Rouault  # This is just like msvisualcpp but w/o cygpath translation.
153d1be5cb7SEven Rouault  # Just convert the backslash-escaped backslashes to single forward
154d1be5cb7SEven Rouault  # slashes to satisfy depend.m4
155d1be5cb7SEven Rouault  cygpath_u='sed s,\\\\,/,g'
156d1be5cb7SEven Rouault  depmode=msvisualcpp
157d1be5cb7SEven Rouaultfi
158d1be5cb7SEven Rouault
159d1be5cb7SEven Rouaultif test "$depmode" = msvc7msys; then
160d1be5cb7SEven Rouault  # This is just like msvc7 but w/o cygpath translation.
161d1be5cb7SEven Rouault  # Just convert the backslash-escaped backslashes to single forward
162d1be5cb7SEven Rouault  # slashes to satisfy depend.m4
163d1be5cb7SEven Rouault  cygpath_u='sed s,\\\\,/,g'
164d1be5cb7SEven Rouault  depmode=msvc7
165d1be5cb7SEven Rouaultfi
166d1be5cb7SEven Rouault
167d1be5cb7SEven Rouaultif test "$depmode" = xlc; then
168d1be5cb7SEven Rouault  # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information.
169d1be5cb7SEven Rouault  gccflag=-qmakedep=gcc,-MF
170d1be5cb7SEven Rouault  depmode=gcc
171d1be5cb7SEven Rouaultfi
172d1be5cb7SEven Rouault
173d1e97bf2SAndrey Kiselevcase "$depmode" in
174d1e97bf2SAndrey Kiselevgcc3)
175d1e97bf2SAndrey Kiselev## gcc 3 implements dependency tracking that does exactly what
176d1e97bf2SAndrey Kiselev## we want.  Yay!  Note: for some reason libtool 1.4 doesn't like
177d1e97bf2SAndrey Kiselev## it if -MD -MP comes after the -MF stuff.  Hmm.
17871b78038SBob Friesenhahn## Unfortunately, FreeBSD c89 acceptance of flags depends upon
17971b78038SBob Friesenhahn## the command line argument order; so add the flags where they
18071b78038SBob Friesenhahn## appear in depend2.am.  Note that the slowdown incurred here
18171b78038SBob Friesenhahn## affects only configure: in makefiles, %FASTDEP% shortcuts this.
18271b78038SBob Friesenhahn  for arg
18371b78038SBob Friesenhahn  do
18471b78038SBob Friesenhahn    case $arg in
18571b78038SBob Friesenhahn    -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;;
18671b78038SBob Friesenhahn    *)  set fnord "$@" "$arg" ;;
18771b78038SBob Friesenhahn    esac
18871b78038SBob Friesenhahn    shift # fnord
18971b78038SBob Friesenhahn    shift # $arg
19071b78038SBob Friesenhahn  done
19171b78038SBob Friesenhahn  "$@"
192d1e97bf2SAndrey Kiselev  stat=$?
193d1be5cb7SEven Rouault  if test $stat -ne 0; then
194d1e97bf2SAndrey Kiselev    rm -f "$tmpdepfile"
195d1e97bf2SAndrey Kiselev    exit $stat
196d1e97bf2SAndrey Kiselev  fi
197d1e97bf2SAndrey Kiselev  mv "$tmpdepfile" "$depfile"
198d1e97bf2SAndrey Kiselev  ;;
199d1e97bf2SAndrey Kiselev
200d1e97bf2SAndrey Kiselevgcc)
201d1be5cb7SEven Rouault## Note that this doesn't just cater to obsosete pre-3.x GCC compilers.
202d1be5cb7SEven Rouault## but also to in-use compilers like IMB xlc/xlC and the HP C compiler.
203d1be5cb7SEven Rouault## (see the conditional assignment to $gccflag above).
204d1e97bf2SAndrey Kiselev## There are various ways to get dependency output from gcc.  Here's
205d1e97bf2SAndrey Kiselev## why we pick this rather obscure method:
206d1e97bf2SAndrey Kiselev## - Don't want to use -MD because we'd like the dependencies to end
207d1e97bf2SAndrey Kiselev##   up in a subdir.  Having to rename by hand is ugly.
208d1e97bf2SAndrey Kiselev##   (We might end up doing this anyway to support other compilers.)
209d1e97bf2SAndrey Kiselev## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
210d1be5cb7SEven Rouault##   -MM, not -M (despite what the docs say).  Also, it might not be
211d1be5cb7SEven Rouault##   supported by the other compilers which use the 'gcc' depmode.
212d1e97bf2SAndrey Kiselev## - Using -M directly means running the compiler twice (even worse
213d1e97bf2SAndrey Kiselev##   than renaming).
214d1e97bf2SAndrey Kiselev  if test -z "$gccflag"; then
215d1e97bf2SAndrey Kiselev    gccflag=-MD,
216d1e97bf2SAndrey Kiselev  fi
217d1e97bf2SAndrey Kiselev  "$@" -Wp,"$gccflag$tmpdepfile"
218d1e97bf2SAndrey Kiselev  stat=$?
219d1be5cb7SEven Rouault  if test $stat -ne 0; then
220d1e97bf2SAndrey Kiselev    rm -f "$tmpdepfile"
221d1e97bf2SAndrey Kiselev    exit $stat
222d1e97bf2SAndrey Kiselev  fi
223d1e97bf2SAndrey Kiselev  rm -f "$depfile"
224d1e97bf2SAndrey Kiselev  echo "$object : \\" > "$depfile"
225d1be5cb7SEven Rouault  # The second -e expression handles DOS-style file names with drive
226d1be5cb7SEven Rouault  # letters.
227d1e97bf2SAndrey Kiselev  sed -e 's/^[^:]*: / /' \
228d1e97bf2SAndrey Kiselev      -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
229d1be5cb7SEven Rouault## This next piece of magic avoids the "deleted header file" problem.
230d1e97bf2SAndrey Kiselev## The problem is that when a header file which appears in a .P file
231d1e97bf2SAndrey Kiselev## is deleted, the dependency causes make to die (because there is
232d1e97bf2SAndrey Kiselev## typically no way to rebuild the header).  We avoid this by adding
233d1e97bf2SAndrey Kiselev## dummy dependencies for each header file.  Too bad gcc doesn't do
234d1e97bf2SAndrey Kiselev## this for us directly.
235d1be5cb7SEven Rouault## Some versions of gcc put a space before the ':'.  On the theory
236d1e97bf2SAndrey Kiselev## that the space means something, we add a space to the output as
237d1be5cb7SEven Rouault## well.  hp depmode also adds that space, but also prefixes the VPATH
238d1be5cb7SEven Rouault## to the object.  Take care to not repeat it in the output.
239d1e97bf2SAndrey Kiselev## Some versions of the HPUX 10.20 sed can't process this invocation
240d1e97bf2SAndrey Kiselev## correctly.  Breaking it into two sed invocations is a workaround.
241d1be5cb7SEven Rouault  tr ' ' "$nl" < "$tmpdepfile" \
242d1be5cb7SEven Rouault    | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \
243d1be5cb7SEven Rouault    | sed -e 's/$/ :/' >> "$depfile"
244d1e97bf2SAndrey Kiselev  rm -f "$tmpdepfile"
245d1e97bf2SAndrey Kiselev  ;;
246d1e97bf2SAndrey Kiselev
247d1e97bf2SAndrey Kiselevhp)
248d1e97bf2SAndrey Kiselev  # This case exists only to let depend.m4 do its work.  It works by
249d1e97bf2SAndrey Kiselev  # looking at the text of this script.  This case will never be run,
250d1e97bf2SAndrey Kiselev  # since it is checked for above.
251d1e97bf2SAndrey Kiselev  exit 1
252d1e97bf2SAndrey Kiselev  ;;
253d1e97bf2SAndrey Kiselev
254d1e97bf2SAndrey Kiselevsgi)
255d1e97bf2SAndrey Kiselev  if test "$libtool" = yes; then
256d1e97bf2SAndrey Kiselev    "$@" "-Wp,-MDupdate,$tmpdepfile"
257d1e97bf2SAndrey Kiselev  else
258d1e97bf2SAndrey Kiselev    "$@" -MDupdate "$tmpdepfile"
259d1e97bf2SAndrey Kiselev  fi
260d1e97bf2SAndrey Kiselev  stat=$?
261d1be5cb7SEven Rouault  if test $stat -ne 0; then
262d1e97bf2SAndrey Kiselev    rm -f "$tmpdepfile"
263d1e97bf2SAndrey Kiselev    exit $stat
264d1e97bf2SAndrey Kiselev  fi
265d1e97bf2SAndrey Kiselev  rm -f "$depfile"
266d1e97bf2SAndrey Kiselev
267d1e97bf2SAndrey Kiselev  if test -f "$tmpdepfile"; then  # yes, the sourcefile depend on other files
268d1e97bf2SAndrey Kiselev    echo "$object : \\" > "$depfile"
269d1e97bf2SAndrey Kiselev    # Clip off the initial element (the dependent).  Don't try to be
270d1e97bf2SAndrey Kiselev    # clever and replace this with sed code, as IRIX sed won't handle
271d1e97bf2SAndrey Kiselev    # lines with more than a fixed number of characters (4096 in
272d1e97bf2SAndrey Kiselev    # IRIX 6.2 sed, 8192 in IRIX 6.5).  We also remove comment lines;
273d1be5cb7SEven Rouault    # the IRIX cc adds comments like '#:fec' to the end of the
274d1e97bf2SAndrey Kiselev    # dependency line.
275d1be5cb7SEven Rouault    tr ' ' "$nl" < "$tmpdepfile" \
276d1be5cb7SEven Rouault      | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \
277d1be5cb7SEven Rouault      | tr "$nl" ' ' >> "$depfile"
278d1be5cb7SEven Rouault    echo >> "$depfile"
279d1e97bf2SAndrey Kiselev    # The second pass generates a dummy entry for each header file.
280d1be5cb7SEven Rouault    tr ' ' "$nl" < "$tmpdepfile" \
281d1e97bf2SAndrey Kiselev      | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
282d1be5cb7SEven Rouault      >> "$depfile"
283d1e97bf2SAndrey Kiselev  else
284d1be5cb7SEven Rouault    make_dummy_depfile
285d1e97bf2SAndrey Kiselev  fi
286d1e97bf2SAndrey Kiselev  rm -f "$tmpdepfile"
287d1e97bf2SAndrey Kiselev  ;;
288d1e97bf2SAndrey Kiselev
289d1be5cb7SEven Rouaultxlc)
290d1be5cb7SEven Rouault  # This case exists only to let depend.m4 do its work.  It works by
291d1be5cb7SEven Rouault  # looking at the text of this script.  This case will never be run,
292d1be5cb7SEven Rouault  # since it is checked for above.
293d1be5cb7SEven Rouault  exit 1
294d1be5cb7SEven Rouault  ;;
295d1be5cb7SEven Rouault
296d1e97bf2SAndrey Kiselevaix)
297d1e97bf2SAndrey Kiselev  # The C for AIX Compiler uses -M and outputs the dependencies
298d1e97bf2SAndrey Kiselev  # in a .u file.  In older versions, this file always lives in the
299d1be5cb7SEven Rouault  # current directory.  Also, the AIX compiler puts '$object:' at the
300d1e97bf2SAndrey Kiselev  # start of each line; $object doesn't have directory information.
301d1e97bf2SAndrey Kiselev  # Version 6 uses the directory in both cases.
302d1be5cb7SEven Rouault  set_dir_from "$object"
303d1be5cb7SEven Rouault  set_base_from "$object"
304d1e97bf2SAndrey Kiselev  if test "$libtool" = yes; then
305d1be5cb7SEven Rouault    tmpdepfile1=$dir$base.u
306d1be5cb7SEven Rouault    tmpdepfile2=$base.u
307d1be5cb7SEven Rouault    tmpdepfile3=$dir.libs/$base.u
308d1e97bf2SAndrey Kiselev    "$@" -Wc,-M
309d1e97bf2SAndrey Kiselev  else
310d1be5cb7SEven Rouault    tmpdepfile1=$dir$base.u
311d1be5cb7SEven Rouault    tmpdepfile2=$dir$base.u
312d1be5cb7SEven Rouault    tmpdepfile3=$dir$base.u
313d1e97bf2SAndrey Kiselev    "$@" -M
314d1e97bf2SAndrey Kiselev  fi
315d1e97bf2SAndrey Kiselev  stat=$?
316d1be5cb7SEven Rouault  if test $stat -ne 0; then
317d1be5cb7SEven Rouault    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
318d1e97bf2SAndrey Kiselev    exit $stat
319d1e97bf2SAndrey Kiselev  fi
320d1e97bf2SAndrey Kiselev
321d1be5cb7SEven Rouault  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
322d1be5cb7SEven Rouault  do
323d1be5cb7SEven Rouault    test -f "$tmpdepfile" && break
324d1be5cb7SEven Rouault  done
325d1be5cb7SEven Rouault  aix_post_process_depfile
326d1be5cb7SEven Rouault  ;;
327d1be5cb7SEven Rouault
328d1be5cb7SEven Rouaulttcc)
329d1be5cb7SEven Rouault  # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26
330d1be5cb7SEven Rouault  # FIXME: That version still under development at the moment of writing.
331d1be5cb7SEven Rouault  #        Make that this statement remains true also for stable, released
332d1be5cb7SEven Rouault  #        versions.
333d1be5cb7SEven Rouault  # It will wrap lines (doesn't matter whether long or short) with a
334d1be5cb7SEven Rouault  # trailing '\', as in:
335d1be5cb7SEven Rouault  #
336d1be5cb7SEven Rouault  #   foo.o : \
337d1be5cb7SEven Rouault  #    foo.c \
338d1be5cb7SEven Rouault  #    foo.h \
339d1be5cb7SEven Rouault  #
340d1be5cb7SEven Rouault  # It will put a trailing '\' even on the last line, and will use leading
341d1be5cb7SEven Rouault  # spaces rather than leading tabs (at least since its commit 0394caf7
342d1be5cb7SEven Rouault  # "Emit spaces for -MD").
343d1be5cb7SEven Rouault  "$@" -MD -MF "$tmpdepfile"
344d1be5cb7SEven Rouault  stat=$?
345d1be5cb7SEven Rouault  if test $stat -ne 0; then
346d1be5cb7SEven Rouault    rm -f "$tmpdepfile"
347d1be5cb7SEven Rouault    exit $stat
348d1e97bf2SAndrey Kiselev  fi
349d1be5cb7SEven Rouault  rm -f "$depfile"
350d1be5cb7SEven Rouault  # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'.
351d1be5cb7SEven Rouault  # We have to change lines of the first kind to '$object: \'.
352d1be5cb7SEven Rouault  sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile"
353d1be5cb7SEven Rouault  # And for each line of the second kind, we have to emit a 'dep.h:'
354d1be5cb7SEven Rouault  # dummy dependency, to avoid the deleted-header problem.
355d1be5cb7SEven Rouault  sed -n -e 's|^  *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile"
356d1e97bf2SAndrey Kiselev  rm -f "$tmpdepfile"
357d1e97bf2SAndrey Kiselev  ;;
358d1e97bf2SAndrey Kiselev
359d1be5cb7SEven Rouault## The order of this option in the case statement is important, since the
360d1be5cb7SEven Rouault## shell code in configure will try each of these formats in the order
361d1be5cb7SEven Rouault## listed in this file.  A plain '-MD' option would be understood by many
362d1be5cb7SEven Rouault## compilers, so we must ensure this comes after the gcc and icc options.
363d1be5cb7SEven Rouaultpgcc)
364d1be5cb7SEven Rouault  # Portland's C compiler understands '-MD'.
365d1be5cb7SEven Rouault  # Will always output deps to 'file.d' where file is the root name of the
366d1be5cb7SEven Rouault  # source file under compilation, even if file resides in a subdirectory.
367d1be5cb7SEven Rouault  # The object file name does not affect the name of the '.d' file.
368d1be5cb7SEven Rouault  # pgcc 10.2 will output
369d1e97bf2SAndrey Kiselev  #    foo.o: sub/foo.c sub/foo.h
370d1be5cb7SEven Rouault  # and will wrap long lines using '\' :
371d1e97bf2SAndrey Kiselev  #    foo.o: sub/foo.c ... \
372d1e97bf2SAndrey Kiselev  #     sub/foo.h ... \
373d1e97bf2SAndrey Kiselev  #     ...
374d1be5cb7SEven Rouault  set_dir_from "$object"
375d1be5cb7SEven Rouault  # Use the source, not the object, to determine the base name, since
376d1be5cb7SEven Rouault  # that's sadly what pgcc will do too.
377d1be5cb7SEven Rouault  set_base_from "$source"
378d1be5cb7SEven Rouault  tmpdepfile=$base.d
379d1e97bf2SAndrey Kiselev
380d1be5cb7SEven Rouault  # For projects that build the same source file twice into different object
381d1be5cb7SEven Rouault  # files, the pgcc approach of using the *source* file root name can cause
382d1be5cb7SEven Rouault  # problems in parallel builds.  Use a locking strategy to avoid stomping on
383d1be5cb7SEven Rouault  # the same $tmpdepfile.
384d1be5cb7SEven Rouault  lockdir=$base.d-lock
385d1be5cb7SEven Rouault  trap "
386d1be5cb7SEven Rouault    echo '$0: caught signal, cleaning up...' >&2
387d1be5cb7SEven Rouault    rmdir '$lockdir'
388d1be5cb7SEven Rouault    exit 1
389d1be5cb7SEven Rouault  " 1 2 13 15
390d1be5cb7SEven Rouault  numtries=100
391d1be5cb7SEven Rouault  i=$numtries
392d1be5cb7SEven Rouault  while test $i -gt 0; do
393d1be5cb7SEven Rouault    # mkdir is a portable test-and-set.
394d1be5cb7SEven Rouault    if mkdir "$lockdir" 2>/dev/null; then
395d1be5cb7SEven Rouault      # This process acquired the lock.
396d1be5cb7SEven Rouault      "$@" -MD
397d1e97bf2SAndrey Kiselev      stat=$?
398d1be5cb7SEven Rouault      # Release the lock.
399d1be5cb7SEven Rouault      rmdir "$lockdir"
400d1be5cb7SEven Rouault      break
401d1e97bf2SAndrey Kiselev    else
402d1be5cb7SEven Rouault      # If the lock is being held by a different process, wait
403d1be5cb7SEven Rouault      # until the winning process is done or we timeout.
404d1be5cb7SEven Rouault      while test -d "$lockdir" && test $i -gt 0; do
405d1be5cb7SEven Rouault        sleep 1
406d1be5cb7SEven Rouault        i=`expr $i - 1`
407d1be5cb7SEven Rouault      done
408d1be5cb7SEven Rouault    fi
409d1be5cb7SEven Rouault    i=`expr $i - 1`
410d1be5cb7SEven Rouault  done
411d1be5cb7SEven Rouault  trap - 1 2 13 15
412d1be5cb7SEven Rouault  if test $i -le 0; then
413d1be5cb7SEven Rouault    echo "$0: failed to acquire lock after $numtries attempts" >&2
414d1be5cb7SEven Rouault    echo "$0: check lockdir '$lockdir'" >&2
415d1be5cb7SEven Rouault    exit 1
416d1be5cb7SEven Rouault  fi
417d1be5cb7SEven Rouault
418d1be5cb7SEven Rouault  if test $stat -ne 0; then
419d1e97bf2SAndrey Kiselev    rm -f "$tmpdepfile"
420d1e97bf2SAndrey Kiselev    exit $stat
421d1e97bf2SAndrey Kiselev  fi
422d1e97bf2SAndrey Kiselev  rm -f "$depfile"
423d1e97bf2SAndrey Kiselev  # Each line is of the form `foo.o: dependent.h',
424d1e97bf2SAndrey Kiselev  # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'.
425d1e97bf2SAndrey Kiselev  # Do two passes, one to just change these to
426d1e97bf2SAndrey Kiselev  # `$object: dependent.h' and one to simply `dependent.h:'.
427d1e97bf2SAndrey Kiselev  sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
428d1e97bf2SAndrey Kiselev  # Some versions of the HPUX 10.20 sed can't process this invocation
429d1e97bf2SAndrey Kiselev  # correctly.  Breaking it into two sed invocations is a workaround.
430d1be5cb7SEven Rouault  sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \
431d1be5cb7SEven Rouault    | sed -e 's/$/ :/' >> "$depfile"
432d1e97bf2SAndrey Kiselev  rm -f "$tmpdepfile"
433d1e97bf2SAndrey Kiselev  ;;
434d1e97bf2SAndrey Kiselev
43571b78038SBob Friesenhahnhp2)
43671b78038SBob Friesenhahn  # The "hp" stanza above does not work with aCC (C++) and HP's ia64
43771b78038SBob Friesenhahn  # compilers, which have integrated preprocessors.  The correct option
43871b78038SBob Friesenhahn  # to use with these is +Maked; it writes dependencies to a file named
43971b78038SBob Friesenhahn  # 'foo.d', which lands next to the object file, wherever that
44071b78038SBob Friesenhahn  # happens to be.
44171b78038SBob Friesenhahn  # Much of this is similar to the tru64 case; see comments there.
442d1be5cb7SEven Rouault  set_dir_from  "$object"
443d1be5cb7SEven Rouault  set_base_from "$object"
44471b78038SBob Friesenhahn  if test "$libtool" = yes; then
44571b78038SBob Friesenhahn    tmpdepfile1=$dir$base.d
44671b78038SBob Friesenhahn    tmpdepfile2=$dir.libs/$base.d
44771b78038SBob Friesenhahn    "$@" -Wc,+Maked
44871b78038SBob Friesenhahn  else
44971b78038SBob Friesenhahn    tmpdepfile1=$dir$base.d
45071b78038SBob Friesenhahn    tmpdepfile2=$dir$base.d
45171b78038SBob Friesenhahn    "$@" +Maked
45271b78038SBob Friesenhahn  fi
45371b78038SBob Friesenhahn  stat=$?
454d1be5cb7SEven Rouault  if test $stat -ne 0; then
45571b78038SBob Friesenhahn     rm -f "$tmpdepfile1" "$tmpdepfile2"
45671b78038SBob Friesenhahn     exit $stat
45771b78038SBob Friesenhahn  fi
45871b78038SBob Friesenhahn
45971b78038SBob Friesenhahn  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2"
46071b78038SBob Friesenhahn  do
46171b78038SBob Friesenhahn    test -f "$tmpdepfile" && break
46271b78038SBob Friesenhahn  done
46371b78038SBob Friesenhahn  if test -f "$tmpdepfile"; then
464d1be5cb7SEven Rouault    sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile"
465d1be5cb7SEven Rouault    # Add 'dependent.h:' lines.
466d1be5cb7SEven Rouault    sed -ne '2,${
467d1be5cb7SEven Rouault               s/^ *//
468d1be5cb7SEven Rouault               s/ \\*$//
469d1be5cb7SEven Rouault               s/$/:/
470d1be5cb7SEven Rouault               p
471d1be5cb7SEven Rouault             }' "$tmpdepfile" >> "$depfile"
47271b78038SBob Friesenhahn  else
473d1be5cb7SEven Rouault    make_dummy_depfile
47471b78038SBob Friesenhahn  fi
47571b78038SBob Friesenhahn  rm -f "$tmpdepfile" "$tmpdepfile2"
47671b78038SBob Friesenhahn  ;;
47771b78038SBob Friesenhahn
478d1e97bf2SAndrey Kiselevtru64)
479d1e97bf2SAndrey Kiselev  # The Tru64 compiler uses -MD to generate dependencies as a side
480d1be5cb7SEven Rouault  # effect.  'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'.
481d1e97bf2SAndrey Kiselev  # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
482d1be5cb7SEven Rouault  # dependencies in 'foo.d' instead, so we check for that too.
483d1e97bf2SAndrey Kiselev  # Subdirectories are respected.
484d1be5cb7SEven Rouault  set_dir_from  "$object"
485d1be5cb7SEven Rouault  set_base_from "$object"
486d1e97bf2SAndrey Kiselev
487d1e97bf2SAndrey Kiselev  if test "$libtool" = yes; then
488d1be5cb7SEven Rouault    # Libtool generates 2 separate objects for the 2 libraries.  These
489d1be5cb7SEven Rouault    # two compilations output dependencies in $dir.libs/$base.o.d and
490f714980aSAndrey Kiselev    # in $dir$base.o.d.  We have to check for both files, because
491f714980aSAndrey Kiselev    # one of the two compilations can be disabled.  We should prefer
492f714980aSAndrey Kiselev    # $dir$base.o.d over $dir.libs/$base.o.d because the latter is
493f714980aSAndrey Kiselev    # automatically cleaned when .libs/ is deleted, while ignoring
494f714980aSAndrey Kiselev    # the former would cause a distcleancheck panic.
495d1be5cb7SEven Rouault    tmpdepfile1=$dir$base.o.d          # libtool 1.5
496d1be5cb7SEven Rouault    tmpdepfile2=$dir.libs/$base.o.d    # Likewise.
497d1be5cb7SEven Rouault    tmpdepfile3=$dir.libs/$base.d      # Compaq CCC V6.2-504
498d1e97bf2SAndrey Kiselev    "$@" -Wc,-MD
499d1e97bf2SAndrey Kiselev  else
500d1be5cb7SEven Rouault    tmpdepfile1=$dir$base.d
501f714980aSAndrey Kiselev    tmpdepfile2=$dir$base.d
502f714980aSAndrey Kiselev    tmpdepfile3=$dir$base.d
503d1e97bf2SAndrey Kiselev    "$@" -MD
504d1e97bf2SAndrey Kiselev  fi
505d1e97bf2SAndrey Kiselev
506d1e97bf2SAndrey Kiselev  stat=$?
507d1be5cb7SEven Rouault  if test $stat -ne 0; then
508d1be5cb7SEven Rouault    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
509d1e97bf2SAndrey Kiselev    exit $stat
510d1e97bf2SAndrey Kiselev  fi
511d1e97bf2SAndrey Kiselev
512d1be5cb7SEven Rouault  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
513f714980aSAndrey Kiselev  do
514f714980aSAndrey Kiselev    test -f "$tmpdepfile" && break
515f714980aSAndrey Kiselev  done
516d1be5cb7SEven Rouault  # Same post-processing that is required for AIX mode.
517d1be5cb7SEven Rouault  aix_post_process_depfile
518d1be5cb7SEven Rouault  ;;
519d1be5cb7SEven Rouault
520d1be5cb7SEven Rouaultmsvc7)
521d1be5cb7SEven Rouault  if test "$libtool" = yes; then
522d1be5cb7SEven Rouault    showIncludes=-Wc,-showIncludes
523d1e97bf2SAndrey Kiselev  else
524d1be5cb7SEven Rouault    showIncludes=-showIncludes
525d1e97bf2SAndrey Kiselev  fi
526d1be5cb7SEven Rouault  "$@" $showIncludes > "$tmpdepfile"
527d1be5cb7SEven Rouault  stat=$?
528d1be5cb7SEven Rouault  grep -v '^Note: including file: ' "$tmpdepfile"
529d1be5cb7SEven Rouault  if test $stat -ne 0; then
530d1e97bf2SAndrey Kiselev    rm -f "$tmpdepfile"
531d1be5cb7SEven Rouault    exit $stat
532d1be5cb7SEven Rouault  fi
533d1be5cb7SEven Rouault  rm -f "$depfile"
534d1be5cb7SEven Rouault  echo "$object : \\" > "$depfile"
535d1be5cb7SEven Rouault  # The first sed program below extracts the file names and escapes
536d1be5cb7SEven Rouault  # backslashes for cygpath.  The second sed program outputs the file
537d1be5cb7SEven Rouault  # name when reading, but also accumulates all include files in the
538d1be5cb7SEven Rouault  # hold buffer in order to output them again at the end.  This only
539d1be5cb7SEven Rouault  # works with sed implementations that can handle large buffers.
540d1be5cb7SEven Rouault  sed < "$tmpdepfile" -n '
541d1be5cb7SEven Rouault/^Note: including file:  *\(.*\)/ {
542d1be5cb7SEven Rouault  s//\1/
543d1be5cb7SEven Rouault  s/\\/\\\\/g
544d1be5cb7SEven Rouault  p
545d1be5cb7SEven Rouault}' | $cygpath_u | sort -u | sed -n '
546d1be5cb7SEven Rouaults/ /\\ /g
547d1be5cb7SEven Rouaults/\(.*\)/'"$tab"'\1 \\/p
548d1be5cb7SEven Rouaults/.\(.*\) \\/\1:/
549d1be5cb7SEven RouaultH
550d1be5cb7SEven Rouault$ {
551d1be5cb7SEven Rouault  s/.*/'"$tab"'/
552d1be5cb7SEven Rouault  G
553d1be5cb7SEven Rouault  p
554d1be5cb7SEven Rouault}' >> "$depfile"
555d1be5cb7SEven Rouault  echo >> "$depfile" # make sure the fragment doesn't end with a backslash
556d1be5cb7SEven Rouault  rm -f "$tmpdepfile"
557d1be5cb7SEven Rouault  ;;
558d1be5cb7SEven Rouault
559d1be5cb7SEven Rouaultmsvc7msys)
560d1be5cb7SEven Rouault  # This case exists only to let depend.m4 do its work.  It works by
561d1be5cb7SEven Rouault  # looking at the text of this script.  This case will never be run,
562d1be5cb7SEven Rouault  # since it is checked for above.
563d1be5cb7SEven Rouault  exit 1
564d1e97bf2SAndrey Kiselev  ;;
565d1e97bf2SAndrey Kiselev
566d1e97bf2SAndrey Kiselev#nosideeffect)
567d1e97bf2SAndrey Kiselev  # This comment above is used by automake to tell side-effect
568d1e97bf2SAndrey Kiselev  # dependency tracking mechanisms from slower ones.
569d1e97bf2SAndrey Kiselev
570d1e97bf2SAndrey Kiselevdashmstdout)
571d1e97bf2SAndrey Kiselev  # Important note: in order to support this mode, a compiler *must*
572d1e97bf2SAndrey Kiselev  # always write the preprocessed file to stdout, regardless of -o.
573d1e97bf2SAndrey Kiselev  "$@" || exit $?
574d1e97bf2SAndrey Kiselev
575d1e97bf2SAndrey Kiselev  # Remove the call to Libtool.
576d1e97bf2SAndrey Kiselev  if test "$libtool" = yes; then
577d1be5cb7SEven Rouault    while test "X$1" != 'X--mode=compile'; do
578d1e97bf2SAndrey Kiselev      shift
579d1e97bf2SAndrey Kiselev    done
580d1e97bf2SAndrey Kiselev    shift
581d1e97bf2SAndrey Kiselev  fi
582d1e97bf2SAndrey Kiselev
583d1be5cb7SEven Rouault  # Remove '-o $object'.
584d1e97bf2SAndrey Kiselev  IFS=" "
585d1e97bf2SAndrey Kiselev  for arg
586d1e97bf2SAndrey Kiselev  do
587d1e97bf2SAndrey Kiselev    case $arg in
588d1e97bf2SAndrey Kiselev    -o)
589d1e97bf2SAndrey Kiselev      shift
590d1e97bf2SAndrey Kiselev      ;;
591d1e97bf2SAndrey Kiselev    $object)
592d1e97bf2SAndrey Kiselev      shift
593d1e97bf2SAndrey Kiselev      ;;
594d1e97bf2SAndrey Kiselev    *)
595d1e97bf2SAndrey Kiselev      set fnord "$@" "$arg"
596d1e97bf2SAndrey Kiselev      shift # fnord
597d1e97bf2SAndrey Kiselev      shift # $arg
598d1e97bf2SAndrey Kiselev      ;;
599d1e97bf2SAndrey Kiselev    esac
600d1e97bf2SAndrey Kiselev  done
601d1e97bf2SAndrey Kiselev
602d1e97bf2SAndrey Kiselev  test -z "$dashmflag" && dashmflag=-M
603d1be5cb7SEven Rouault  # Require at least two characters before searching for ':'
604d1e97bf2SAndrey Kiselev  # in the target name.  This is to cope with DOS-style filenames:
605d1be5cb7SEven Rouault  # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise.
606d1e97bf2SAndrey Kiselev  "$@" $dashmflag |
607d1be5cb7SEven Rouault    sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile"
608d1e97bf2SAndrey Kiselev  rm -f "$depfile"
609d1e97bf2SAndrey Kiselev  cat < "$tmpdepfile" > "$depfile"
610d1be5cb7SEven Rouault  # Some versions of the HPUX 10.20 sed can't process this sed invocation
611d1be5cb7SEven Rouault  # correctly.  Breaking it into two sed invocations is a workaround.
612d1be5cb7SEven Rouault  tr ' ' "$nl" < "$tmpdepfile" \
613d1be5cb7SEven Rouault    | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
614d1be5cb7SEven Rouault    | sed -e 's/$/ :/' >> "$depfile"
615d1e97bf2SAndrey Kiselev  rm -f "$tmpdepfile"
616d1e97bf2SAndrey Kiselev  ;;
617d1e97bf2SAndrey Kiselev
618d1e97bf2SAndrey KiselevdashXmstdout)
619d1e97bf2SAndrey Kiselev  # This case only exists to satisfy depend.m4.  It is never actually
620d1e97bf2SAndrey Kiselev  # run, as this mode is specially recognized in the preamble.
621d1e97bf2SAndrey Kiselev  exit 1
622d1e97bf2SAndrey Kiselev  ;;
623d1e97bf2SAndrey Kiselev
624d1e97bf2SAndrey Kiselevmakedepend)
625d1e97bf2SAndrey Kiselev  "$@" || exit $?
626d1e97bf2SAndrey Kiselev  # Remove any Libtool call
627d1e97bf2SAndrey Kiselev  if test "$libtool" = yes; then
628d1be5cb7SEven Rouault    while test "X$1" != 'X--mode=compile'; do
629d1e97bf2SAndrey Kiselev      shift
630d1e97bf2SAndrey Kiselev    done
631d1e97bf2SAndrey Kiselev    shift
632d1e97bf2SAndrey Kiselev  fi
633d1e97bf2SAndrey Kiselev  # X makedepend
634d1e97bf2SAndrey Kiselev  shift
635d1be5cb7SEven Rouault  cleared=no eat=no
636d1be5cb7SEven Rouault  for arg
637d1be5cb7SEven Rouault  do
638d1e97bf2SAndrey Kiselev    case $cleared in
639d1e97bf2SAndrey Kiselev    no)
640d1e97bf2SAndrey Kiselev      set ""; shift
641d1e97bf2SAndrey Kiselev      cleared=yes ;;
642d1e97bf2SAndrey Kiselev    esac
643d1be5cb7SEven Rouault    if test $eat = yes; then
644d1be5cb7SEven Rouault      eat=no
645d1be5cb7SEven Rouault      continue
646d1be5cb7SEven Rouault    fi
647d1e97bf2SAndrey Kiselev    case "$arg" in
648d1e97bf2SAndrey Kiselev    -D*|-I*)
649d1e97bf2SAndrey Kiselev      set fnord "$@" "$arg"; shift ;;
650d1e97bf2SAndrey Kiselev    # Strip any option that makedepend may not understand.  Remove
651d1e97bf2SAndrey Kiselev    # the object too, otherwise makedepend will parse it as a source file.
652d1be5cb7SEven Rouault    -arch)
653d1be5cb7SEven Rouault      eat=yes ;;
654d1e97bf2SAndrey Kiselev    -*|$object)
655d1e97bf2SAndrey Kiselev      ;;
656d1e97bf2SAndrey Kiselev    *)
657d1e97bf2SAndrey Kiselev      set fnord "$@" "$arg"; shift ;;
658d1e97bf2SAndrey Kiselev    esac
659d1e97bf2SAndrey Kiselev  done
660d1be5cb7SEven Rouault  obj_suffix=`echo "$object" | sed 's/^.*\././'`
661d1e97bf2SAndrey Kiselev  touch "$tmpdepfile"
662d1e97bf2SAndrey Kiselev  ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
663d1e97bf2SAndrey Kiselev  rm -f "$depfile"
664d1be5cb7SEven Rouault  # makedepend may prepend the VPATH from the source file name to the object.
665d1be5cb7SEven Rouault  # No need to regex-escape $object, excess matching of '.' is harmless.
666d1be5cb7SEven Rouault  sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile"
667d1be5cb7SEven Rouault  # Some versions of the HPUX 10.20 sed can't process the last invocation
668d1be5cb7SEven Rouault  # correctly.  Breaking it into two sed invocations is a workaround.
669d1be5cb7SEven Rouault  sed '1,2d' "$tmpdepfile" \
670d1be5cb7SEven Rouault    | tr ' ' "$nl" \
671d1be5cb7SEven Rouault    | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
672d1be5cb7SEven Rouault    | sed -e 's/$/ :/' >> "$depfile"
673d1e97bf2SAndrey Kiselev  rm -f "$tmpdepfile" "$tmpdepfile".bak
674d1e97bf2SAndrey Kiselev  ;;
675d1e97bf2SAndrey Kiselev
676d1e97bf2SAndrey Kiselevcpp)
677d1e97bf2SAndrey Kiselev  # Important note: in order to support this mode, a compiler *must*
678d1e97bf2SAndrey Kiselev  # always write the preprocessed file to stdout.
679d1e97bf2SAndrey Kiselev  "$@" || exit $?
680d1e97bf2SAndrey Kiselev
681d1e97bf2SAndrey Kiselev  # Remove the call to Libtool.
682d1e97bf2SAndrey Kiselev  if test "$libtool" = yes; then
683d1be5cb7SEven Rouault    while test "X$1" != 'X--mode=compile'; do
684d1e97bf2SAndrey Kiselev      shift
685d1e97bf2SAndrey Kiselev    done
686d1e97bf2SAndrey Kiselev    shift
687d1e97bf2SAndrey Kiselev  fi
688d1e97bf2SAndrey Kiselev
689d1be5cb7SEven Rouault  # Remove '-o $object'.
690d1e97bf2SAndrey Kiselev  IFS=" "
691d1e97bf2SAndrey Kiselev  for arg
692d1e97bf2SAndrey Kiselev  do
693d1e97bf2SAndrey Kiselev    case $arg in
694d1e97bf2SAndrey Kiselev    -o)
695d1e97bf2SAndrey Kiselev      shift
696d1e97bf2SAndrey Kiselev      ;;
697d1e97bf2SAndrey Kiselev    $object)
698d1e97bf2SAndrey Kiselev      shift
699d1e97bf2SAndrey Kiselev      ;;
700d1e97bf2SAndrey Kiselev    *)
701d1e97bf2SAndrey Kiselev      set fnord "$@" "$arg"
702d1e97bf2SAndrey Kiselev      shift # fnord
703d1e97bf2SAndrey Kiselev      shift # $arg
704d1e97bf2SAndrey Kiselev      ;;
705d1e97bf2SAndrey Kiselev    esac
706d1e97bf2SAndrey Kiselev  done
707d1e97bf2SAndrey Kiselev
708d1be5cb7SEven Rouault  "$@" -E \
709d1be5cb7SEven Rouault    | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
710d1be5cb7SEven Rouault             -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
711d1be5cb7SEven Rouault    | sed '$ s: \\$::' > "$tmpdepfile"
712d1e97bf2SAndrey Kiselev  rm -f "$depfile"
713d1e97bf2SAndrey Kiselev  echo "$object : \\" > "$depfile"
714d1e97bf2SAndrey Kiselev  cat < "$tmpdepfile" >> "$depfile"
715d1e97bf2SAndrey Kiselev  sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
716d1e97bf2SAndrey Kiselev  rm -f "$tmpdepfile"
717d1e97bf2SAndrey Kiselev  ;;
718d1e97bf2SAndrey Kiselev
719d1e97bf2SAndrey Kiselevmsvisualcpp)
720d1e97bf2SAndrey Kiselev  # Important note: in order to support this mode, a compiler *must*
721d1be5cb7SEven Rouault  # always write the preprocessed file to stdout.
722d1e97bf2SAndrey Kiselev  "$@" || exit $?
723d1be5cb7SEven Rouault
724d1be5cb7SEven Rouault  # Remove the call to Libtool.
725d1be5cb7SEven Rouault  if test "$libtool" = yes; then
726d1be5cb7SEven Rouault    while test "X$1" != 'X--mode=compile'; do
727d1be5cb7SEven Rouault      shift
728d1be5cb7SEven Rouault    done
729d1be5cb7SEven Rouault    shift
730d1be5cb7SEven Rouault  fi
731d1be5cb7SEven Rouault
732d1e97bf2SAndrey Kiselev  IFS=" "
733d1e97bf2SAndrey Kiselev  for arg
734d1e97bf2SAndrey Kiselev  do
735d1e97bf2SAndrey Kiselev    case "$arg" in
736d1be5cb7SEven Rouault    -o)
737d1be5cb7SEven Rouault      shift
738d1be5cb7SEven Rouault      ;;
739d1be5cb7SEven Rouault    $object)
740d1be5cb7SEven Rouault      shift
741d1be5cb7SEven Rouault      ;;
742d1e97bf2SAndrey Kiselev    "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
743d1e97bf2SAndrey Kiselev        set fnord "$@"
744d1e97bf2SAndrey Kiselev        shift
745d1e97bf2SAndrey Kiselev        shift
746d1e97bf2SAndrey Kiselev        ;;
747d1e97bf2SAndrey Kiselev    *)
748d1e97bf2SAndrey Kiselev        set fnord "$@" "$arg"
749d1e97bf2SAndrey Kiselev        shift
750d1e97bf2SAndrey Kiselev        shift
751d1e97bf2SAndrey Kiselev        ;;
752d1e97bf2SAndrey Kiselev    esac
753d1e97bf2SAndrey Kiselev  done
754d1be5cb7SEven Rouault  "$@" -E 2>/dev/null |
755d1be5cb7SEven Rouault  sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile"
756d1e97bf2SAndrey Kiselev  rm -f "$depfile"
757d1e97bf2SAndrey Kiselev  echo "$object : \\" > "$depfile"
758d1be5cb7SEven Rouault  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile"
759d1be5cb7SEven Rouault  echo "$tab" >> "$depfile"
760d1be5cb7SEven Rouault  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile"
761d1e97bf2SAndrey Kiselev  rm -f "$tmpdepfile"
762d1e97bf2SAndrey Kiselev  ;;
763d1e97bf2SAndrey Kiselev
764d1be5cb7SEven Rouaultmsvcmsys)
765d1be5cb7SEven Rouault  # This case exists only to let depend.m4 do its work.  It works by
766d1be5cb7SEven Rouault  # looking at the text of this script.  This case will never be run,
767d1be5cb7SEven Rouault  # since it is checked for above.
768d1be5cb7SEven Rouault  exit 1
769d1be5cb7SEven Rouault  ;;
770d1be5cb7SEven Rouault
771d1e97bf2SAndrey Kiselevnone)
772d1e97bf2SAndrey Kiselev  exec "$@"
773d1e97bf2SAndrey Kiselev  ;;
774d1e97bf2SAndrey Kiselev
775d1e97bf2SAndrey Kiselev*)
776d1e97bf2SAndrey Kiselev  echo "Unknown depmode $depmode" 1>&2
777d1e97bf2SAndrey Kiselev  exit 1
778d1e97bf2SAndrey Kiselev  ;;
779d1e97bf2SAndrey Kiselevesac
780d1e97bf2SAndrey Kiselev
781d1e97bf2SAndrey Kiselevexit 0
782d1e97bf2SAndrey Kiselev
783d1e97bf2SAndrey Kiselev# Local Variables:
784d1e97bf2SAndrey Kiselev# mode: shell-script
785d1e97bf2SAndrey Kiselev# sh-indentation: 2
786d1e97bf2SAndrey Kiselev# eval: (add-hook 'write-file-hooks 'time-stamp)
787d1e97bf2SAndrey Kiselev# time-stamp-start: "scriptversion="
788d1e97bf2SAndrey Kiselev# time-stamp-format: "%:y-%02m-%02d.%02H"
789d1be5cb7SEven Rouault# time-stamp-time-zone: "UTC"
790d1be5cb7SEven Rouault# time-stamp-end: "; # UTC"
791d1e97bf2SAndrey Kiselev# End:
792