15dfecf96Smrg#! /bin/sh
25dfecf96Smrg# depcomp - compile a program generating dependencies as side-effects
35dfecf96Smrg
496d43ffdSmrgscriptversion=2018-03-07.03; # UTC
55dfecf96Smrg
696d43ffdSmrg# Copyright (C) 1999-2021 Free Software Foundation, Inc.
75dfecf96Smrg
85dfecf96Smrg# This program is free software; you can redistribute it and/or modify
95dfecf96Smrg# it under the terms of the GNU General Public License as published by
105dfecf96Smrg# the Free Software Foundation; either version 2, or (at your option)
115dfecf96Smrg# any later version.
125dfecf96Smrg
135dfecf96Smrg# This program is distributed in the hope that it will be useful,
145dfecf96Smrg# but WITHOUT ANY WARRANTY; without even the implied warranty of
155dfecf96Smrg# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
165dfecf96Smrg# GNU General Public License for more details.
175dfecf96Smrg
185dfecf96Smrg# You should have received a copy of the GNU General Public License
1996d43ffdSmrg# along with this program.  If not, see <https://www.gnu.org/licenses/>.
205dfecf96Smrg
215dfecf96Smrg# As a special exception to the GNU General Public License, if you
225dfecf96Smrg# distribute this file as part of a program that contains a
235dfecf96Smrg# configuration script generated by Autoconf, you may include it under
245dfecf96Smrg# the same distribution terms that you use for the rest of that program.
255dfecf96Smrg
265dfecf96Smrg# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>.
275dfecf96Smrg
285dfecf96Smrgcase $1 in
295dfecf96Smrg  '')
30f765521fSmrg    echo "$0: No command.  Try '$0 --help' for more information." 1>&2
31f765521fSmrg    exit 1;
32f765521fSmrg    ;;
335dfecf96Smrg  -h | --h*)
345dfecf96Smrg    cat <<\EOF
355dfecf96SmrgUsage: depcomp [--help] [--version] PROGRAM [ARGS]
365dfecf96Smrg
375dfecf96SmrgRun PROGRAMS ARGS to compile a file, generating dependencies
385dfecf96Smrgas side-effects.
395dfecf96Smrg
405dfecf96SmrgEnvironment variables:
415dfecf96Smrg  depmode     Dependency tracking mode.
42f765521fSmrg  source      Source file read by 'PROGRAMS ARGS'.
43f765521fSmrg  object      Object file output by 'PROGRAMS ARGS'.
445dfecf96Smrg  DEPDIR      directory where to store dependencies.
455dfecf96Smrg  depfile     Dependency file to output.
4631de2854Smrg  tmpdepfile  Temporary file to use when outputting dependencies.
475dfecf96Smrg  libtool     Whether libtool is used (yes/no).
485dfecf96Smrg
495dfecf96SmrgReport bugs to <bug-automake@gnu.org>.
505dfecf96SmrgEOF
515dfecf96Smrg    exit $?
525dfecf96Smrg    ;;
535dfecf96Smrg  -v | --v*)
545dfecf96Smrg    echo "depcomp $scriptversion"
555dfecf96Smrg    exit $?
565dfecf96Smrg    ;;
575dfecf96Smrgesac
585dfecf96Smrg
59f765521fSmrg# Get the directory component of the given path, and save it in the
60f765521fSmrg# global variables '$dir'.  Note that this directory component will
61f765521fSmrg# be either empty or ending with a '/' character.  This is deliberate.
62f765521fSmrgset_dir_from ()
63f765521fSmrg{
64f765521fSmrg  case $1 in
65f765521fSmrg    */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;;
66f765521fSmrg      *) dir=;;
67f765521fSmrg  esac
68f765521fSmrg}
69f765521fSmrg
70f765521fSmrg# Get the suffix-stripped basename of the given path, and save it the
71f765521fSmrg# global variable '$base'.
72f765521fSmrgset_base_from ()
73f765521fSmrg{
74f765521fSmrg  base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'`
75f765521fSmrg}
76f765521fSmrg
77f765521fSmrg# If no dependency file was actually created by the compiler invocation,
78f765521fSmrg# we still have to create a dummy depfile, to avoid errors with the
79f765521fSmrg# Makefile "include basename.Plo" scheme.
80f765521fSmrgmake_dummy_depfile ()
81f765521fSmrg{
82f765521fSmrg  echo "#dummy" > "$depfile"
83f765521fSmrg}
84f765521fSmrg
85f765521fSmrg# Factor out some common post-processing of the generated depfile.
86f765521fSmrg# Requires the auxiliary global variable '$tmpdepfile' to be set.
87f765521fSmrgaix_post_process_depfile ()
88f765521fSmrg{
89f765521fSmrg  # If the compiler actually managed to produce a dependency file,
90f765521fSmrg  # post-process it.
91f765521fSmrg  if test -f "$tmpdepfile"; then
92f765521fSmrg    # Each line is of the form 'foo.o: dependency.h'.
93f765521fSmrg    # Do two passes, one to just change these to
94f765521fSmrg    #   $object: dependency.h
95f765521fSmrg    # and one to simply output
96f765521fSmrg    #   dependency.h:
97f765521fSmrg    # which is needed to avoid the deleted-header problem.
98f765521fSmrg    { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile"
99f765521fSmrg      sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile"
100f765521fSmrg    } > "$depfile"
101f765521fSmrg    rm -f "$tmpdepfile"
102f765521fSmrg  else
103f765521fSmrg    make_dummy_depfile
104f765521fSmrg  fi
105f765521fSmrg}
106f765521fSmrg
107f765521fSmrg# A tabulation character.
108f765521fSmrgtab='	'
109f765521fSmrg# A newline character.
110f765521fSmrgnl='
111f765521fSmrg'
112f765521fSmrg# Character ranges might be problematic outside the C locale.
113f765521fSmrg# These definitions help.
114f765521fSmrgupper=ABCDEFGHIJKLMNOPQRSTUVWXYZ
115f765521fSmrglower=abcdefghijklmnopqrstuvwxyz
116f765521fSmrgdigits=0123456789
117f765521fSmrgalpha=${upper}${lower}
118f765521fSmrg
1195dfecf96Smrgif test -z "$depmode" || test -z "$source" || test -z "$object"; then
1205dfecf96Smrg  echo "depcomp: Variables source, object and depmode must be set" 1>&2
1215dfecf96Smrg  exit 1
1225dfecf96Smrgfi
1235dfecf96Smrg
1245dfecf96Smrg# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.
1255dfecf96Smrgdepfile=${depfile-`echo "$object" |
1265dfecf96Smrg  sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`}
1275dfecf96Smrgtmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
1285dfecf96Smrg
1295dfecf96Smrgrm -f "$tmpdepfile"
1305dfecf96Smrg
131f765521fSmrg# Avoid interferences from the environment.
132f765521fSmrggccflag= dashmflag=
133f765521fSmrg
1345dfecf96Smrg# Some modes work just like other modes, but use different flags.  We
1355dfecf96Smrg# parameterize here, but still list the modes in the big case below,
1365dfecf96Smrg# to make depend.m4 easier to write.  Note that we *cannot* use a case
1375dfecf96Smrg# here, because this file can only contain one case statement.
1385dfecf96Smrgif test "$depmode" = hp; then
1395dfecf96Smrg  # HP compiler uses -M and no extra arg.
1405dfecf96Smrg  gccflag=-M
1415dfecf96Smrg  depmode=gcc
1425dfecf96Smrgfi
1435dfecf96Smrg
1445dfecf96Smrgif test "$depmode" = dashXmstdout; then
145f765521fSmrg  # This is just like dashmstdout with a different argument.
146f765521fSmrg  dashmflag=-xM
147f765521fSmrg  depmode=dashmstdout
1485dfecf96Smrgfi
1495dfecf96Smrg
150c05e22d7Smrgcygpath_u="cygpath -u -f -"
151c05e22d7Smrgif test "$depmode" = msvcmsys; then
152f765521fSmrg  # This is just like msvisualcpp but w/o cygpath translation.
153f765521fSmrg  # Just convert the backslash-escaped backslashes to single forward
154f765521fSmrg  # slashes to satisfy depend.m4
155f765521fSmrg  cygpath_u='sed s,\\\\,/,g'
156f765521fSmrg  depmode=msvisualcpp
157c05e22d7Smrgfi
158c05e22d7Smrg
15931de2854Smrgif test "$depmode" = msvc7msys; then
160f765521fSmrg  # This is just like msvc7 but w/o cygpath translation.
161f765521fSmrg  # Just convert the backslash-escaped backslashes to single forward
162f765521fSmrg  # slashes to satisfy depend.m4
163f765521fSmrg  cygpath_u='sed s,\\\\,/,g'
164f765521fSmrg  depmode=msvc7
165f765521fSmrgfi
166f765521fSmrg
167f765521fSmrgif test "$depmode" = xlc; then
168f765521fSmrg  # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information.
169f765521fSmrg  gccflag=-qmakedep=gcc,-MF
170f765521fSmrg  depmode=gcc
17131de2854Smrgfi
17231de2854Smrg
1735dfecf96Smrgcase "$depmode" in
1745dfecf96Smrggcc3)
1755dfecf96Smrg## gcc 3 implements dependency tracking that does exactly what
1765dfecf96Smrg## we want.  Yay!  Note: for some reason libtool 1.4 doesn't like
1775dfecf96Smrg## it if -MD -MP comes after the -MF stuff.  Hmm.
178f14f4646Smrg## Unfortunately, FreeBSD c89 acceptance of flags depends upon
179f14f4646Smrg## the command line argument order; so add the flags where they
180f14f4646Smrg## appear in depend2.am.  Note that the slowdown incurred here
181f14f4646Smrg## affects only configure: in makefiles, %FASTDEP% shortcuts this.
182f14f4646Smrg  for arg
183f14f4646Smrg  do
184f14f4646Smrg    case $arg in
185f14f4646Smrg    -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;;
186f14f4646Smrg    *)  set fnord "$@" "$arg" ;;
187f14f4646Smrg    esac
188f14f4646Smrg    shift # fnord
189f14f4646Smrg    shift # $arg
190f14f4646Smrg  done
191f14f4646Smrg  "$@"
1925dfecf96Smrg  stat=$?
193f765521fSmrg  if test $stat -ne 0; then
1945dfecf96Smrg    rm -f "$tmpdepfile"
1955dfecf96Smrg    exit $stat
1965dfecf96Smrg  fi
1975dfecf96Smrg  mv "$tmpdepfile" "$depfile"
1985dfecf96Smrg  ;;
1995dfecf96Smrg
2005dfecf96Smrggcc)
201f765521fSmrg## Note that this doesn't just cater to obsosete pre-3.x GCC compilers.
202f765521fSmrg## but also to in-use compilers like IMB xlc/xlC and the HP C compiler.
203f765521fSmrg## (see the conditional assignment to $gccflag above).
2045dfecf96Smrg## There are various ways to get dependency output from gcc.  Here's
2055dfecf96Smrg## why we pick this rather obscure method:
2065dfecf96Smrg## - Don't want to use -MD because we'd like the dependencies to end
2075dfecf96Smrg##   up in a subdir.  Having to rename by hand is ugly.
2085dfecf96Smrg##   (We might end up doing this anyway to support other compilers.)
2095dfecf96Smrg## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
210f765521fSmrg##   -MM, not -M (despite what the docs say).  Also, it might not be
211f765521fSmrg##   supported by the other compilers which use the 'gcc' depmode.
2125dfecf96Smrg## - Using -M directly means running the compiler twice (even worse
2135dfecf96Smrg##   than renaming).
2145dfecf96Smrg  if test -z "$gccflag"; then
2155dfecf96Smrg    gccflag=-MD,
2165dfecf96Smrg  fi
2175dfecf96Smrg  "$@" -Wp,"$gccflag$tmpdepfile"
2185dfecf96Smrg  stat=$?
219f765521fSmrg  if test $stat -ne 0; then
2205dfecf96Smrg    rm -f "$tmpdepfile"
2215dfecf96Smrg    exit $stat
2225dfecf96Smrg  fi
2235dfecf96Smrg  rm -f "$depfile"
2245dfecf96Smrg  echo "$object : \\" > "$depfile"
225f765521fSmrg  # The second -e expression handles DOS-style file names with drive
226f765521fSmrg  # letters.
2275dfecf96Smrg  sed -e 's/^[^:]*: / /' \
2285dfecf96Smrg      -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
229f765521fSmrg## This next piece of magic avoids the "deleted header file" problem.
2305dfecf96Smrg## The problem is that when a header file which appears in a .P file
2315dfecf96Smrg## is deleted, the dependency causes make to die (because there is
2325dfecf96Smrg## typically no way to rebuild the header).  We avoid this by adding
2335dfecf96Smrg## dummy dependencies for each header file.  Too bad gcc doesn't do
2345dfecf96Smrg## this for us directly.
235f765521fSmrg## Some versions of gcc put a space before the ':'.  On the theory
2365dfecf96Smrg## that the space means something, we add a space to the output as
23731de2854Smrg## well.  hp depmode also adds that space, but also prefixes the VPATH
23831de2854Smrg## to the object.  Take care to not repeat it in the output.
2395dfecf96Smrg## Some versions of the HPUX 10.20 sed can't process this invocation
2405dfecf96Smrg## correctly.  Breaking it into two sed invocations is a workaround.
241f765521fSmrg  tr ' ' "$nl" < "$tmpdepfile" \
242f765521fSmrg    | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \
243f765521fSmrg    | sed -e 's/$/ :/' >> "$depfile"
2445dfecf96Smrg  rm -f "$tmpdepfile"
2455dfecf96Smrg  ;;
2465dfecf96Smrg
2475dfecf96Smrghp)
2485dfecf96Smrg  # This case exists only to let depend.m4 do its work.  It works by
2495dfecf96Smrg  # looking at the text of this script.  This case will never be run,
2505dfecf96Smrg  # since it is checked for above.
2515dfecf96Smrg  exit 1
2525dfecf96Smrg  ;;
2535dfecf96Smrg
2545dfecf96Smrgsgi)
2555dfecf96Smrg  if test "$libtool" = yes; then
2565dfecf96Smrg    "$@" "-Wp,-MDupdate,$tmpdepfile"
2575dfecf96Smrg  else
2585dfecf96Smrg    "$@" -MDupdate "$tmpdepfile"
2595dfecf96Smrg  fi
2605dfecf96Smrg  stat=$?
261f765521fSmrg  if test $stat -ne 0; then
2625dfecf96Smrg    rm -f "$tmpdepfile"
2635dfecf96Smrg    exit $stat
2645dfecf96Smrg  fi
2655dfecf96Smrg  rm -f "$depfile"
2665dfecf96Smrg
2675dfecf96Smrg  if test -f "$tmpdepfile"; then  # yes, the sourcefile depend on other files
2685dfecf96Smrg    echo "$object : \\" > "$depfile"
2695dfecf96Smrg    # Clip off the initial element (the dependent).  Don't try to be
2705dfecf96Smrg    # clever and replace this with sed code, as IRIX sed won't handle
2715dfecf96Smrg    # lines with more than a fixed number of characters (4096 in
2725dfecf96Smrg    # IRIX 6.2 sed, 8192 in IRIX 6.5).  We also remove comment lines;
273f765521fSmrg    # the IRIX cc adds comments like '#:fec' to the end of the
2745dfecf96Smrg    # dependency line.
275f765521fSmrg    tr ' ' "$nl" < "$tmpdepfile" \
276f765521fSmrg      | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \
277f765521fSmrg      | tr "$nl" ' ' >> "$depfile"
278c05e22d7Smrg    echo >> "$depfile"
2795dfecf96Smrg    # The second pass generates a dummy entry for each header file.
280f765521fSmrg    tr ' ' "$nl" < "$tmpdepfile" \
281f765521fSmrg      | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
282f765521fSmrg      >> "$depfile"
2835dfecf96Smrg  else
284f765521fSmrg    make_dummy_depfile
2855dfecf96Smrg  fi
2865dfecf96Smrg  rm -f "$tmpdepfile"
2875dfecf96Smrg  ;;
2885dfecf96Smrg
289f765521fSmrgxlc)
290f765521fSmrg  # This case exists only to let depend.m4 do its work.  It works by
291f765521fSmrg  # looking at the text of this script.  This case will never be run,
292f765521fSmrg  # since it is checked for above.
293f765521fSmrg  exit 1
294f765521fSmrg  ;;
295f765521fSmrg
2965dfecf96Smrgaix)
2975dfecf96Smrg  # The C for AIX Compiler uses -M and outputs the dependencies
2985dfecf96Smrg  # in a .u file.  In older versions, this file always lives in the
299f765521fSmrg  # current directory.  Also, the AIX compiler puts '$object:' at the
3005dfecf96Smrg  # start of each line; $object doesn't have directory information.
3015dfecf96Smrg  # Version 6 uses the directory in both cases.
302f765521fSmrg  set_dir_from "$object"
303f765521fSmrg  set_base_from "$object"
3045dfecf96Smrg  if test "$libtool" = yes; then
305f14f4646Smrg    tmpdepfile1=$dir$base.u
306f14f4646Smrg    tmpdepfile2=$base.u
307f14f4646Smrg    tmpdepfile3=$dir.libs/$base.u
3085dfecf96Smrg    "$@" -Wc,-M
3095dfecf96Smrg  else
310f14f4646Smrg    tmpdepfile1=$dir$base.u
311f14f4646Smrg    tmpdepfile2=$dir$base.u
312f14f4646Smrg    tmpdepfile3=$dir$base.u
3135dfecf96Smrg    "$@" -M
3145dfecf96Smrg  fi
3155dfecf96Smrg  stat=$?
316f765521fSmrg  if test $stat -ne 0; then
317f14f4646Smrg    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
3185dfecf96Smrg    exit $stat
3195dfecf96Smrg  fi
3205dfecf96Smrg
321f14f4646Smrg  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
322f14f4646Smrg  do
323f14f4646Smrg    test -f "$tmpdepfile" && break
324f14f4646Smrg  done
325f765521fSmrg  aix_post_process_depfile
326f765521fSmrg  ;;
327f765521fSmrg
328f765521fSmrgtcc)
329f765521fSmrg  # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26
330f765521fSmrg  # FIXME: That version still under development at the moment of writing.
331f765521fSmrg  #        Make that this statement remains true also for stable, released
332f765521fSmrg  #        versions.
333f765521fSmrg  # It will wrap lines (doesn't matter whether long or short) with a
334f765521fSmrg  # trailing '\', as in:
335f765521fSmrg  #
336f765521fSmrg  #   foo.o : \
337f765521fSmrg  #    foo.c \
338f765521fSmrg  #    foo.h \
339f765521fSmrg  #
340f765521fSmrg  # It will put a trailing '\' even on the last line, and will use leading
341f765521fSmrg  # spaces rather than leading tabs (at least since its commit 0394caf7
342f765521fSmrg  # "Emit spaces for -MD").
343f765521fSmrg  "$@" -MD -MF "$tmpdepfile"
344f765521fSmrg  stat=$?
345f765521fSmrg  if test $stat -ne 0; then
346f765521fSmrg    rm -f "$tmpdepfile"
347f765521fSmrg    exit $stat
3485dfecf96Smrg  fi
349f765521fSmrg  rm -f "$depfile"
350f765521fSmrg  # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'.
351f765521fSmrg  # We have to change lines of the first kind to '$object: \'.
352f765521fSmrg  sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile"
353f765521fSmrg  # And for each line of the second kind, we have to emit a 'dep.h:'
354f765521fSmrg  # dummy dependency, to avoid the deleted-header problem.
355f765521fSmrg  sed -n -e 's|^  *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile"
3565dfecf96Smrg  rm -f "$tmpdepfile"
3575dfecf96Smrg  ;;
3585dfecf96Smrg
359f765521fSmrg## The order of this option in the case statement is important, since the
360f765521fSmrg## shell code in configure will try each of these formats in the order
361f765521fSmrg## listed in this file.  A plain '-MD' option would be understood by many
362f765521fSmrg## compilers, so we must ensure this comes after the gcc and icc options.
363f765521fSmrgpgcc)
364f765521fSmrg  # Portland's C compiler understands '-MD'.
365f765521fSmrg  # Will always output deps to 'file.d' where file is the root name of the
366f765521fSmrg  # source file under compilation, even if file resides in a subdirectory.
367f765521fSmrg  # The object file name does not affect the name of the '.d' file.
368f765521fSmrg  # pgcc 10.2 will output
3695dfecf96Smrg  #    foo.o: sub/foo.c sub/foo.h
370f765521fSmrg  # and will wrap long lines using '\' :
3715dfecf96Smrg  #    foo.o: sub/foo.c ... \
3725dfecf96Smrg  #     sub/foo.h ... \
3735dfecf96Smrg  #     ...
374f765521fSmrg  set_dir_from "$object"
375f765521fSmrg  # Use the source, not the object, to determine the base name, since
376f765521fSmrg  # that's sadly what pgcc will do too.
377f765521fSmrg  set_base_from "$source"
378f765521fSmrg  tmpdepfile=$base.d
379f765521fSmrg
380f765521fSmrg  # For projects that build the same source file twice into different object
381f765521fSmrg  # files, the pgcc approach of using the *source* file root name can cause
382f765521fSmrg  # problems in parallel builds.  Use a locking strategy to avoid stomping on
383f765521fSmrg  # the same $tmpdepfile.
384f765521fSmrg  lockdir=$base.d-lock
385f765521fSmrg  trap "
386f765521fSmrg    echo '$0: caught signal, cleaning up...' >&2
387f765521fSmrg    rmdir '$lockdir'
388f765521fSmrg    exit 1
389f765521fSmrg  " 1 2 13 15
390f765521fSmrg  numtries=100
391f765521fSmrg  i=$numtries
392f765521fSmrg  while test $i -gt 0; do
393f765521fSmrg    # mkdir is a portable test-and-set.
394f765521fSmrg    if mkdir "$lockdir" 2>/dev/null; then
395f765521fSmrg      # This process acquired the lock.
396f765521fSmrg      "$@" -MD
397f765521fSmrg      stat=$?
398f765521fSmrg      # Release the lock.
399f765521fSmrg      rmdir "$lockdir"
400f765521fSmrg      break
401f765521fSmrg    else
402f765521fSmrg      # If the lock is being held by a different process, wait
403f765521fSmrg      # until the winning process is done or we timeout.
404f765521fSmrg      while test -d "$lockdir" && test $i -gt 0; do
405f765521fSmrg        sleep 1
406f765521fSmrg        i=`expr $i - 1`
407f765521fSmrg      done
408f765521fSmrg    fi
409f765521fSmrg    i=`expr $i - 1`
410f765521fSmrg  done
411f765521fSmrg  trap - 1 2 13 15
412f765521fSmrg  if test $i -le 0; then
413f765521fSmrg    echo "$0: failed to acquire lock after $numtries attempts" >&2
414f765521fSmrg    echo "$0: check lockdir '$lockdir'" >&2
415f765521fSmrg    exit 1
416f765521fSmrg  fi
4175dfecf96Smrg
418f765521fSmrg  if test $stat -ne 0; then
4195dfecf96Smrg    rm -f "$tmpdepfile"
4205dfecf96Smrg    exit $stat
4215dfecf96Smrg  fi
4225dfecf96Smrg  rm -f "$depfile"
4235dfecf96Smrg  # Each line is of the form `foo.o: dependent.h',
4245dfecf96Smrg  # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'.
4255dfecf96Smrg  # Do two passes, one to just change these to
4265dfecf96Smrg  # `$object: dependent.h' and one to simply `dependent.h:'.
4275dfecf96Smrg  sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
4285dfecf96Smrg  # Some versions of the HPUX 10.20 sed can't process this invocation
4295dfecf96Smrg  # correctly.  Breaking it into two sed invocations is a workaround.
430f765521fSmrg  sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \
431f765521fSmrg    | sed -e 's/$/ :/' >> "$depfile"
4325dfecf96Smrg  rm -f "$tmpdepfile"
4335dfecf96Smrg  ;;
4345dfecf96Smrg
435f14f4646Smrghp2)
436f14f4646Smrg  # The "hp" stanza above does not work with aCC (C++) and HP's ia64
437f14f4646Smrg  # compilers, which have integrated preprocessors.  The correct option
438f14f4646Smrg  # to use with these is +Maked; it writes dependencies to a file named
439f14f4646Smrg  # 'foo.d', which lands next to the object file, wherever that
440f14f4646Smrg  # happens to be.
441f14f4646Smrg  # Much of this is similar to the tru64 case; see comments there.
442f765521fSmrg  set_dir_from  "$object"
443f765521fSmrg  set_base_from "$object"
444f14f4646Smrg  if test "$libtool" = yes; then
445f14f4646Smrg    tmpdepfile1=$dir$base.d
446f14f4646Smrg    tmpdepfile2=$dir.libs/$base.d
447f14f4646Smrg    "$@" -Wc,+Maked
448f14f4646Smrg  else
449f14f4646Smrg    tmpdepfile1=$dir$base.d
450f14f4646Smrg    tmpdepfile2=$dir$base.d
451f14f4646Smrg    "$@" +Maked
452f14f4646Smrg  fi
453f14f4646Smrg  stat=$?
454f765521fSmrg  if test $stat -ne 0; then
455f14f4646Smrg     rm -f "$tmpdepfile1" "$tmpdepfile2"
456f14f4646Smrg     exit $stat
457f14f4646Smrg  fi
458f14f4646Smrg
459f14f4646Smrg  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2"
460f14f4646Smrg  do
461f14f4646Smrg    test -f "$tmpdepfile" && break
462f14f4646Smrg  done
463f14f4646Smrg  if test -f "$tmpdepfile"; then
464f765521fSmrg    sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile"
465f765521fSmrg    # Add 'dependent.h:' lines.
466c05e22d7Smrg    sed -ne '2,${
467f765521fSmrg               s/^ *//
468f765521fSmrg               s/ \\*$//
469f765521fSmrg               s/$/:/
470f765521fSmrg               p
471f765521fSmrg             }' "$tmpdepfile" >> "$depfile"
472f14f4646Smrg  else
473f765521fSmrg    make_dummy_depfile
474f14f4646Smrg  fi
475f14f4646Smrg  rm -f "$tmpdepfile" "$tmpdepfile2"
476f14f4646Smrg  ;;
477f14f4646Smrg
4785dfecf96Smrgtru64)
479f765521fSmrg  # The Tru64 compiler uses -MD to generate dependencies as a side
480f765521fSmrg  # effect.  'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'.
481f765521fSmrg  # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
482f765521fSmrg  # dependencies in 'foo.d' instead, so we check for that too.
483f765521fSmrg  # Subdirectories are respected.
484f765521fSmrg  set_dir_from  "$object"
485f765521fSmrg  set_base_from "$object"
486f765521fSmrg
487f765521fSmrg  if test "$libtool" = yes; then
488f765521fSmrg    # Libtool generates 2 separate objects for the 2 libraries.  These
489f765521fSmrg    # two compilations output dependencies in $dir.libs/$base.o.d and
490f765521fSmrg    # in $dir$base.o.d.  We have to check for both files, because
491f765521fSmrg    # one of the two compilations can be disabled.  We should prefer
492f765521fSmrg    # $dir$base.o.d over $dir.libs/$base.o.d because the latter is
493f765521fSmrg    # automatically cleaned when .libs/ is deleted, while ignoring
494f765521fSmrg    # the former would cause a distcleancheck panic.
495f765521fSmrg    tmpdepfile1=$dir$base.o.d          # libtool 1.5
496f765521fSmrg    tmpdepfile2=$dir.libs/$base.o.d    # Likewise.
497f765521fSmrg    tmpdepfile3=$dir.libs/$base.d      # Compaq CCC V6.2-504
498f765521fSmrg    "$@" -Wc,-MD
499f765521fSmrg  else
500f765521fSmrg    tmpdepfile1=$dir$base.d
501f765521fSmrg    tmpdepfile2=$dir$base.d
502f765521fSmrg    tmpdepfile3=$dir$base.d
503f765521fSmrg    "$@" -MD
504f765521fSmrg  fi
505f765521fSmrg
506f765521fSmrg  stat=$?
507f765521fSmrg  if test $stat -ne 0; then
508f765521fSmrg    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
509f765521fSmrg    exit $stat
510f765521fSmrg  fi
511f765521fSmrg
512f765521fSmrg  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
513f765521fSmrg  do
514f765521fSmrg    test -f "$tmpdepfile" && break
515f765521fSmrg  done
516f765521fSmrg  # Same post-processing that is required for AIX mode.
517f765521fSmrg  aix_post_process_depfile
518f765521fSmrg  ;;
5195dfecf96Smrg
52031de2854Smrgmsvc7)
52131de2854Smrg  if test "$libtool" = yes; then
52231de2854Smrg    showIncludes=-Wc,-showIncludes
52331de2854Smrg  else
52431de2854Smrg    showIncludes=-showIncludes
52531de2854Smrg  fi
52631de2854Smrg  "$@" $showIncludes > "$tmpdepfile"
52731de2854Smrg  stat=$?
52831de2854Smrg  grep -v '^Note: including file: ' "$tmpdepfile"
529f765521fSmrg  if test $stat -ne 0; then
53031de2854Smrg    rm -f "$tmpdepfile"
53131de2854Smrg    exit $stat
53231de2854Smrg  fi
53331de2854Smrg  rm -f "$depfile"
53431de2854Smrg  echo "$object : \\" > "$depfile"
53531de2854Smrg  # The first sed program below extracts the file names and escapes
53631de2854Smrg  # backslashes for cygpath.  The second sed program outputs the file
53731de2854Smrg  # name when reading, but also accumulates all include files in the
53831de2854Smrg  # hold buffer in order to output them again at the end.  This only
53931de2854Smrg  # works with sed implementations that can handle large buffers.
54031de2854Smrg  sed < "$tmpdepfile" -n '
54131de2854Smrg/^Note: including file:  *\(.*\)/ {
54231de2854Smrg  s//\1/
54331de2854Smrg  s/\\/\\\\/g
54431de2854Smrg  p
54531de2854Smrg}' | $cygpath_u | sort -u | sed -n '
54631de2854Smrgs/ /\\ /g
547f765521fSmrgs/\(.*\)/'"$tab"'\1 \\/p
54831de2854Smrgs/.\(.*\) \\/\1:/
54931de2854SmrgH
55031de2854Smrg$ {
551f765521fSmrg  s/.*/'"$tab"'/
55231de2854Smrg  G
55331de2854Smrg  p
55431de2854Smrg}' >> "$depfile"
555f765521fSmrg  echo >> "$depfile" # make sure the fragment doesn't end with a backslash
55631de2854Smrg  rm -f "$tmpdepfile"
55731de2854Smrg  ;;
55831de2854Smrg
55931de2854Smrgmsvc7msys)
56031de2854Smrg  # This case exists only to let depend.m4 do its work.  It works by
56131de2854Smrg  # looking at the text of this script.  This case will never be run,
56231de2854Smrg  # since it is checked for above.
56331de2854Smrg  exit 1
56431de2854Smrg  ;;
56531de2854Smrg
5665dfecf96Smrg#nosideeffect)
5675dfecf96Smrg  # This comment above is used by automake to tell side-effect
5685dfecf96Smrg  # dependency tracking mechanisms from slower ones.
5695dfecf96Smrg
5705dfecf96Smrgdashmstdout)
5715dfecf96Smrg  # Important note: in order to support this mode, a compiler *must*
5725dfecf96Smrg  # always write the preprocessed file to stdout, regardless of -o.
5735dfecf96Smrg  "$@" || exit $?
5745dfecf96Smrg
5755dfecf96Smrg  # Remove the call to Libtool.
5765dfecf96Smrg  if test "$libtool" = yes; then
577c05e22d7Smrg    while test "X$1" != 'X--mode=compile'; do
5785dfecf96Smrg      shift
5795dfecf96Smrg    done
5805dfecf96Smrg    shift
5815dfecf96Smrg  fi
5825dfecf96Smrg
583f765521fSmrg  # Remove '-o $object'.
5845dfecf96Smrg  IFS=" "
5855dfecf96Smrg  for arg
5865dfecf96Smrg  do
5875dfecf96Smrg    case $arg in
5885dfecf96Smrg    -o)
5895dfecf96Smrg      shift
5905dfecf96Smrg      ;;
5915dfecf96Smrg    $object)
5925dfecf96Smrg      shift
5935dfecf96Smrg      ;;
5945dfecf96Smrg    *)
5955dfecf96Smrg      set fnord "$@" "$arg"
5965dfecf96Smrg      shift # fnord
5975dfecf96Smrg      shift # $arg
5985dfecf96Smrg      ;;
5995dfecf96Smrg    esac
6005dfecf96Smrg  done
6015dfecf96Smrg
6025dfecf96Smrg  test -z "$dashmflag" && dashmflag=-M
603f765521fSmrg  # Require at least two characters before searching for ':'
6045dfecf96Smrg  # in the target name.  This is to cope with DOS-style filenames:
605f765521fSmrg  # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise.
6065dfecf96Smrg  "$@" $dashmflag |
607f765521fSmrg    sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile"
6085dfecf96Smrg  rm -f "$depfile"
6095dfecf96Smrg  cat < "$tmpdepfile" > "$depfile"
610f765521fSmrg  # Some versions of the HPUX 10.20 sed can't process this sed invocation
611f765521fSmrg  # correctly.  Breaking it into two sed invocations is a workaround.
612f765521fSmrg  tr ' ' "$nl" < "$tmpdepfile" \
613f765521fSmrg    | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
614f765521fSmrg    | sed -e 's/$/ :/' >> "$depfile"
6155dfecf96Smrg  rm -f "$tmpdepfile"
6165dfecf96Smrg  ;;
6175dfecf96Smrg
6185dfecf96SmrgdashXmstdout)
6195dfecf96Smrg  # This case only exists to satisfy depend.m4.  It is never actually
6205dfecf96Smrg  # run, as this mode is specially recognized in the preamble.
6215dfecf96Smrg  exit 1
6225dfecf96Smrg  ;;
6235dfecf96Smrg
6245dfecf96Smrgmakedepend)
6255dfecf96Smrg  "$@" || exit $?
6265dfecf96Smrg  # Remove any Libtool call
6275dfecf96Smrg  if test "$libtool" = yes; then
628c05e22d7Smrg    while test "X$1" != 'X--mode=compile'; do
6295dfecf96Smrg      shift
6305dfecf96Smrg    done
6315dfecf96Smrg    shift
6325dfecf96Smrg  fi
6335dfecf96Smrg  # X makedepend
6345dfecf96Smrg  shift
635c05e22d7Smrg  cleared=no eat=no
636c05e22d7Smrg  for arg
637c05e22d7Smrg  do
6385dfecf96Smrg    case $cleared in
6395dfecf96Smrg    no)
6405dfecf96Smrg      set ""; shift
6415dfecf96Smrg      cleared=yes ;;
6425dfecf96Smrg    esac
643c05e22d7Smrg    if test $eat = yes; then
644c05e22d7Smrg      eat=no
645c05e22d7Smrg      continue
646c05e22d7Smrg    fi
6475dfecf96Smrg    case "$arg" in
6485dfecf96Smrg    -D*|-I*)
6495dfecf96Smrg      set fnord "$@" "$arg"; shift ;;
6505dfecf96Smrg    # Strip any option that makedepend may not understand.  Remove
6515dfecf96Smrg    # the object too, otherwise makedepend will parse it as a source file.
652c05e22d7Smrg    -arch)
653c05e22d7Smrg      eat=yes ;;
6545dfecf96Smrg    -*|$object)
6555dfecf96Smrg      ;;
6565dfecf96Smrg    *)
6575dfecf96Smrg      set fnord "$@" "$arg"; shift ;;
6585dfecf96Smrg    esac
6595dfecf96Smrg  done
660c05e22d7Smrg  obj_suffix=`echo "$object" | sed 's/^.*\././'`
6615dfecf96Smrg  touch "$tmpdepfile"
6625dfecf96Smrg  ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
6635dfecf96Smrg  rm -f "$depfile"
66431de2854Smrg  # makedepend may prepend the VPATH from the source file name to the object.
66531de2854Smrg  # No need to regex-escape $object, excess matching of '.' is harmless.
66631de2854Smrg  sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile"
667f765521fSmrg  # Some versions of the HPUX 10.20 sed can't process the last invocation
668f765521fSmrg  # correctly.  Breaking it into two sed invocations is a workaround.
669f765521fSmrg  sed '1,2d' "$tmpdepfile" \
670f765521fSmrg    | tr ' ' "$nl" \
671f765521fSmrg    | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
672f765521fSmrg    | sed -e 's/$/ :/' >> "$depfile"
6735dfecf96Smrg  rm -f "$tmpdepfile" "$tmpdepfile".bak
6745dfecf96Smrg  ;;
6755dfecf96Smrg
6765dfecf96Smrgcpp)
6775dfecf96Smrg  # Important note: in order to support this mode, a compiler *must*
6785dfecf96Smrg  # always write the preprocessed file to stdout.
6795dfecf96Smrg  "$@" || exit $?
6805dfecf96Smrg
6815dfecf96Smrg  # Remove the call to Libtool.
6825dfecf96Smrg  if test "$libtool" = yes; then
683c05e22d7Smrg    while test "X$1" != 'X--mode=compile'; do
6845dfecf96Smrg      shift
6855dfecf96Smrg    done
6865dfecf96Smrg    shift
6875dfecf96Smrg  fi
6885dfecf96Smrg
689f765521fSmrg  # Remove '-o $object'.
6905dfecf96Smrg  IFS=" "
6915dfecf96Smrg  for arg
6925dfecf96Smrg  do
6935dfecf96Smrg    case $arg in
6945dfecf96Smrg    -o)
6955dfecf96Smrg      shift
6965dfecf96Smrg      ;;
6975dfecf96Smrg    $object)
6985dfecf96Smrg      shift
6995dfecf96Smrg      ;;
7005dfecf96Smrg    *)
7015dfecf96Smrg      set fnord "$@" "$arg"
7025dfecf96Smrg      shift # fnord
7035dfecf96Smrg      shift # $arg
7045dfecf96Smrg      ;;
7055dfecf96Smrg    esac
7065dfecf96Smrg  done
7075dfecf96Smrg
708f765521fSmrg  "$@" -E \
709f765521fSmrg    | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
710f765521fSmrg             -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
711f765521fSmrg    | sed '$ s: \\$::' > "$tmpdepfile"
7125dfecf96Smrg  rm -f "$depfile"
7135dfecf96Smrg  echo "$object : \\" > "$depfile"
7145dfecf96Smrg  cat < "$tmpdepfile" >> "$depfile"
7155dfecf96Smrg  sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
7165dfecf96Smrg  rm -f "$tmpdepfile"
7175dfecf96Smrg  ;;
7185dfecf96Smrg
7195dfecf96Smrgmsvisualcpp)
7205dfecf96Smrg  # Important note: in order to support this mode, a compiler *must*
721c05e22d7Smrg  # always write the preprocessed file to stdout.
7225dfecf96Smrg  "$@" || exit $?
723c05e22d7Smrg
724c05e22d7Smrg  # Remove the call to Libtool.
725c05e22d7Smrg  if test "$libtool" = yes; then
726c05e22d7Smrg    while test "X$1" != 'X--mode=compile'; do
727c05e22d7Smrg      shift
728c05e22d7Smrg    done
729c05e22d7Smrg    shift
730c05e22d7Smrg  fi
731c05e22d7Smrg
7325dfecf96Smrg  IFS=" "
7335dfecf96Smrg  for arg
7345dfecf96Smrg  do
7355dfecf96Smrg    case "$arg" in
736c05e22d7Smrg    -o)
737c05e22d7Smrg      shift
738c05e22d7Smrg      ;;
739c05e22d7Smrg    $object)
740c05e22d7Smrg      shift
741c05e22d7Smrg      ;;
7425dfecf96Smrg    "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
743f765521fSmrg        set fnord "$@"
744f765521fSmrg        shift
745f765521fSmrg        shift
746f765521fSmrg        ;;
7475dfecf96Smrg    *)
748f765521fSmrg        set fnord "$@" "$arg"
749f765521fSmrg        shift
750f765521fSmrg        shift
751f765521fSmrg        ;;
7525dfecf96Smrg    esac
7535dfecf96Smrg  done
754c05e22d7Smrg  "$@" -E 2>/dev/null |
755c05e22d7Smrg  sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile"
7565dfecf96Smrg  rm -f "$depfile"
7575dfecf96Smrg  echo "$object : \\" > "$depfile"
758f765521fSmrg  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile"
759f765521fSmrg  echo "$tab" >> "$depfile"
760c05e22d7Smrg  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile"
7615dfecf96Smrg  rm -f "$tmpdepfile"
7625dfecf96Smrg  ;;
7635dfecf96Smrg
764c05e22d7Smrgmsvcmsys)
765c05e22d7Smrg  # This case exists only to let depend.m4 do its work.  It works by
766c05e22d7Smrg  # looking at the text of this script.  This case will never be run,
767c05e22d7Smrg  # since it is checked for above.
768c05e22d7Smrg  exit 1
769c05e22d7Smrg  ;;
770c05e22d7Smrg
7715dfecf96Smrgnone)
7725dfecf96Smrg  exec "$@"
7735dfecf96Smrg  ;;
7745dfecf96Smrg
7755dfecf96Smrg*)
7765dfecf96Smrg  echo "Unknown depmode $depmode" 1>&2
7775dfecf96Smrg  exit 1
7785dfecf96Smrg  ;;
7795dfecf96Smrgesac
7805dfecf96Smrg
7815dfecf96Smrgexit 0
7825dfecf96Smrg
7835dfecf96Smrg# Local Variables:
7845dfecf96Smrg# mode: shell-script
7855dfecf96Smrg# sh-indentation: 2
78696d43ffdSmrg# eval: (add-hook 'before-save-hook 'time-stamp)
7875dfecf96Smrg# time-stamp-start: "scriptversion="
7885dfecf96Smrg# time-stamp-format: "%:y-%02m-%02d.%02H"
78996d43ffdSmrg# time-stamp-time-zone: "UTC0"
790c05e22d7Smrg# time-stamp-end: "; # UTC"
7915dfecf96Smrg# End:
792