1de2362d3Smrg#! /bin/sh
2de2362d3Smrg# depcomp - compile a program generating dependencies as side-effects
3de2362d3Smrg
439413783Smrgscriptversion=2018-03-07.03; # UTC
5de2362d3Smrg
60a1d3ae0Smrg# Copyright (C) 1999-2021 Free Software Foundation, Inc.
7de2362d3Smrg
8de2362d3Smrg# This program is free software; you can redistribute it and/or modify
9de2362d3Smrg# it under the terms of the GNU General Public License as published by
10de2362d3Smrg# the Free Software Foundation; either version 2, or (at your option)
11de2362d3Smrg# any later version.
12de2362d3Smrg
13de2362d3Smrg# This program is distributed in the hope that it will be useful,
14de2362d3Smrg# but WITHOUT ANY WARRANTY; without even the implied warranty of
15de2362d3Smrg# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16de2362d3Smrg# GNU General Public License for more details.
17de2362d3Smrg
18de2362d3Smrg# You should have received a copy of the GNU General Public License
1939413783Smrg# along with this program.  If not, see <https://www.gnu.org/licenses/>.
20de2362d3Smrg
21de2362d3Smrg# As a special exception to the GNU General Public License, if you
22de2362d3Smrg# distribute this file as part of a program that contains a
23de2362d3Smrg# configuration script generated by Autoconf, you may include it under
24de2362d3Smrg# the same distribution terms that you use for the rest of that program.
25de2362d3Smrg
26de2362d3Smrg# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>.
27de2362d3Smrg
28de2362d3Smrgcase $1 in
29de2362d3Smrg  '')
3018781e08Smrg    echo "$0: No command.  Try '$0 --help' for more information." 1>&2
3118781e08Smrg    exit 1;
3218781e08Smrg    ;;
33de2362d3Smrg  -h | --h*)
34de2362d3Smrg    cat <<\EOF
35de2362d3SmrgUsage: depcomp [--help] [--version] PROGRAM [ARGS]
36de2362d3Smrg
37de2362d3SmrgRun PROGRAMS ARGS to compile a file, generating dependencies
38de2362d3Smrgas side-effects.
39de2362d3Smrg
40de2362d3SmrgEnvironment variables:
41de2362d3Smrg  depmode     Dependency tracking mode.
4218781e08Smrg  source      Source file read by 'PROGRAMS ARGS'.
4318781e08Smrg  object      Object file output by 'PROGRAMS ARGS'.
44de2362d3Smrg  DEPDIR      directory where to store dependencies.
45de2362d3Smrg  depfile     Dependency file to output.
4618781e08Smrg  tmpdepfile  Temporary file to use when outputting dependencies.
47de2362d3Smrg  libtool     Whether libtool is used (yes/no).
48de2362d3Smrg
49de2362d3SmrgReport bugs to <bug-automake@gnu.org>.
50de2362d3SmrgEOF
51de2362d3Smrg    exit $?
52de2362d3Smrg    ;;
53de2362d3Smrg  -v | --v*)
54de2362d3Smrg    echo "depcomp $scriptversion"
55de2362d3Smrg    exit $?
56de2362d3Smrg    ;;
57de2362d3Smrgesac
58de2362d3Smrg
5918781e08Smrg# Get the directory component of the given path, and save it in the
6018781e08Smrg# global variables '$dir'.  Note that this directory component will
6118781e08Smrg# be either empty or ending with a '/' character.  This is deliberate.
6218781e08Smrgset_dir_from ()
6318781e08Smrg{
6418781e08Smrg  case $1 in
6518781e08Smrg    */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;;
6618781e08Smrg      *) dir=;;
6718781e08Smrg  esac
6818781e08Smrg}
6918781e08Smrg
7018781e08Smrg# Get the suffix-stripped basename of the given path, and save it the
7118781e08Smrg# global variable '$base'.
7218781e08Smrgset_base_from ()
7318781e08Smrg{
7418781e08Smrg  base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'`
7518781e08Smrg}
7618781e08Smrg
7718781e08Smrg# If no dependency file was actually created by the compiler invocation,
7818781e08Smrg# we still have to create a dummy depfile, to avoid errors with the
7918781e08Smrg# Makefile "include basename.Plo" scheme.
8018781e08Smrgmake_dummy_depfile ()
8118781e08Smrg{
8218781e08Smrg  echo "#dummy" > "$depfile"
8318781e08Smrg}
8418781e08Smrg
8518781e08Smrg# Factor out some common post-processing of the generated depfile.
8618781e08Smrg# Requires the auxiliary global variable '$tmpdepfile' to be set.
8718781e08Smrgaix_post_process_depfile ()
8818781e08Smrg{
8918781e08Smrg  # If the compiler actually managed to produce a dependency file,
9018781e08Smrg  # post-process it.
9118781e08Smrg  if test -f "$tmpdepfile"; then
9218781e08Smrg    # Each line is of the form 'foo.o: dependency.h'.
9318781e08Smrg    # Do two passes, one to just change these to
9418781e08Smrg    #   $object: dependency.h
9518781e08Smrg    # and one to simply output
9618781e08Smrg    #   dependency.h:
9718781e08Smrg    # which is needed to avoid the deleted-header problem.
9818781e08Smrg    { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile"
9918781e08Smrg      sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile"
10018781e08Smrg    } > "$depfile"
10118781e08Smrg    rm -f "$tmpdepfile"
10218781e08Smrg  else
10318781e08Smrg    make_dummy_depfile
10418781e08Smrg  fi
10518781e08Smrg}
10618781e08Smrg
10718781e08Smrg# A tabulation character.
10818781e08Smrgtab='	'
10918781e08Smrg# A newline character.
11018781e08Smrgnl='
11118781e08Smrg'
11218781e08Smrg# Character ranges might be problematic outside the C locale.
11318781e08Smrg# These definitions help.
11418781e08Smrgupper=ABCDEFGHIJKLMNOPQRSTUVWXYZ
11518781e08Smrglower=abcdefghijklmnopqrstuvwxyz
11618781e08Smrgdigits=0123456789
11718781e08Smrgalpha=${upper}${lower}
11818781e08Smrg
119de2362d3Smrgif test -z "$depmode" || test -z "$source" || test -z "$object"; then
120de2362d3Smrg  echo "depcomp: Variables source, object and depmode must be set" 1>&2
121de2362d3Smrg  exit 1
122de2362d3Smrgfi
123de2362d3Smrg
124de2362d3Smrg# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.
125de2362d3Smrgdepfile=${depfile-`echo "$object" |
126de2362d3Smrg  sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`}
127de2362d3Smrgtmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
128de2362d3Smrg
129de2362d3Smrgrm -f "$tmpdepfile"
130de2362d3Smrg
13118781e08Smrg# Avoid interferences from the environment.
13218781e08Smrggccflag= dashmflag=
13318781e08Smrg
134de2362d3Smrg# Some modes work just like other modes, but use different flags.  We
135de2362d3Smrg# parameterize here, but still list the modes in the big case below,
136de2362d3Smrg# to make depend.m4 easier to write.  Note that we *cannot* use a case
137de2362d3Smrg# here, because this file can only contain one case statement.
138de2362d3Smrgif test "$depmode" = hp; then
139de2362d3Smrg  # HP compiler uses -M and no extra arg.
140de2362d3Smrg  gccflag=-M
141de2362d3Smrg  depmode=gcc
142de2362d3Smrgfi
143de2362d3Smrg
144de2362d3Smrgif test "$depmode" = dashXmstdout; then
14518781e08Smrg  # This is just like dashmstdout with a different argument.
14618781e08Smrg  dashmflag=-xM
14718781e08Smrg  depmode=dashmstdout
1480d16fef4Smrgfi
1490d16fef4Smrg
1500d16fef4Smrgcygpath_u="cygpath -u -f -"
1510d16fef4Smrgif test "$depmode" = msvcmsys; then
15218781e08Smrg  # This is just like msvisualcpp but w/o cygpath translation.
15318781e08Smrg  # Just convert the backslash-escaped backslashes to single forward
15418781e08Smrg  # slashes to satisfy depend.m4
15518781e08Smrg  cygpath_u='sed s,\\\\,/,g'
15618781e08Smrg  depmode=msvisualcpp
15718781e08Smrgfi
15818781e08Smrg
15918781e08Smrgif test "$depmode" = msvc7msys; then
16018781e08Smrg  # This is just like msvc7 but w/o cygpath translation.
16118781e08Smrg  # Just convert the backslash-escaped backslashes to single forward
16218781e08Smrg  # slashes to satisfy depend.m4
16318781e08Smrg  cygpath_u='sed s,\\\\,/,g'
16418781e08Smrg  depmode=msvc7
16518781e08Smrgfi
16618781e08Smrg
16718781e08Smrgif test "$depmode" = xlc; then
16818781e08Smrg  # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information.
16918781e08Smrg  gccflag=-qmakedep=gcc,-MF
17018781e08Smrg  depmode=gcc
171de2362d3Smrgfi
172de2362d3Smrg
173de2362d3Smrgcase "$depmode" in
174de2362d3Smrggcc3)
175de2362d3Smrg## gcc 3 implements dependency tracking that does exactly what
176de2362d3Smrg## we want.  Yay!  Note: for some reason libtool 1.4 doesn't like
177de2362d3Smrg## it if -MD -MP comes after the -MF stuff.  Hmm.
178de2362d3Smrg## Unfortunately, FreeBSD c89 acceptance of flags depends upon
179de2362d3Smrg## the command line argument order; so add the flags where they
180de2362d3Smrg## appear in depend2.am.  Note that the slowdown incurred here
181de2362d3Smrg## affects only configure: in makefiles, %FASTDEP% shortcuts this.
182de2362d3Smrg  for arg
183de2362d3Smrg  do
184de2362d3Smrg    case $arg in
185de2362d3Smrg    -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;;
186de2362d3Smrg    *)  set fnord "$@" "$arg" ;;
187de2362d3Smrg    esac
188de2362d3Smrg    shift # fnord
189de2362d3Smrg    shift # $arg
190de2362d3Smrg  done
191de2362d3Smrg  "$@"
192de2362d3Smrg  stat=$?
19318781e08Smrg  if test $stat -ne 0; then
194de2362d3Smrg    rm -f "$tmpdepfile"
195de2362d3Smrg    exit $stat
196de2362d3Smrg  fi
197de2362d3Smrg  mv "$tmpdepfile" "$depfile"
198de2362d3Smrg  ;;
199de2362d3Smrg
200de2362d3Smrggcc)
20118781e08Smrg## Note that this doesn't just cater to obsosete pre-3.x GCC compilers.
20218781e08Smrg## but also to in-use compilers like IMB xlc/xlC and the HP C compiler.
20318781e08Smrg## (see the conditional assignment to $gccflag above).
204de2362d3Smrg## There are various ways to get dependency output from gcc.  Here's
205de2362d3Smrg## why we pick this rather obscure method:
206de2362d3Smrg## - Don't want to use -MD because we'd like the dependencies to end
207de2362d3Smrg##   up in a subdir.  Having to rename by hand is ugly.
208de2362d3Smrg##   (We might end up doing this anyway to support other compilers.)
209de2362d3Smrg## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
21018781e08Smrg##   -MM, not -M (despite what the docs say).  Also, it might not be
21118781e08Smrg##   supported by the other compilers which use the 'gcc' depmode.
212de2362d3Smrg## - Using -M directly means running the compiler twice (even worse
213de2362d3Smrg##   than renaming).
214de2362d3Smrg  if test -z "$gccflag"; then
215de2362d3Smrg    gccflag=-MD,
216de2362d3Smrg  fi
217de2362d3Smrg  "$@" -Wp,"$gccflag$tmpdepfile"
218de2362d3Smrg  stat=$?
21918781e08Smrg  if test $stat -ne 0; then
220de2362d3Smrg    rm -f "$tmpdepfile"
221de2362d3Smrg    exit $stat
222de2362d3Smrg  fi
223de2362d3Smrg  rm -f "$depfile"
224de2362d3Smrg  echo "$object : \\" > "$depfile"
22518781e08Smrg  # The second -e expression handles DOS-style file names with drive
22618781e08Smrg  # letters.
227de2362d3Smrg  sed -e 's/^[^:]*: / /' \
228de2362d3Smrg      -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
22918781e08Smrg## This next piece of magic avoids the "deleted header file" problem.
230de2362d3Smrg## The problem is that when a header file which appears in a .P file
231de2362d3Smrg## is deleted, the dependency causes make to die (because there is
232de2362d3Smrg## typically no way to rebuild the header).  We avoid this by adding
233de2362d3Smrg## dummy dependencies for each header file.  Too bad gcc doesn't do
234de2362d3Smrg## this for us directly.
23518781e08Smrg## Some versions of gcc put a space before the ':'.  On the theory
236de2362d3Smrg## that the space means something, we add a space to the output as
23718781e08Smrg## well.  hp depmode also adds that space, but also prefixes the VPATH
23818781e08Smrg## to the object.  Take care to not repeat it in the output.
239de2362d3Smrg## Some versions of the HPUX 10.20 sed can't process this invocation
240de2362d3Smrg## correctly.  Breaking it into two sed invocations is a workaround.
24118781e08Smrg  tr ' ' "$nl" < "$tmpdepfile" \
24218781e08Smrg    | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \
24318781e08Smrg    | sed -e 's/$/ :/' >> "$depfile"
244de2362d3Smrg  rm -f "$tmpdepfile"
245de2362d3Smrg  ;;
246de2362d3Smrg
247de2362d3Smrghp)
248de2362d3Smrg  # This case exists only to let depend.m4 do its work.  It works by
249de2362d3Smrg  # looking at the text of this script.  This case will never be run,
250de2362d3Smrg  # since it is checked for above.
251de2362d3Smrg  exit 1
252de2362d3Smrg  ;;
253de2362d3Smrg
254de2362d3Smrgsgi)
255de2362d3Smrg  if test "$libtool" = yes; then
256de2362d3Smrg    "$@" "-Wp,-MDupdate,$tmpdepfile"
257de2362d3Smrg  else
258de2362d3Smrg    "$@" -MDupdate "$tmpdepfile"
259de2362d3Smrg  fi
260de2362d3Smrg  stat=$?
26118781e08Smrg  if test $stat -ne 0; then
262de2362d3Smrg    rm -f "$tmpdepfile"
263de2362d3Smrg    exit $stat
264de2362d3Smrg  fi
265de2362d3Smrg  rm -f "$depfile"
266de2362d3Smrg
267de2362d3Smrg  if test -f "$tmpdepfile"; then  # yes, the sourcefile depend on other files
268de2362d3Smrg    echo "$object : \\" > "$depfile"
269de2362d3Smrg    # Clip off the initial element (the dependent).  Don't try to be
270de2362d3Smrg    # clever and replace this with sed code, as IRIX sed won't handle
271de2362d3Smrg    # lines with more than a fixed number of characters (4096 in
272de2362d3Smrg    # IRIX 6.2 sed, 8192 in IRIX 6.5).  We also remove comment lines;
27318781e08Smrg    # the IRIX cc adds comments like '#:fec' to the end of the
274de2362d3Smrg    # dependency line.
27518781e08Smrg    tr ' ' "$nl" < "$tmpdepfile" \
27618781e08Smrg      | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \
27718781e08Smrg      | tr "$nl" ' ' >> "$depfile"
2780d16fef4Smrg    echo >> "$depfile"
279de2362d3Smrg    # The second pass generates a dummy entry for each header file.
28018781e08Smrg    tr ' ' "$nl" < "$tmpdepfile" \
28118781e08Smrg      | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
28218781e08Smrg      >> "$depfile"
283de2362d3Smrg  else
28418781e08Smrg    make_dummy_depfile
285de2362d3Smrg  fi
286de2362d3Smrg  rm -f "$tmpdepfile"
287de2362d3Smrg  ;;
288de2362d3Smrg
28918781e08Smrgxlc)
29018781e08Smrg  # This case exists only to let depend.m4 do its work.  It works by
29118781e08Smrg  # looking at the text of this script.  This case will never be run,
29218781e08Smrg  # since it is checked for above.
29318781e08Smrg  exit 1
29418781e08Smrg  ;;
29518781e08Smrg
296de2362d3Smrgaix)
297de2362d3Smrg  # The C for AIX Compiler uses -M and outputs the dependencies
298de2362d3Smrg  # in a .u file.  In older versions, this file always lives in the
29918781e08Smrg  # current directory.  Also, the AIX compiler puts '$object:' at the
300de2362d3Smrg  # start of each line; $object doesn't have directory information.
301de2362d3Smrg  # Version 6 uses the directory in both cases.
30218781e08Smrg  set_dir_from "$object"
30318781e08Smrg  set_base_from "$object"
304de2362d3Smrg  if test "$libtool" = yes; then
305de2362d3Smrg    tmpdepfile1=$dir$base.u
306de2362d3Smrg    tmpdepfile2=$base.u
307de2362d3Smrg    tmpdepfile3=$dir.libs/$base.u
308de2362d3Smrg    "$@" -Wc,-M
309de2362d3Smrg  else
310de2362d3Smrg    tmpdepfile1=$dir$base.u
311de2362d3Smrg    tmpdepfile2=$dir$base.u
312de2362d3Smrg    tmpdepfile3=$dir$base.u
313de2362d3Smrg    "$@" -M
314de2362d3Smrg  fi
315de2362d3Smrg  stat=$?
31618781e08Smrg  if test $stat -ne 0; then
317de2362d3Smrg    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
318de2362d3Smrg    exit $stat
319de2362d3Smrg  fi
320de2362d3Smrg
321de2362d3Smrg  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
322de2362d3Smrg  do
323de2362d3Smrg    test -f "$tmpdepfile" && break
324de2362d3Smrg  done
32518781e08Smrg  aix_post_process_depfile
32618781e08Smrg  ;;
32718781e08Smrg
32818781e08Smrgtcc)
32918781e08Smrg  # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26
33018781e08Smrg  # FIXME: That version still under development at the moment of writing.
33118781e08Smrg  #        Make that this statement remains true also for stable, released
33218781e08Smrg  #        versions.
33318781e08Smrg  # It will wrap lines (doesn't matter whether long or short) with a
33418781e08Smrg  # trailing '\', as in:
33518781e08Smrg  #
33618781e08Smrg  #   foo.o : \
33718781e08Smrg  #    foo.c \
33818781e08Smrg  #    foo.h \
33918781e08Smrg  #
34018781e08Smrg  # It will put a trailing '\' even on the last line, and will use leading
34118781e08Smrg  # spaces rather than leading tabs (at least since its commit 0394caf7
34218781e08Smrg  # "Emit spaces for -MD").
34318781e08Smrg  "$@" -MD -MF "$tmpdepfile"
34418781e08Smrg  stat=$?
34518781e08Smrg  if test $stat -ne 0; then
34618781e08Smrg    rm -f "$tmpdepfile"
34718781e08Smrg    exit $stat
348de2362d3Smrg  fi
34918781e08Smrg  rm -f "$depfile"
35018781e08Smrg  # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'.
35118781e08Smrg  # We have to change lines of the first kind to '$object: \'.
35218781e08Smrg  sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile"
35318781e08Smrg  # And for each line of the second kind, we have to emit a 'dep.h:'
35418781e08Smrg  # dummy dependency, to avoid the deleted-header problem.
35518781e08Smrg  sed -n -e 's|^  *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile"
356de2362d3Smrg  rm -f "$tmpdepfile"
357de2362d3Smrg  ;;
358de2362d3Smrg
35918781e08Smrg## The order of this option in the case statement is important, since the
36018781e08Smrg## shell code in configure will try each of these formats in the order
36118781e08Smrg## listed in this file.  A plain '-MD' option would be understood by many
36218781e08Smrg## compilers, so we must ensure this comes after the gcc and icc options.
36318781e08Smrgpgcc)
36418781e08Smrg  # Portland's C compiler understands '-MD'.
36518781e08Smrg  # Will always output deps to 'file.d' where file is the root name of the
36618781e08Smrg  # source file under compilation, even if file resides in a subdirectory.
36718781e08Smrg  # The object file name does not affect the name of the '.d' file.
36818781e08Smrg  # pgcc 10.2 will output
369de2362d3Smrg  #    foo.o: sub/foo.c sub/foo.h
37018781e08Smrg  # and will wrap long lines using '\' :
371de2362d3Smrg  #    foo.o: sub/foo.c ... \
372de2362d3Smrg  #     sub/foo.h ... \
373de2362d3Smrg  #     ...
37418781e08Smrg  set_dir_from "$object"
37518781e08Smrg  # Use the source, not the object, to determine the base name, since
37618781e08Smrg  # that's sadly what pgcc will do too.
37718781e08Smrg  set_base_from "$source"
37818781e08Smrg  tmpdepfile=$base.d
37918781e08Smrg
38018781e08Smrg  # For projects that build the same source file twice into different object
38118781e08Smrg  # files, the pgcc approach of using the *source* file root name can cause
38218781e08Smrg  # problems in parallel builds.  Use a locking strategy to avoid stomping on
38318781e08Smrg  # the same $tmpdepfile.
38418781e08Smrg  lockdir=$base.d-lock
38518781e08Smrg  trap "
38618781e08Smrg    echo '$0: caught signal, cleaning up...' >&2
38718781e08Smrg    rmdir '$lockdir'
38818781e08Smrg    exit 1
38918781e08Smrg  " 1 2 13 15
39018781e08Smrg  numtries=100
39118781e08Smrg  i=$numtries
39218781e08Smrg  while test $i -gt 0; do
39318781e08Smrg    # mkdir is a portable test-and-set.
39418781e08Smrg    if mkdir "$lockdir" 2>/dev/null; then
39518781e08Smrg      # This process acquired the lock.
39618781e08Smrg      "$@" -MD
39718781e08Smrg      stat=$?
39818781e08Smrg      # Release the lock.
39918781e08Smrg      rmdir "$lockdir"
40018781e08Smrg      break
40118781e08Smrg    else
40218781e08Smrg      # If the lock is being held by a different process, wait
40318781e08Smrg      # until the winning process is done or we timeout.
40418781e08Smrg      while test -d "$lockdir" && test $i -gt 0; do
40518781e08Smrg        sleep 1
40618781e08Smrg        i=`expr $i - 1`
40718781e08Smrg      done
40818781e08Smrg    fi
40918781e08Smrg    i=`expr $i - 1`
41018781e08Smrg  done
41118781e08Smrg  trap - 1 2 13 15
41218781e08Smrg  if test $i -le 0; then
41318781e08Smrg    echo "$0: failed to acquire lock after $numtries attempts" >&2
41418781e08Smrg    echo "$0: check lockdir '$lockdir'" >&2
41518781e08Smrg    exit 1
41618781e08Smrg  fi
417de2362d3Smrg
41818781e08Smrg  if test $stat -ne 0; then
419de2362d3Smrg    rm -f "$tmpdepfile"
420de2362d3Smrg    exit $stat
421de2362d3Smrg  fi
422de2362d3Smrg  rm -f "$depfile"
423de2362d3Smrg  # Each line is of the form `foo.o: dependent.h',
424de2362d3Smrg  # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'.
425de2362d3Smrg  # Do two passes, one to just change these to
426de2362d3Smrg  # `$object: dependent.h' and one to simply `dependent.h:'.
427de2362d3Smrg  sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
428de2362d3Smrg  # Some versions of the HPUX 10.20 sed can't process this invocation
429de2362d3Smrg  # correctly.  Breaking it into two sed invocations is a workaround.
43018781e08Smrg  sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \
43118781e08Smrg    | sed -e 's/$/ :/' >> "$depfile"
432de2362d3Smrg  rm -f "$tmpdepfile"
433de2362d3Smrg  ;;
434de2362d3Smrg
435de2362d3Smrghp2)
436de2362d3Smrg  # The "hp" stanza above does not work with aCC (C++) and HP's ia64
437de2362d3Smrg  # compilers, which have integrated preprocessors.  The correct option
438de2362d3Smrg  # to use with these is +Maked; it writes dependencies to a file named
439de2362d3Smrg  # 'foo.d', which lands next to the object file, wherever that
440de2362d3Smrg  # happens to be.
441de2362d3Smrg  # Much of this is similar to the tru64 case; see comments there.
44218781e08Smrg  set_dir_from  "$object"
44318781e08Smrg  set_base_from "$object"
444de2362d3Smrg  if test "$libtool" = yes; then
445de2362d3Smrg    tmpdepfile1=$dir$base.d
446de2362d3Smrg    tmpdepfile2=$dir.libs/$base.d
447de2362d3Smrg    "$@" -Wc,+Maked
448de2362d3Smrg  else
449de2362d3Smrg    tmpdepfile1=$dir$base.d
450de2362d3Smrg    tmpdepfile2=$dir$base.d
451de2362d3Smrg    "$@" +Maked
452de2362d3Smrg  fi
453de2362d3Smrg  stat=$?
45418781e08Smrg  if test $stat -ne 0; then
455de2362d3Smrg     rm -f "$tmpdepfile1" "$tmpdepfile2"
456de2362d3Smrg     exit $stat
457de2362d3Smrg  fi
458de2362d3Smrg
459de2362d3Smrg  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2"
460de2362d3Smrg  do
461de2362d3Smrg    test -f "$tmpdepfile" && break
462de2362d3Smrg  done
463de2362d3Smrg  if test -f "$tmpdepfile"; then
46418781e08Smrg    sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile"
46518781e08Smrg    # Add 'dependent.h:' lines.
4660d16fef4Smrg    sed -ne '2,${
46718781e08Smrg               s/^ *//
46818781e08Smrg               s/ \\*$//
46918781e08Smrg               s/$/:/
47018781e08Smrg               p
47118781e08Smrg             }' "$tmpdepfile" >> "$depfile"
472de2362d3Smrg  else
47318781e08Smrg    make_dummy_depfile
474de2362d3Smrg  fi
475de2362d3Smrg  rm -f "$tmpdepfile" "$tmpdepfile2"
476de2362d3Smrg  ;;
477de2362d3Smrg
478de2362d3Smrgtru64)
47918781e08Smrg  # The Tru64 compiler uses -MD to generate dependencies as a side
48018781e08Smrg  # effect.  'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'.
48118781e08Smrg  # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
48218781e08Smrg  # dependencies in 'foo.d' instead, so we check for that too.
48318781e08Smrg  # Subdirectories are respected.
48418781e08Smrg  set_dir_from  "$object"
48518781e08Smrg  set_base_from "$object"
48618781e08Smrg
48718781e08Smrg  if test "$libtool" = yes; then
48818781e08Smrg    # Libtool generates 2 separate objects for the 2 libraries.  These
48918781e08Smrg    # two compilations output dependencies in $dir.libs/$base.o.d and
49018781e08Smrg    # in $dir$base.o.d.  We have to check for both files, because
49118781e08Smrg    # one of the two compilations can be disabled.  We should prefer
49218781e08Smrg    # $dir$base.o.d over $dir.libs/$base.o.d because the latter is
49318781e08Smrg    # automatically cleaned when .libs/ is deleted, while ignoring
49418781e08Smrg    # the former would cause a distcleancheck panic.
49518781e08Smrg    tmpdepfile1=$dir$base.o.d          # libtool 1.5
49618781e08Smrg    tmpdepfile2=$dir.libs/$base.o.d    # Likewise.
49718781e08Smrg    tmpdepfile3=$dir.libs/$base.d      # Compaq CCC V6.2-504
49818781e08Smrg    "$@" -Wc,-MD
49918781e08Smrg  else
50018781e08Smrg    tmpdepfile1=$dir$base.d
50118781e08Smrg    tmpdepfile2=$dir$base.d
50218781e08Smrg    tmpdepfile3=$dir$base.d
50318781e08Smrg    "$@" -MD
50418781e08Smrg  fi
50518781e08Smrg
50618781e08Smrg  stat=$?
50718781e08Smrg  if test $stat -ne 0; then
50818781e08Smrg    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
50918781e08Smrg    exit $stat
51018781e08Smrg  fi
51118781e08Smrg
51218781e08Smrg  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
51318781e08Smrg  do
51418781e08Smrg    test -f "$tmpdepfile" && break
51518781e08Smrg  done
51618781e08Smrg  # Same post-processing that is required for AIX mode.
51718781e08Smrg  aix_post_process_depfile
51818781e08Smrg  ;;
51918781e08Smrg
52018781e08Smrgmsvc7)
52118781e08Smrg  if test "$libtool" = yes; then
52218781e08Smrg    showIncludes=-Wc,-showIncludes
52318781e08Smrg  else
52418781e08Smrg    showIncludes=-showIncludes
52518781e08Smrg  fi
52618781e08Smrg  "$@" $showIncludes > "$tmpdepfile"
52718781e08Smrg  stat=$?
52818781e08Smrg  grep -v '^Note: including file: ' "$tmpdepfile"
52918781e08Smrg  if test $stat -ne 0; then
53018781e08Smrg    rm -f "$tmpdepfile"
53118781e08Smrg    exit $stat
53218781e08Smrg  fi
53318781e08Smrg  rm -f "$depfile"
53418781e08Smrg  echo "$object : \\" > "$depfile"
53518781e08Smrg  # The first sed program below extracts the file names and escapes
53618781e08Smrg  # backslashes for cygpath.  The second sed program outputs the file
53718781e08Smrg  # name when reading, but also accumulates all include files in the
53818781e08Smrg  # hold buffer in order to output them again at the end.  This only
53918781e08Smrg  # works with sed implementations that can handle large buffers.
54018781e08Smrg  sed < "$tmpdepfile" -n '
54118781e08Smrg/^Note: including file:  *\(.*\)/ {
54218781e08Smrg  s//\1/
54318781e08Smrg  s/\\/\\\\/g
54418781e08Smrg  p
54518781e08Smrg}' | $cygpath_u | sort -u | sed -n '
54618781e08Smrgs/ /\\ /g
54718781e08Smrgs/\(.*\)/'"$tab"'\1 \\/p
54818781e08Smrgs/.\(.*\) \\/\1:/
54918781e08SmrgH
55018781e08Smrg$ {
55118781e08Smrg  s/.*/'"$tab"'/
55218781e08Smrg  G
55318781e08Smrg  p
55418781e08Smrg}' >> "$depfile"
55518781e08Smrg  echo >> "$depfile" # make sure the fragment doesn't end with a backslash
55618781e08Smrg  rm -f "$tmpdepfile"
55718781e08Smrg  ;;
55818781e08Smrg
55918781e08Smrgmsvc7msys)
56018781e08Smrg  # This case exists only to let depend.m4 do its work.  It works by
56118781e08Smrg  # looking at the text of this script.  This case will never be run,
56218781e08Smrg  # since it is checked for above.
56318781e08Smrg  exit 1
56418781e08Smrg  ;;
565de2362d3Smrg
566de2362d3Smrg#nosideeffect)
567de2362d3Smrg  # This comment above is used by automake to tell side-effect
568de2362d3Smrg  # dependency tracking mechanisms from slower ones.
569de2362d3Smrg
570de2362d3Smrgdashmstdout)
571de2362d3Smrg  # Important note: in order to support this mode, a compiler *must*
572de2362d3Smrg  # always write the preprocessed file to stdout, regardless of -o.
573de2362d3Smrg  "$@" || exit $?
574de2362d3Smrg
575de2362d3Smrg  # Remove the call to Libtool.
576de2362d3Smrg  if test "$libtool" = yes; then
5770d16fef4Smrg    while test "X$1" != 'X--mode=compile'; do
578de2362d3Smrg      shift
579de2362d3Smrg    done
580de2362d3Smrg    shift
581de2362d3Smrg  fi
582de2362d3Smrg
58318781e08Smrg  # Remove '-o $object'.
584de2362d3Smrg  IFS=" "
585de2362d3Smrg  for arg
586de2362d3Smrg  do
587de2362d3Smrg    case $arg in
588de2362d3Smrg    -o)
589de2362d3Smrg      shift
590de2362d3Smrg      ;;
591de2362d3Smrg    $object)
592de2362d3Smrg      shift
593de2362d3Smrg      ;;
594de2362d3Smrg    *)
595de2362d3Smrg      set fnord "$@" "$arg"
596de2362d3Smrg      shift # fnord
597de2362d3Smrg      shift # $arg
598de2362d3Smrg      ;;
599de2362d3Smrg    esac
600de2362d3Smrg  done
601de2362d3Smrg
602de2362d3Smrg  test -z "$dashmflag" && dashmflag=-M
60318781e08Smrg  # Require at least two characters before searching for ':'
604de2362d3Smrg  # in the target name.  This is to cope with DOS-style filenames:
60518781e08Smrg  # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise.
606de2362d3Smrg  "$@" $dashmflag |
60718781e08Smrg    sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile"
608de2362d3Smrg  rm -f "$depfile"
609de2362d3Smrg  cat < "$tmpdepfile" > "$depfile"
61018781e08Smrg  # Some versions of the HPUX 10.20 sed can't process this sed invocation
61118781e08Smrg  # correctly.  Breaking it into two sed invocations is a workaround.
61218781e08Smrg  tr ' ' "$nl" < "$tmpdepfile" \
61318781e08Smrg    | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
61418781e08Smrg    | sed -e 's/$/ :/' >> "$depfile"
615de2362d3Smrg  rm -f "$tmpdepfile"
616de2362d3Smrg  ;;
617de2362d3Smrg
618de2362d3SmrgdashXmstdout)
619de2362d3Smrg  # This case only exists to satisfy depend.m4.  It is never actually
620de2362d3Smrg  # run, as this mode is specially recognized in the preamble.
621de2362d3Smrg  exit 1
622de2362d3Smrg  ;;
623de2362d3Smrg
624de2362d3Smrgmakedepend)
625de2362d3Smrg  "$@" || exit $?
626de2362d3Smrg  # Remove any Libtool call
627de2362d3Smrg  if test "$libtool" = yes; then
6280d16fef4Smrg    while test "X$1" != 'X--mode=compile'; do
629de2362d3Smrg      shift
630de2362d3Smrg    done
631de2362d3Smrg    shift
632de2362d3Smrg  fi
633de2362d3Smrg  # X makedepend
634de2362d3Smrg  shift
6350d16fef4Smrg  cleared=no eat=no
6360d16fef4Smrg  for arg
6370d16fef4Smrg  do
638de2362d3Smrg    case $cleared in
639de2362d3Smrg    no)
640de2362d3Smrg      set ""; shift
641de2362d3Smrg      cleared=yes ;;
642de2362d3Smrg    esac
6430d16fef4Smrg    if test $eat = yes; then
6440d16fef4Smrg      eat=no
6450d16fef4Smrg      continue
6460d16fef4Smrg    fi
647de2362d3Smrg    case "$arg" in
648de2362d3Smrg    -D*|-I*)
649de2362d3Smrg      set fnord "$@" "$arg"; shift ;;
650de2362d3Smrg    # Strip any option that makedepend may not understand.  Remove
651de2362d3Smrg    # the object too, otherwise makedepend will parse it as a source file.
6520d16fef4Smrg    -arch)
6530d16fef4Smrg      eat=yes ;;
654de2362d3Smrg    -*|$object)
655de2362d3Smrg      ;;
656de2362d3Smrg    *)
657de2362d3Smrg      set fnord "$@" "$arg"; shift ;;
658de2362d3Smrg    esac
659de2362d3Smrg  done
6600d16fef4Smrg  obj_suffix=`echo "$object" | sed 's/^.*\././'`
661de2362d3Smrg  touch "$tmpdepfile"
662de2362d3Smrg  ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
663de2362d3Smrg  rm -f "$depfile"
66418781e08Smrg  # makedepend may prepend the VPATH from the source file name to the object.
66518781e08Smrg  # No need to regex-escape $object, excess matching of '.' is harmless.
66618781e08Smrg  sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile"
66718781e08Smrg  # Some versions of the HPUX 10.20 sed can't process the last invocation
66818781e08Smrg  # correctly.  Breaking it into two sed invocations is a workaround.
66918781e08Smrg  sed '1,2d' "$tmpdepfile" \
67018781e08Smrg    | tr ' ' "$nl" \
67118781e08Smrg    | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
67218781e08Smrg    | sed -e 's/$/ :/' >> "$depfile"
673de2362d3Smrg  rm -f "$tmpdepfile" "$tmpdepfile".bak
674de2362d3Smrg  ;;
675de2362d3Smrg
676de2362d3Smrgcpp)
677de2362d3Smrg  # Important note: in order to support this mode, a compiler *must*
678de2362d3Smrg  # always write the preprocessed file to stdout.
679de2362d3Smrg  "$@" || exit $?
680de2362d3Smrg
681de2362d3Smrg  # Remove the call to Libtool.
682de2362d3Smrg  if test "$libtool" = yes; then
6830d16fef4Smrg    while test "X$1" != 'X--mode=compile'; do
684de2362d3Smrg      shift
685de2362d3Smrg    done
686de2362d3Smrg    shift
687de2362d3Smrg  fi
688de2362d3Smrg
68918781e08Smrg  # Remove '-o $object'.
690de2362d3Smrg  IFS=" "
691de2362d3Smrg  for arg
692de2362d3Smrg  do
693de2362d3Smrg    case $arg in
694de2362d3Smrg    -o)
695de2362d3Smrg      shift
696de2362d3Smrg      ;;
697de2362d3Smrg    $object)
698de2362d3Smrg      shift
699de2362d3Smrg      ;;
700de2362d3Smrg    *)
701de2362d3Smrg      set fnord "$@" "$arg"
702de2362d3Smrg      shift # fnord
703de2362d3Smrg      shift # $arg
704de2362d3Smrg      ;;
705de2362d3Smrg    esac
706de2362d3Smrg  done
707de2362d3Smrg
70818781e08Smrg  "$@" -E \
70918781e08Smrg    | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
71018781e08Smrg             -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
71118781e08Smrg    | sed '$ s: \\$::' > "$tmpdepfile"
712de2362d3Smrg  rm -f "$depfile"
713de2362d3Smrg  echo "$object : \\" > "$depfile"
714de2362d3Smrg  cat < "$tmpdepfile" >> "$depfile"
715de2362d3Smrg  sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
716de2362d3Smrg  rm -f "$tmpdepfile"
717de2362d3Smrg  ;;
718de2362d3Smrg
719de2362d3Smrgmsvisualcpp)
720de2362d3Smrg  # Important note: in order to support this mode, a compiler *must*
7210d16fef4Smrg  # always write the preprocessed file to stdout.
722de2362d3Smrg  "$@" || exit $?
7230d16fef4Smrg
7240d16fef4Smrg  # Remove the call to Libtool.
7250d16fef4Smrg  if test "$libtool" = yes; then
7260d16fef4Smrg    while test "X$1" != 'X--mode=compile'; do
7270d16fef4Smrg      shift
7280d16fef4Smrg    done
7290d16fef4Smrg    shift
7300d16fef4Smrg  fi
7310d16fef4Smrg
732de2362d3Smrg  IFS=" "
733de2362d3Smrg  for arg
734de2362d3Smrg  do
735de2362d3Smrg    case "$arg" in
7360d16fef4Smrg    -o)
7370d16fef4Smrg      shift
7380d16fef4Smrg      ;;
7390d16fef4Smrg    $object)
7400d16fef4Smrg      shift
7410d16fef4Smrg      ;;
742de2362d3Smrg    "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
74318781e08Smrg        set fnord "$@"
74418781e08Smrg        shift
74518781e08Smrg        shift
74618781e08Smrg        ;;
747de2362d3Smrg    *)
74818781e08Smrg        set fnord "$@" "$arg"
74918781e08Smrg        shift
75018781e08Smrg        shift
75118781e08Smrg        ;;
752de2362d3Smrg    esac
753de2362d3Smrg  done
7540d16fef4Smrg  "$@" -E 2>/dev/null |
7550d16fef4Smrg  sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile"
756de2362d3Smrg  rm -f "$depfile"
757de2362d3Smrg  echo "$object : \\" > "$depfile"
75818781e08Smrg  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile"
75918781e08Smrg  echo "$tab" >> "$depfile"
7600d16fef4Smrg  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile"
761de2362d3Smrg  rm -f "$tmpdepfile"
762de2362d3Smrg  ;;
763de2362d3Smrg
7640d16fef4Smrgmsvcmsys)
7650d16fef4Smrg  # This case exists only to let depend.m4 do its work.  It works by
7660d16fef4Smrg  # looking at the text of this script.  This case will never be run,
7670d16fef4Smrg  # since it is checked for above.
7680d16fef4Smrg  exit 1
7690d16fef4Smrg  ;;
7700d16fef4Smrg
771de2362d3Smrgnone)
772de2362d3Smrg  exec "$@"
773de2362d3Smrg  ;;
774de2362d3Smrg
775de2362d3Smrg*)
776de2362d3Smrg  echo "Unknown depmode $depmode" 1>&2
777de2362d3Smrg  exit 1
778de2362d3Smrg  ;;
779de2362d3Smrgesac
780de2362d3Smrg
781de2362d3Smrgexit 0
782de2362d3Smrg
783de2362d3Smrg# Local Variables:
784de2362d3Smrg# mode: shell-script
785de2362d3Smrg# sh-indentation: 2
78639413783Smrg# eval: (add-hook 'before-save-hook 'time-stamp)
787de2362d3Smrg# time-stamp-start: "scriptversion="
788de2362d3Smrg# time-stamp-format: "%:y-%02m-%02d.%02H"
7898bf5c682Smrg# time-stamp-time-zone: "UTC0"
7900d16fef4Smrg# time-stamp-end: "; # UTC"
791de2362d3Smrg# End:
792