1492e1cfeSmrg#! /bin/sh
2492e1cfeSmrg# depcomp - compile a program generating dependencies as side-effects
39e0146f7Smrg
431e5d586Smrgscriptversion=2018-03-07.03; # UTC
59e0146f7Smrg
631e5d586Smrg# Copyright (C) 1999-2021 Free Software Foundation, Inc.
7492e1cfeSmrg
8492e1cfeSmrg# This program is free software; you can redistribute it and/or modify
9492e1cfeSmrg# it under the terms of the GNU General Public License as published by
10492e1cfeSmrg# the Free Software Foundation; either version 2, or (at your option)
11492e1cfeSmrg# any later version.
12492e1cfeSmrg
13492e1cfeSmrg# This program is distributed in the hope that it will be useful,
14492e1cfeSmrg# but WITHOUT ANY WARRANTY; without even the implied warranty of
15492e1cfeSmrg# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16492e1cfeSmrg# GNU General Public License for more details.
17492e1cfeSmrg
18492e1cfeSmrg# You should have received a copy of the GNU General Public License
1931e5d586Smrg# along with this program.  If not, see <https://www.gnu.org/licenses/>.
20492e1cfeSmrg
21492e1cfeSmrg# As a special exception to the GNU General Public License, if you
22492e1cfeSmrg# distribute this file as part of a program that contains a
23492e1cfeSmrg# configuration script generated by Autoconf, you may include it under
24492e1cfeSmrg# the same distribution terms that you use for the rest of that program.
25492e1cfeSmrg
26492e1cfeSmrg# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>.
27492e1cfeSmrg
289e0146f7Smrgcase $1 in
299e0146f7Smrg  '')
301afad795Smrg    echo "$0: No command.  Try '$0 --help' for more information." 1>&2
311afad795Smrg    exit 1;
321afad795Smrg    ;;
339e0146f7Smrg  -h | --h*)
349e0146f7Smrg    cat <<\EOF
359e0146f7SmrgUsage: depcomp [--help] [--version] PROGRAM [ARGS]
369e0146f7Smrg
379e0146f7SmrgRun PROGRAMS ARGS to compile a file, generating dependencies
389e0146f7Smrgas side-effects.
399e0146f7Smrg
409e0146f7SmrgEnvironment variables:
419e0146f7Smrg  depmode     Dependency tracking mode.
421afad795Smrg  source      Source file read by 'PROGRAMS ARGS'.
431afad795Smrg  object      Object file output by 'PROGRAMS ARGS'.
449e0146f7Smrg  DEPDIR      directory where to store dependencies.
459e0146f7Smrg  depfile     Dependency file to output.
461afad795Smrg  tmpdepfile  Temporary file to use when outputting dependencies.
479e0146f7Smrg  libtool     Whether libtool is used (yes/no).
489e0146f7Smrg
499e0146f7SmrgReport bugs to <bug-automake@gnu.org>.
509e0146f7SmrgEOF
519e0146f7Smrg    exit $?
529e0146f7Smrg    ;;
539e0146f7Smrg  -v | --v*)
549e0146f7Smrg    echo "depcomp $scriptversion"
559e0146f7Smrg    exit $?
569e0146f7Smrg    ;;
579e0146f7Smrgesac
589e0146f7Smrg
591afad795Smrg# Get the directory component of the given path, and save it in the
601afad795Smrg# global variables '$dir'.  Note that this directory component will
611afad795Smrg# be either empty or ending with a '/' character.  This is deliberate.
621afad795Smrgset_dir_from ()
631afad795Smrg{
641afad795Smrg  case $1 in
651afad795Smrg    */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;;
661afad795Smrg      *) dir=;;
671afad795Smrg  esac
681afad795Smrg}
691afad795Smrg
701afad795Smrg# Get the suffix-stripped basename of the given path, and save it the
711afad795Smrg# global variable '$base'.
721afad795Smrgset_base_from ()
731afad795Smrg{
741afad795Smrg  base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'`
751afad795Smrg}
761afad795Smrg
771afad795Smrg# If no dependency file was actually created by the compiler invocation,
781afad795Smrg# we still have to create a dummy depfile, to avoid errors with the
791afad795Smrg# Makefile "include basename.Plo" scheme.
801afad795Smrgmake_dummy_depfile ()
811afad795Smrg{
821afad795Smrg  echo "#dummy" > "$depfile"
831afad795Smrg}
841afad795Smrg
851afad795Smrg# Factor out some common post-processing of the generated depfile.
861afad795Smrg# Requires the auxiliary global variable '$tmpdepfile' to be set.
871afad795Smrgaix_post_process_depfile ()
881afad795Smrg{
891afad795Smrg  # If the compiler actually managed to produce a dependency file,
901afad795Smrg  # post-process it.
911afad795Smrg  if test -f "$tmpdepfile"; then
921afad795Smrg    # Each line is of the form 'foo.o: dependency.h'.
931afad795Smrg    # Do two passes, one to just change these to
941afad795Smrg    #   $object: dependency.h
951afad795Smrg    # and one to simply output
961afad795Smrg    #   dependency.h:
971afad795Smrg    # which is needed to avoid the deleted-header problem.
981afad795Smrg    { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile"
991afad795Smrg      sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile"
1001afad795Smrg    } > "$depfile"
1011afad795Smrg    rm -f "$tmpdepfile"
1021afad795Smrg  else
1031afad795Smrg    make_dummy_depfile
1041afad795Smrg  fi
1051afad795Smrg}
1061afad795Smrg
1071afad795Smrg# A tabulation character.
1081afad795Smrgtab='	'
1091afad795Smrg# A newline character.
1101afad795Smrgnl='
1111afad795Smrg'
1121afad795Smrg# Character ranges might be problematic outside the C locale.
1131afad795Smrg# These definitions help.
1141afad795Smrgupper=ABCDEFGHIJKLMNOPQRSTUVWXYZ
1151afad795Smrglower=abcdefghijklmnopqrstuvwxyz
1161afad795Smrgdigits=0123456789
1171afad795Smrgalpha=${upper}${lower}
1181afad795Smrg
119492e1cfeSmrgif test -z "$depmode" || test -z "$source" || test -z "$object"; then
120492e1cfeSmrg  echo "depcomp: Variables source, object and depmode must be set" 1>&2
121492e1cfeSmrg  exit 1
122492e1cfeSmrgfi
123492e1cfeSmrg
1249e0146f7Smrg# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.
1259e0146f7Smrgdepfile=${depfile-`echo "$object" |
1269e0146f7Smrg  sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`}
127492e1cfeSmrgtmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
128492e1cfeSmrg
129492e1cfeSmrgrm -f "$tmpdepfile"
130492e1cfeSmrg
1311afad795Smrg# Avoid interferences from the environment.
1321afad795Smrggccflag= dashmflag=
1331afad795Smrg
134492e1cfeSmrg# Some modes work just like other modes, but use different flags.  We
135492e1cfeSmrg# parameterize here, but still list the modes in the big case below,
136492e1cfeSmrg# to make depend.m4 easier to write.  Note that we *cannot* use a case
137492e1cfeSmrg# here, because this file can only contain one case statement.
138492e1cfeSmrgif test "$depmode" = hp; then
139492e1cfeSmrg  # HP compiler uses -M and no extra arg.
140492e1cfeSmrg  gccflag=-M
141492e1cfeSmrg  depmode=gcc
142492e1cfeSmrgfi
143492e1cfeSmrg
144492e1cfeSmrgif test "$depmode" = dashXmstdout; then
1451afad795Smrg  # This is just like dashmstdout with a different argument.
1461afad795Smrg  dashmflag=-xM
1471afad795Smrg  depmode=dashmstdout
148492e1cfeSmrgfi
149492e1cfeSmrg
1509e0146f7Smrgcygpath_u="cygpath -u -f -"
1519e0146f7Smrgif test "$depmode" = msvcmsys; then
1521afad795Smrg  # This is just like msvisualcpp but w/o cygpath translation.
1531afad795Smrg  # Just convert the backslash-escaped backslashes to single forward
1541afad795Smrg  # slashes to satisfy depend.m4
1551afad795Smrg  cygpath_u='sed s,\\\\,/,g'
1561afad795Smrg  depmode=msvisualcpp
1571afad795Smrgfi
1581afad795Smrg
1591afad795Smrgif test "$depmode" = msvc7msys; then
1601afad795Smrg  # This is just like msvc7 but w/o cygpath translation.
1611afad795Smrg  # Just convert the backslash-escaped backslashes to single forward
1621afad795Smrg  # slashes to satisfy depend.m4
1631afad795Smrg  cygpath_u='sed s,\\\\,/,g'
1641afad795Smrg  depmode=msvc7
1651afad795Smrgfi
1661afad795Smrg
1671afad795Smrgif test "$depmode" = xlc; then
1681afad795Smrg  # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information.
1691afad795Smrg  gccflag=-qmakedep=gcc,-MF
1701afad795Smrg  depmode=gcc
1719e0146f7Smrgfi
1729e0146f7Smrg
173492e1cfeSmrgcase "$depmode" in
174492e1cfeSmrggcc3)
175492e1cfeSmrg## gcc 3 implements dependency tracking that does exactly what
176492e1cfeSmrg## we want.  Yay!  Note: for some reason libtool 1.4 doesn't like
177492e1cfeSmrg## it if -MD -MP comes after the -MF stuff.  Hmm.
1789e0146f7Smrg## Unfortunately, FreeBSD c89 acceptance of flags depends upon
1799e0146f7Smrg## the command line argument order; so add the flags where they
1809e0146f7Smrg## appear in depend2.am.  Note that the slowdown incurred here
1819e0146f7Smrg## affects only configure: in makefiles, %FASTDEP% shortcuts this.
1829e0146f7Smrg  for arg
1839e0146f7Smrg  do
1849e0146f7Smrg    case $arg in
1859e0146f7Smrg    -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;;
1869e0146f7Smrg    *)  set fnord "$@" "$arg" ;;
1879e0146f7Smrg    esac
1889e0146f7Smrg    shift # fnord
1899e0146f7Smrg    shift # $arg
1909e0146f7Smrg  done
1919e0146f7Smrg  "$@"
192492e1cfeSmrg  stat=$?
1931afad795Smrg  if test $stat -ne 0; then
194492e1cfeSmrg    rm -f "$tmpdepfile"
195492e1cfeSmrg    exit $stat
196492e1cfeSmrg  fi
197492e1cfeSmrg  mv "$tmpdepfile" "$depfile"
198492e1cfeSmrg  ;;
199492e1cfeSmrg
200492e1cfeSmrggcc)
2011afad795Smrg## Note that this doesn't just cater to obsosete pre-3.x GCC compilers.
2021afad795Smrg## but also to in-use compilers like IMB xlc/xlC and the HP C compiler.
2031afad795Smrg## (see the conditional assignment to $gccflag above).
204492e1cfeSmrg## There are various ways to get dependency output from gcc.  Here's
205492e1cfeSmrg## why we pick this rather obscure method:
206492e1cfeSmrg## - Don't want to use -MD because we'd like the dependencies to end
207492e1cfeSmrg##   up in a subdir.  Having to rename by hand is ugly.
208492e1cfeSmrg##   (We might end up doing this anyway to support other compilers.)
209492e1cfeSmrg## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
2101afad795Smrg##   -MM, not -M (despite what the docs say).  Also, it might not be
2111afad795Smrg##   supported by the other compilers which use the 'gcc' depmode.
212492e1cfeSmrg## - Using -M directly means running the compiler twice (even worse
213492e1cfeSmrg##   than renaming).
214492e1cfeSmrg  if test -z "$gccflag"; then
215492e1cfeSmrg    gccflag=-MD,
216492e1cfeSmrg  fi
217492e1cfeSmrg  "$@" -Wp,"$gccflag$tmpdepfile"
218492e1cfeSmrg  stat=$?
2191afad795Smrg  if test $stat -ne 0; then
220492e1cfeSmrg    rm -f "$tmpdepfile"
221492e1cfeSmrg    exit $stat
222492e1cfeSmrg  fi
223492e1cfeSmrg  rm -f "$depfile"
224492e1cfeSmrg  echo "$object : \\" > "$depfile"
2251afad795Smrg  # The second -e expression handles DOS-style file names with drive
2261afad795Smrg  # letters.
227492e1cfeSmrg  sed -e 's/^[^:]*: / /' \
228492e1cfeSmrg      -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
2291afad795Smrg## This next piece of magic avoids the "deleted header file" problem.
230492e1cfeSmrg## The problem is that when a header file which appears in a .P file
231492e1cfeSmrg## is deleted, the dependency causes make to die (because there is
232492e1cfeSmrg## typically no way to rebuild the header).  We avoid this by adding
233492e1cfeSmrg## dummy dependencies for each header file.  Too bad gcc doesn't do
234492e1cfeSmrg## this for us directly.
2351afad795Smrg## Some versions of gcc put a space before the ':'.  On the theory
236492e1cfeSmrg## that the space means something, we add a space to the output as
2371afad795Smrg## well.  hp depmode also adds that space, but also prefixes the VPATH
2381afad795Smrg## to the object.  Take care to not repeat it in the output.
239492e1cfeSmrg## Some versions of the HPUX 10.20 sed can't process this invocation
240492e1cfeSmrg## correctly.  Breaking it into two sed invocations is a workaround.
2411afad795Smrg  tr ' ' "$nl" < "$tmpdepfile" \
2421afad795Smrg    | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \
2431afad795Smrg    | sed -e 's/$/ :/' >> "$depfile"
244492e1cfeSmrg  rm -f "$tmpdepfile"
245492e1cfeSmrg  ;;
246492e1cfeSmrg
247492e1cfeSmrghp)
248492e1cfeSmrg  # This case exists only to let depend.m4 do its work.  It works by
249492e1cfeSmrg  # looking at the text of this script.  This case will never be run,
250492e1cfeSmrg  # since it is checked for above.
251492e1cfeSmrg  exit 1
252492e1cfeSmrg  ;;
253492e1cfeSmrg
254492e1cfeSmrgsgi)
255492e1cfeSmrg  if test "$libtool" = yes; then
256492e1cfeSmrg    "$@" "-Wp,-MDupdate,$tmpdepfile"
257492e1cfeSmrg  else
258492e1cfeSmrg    "$@" -MDupdate "$tmpdepfile"
259492e1cfeSmrg  fi
260492e1cfeSmrg  stat=$?
2611afad795Smrg  if test $stat -ne 0; then
262492e1cfeSmrg    rm -f "$tmpdepfile"
263492e1cfeSmrg    exit $stat
264492e1cfeSmrg  fi
265492e1cfeSmrg  rm -f "$depfile"
266492e1cfeSmrg
267492e1cfeSmrg  if test -f "$tmpdepfile"; then  # yes, the sourcefile depend on other files
268492e1cfeSmrg    echo "$object : \\" > "$depfile"
269492e1cfeSmrg    # Clip off the initial element (the dependent).  Don't try to be
270492e1cfeSmrg    # clever and replace this with sed code, as IRIX sed won't handle
271492e1cfeSmrg    # lines with more than a fixed number of characters (4096 in
272492e1cfeSmrg    # IRIX 6.2 sed, 8192 in IRIX 6.5).  We also remove comment lines;
2731afad795Smrg    # the IRIX cc adds comments like '#:fec' to the end of the
274492e1cfeSmrg    # dependency line.
2751afad795Smrg    tr ' ' "$nl" < "$tmpdepfile" \
2761afad795Smrg      | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \
2771afad795Smrg      | tr "$nl" ' ' >> "$depfile"
2789e0146f7Smrg    echo >> "$depfile"
279492e1cfeSmrg    # The second pass generates a dummy entry for each header file.
2801afad795Smrg    tr ' ' "$nl" < "$tmpdepfile" \
2811afad795Smrg      | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
2821afad795Smrg      >> "$depfile"
283492e1cfeSmrg  else
2841afad795Smrg    make_dummy_depfile
285492e1cfeSmrg  fi
286492e1cfeSmrg  rm -f "$tmpdepfile"
287492e1cfeSmrg  ;;
288492e1cfeSmrg
2891afad795Smrgxlc)
2901afad795Smrg  # This case exists only to let depend.m4 do its work.  It works by
2911afad795Smrg  # looking at the text of this script.  This case will never be run,
2921afad795Smrg  # since it is checked for above.
2931afad795Smrg  exit 1
2941afad795Smrg  ;;
2951afad795Smrg
296492e1cfeSmrgaix)
297492e1cfeSmrg  # The C for AIX Compiler uses -M and outputs the dependencies
298492e1cfeSmrg  # in a .u file.  In older versions, this file always lives in the
2991afad795Smrg  # current directory.  Also, the AIX compiler puts '$object:' at the
300492e1cfeSmrg  # start of each line; $object doesn't have directory information.
301492e1cfeSmrg  # Version 6 uses the directory in both cases.
3021afad795Smrg  set_dir_from "$object"
3031afad795Smrg  set_base_from "$object"
304492e1cfeSmrg  if test "$libtool" = yes; then
3059e0146f7Smrg    tmpdepfile1=$dir$base.u
3069e0146f7Smrg    tmpdepfile2=$base.u
3079e0146f7Smrg    tmpdepfile3=$dir.libs/$base.u
308492e1cfeSmrg    "$@" -Wc,-M
309492e1cfeSmrg  else
3109e0146f7Smrg    tmpdepfile1=$dir$base.u
3119e0146f7Smrg    tmpdepfile2=$dir$base.u
3129e0146f7Smrg    tmpdepfile3=$dir$base.u
313492e1cfeSmrg    "$@" -M
314492e1cfeSmrg  fi
315492e1cfeSmrg  stat=$?
3161afad795Smrg  if test $stat -ne 0; then
3179e0146f7Smrg    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
318492e1cfeSmrg    exit $stat
319492e1cfeSmrg  fi
320492e1cfeSmrg
3219e0146f7Smrg  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
3229e0146f7Smrg  do
3239e0146f7Smrg    test -f "$tmpdepfile" && break
3249e0146f7Smrg  done
3251afad795Smrg  aix_post_process_depfile
3261afad795Smrg  ;;
3271afad795Smrg
3281afad795Smrgtcc)
3291afad795Smrg  # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26
3301afad795Smrg  # FIXME: That version still under development at the moment of writing.
3311afad795Smrg  #        Make that this statement remains true also for stable, released
3321afad795Smrg  #        versions.
3331afad795Smrg  # It will wrap lines (doesn't matter whether long or short) with a
3341afad795Smrg  # trailing '\', as in:
3351afad795Smrg  #
3361afad795Smrg  #   foo.o : \
3371afad795Smrg  #    foo.c \
3381afad795Smrg  #    foo.h \
3391afad795Smrg  #
3401afad795Smrg  # It will put a trailing '\' even on the last line, and will use leading
3411afad795Smrg  # spaces rather than leading tabs (at least since its commit 0394caf7
3421afad795Smrg  # "Emit spaces for -MD").
3431afad795Smrg  "$@" -MD -MF "$tmpdepfile"
3441afad795Smrg  stat=$?
3451afad795Smrg  if test $stat -ne 0; then
3461afad795Smrg    rm -f "$tmpdepfile"
3471afad795Smrg    exit $stat
348492e1cfeSmrg  fi
3491afad795Smrg  rm -f "$depfile"
3501afad795Smrg  # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'.
3511afad795Smrg  # We have to change lines of the first kind to '$object: \'.
3521afad795Smrg  sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile"
3531afad795Smrg  # And for each line of the second kind, we have to emit a 'dep.h:'
3541afad795Smrg  # dummy dependency, to avoid the deleted-header problem.
3551afad795Smrg  sed -n -e 's|^  *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile"
356492e1cfeSmrg  rm -f "$tmpdepfile"
357492e1cfeSmrg  ;;
358492e1cfeSmrg
3591afad795Smrg## The order of this option in the case statement is important, since the
3601afad795Smrg## shell code in configure will try each of these formats in the order
3611afad795Smrg## listed in this file.  A plain '-MD' option would be understood by many
3621afad795Smrg## compilers, so we must ensure this comes after the gcc and icc options.
3631afad795Smrgpgcc)
3641afad795Smrg  # Portland's C compiler understands '-MD'.
3651afad795Smrg  # Will always output deps to 'file.d' where file is the root name of the
3661afad795Smrg  # source file under compilation, even if file resides in a subdirectory.
3671afad795Smrg  # The object file name does not affect the name of the '.d' file.
3681afad795Smrg  # pgcc 10.2 will output
369492e1cfeSmrg  #    foo.o: sub/foo.c sub/foo.h
3701afad795Smrg  # and will wrap long lines using '\' :
371492e1cfeSmrg  #    foo.o: sub/foo.c ... \
372492e1cfeSmrg  #     sub/foo.h ... \
373492e1cfeSmrg  #     ...
3741afad795Smrg  set_dir_from "$object"
3751afad795Smrg  # Use the source, not the object, to determine the base name, since
3761afad795Smrg  # that's sadly what pgcc will do too.
3771afad795Smrg  set_base_from "$source"
3781afad795Smrg  tmpdepfile=$base.d
3791afad795Smrg
3801afad795Smrg  # For projects that build the same source file twice into different object
3811afad795Smrg  # files, the pgcc approach of using the *source* file root name can cause
3821afad795Smrg  # problems in parallel builds.  Use a locking strategy to avoid stomping on
3831afad795Smrg  # the same $tmpdepfile.
3841afad795Smrg  lockdir=$base.d-lock
3851afad795Smrg  trap "
3861afad795Smrg    echo '$0: caught signal, cleaning up...' >&2
3871afad795Smrg    rmdir '$lockdir'
3881afad795Smrg    exit 1
3891afad795Smrg  " 1 2 13 15
3901afad795Smrg  numtries=100
3911afad795Smrg  i=$numtries
3921afad795Smrg  while test $i -gt 0; do
3931afad795Smrg    # mkdir is a portable test-and-set.
3941afad795Smrg    if mkdir "$lockdir" 2>/dev/null; then
3951afad795Smrg      # This process acquired the lock.
3961afad795Smrg      "$@" -MD
3971afad795Smrg      stat=$?
3981afad795Smrg      # Release the lock.
3991afad795Smrg      rmdir "$lockdir"
4001afad795Smrg      break
4011afad795Smrg    else
4021afad795Smrg      # If the lock is being held by a different process, wait
4031afad795Smrg      # until the winning process is done or we timeout.
4041afad795Smrg      while test -d "$lockdir" && test $i -gt 0; do
4051afad795Smrg        sleep 1
4061afad795Smrg        i=`expr $i - 1`
4071afad795Smrg      done
4081afad795Smrg    fi
4091afad795Smrg    i=`expr $i - 1`
4101afad795Smrg  done
4111afad795Smrg  trap - 1 2 13 15
4121afad795Smrg  if test $i -le 0; then
4131afad795Smrg    echo "$0: failed to acquire lock after $numtries attempts" >&2
4141afad795Smrg    echo "$0: check lockdir '$lockdir'" >&2
4151afad795Smrg    exit 1
4161afad795Smrg  fi
417492e1cfeSmrg
4181afad795Smrg  if test $stat -ne 0; then
419492e1cfeSmrg    rm -f "$tmpdepfile"
420492e1cfeSmrg    exit $stat
421492e1cfeSmrg  fi
422492e1cfeSmrg  rm -f "$depfile"
423492e1cfeSmrg  # Each line is of the form `foo.o: dependent.h',
424492e1cfeSmrg  # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'.
425492e1cfeSmrg  # Do two passes, one to just change these to
426492e1cfeSmrg  # `$object: dependent.h' and one to simply `dependent.h:'.
427492e1cfeSmrg  sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
428492e1cfeSmrg  # Some versions of the HPUX 10.20 sed can't process this invocation
429492e1cfeSmrg  # correctly.  Breaking it into two sed invocations is a workaround.
4301afad795Smrg  sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \
4311afad795Smrg    | sed -e 's/$/ :/' >> "$depfile"
432492e1cfeSmrg  rm -f "$tmpdepfile"
433492e1cfeSmrg  ;;
434492e1cfeSmrg
4359e0146f7Smrghp2)
4369e0146f7Smrg  # The "hp" stanza above does not work with aCC (C++) and HP's ia64
4379e0146f7Smrg  # compilers, which have integrated preprocessors.  The correct option
4389e0146f7Smrg  # to use with these is +Maked; it writes dependencies to a file named
4399e0146f7Smrg  # 'foo.d', which lands next to the object file, wherever that
4409e0146f7Smrg  # happens to be.
4419e0146f7Smrg  # Much of this is similar to the tru64 case; see comments there.
4421afad795Smrg  set_dir_from  "$object"
4431afad795Smrg  set_base_from "$object"
4449e0146f7Smrg  if test "$libtool" = yes; then
4459e0146f7Smrg    tmpdepfile1=$dir$base.d
4469e0146f7Smrg    tmpdepfile2=$dir.libs/$base.d
4479e0146f7Smrg    "$@" -Wc,+Maked
4489e0146f7Smrg  else
4499e0146f7Smrg    tmpdepfile1=$dir$base.d
4509e0146f7Smrg    tmpdepfile2=$dir$base.d
4519e0146f7Smrg    "$@" +Maked
4529e0146f7Smrg  fi
4539e0146f7Smrg  stat=$?
4541afad795Smrg  if test $stat -ne 0; then
4559e0146f7Smrg     rm -f "$tmpdepfile1" "$tmpdepfile2"
4569e0146f7Smrg     exit $stat
4579e0146f7Smrg  fi
4589e0146f7Smrg
4599e0146f7Smrg  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2"
4609e0146f7Smrg  do
4619e0146f7Smrg    test -f "$tmpdepfile" && break
4629e0146f7Smrg  done
4639e0146f7Smrg  if test -f "$tmpdepfile"; then
4641afad795Smrg    sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile"
4651afad795Smrg    # Add 'dependent.h:' lines.
4669e0146f7Smrg    sed -ne '2,${
4671afad795Smrg               s/^ *//
4681afad795Smrg               s/ \\*$//
4691afad795Smrg               s/$/:/
4701afad795Smrg               p
4711afad795Smrg             }' "$tmpdepfile" >> "$depfile"
4729e0146f7Smrg  else
4731afad795Smrg    make_dummy_depfile
4749e0146f7Smrg  fi
4759e0146f7Smrg  rm -f "$tmpdepfile" "$tmpdepfile2"
4769e0146f7Smrg  ;;
4779e0146f7Smrg
478492e1cfeSmrgtru64)
4791afad795Smrg  # The Tru64 compiler uses -MD to generate dependencies as a side
4801afad795Smrg  # effect.  'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'.
4811afad795Smrg  # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
4821afad795Smrg  # dependencies in 'foo.d' instead, so we check for that too.
4831afad795Smrg  # Subdirectories are respected.
4841afad795Smrg  set_dir_from  "$object"
4851afad795Smrg  set_base_from "$object"
4861afad795Smrg
4871afad795Smrg  if test "$libtool" = yes; then
4881afad795Smrg    # Libtool generates 2 separate objects for the 2 libraries.  These
4891afad795Smrg    # two compilations output dependencies in $dir.libs/$base.o.d and
4901afad795Smrg    # in $dir$base.o.d.  We have to check for both files, because
4911afad795Smrg    # one of the two compilations can be disabled.  We should prefer
4921afad795Smrg    # $dir$base.o.d over $dir.libs/$base.o.d because the latter is
4931afad795Smrg    # automatically cleaned when .libs/ is deleted, while ignoring
4941afad795Smrg    # the former would cause a distcleancheck panic.
4951afad795Smrg    tmpdepfile1=$dir$base.o.d          # libtool 1.5
4961afad795Smrg    tmpdepfile2=$dir.libs/$base.o.d    # Likewise.
4971afad795Smrg    tmpdepfile3=$dir.libs/$base.d      # Compaq CCC V6.2-504
4981afad795Smrg    "$@" -Wc,-MD
4991afad795Smrg  else
5001afad795Smrg    tmpdepfile1=$dir$base.d
5011afad795Smrg    tmpdepfile2=$dir$base.d
5021afad795Smrg    tmpdepfile3=$dir$base.d
5031afad795Smrg    "$@" -MD
5041afad795Smrg  fi
5051afad795Smrg
5061afad795Smrg  stat=$?
5071afad795Smrg  if test $stat -ne 0; then
5081afad795Smrg    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
5091afad795Smrg    exit $stat
5101afad795Smrg  fi
5111afad795Smrg
5121afad795Smrg  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
5131afad795Smrg  do
5141afad795Smrg    test -f "$tmpdepfile" && break
5151afad795Smrg  done
5161afad795Smrg  # Same post-processing that is required for AIX mode.
5171afad795Smrg  aix_post_process_depfile
5181afad795Smrg  ;;
5191afad795Smrg
5201afad795Smrgmsvc7)
5211afad795Smrg  if test "$libtool" = yes; then
5221afad795Smrg    showIncludes=-Wc,-showIncludes
5231afad795Smrg  else
5241afad795Smrg    showIncludes=-showIncludes
5251afad795Smrg  fi
5261afad795Smrg  "$@" $showIncludes > "$tmpdepfile"
5271afad795Smrg  stat=$?
5281afad795Smrg  grep -v '^Note: including file: ' "$tmpdepfile"
5291afad795Smrg  if test $stat -ne 0; then
5301afad795Smrg    rm -f "$tmpdepfile"
5311afad795Smrg    exit $stat
5321afad795Smrg  fi
5331afad795Smrg  rm -f "$depfile"
5341afad795Smrg  echo "$object : \\" > "$depfile"
5351afad795Smrg  # The first sed program below extracts the file names and escapes
5361afad795Smrg  # backslashes for cygpath.  The second sed program outputs the file
5371afad795Smrg  # name when reading, but also accumulates all include files in the
5381afad795Smrg  # hold buffer in order to output them again at the end.  This only
5391afad795Smrg  # works with sed implementations that can handle large buffers.
5401afad795Smrg  sed < "$tmpdepfile" -n '
5411afad795Smrg/^Note: including file:  *\(.*\)/ {
5421afad795Smrg  s//\1/
5431afad795Smrg  s/\\/\\\\/g
5441afad795Smrg  p
5451afad795Smrg}' | $cygpath_u | sort -u | sed -n '
5461afad795Smrgs/ /\\ /g
5471afad795Smrgs/\(.*\)/'"$tab"'\1 \\/p
5481afad795Smrgs/.\(.*\) \\/\1:/
5491afad795SmrgH
5501afad795Smrg$ {
5511afad795Smrg  s/.*/'"$tab"'/
5521afad795Smrg  G
5531afad795Smrg  p
5541afad795Smrg}' >> "$depfile"
5551afad795Smrg  echo >> "$depfile" # make sure the fragment doesn't end with a backslash
5561afad795Smrg  rm -f "$tmpdepfile"
5571afad795Smrg  ;;
5581afad795Smrg
5591afad795Smrgmsvc7msys)
5601afad795Smrg  # This case exists only to let depend.m4 do its work.  It works by
5611afad795Smrg  # looking at the text of this script.  This case will never be run,
5621afad795Smrg  # since it is checked for above.
5631afad795Smrg  exit 1
5641afad795Smrg  ;;
565492e1cfeSmrg
566492e1cfeSmrg#nosideeffect)
567492e1cfeSmrg  # This comment above is used by automake to tell side-effect
568492e1cfeSmrg  # dependency tracking mechanisms from slower ones.
569492e1cfeSmrg
570492e1cfeSmrgdashmstdout)
571492e1cfeSmrg  # Important note: in order to support this mode, a compiler *must*
572492e1cfeSmrg  # always write the preprocessed file to stdout, regardless of -o.
573492e1cfeSmrg  "$@" || exit $?
574492e1cfeSmrg
575492e1cfeSmrg  # Remove the call to Libtool.
576492e1cfeSmrg  if test "$libtool" = yes; then
5779e0146f7Smrg    while test "X$1" != 'X--mode=compile'; do
578492e1cfeSmrg      shift
579492e1cfeSmrg    done
580492e1cfeSmrg    shift
581492e1cfeSmrg  fi
582492e1cfeSmrg
5831afad795Smrg  # Remove '-o $object'.
584492e1cfeSmrg  IFS=" "
585492e1cfeSmrg  for arg
586492e1cfeSmrg  do
587492e1cfeSmrg    case $arg in
588492e1cfeSmrg    -o)
589492e1cfeSmrg      shift
590492e1cfeSmrg      ;;
591492e1cfeSmrg    $object)
592492e1cfeSmrg      shift
593492e1cfeSmrg      ;;
594492e1cfeSmrg    *)
595492e1cfeSmrg      set fnord "$@" "$arg"
596492e1cfeSmrg      shift # fnord
597492e1cfeSmrg      shift # $arg
598492e1cfeSmrg      ;;
599492e1cfeSmrg    esac
600492e1cfeSmrg  done
601492e1cfeSmrg
602492e1cfeSmrg  test -z "$dashmflag" && dashmflag=-M
6031afad795Smrg  # Require at least two characters before searching for ':'
604492e1cfeSmrg  # in the target name.  This is to cope with DOS-style filenames:
6051afad795Smrg  # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise.
606492e1cfeSmrg  "$@" $dashmflag |
6071afad795Smrg    sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile"
608492e1cfeSmrg  rm -f "$depfile"
609492e1cfeSmrg  cat < "$tmpdepfile" > "$depfile"
6101afad795Smrg  # Some versions of the HPUX 10.20 sed can't process this sed invocation
6111afad795Smrg  # correctly.  Breaking it into two sed invocations is a workaround.
6121afad795Smrg  tr ' ' "$nl" < "$tmpdepfile" \
6131afad795Smrg    | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
6141afad795Smrg    | sed -e 's/$/ :/' >> "$depfile"
615492e1cfeSmrg  rm -f "$tmpdepfile"
616492e1cfeSmrg  ;;
617492e1cfeSmrg
618492e1cfeSmrgdashXmstdout)
619492e1cfeSmrg  # This case only exists to satisfy depend.m4.  It is never actually
620492e1cfeSmrg  # run, as this mode is specially recognized in the preamble.
621492e1cfeSmrg  exit 1
622492e1cfeSmrg  ;;
623492e1cfeSmrg
624492e1cfeSmrgmakedepend)
625492e1cfeSmrg  "$@" || exit $?
626492e1cfeSmrg  # Remove any Libtool call
627492e1cfeSmrg  if test "$libtool" = yes; then
6289e0146f7Smrg    while test "X$1" != 'X--mode=compile'; do
629492e1cfeSmrg      shift
630492e1cfeSmrg    done
631492e1cfeSmrg    shift
632492e1cfeSmrg  fi
633492e1cfeSmrg  # X makedepend
634492e1cfeSmrg  shift
6359e0146f7Smrg  cleared=no eat=no
6369e0146f7Smrg  for arg
6379e0146f7Smrg  do
638492e1cfeSmrg    case $cleared in
639492e1cfeSmrg    no)
640492e1cfeSmrg      set ""; shift
641492e1cfeSmrg      cleared=yes ;;
642492e1cfeSmrg    esac
6439e0146f7Smrg    if test $eat = yes; then
6449e0146f7Smrg      eat=no
6459e0146f7Smrg      continue
6469e0146f7Smrg    fi
647492e1cfeSmrg    case "$arg" in
648492e1cfeSmrg    -D*|-I*)
649492e1cfeSmrg      set fnord "$@" "$arg"; shift ;;
650492e1cfeSmrg    # Strip any option that makedepend may not understand.  Remove
651492e1cfeSmrg    # the object too, otherwise makedepend will parse it as a source file.
6529e0146f7Smrg    -arch)
6539e0146f7Smrg      eat=yes ;;
654492e1cfeSmrg    -*|$object)
655492e1cfeSmrg      ;;
656492e1cfeSmrg    *)
657492e1cfeSmrg      set fnord "$@" "$arg"; shift ;;
658492e1cfeSmrg    esac
659492e1cfeSmrg  done
6609e0146f7Smrg  obj_suffix=`echo "$object" | sed 's/^.*\././'`
661492e1cfeSmrg  touch "$tmpdepfile"
662492e1cfeSmrg  ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
663492e1cfeSmrg  rm -f "$depfile"
6641afad795Smrg  # makedepend may prepend the VPATH from the source file name to the object.
6651afad795Smrg  # No need to regex-escape $object, excess matching of '.' is harmless.
6661afad795Smrg  sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile"
6671afad795Smrg  # Some versions of the HPUX 10.20 sed can't process the last invocation
6681afad795Smrg  # correctly.  Breaking it into two sed invocations is a workaround.
6691afad795Smrg  sed '1,2d' "$tmpdepfile" \
6701afad795Smrg    | tr ' ' "$nl" \
6711afad795Smrg    | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
6721afad795Smrg    | sed -e 's/$/ :/' >> "$depfile"
673492e1cfeSmrg  rm -f "$tmpdepfile" "$tmpdepfile".bak
674492e1cfeSmrg  ;;
675492e1cfeSmrg
676492e1cfeSmrgcpp)
677492e1cfeSmrg  # Important note: in order to support this mode, a compiler *must*
678492e1cfeSmrg  # always write the preprocessed file to stdout.
679492e1cfeSmrg  "$@" || exit $?
680492e1cfeSmrg
681492e1cfeSmrg  # Remove the call to Libtool.
682492e1cfeSmrg  if test "$libtool" = yes; then
6839e0146f7Smrg    while test "X$1" != 'X--mode=compile'; do
684492e1cfeSmrg      shift
685492e1cfeSmrg    done
686492e1cfeSmrg    shift
687492e1cfeSmrg  fi
688492e1cfeSmrg
6891afad795Smrg  # Remove '-o $object'.
690492e1cfeSmrg  IFS=" "
691492e1cfeSmrg  for arg
692492e1cfeSmrg  do
693492e1cfeSmrg    case $arg in
694492e1cfeSmrg    -o)
695492e1cfeSmrg      shift
696492e1cfeSmrg      ;;
697492e1cfeSmrg    $object)
698492e1cfeSmrg      shift
699492e1cfeSmrg      ;;
700492e1cfeSmrg    *)
701492e1cfeSmrg      set fnord "$@" "$arg"
702492e1cfeSmrg      shift # fnord
703492e1cfeSmrg      shift # $arg
704492e1cfeSmrg      ;;
705492e1cfeSmrg    esac
706492e1cfeSmrg  done
707492e1cfeSmrg
7081afad795Smrg  "$@" -E \
7091afad795Smrg    | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
7101afad795Smrg             -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
7111afad795Smrg    | sed '$ s: \\$::' > "$tmpdepfile"
712492e1cfeSmrg  rm -f "$depfile"
713492e1cfeSmrg  echo "$object : \\" > "$depfile"
714492e1cfeSmrg  cat < "$tmpdepfile" >> "$depfile"
715492e1cfeSmrg  sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
716492e1cfeSmrg  rm -f "$tmpdepfile"
717492e1cfeSmrg  ;;
718492e1cfeSmrg
719492e1cfeSmrgmsvisualcpp)
720492e1cfeSmrg  # Important note: in order to support this mode, a compiler *must*
7219e0146f7Smrg  # always write the preprocessed file to stdout.
722492e1cfeSmrg  "$@" || exit $?
7239e0146f7Smrg
7249e0146f7Smrg  # Remove the call to Libtool.
7259e0146f7Smrg  if test "$libtool" = yes; then
7269e0146f7Smrg    while test "X$1" != 'X--mode=compile'; do
7279e0146f7Smrg      shift
7289e0146f7Smrg    done
7299e0146f7Smrg    shift
7309e0146f7Smrg  fi
7319e0146f7Smrg
732492e1cfeSmrg  IFS=" "
733492e1cfeSmrg  for arg
734492e1cfeSmrg  do
735492e1cfeSmrg    case "$arg" in
7369e0146f7Smrg    -o)
7379e0146f7Smrg      shift
7389e0146f7Smrg      ;;
7399e0146f7Smrg    $object)
7409e0146f7Smrg      shift
7419e0146f7Smrg      ;;
742492e1cfeSmrg    "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
7431afad795Smrg        set fnord "$@"
7441afad795Smrg        shift
7451afad795Smrg        shift
7461afad795Smrg        ;;
747492e1cfeSmrg    *)
7481afad795Smrg        set fnord "$@" "$arg"
7491afad795Smrg        shift
7501afad795Smrg        shift
7511afad795Smrg        ;;
752492e1cfeSmrg    esac
753492e1cfeSmrg  done
7549e0146f7Smrg  "$@" -E 2>/dev/null |
7559e0146f7Smrg  sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile"
756492e1cfeSmrg  rm -f "$depfile"
757492e1cfeSmrg  echo "$object : \\" > "$depfile"
7581afad795Smrg  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile"
7591afad795Smrg  echo "$tab" >> "$depfile"
7609e0146f7Smrg  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile"
761492e1cfeSmrg  rm -f "$tmpdepfile"
762492e1cfeSmrg  ;;
763492e1cfeSmrg
7649e0146f7Smrgmsvcmsys)
7659e0146f7Smrg  # This case exists only to let depend.m4 do its work.  It works by
7669e0146f7Smrg  # looking at the text of this script.  This case will never be run,
7679e0146f7Smrg  # since it is checked for above.
7689e0146f7Smrg  exit 1
7699e0146f7Smrg  ;;
7709e0146f7Smrg
771492e1cfeSmrgnone)
772492e1cfeSmrg  exec "$@"
773492e1cfeSmrg  ;;
774492e1cfeSmrg
775492e1cfeSmrg*)
776492e1cfeSmrg  echo "Unknown depmode $depmode" 1>&2
777492e1cfeSmrg  exit 1
778492e1cfeSmrg  ;;
779492e1cfeSmrgesac
780492e1cfeSmrg
781492e1cfeSmrgexit 0
7829e0146f7Smrg
7839e0146f7Smrg# Local Variables:
7849e0146f7Smrg# mode: shell-script
7859e0146f7Smrg# sh-indentation: 2
78631e5d586Smrg# eval: (add-hook 'before-save-hook 'time-stamp)
7879e0146f7Smrg# time-stamp-start: "scriptversion="
7889e0146f7Smrg# time-stamp-format: "%:y-%02m-%02d.%02H"
78931e5d586Smrg# time-stamp-time-zone: "UTC0"
7909e0146f7Smrg# time-stamp-end: "; # UTC"
7919e0146f7Smrg# End:
792