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