18b22bf3fSmrg#! /bin/sh
28b22bf3fSmrg# depcomp - compile a program generating dependencies as side-effects
38b22bf3fSmrg
49e1184feSmrgscriptversion=2018-03-07.03; # UTC
58b22bf3fSmrg
614cde9d3Smrg# Copyright (C) 1999-2021 Free Software Foundation, Inc.
78b22bf3fSmrg
88b22bf3fSmrg# This program is free software; you can redistribute it and/or modify
98b22bf3fSmrg# it under the terms of the GNU General Public License as published by
108b22bf3fSmrg# the Free Software Foundation; either version 2, or (at your option)
118b22bf3fSmrg# any later version.
128b22bf3fSmrg
138b22bf3fSmrg# This program is distributed in the hope that it will be useful,
148b22bf3fSmrg# but WITHOUT ANY WARRANTY; without even the implied warranty of
158b22bf3fSmrg# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
168b22bf3fSmrg# GNU General Public License for more details.
178b22bf3fSmrg
188b22bf3fSmrg# You should have received a copy of the GNU General Public License
199e1184feSmrg# along with this program.  If not, see <https://www.gnu.org/licenses/>.
208b22bf3fSmrg
218b22bf3fSmrg# As a special exception to the GNU General Public License, if you
228b22bf3fSmrg# distribute this file as part of a program that contains a
238b22bf3fSmrg# configuration script generated by Autoconf, you may include it under
248b22bf3fSmrg# the same distribution terms that you use for the rest of that program.
258b22bf3fSmrg
268b22bf3fSmrg# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>.
278b22bf3fSmrg
288b22bf3fSmrgcase $1 in
298b22bf3fSmrg  '')
30f126e068Smrg    echo "$0: No command.  Try '$0 --help' for more information." 1>&2
31f126e068Smrg    exit 1;
32f126e068Smrg    ;;
338b22bf3fSmrg  -h | --h*)
348b22bf3fSmrg    cat <<\EOF
358b22bf3fSmrgUsage: depcomp [--help] [--version] PROGRAM [ARGS]
368b22bf3fSmrg
378b22bf3fSmrgRun PROGRAMS ARGS to compile a file, generating dependencies
388b22bf3fSmrgas side-effects.
398b22bf3fSmrg
408b22bf3fSmrgEnvironment variables:
418b22bf3fSmrg  depmode     Dependency tracking mode.
42f126e068Smrg  source      Source file read by 'PROGRAMS ARGS'.
43f126e068Smrg  object      Object file output by 'PROGRAMS ARGS'.
448b22bf3fSmrg  DEPDIR      directory where to store dependencies.
458b22bf3fSmrg  depfile     Dependency file to output.
46f126e068Smrg  tmpdepfile  Temporary file to use when outputting dependencies.
478b22bf3fSmrg  libtool     Whether libtool is used (yes/no).
488b22bf3fSmrg
498b22bf3fSmrgReport bugs to <bug-automake@gnu.org>.
508b22bf3fSmrgEOF
518b22bf3fSmrg    exit $?
528b22bf3fSmrg    ;;
538b22bf3fSmrg  -v | --v*)
548b22bf3fSmrg    echo "depcomp $scriptversion"
558b22bf3fSmrg    exit $?
568b22bf3fSmrg    ;;
578b22bf3fSmrgesac
588b22bf3fSmrg
59f126e068Smrg# Get the directory component of the given path, and save it in the
60f126e068Smrg# global variables '$dir'.  Note that this directory component will
61f126e068Smrg# be either empty or ending with a '/' character.  This is deliberate.
62f126e068Smrgset_dir_from ()
63f126e068Smrg{
64f126e068Smrg  case $1 in
65f126e068Smrg    */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;;
66f126e068Smrg      *) dir=;;
67f126e068Smrg  esac
68f126e068Smrg}
69f126e068Smrg
70f126e068Smrg# Get the suffix-stripped basename of the given path, and save it the
71f126e068Smrg# global variable '$base'.
72f126e068Smrgset_base_from ()
73f126e068Smrg{
74f126e068Smrg  base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'`
75f126e068Smrg}
76f126e068Smrg
77f126e068Smrg# If no dependency file was actually created by the compiler invocation,
78f126e068Smrg# we still have to create a dummy depfile, to avoid errors with the
79f126e068Smrg# Makefile "include basename.Plo" scheme.
80f126e068Smrgmake_dummy_depfile ()
81f126e068Smrg{
82f126e068Smrg  echo "#dummy" > "$depfile"
83f126e068Smrg}
84f126e068Smrg
85f126e068Smrg# Factor out some common post-processing of the generated depfile.
86f126e068Smrg# Requires the auxiliary global variable '$tmpdepfile' to be set.
87f126e068Smrgaix_post_process_depfile ()
88f126e068Smrg{
89f126e068Smrg  # If the compiler actually managed to produce a dependency file,
90f126e068Smrg  # post-process it.
91f126e068Smrg  if test -f "$tmpdepfile"; then
92f126e068Smrg    # Each line is of the form 'foo.o: dependency.h'.
93f126e068Smrg    # Do two passes, one to just change these to
94f126e068Smrg    #   $object: dependency.h
95f126e068Smrg    # and one to simply output
96f126e068Smrg    #   dependency.h:
97f126e068Smrg    # which is needed to avoid the deleted-header problem.
98f126e068Smrg    { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile"
99f126e068Smrg      sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile"
100f126e068Smrg    } > "$depfile"
101f126e068Smrg    rm -f "$tmpdepfile"
102f126e068Smrg  else
103f126e068Smrg    make_dummy_depfile
104f126e068Smrg  fi
105f126e068Smrg}
106f126e068Smrg
107f126e068Smrg# A tabulation character.
108f126e068Smrgtab='	'
109f126e068Smrg# A newline character.
110f126e068Smrgnl='
111f126e068Smrg'
112f126e068Smrg# Character ranges might be problematic outside the C locale.
113f126e068Smrg# These definitions help.
114f126e068Smrgupper=ABCDEFGHIJKLMNOPQRSTUVWXYZ
115f126e068Smrglower=abcdefghijklmnopqrstuvwxyz
116f126e068Smrgdigits=0123456789
117f126e068Smrgalpha=${upper}${lower}
118f126e068Smrg
1198b22bf3fSmrgif test -z "$depmode" || test -z "$source" || test -z "$object"; then
1208b22bf3fSmrg  echo "depcomp: Variables source, object and depmode must be set" 1>&2
1218b22bf3fSmrg  exit 1
1228b22bf3fSmrgfi
1238b22bf3fSmrg
1248b22bf3fSmrg# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.
1258b22bf3fSmrgdepfile=${depfile-`echo "$object" |
1268b22bf3fSmrg  sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`}
1278b22bf3fSmrgtmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
1288b22bf3fSmrg
1298b22bf3fSmrgrm -f "$tmpdepfile"
1308b22bf3fSmrg
131f126e068Smrg# Avoid interferences from the environment.
132f126e068Smrggccflag= dashmflag=
133f126e068Smrg
1348b22bf3fSmrg# Some modes work just like other modes, but use different flags.  We
1358b22bf3fSmrg# parameterize here, but still list the modes in the big case below,
1368b22bf3fSmrg# to make depend.m4 easier to write.  Note that we *cannot* use a case
1378b22bf3fSmrg# here, because this file can only contain one case statement.
1388b22bf3fSmrgif test "$depmode" = hp; then
1398b22bf3fSmrg  # HP compiler uses -M and no extra arg.
1408b22bf3fSmrg  gccflag=-M
1418b22bf3fSmrg  depmode=gcc
1428b22bf3fSmrgfi
1438b22bf3fSmrg
1448b22bf3fSmrgif test "$depmode" = dashXmstdout; then
145f126e068Smrg  # This is just like dashmstdout with a different argument.
146f126e068Smrg  dashmflag=-xM
147f126e068Smrg  depmode=dashmstdout
1488b22bf3fSmrgfi
1498b22bf3fSmrg
15096a81b41Smrgcygpath_u="cygpath -u -f -"
15196a81b41Smrgif test "$depmode" = msvcmsys; then
152f126e068Smrg  # This is just like msvisualcpp but w/o cygpath translation.
153f126e068Smrg  # Just convert the backslash-escaped backslashes to single forward
154f126e068Smrg  # slashes to satisfy depend.m4
155f126e068Smrg  cygpath_u='sed s,\\\\,/,g'
156f126e068Smrg  depmode=msvisualcpp
157f126e068Smrgfi
158f126e068Smrg
159f126e068Smrgif test "$depmode" = msvc7msys; then
160f126e068Smrg  # This is just like msvc7 but w/o cygpath translation.
161f126e068Smrg  # Just convert the backslash-escaped backslashes to single forward
162f126e068Smrg  # slashes to satisfy depend.m4
163f126e068Smrg  cygpath_u='sed s,\\\\,/,g'
164f126e068Smrg  depmode=msvc7
165f126e068Smrgfi
166f126e068Smrg
167f126e068Smrgif test "$depmode" = xlc; then
168f126e068Smrg  # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information.
169f126e068Smrg  gccflag=-qmakedep=gcc,-MF
170f126e068Smrg  depmode=gcc
17196a81b41Smrgfi
17296a81b41Smrg
1738b22bf3fSmrgcase "$depmode" in
1748b22bf3fSmrggcc3)
1758b22bf3fSmrg## gcc 3 implements dependency tracking that does exactly what
1768b22bf3fSmrg## we want.  Yay!  Note: for some reason libtool 1.4 doesn't like
1778b22bf3fSmrg## it if -MD -MP comes after the -MF stuff.  Hmm.
1788b22bf3fSmrg## Unfortunately, FreeBSD c89 acceptance of flags depends upon
1798b22bf3fSmrg## the command line argument order; so add the flags where they
1808b22bf3fSmrg## appear in depend2.am.  Note that the slowdown incurred here
1818b22bf3fSmrg## affects only configure: in makefiles, %FASTDEP% shortcuts this.
1828b22bf3fSmrg  for arg
1838b22bf3fSmrg  do
1848b22bf3fSmrg    case $arg in
1858b22bf3fSmrg    -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;;
1868b22bf3fSmrg    *)  set fnord "$@" "$arg" ;;
1878b22bf3fSmrg    esac
1888b22bf3fSmrg    shift # fnord
1898b22bf3fSmrg    shift # $arg
1908b22bf3fSmrg  done
1918b22bf3fSmrg  "$@"
1928b22bf3fSmrg  stat=$?
193f126e068Smrg  if test $stat -ne 0; then
1948b22bf3fSmrg    rm -f "$tmpdepfile"
1958b22bf3fSmrg    exit $stat
1968b22bf3fSmrg  fi
1978b22bf3fSmrg  mv "$tmpdepfile" "$depfile"
1988b22bf3fSmrg  ;;
1998b22bf3fSmrg
2008b22bf3fSmrggcc)
201f126e068Smrg## Note that this doesn't just cater to obsosete pre-3.x GCC compilers.
202f126e068Smrg## but also to in-use compilers like IMB xlc/xlC and the HP C compiler.
203f126e068Smrg## (see the conditional assignment to $gccflag above).
2048b22bf3fSmrg## There are various ways to get dependency output from gcc.  Here's
2058b22bf3fSmrg## why we pick this rather obscure method:
2068b22bf3fSmrg## - Don't want to use -MD because we'd like the dependencies to end
2078b22bf3fSmrg##   up in a subdir.  Having to rename by hand is ugly.
2088b22bf3fSmrg##   (We might end up doing this anyway to support other compilers.)
2098b22bf3fSmrg## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
210f126e068Smrg##   -MM, not -M (despite what the docs say).  Also, it might not be
211f126e068Smrg##   supported by the other compilers which use the 'gcc' depmode.
2128b22bf3fSmrg## - Using -M directly means running the compiler twice (even worse
2138b22bf3fSmrg##   than renaming).
2148b22bf3fSmrg  if test -z "$gccflag"; then
2158b22bf3fSmrg    gccflag=-MD,
2168b22bf3fSmrg  fi
2178b22bf3fSmrg  "$@" -Wp,"$gccflag$tmpdepfile"
2188b22bf3fSmrg  stat=$?
219f126e068Smrg  if test $stat -ne 0; then
2208b22bf3fSmrg    rm -f "$tmpdepfile"
2218b22bf3fSmrg    exit $stat
2228b22bf3fSmrg  fi
2238b22bf3fSmrg  rm -f "$depfile"
2248b22bf3fSmrg  echo "$object : \\" > "$depfile"
225f126e068Smrg  # The second -e expression handles DOS-style file names with drive
226f126e068Smrg  # letters.
2278b22bf3fSmrg  sed -e 's/^[^:]*: / /' \
2288b22bf3fSmrg      -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
229f126e068Smrg## This next piece of magic avoids the "deleted header file" problem.
2308b22bf3fSmrg## The problem is that when a header file which appears in a .P file
2318b22bf3fSmrg## is deleted, the dependency causes make to die (because there is
2328b22bf3fSmrg## typically no way to rebuild the header).  We avoid this by adding
2338b22bf3fSmrg## dummy dependencies for each header file.  Too bad gcc doesn't do
2348b22bf3fSmrg## this for us directly.
235f126e068Smrg## Some versions of gcc put a space before the ':'.  On the theory
2368b22bf3fSmrg## that the space means something, we add a space to the output as
237f126e068Smrg## well.  hp depmode also adds that space, but also prefixes the VPATH
238f126e068Smrg## to the object.  Take care to not repeat it in the output.
2398b22bf3fSmrg## Some versions of the HPUX 10.20 sed can't process this invocation
2408b22bf3fSmrg## correctly.  Breaking it into two sed invocations is a workaround.
241f126e068Smrg  tr ' ' "$nl" < "$tmpdepfile" \
242f126e068Smrg    | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \
243f126e068Smrg    | sed -e 's/$/ :/' >> "$depfile"
2448b22bf3fSmrg  rm -f "$tmpdepfile"
2458b22bf3fSmrg  ;;
2468b22bf3fSmrg
2478b22bf3fSmrghp)
2488b22bf3fSmrg  # This case exists only to let depend.m4 do its work.  It works by
2498b22bf3fSmrg  # looking at the text of this script.  This case will never be run,
2508b22bf3fSmrg  # since it is checked for above.
2518b22bf3fSmrg  exit 1
2528b22bf3fSmrg  ;;
2538b22bf3fSmrg
2548b22bf3fSmrgsgi)
2558b22bf3fSmrg  if test "$libtool" = yes; then
2568b22bf3fSmrg    "$@" "-Wp,-MDupdate,$tmpdepfile"
2578b22bf3fSmrg  else
2588b22bf3fSmrg    "$@" -MDupdate "$tmpdepfile"
2598b22bf3fSmrg  fi
2608b22bf3fSmrg  stat=$?
261f126e068Smrg  if test $stat -ne 0; then
2628b22bf3fSmrg    rm -f "$tmpdepfile"
2638b22bf3fSmrg    exit $stat
2648b22bf3fSmrg  fi
2658b22bf3fSmrg  rm -f "$depfile"
2668b22bf3fSmrg
2678b22bf3fSmrg  if test -f "$tmpdepfile"; then  # yes, the sourcefile depend on other files
2688b22bf3fSmrg    echo "$object : \\" > "$depfile"
2698b22bf3fSmrg    # Clip off the initial element (the dependent).  Don't try to be
2708b22bf3fSmrg    # clever and replace this with sed code, as IRIX sed won't handle
2718b22bf3fSmrg    # lines with more than a fixed number of characters (4096 in
2728b22bf3fSmrg    # IRIX 6.2 sed, 8192 in IRIX 6.5).  We also remove comment lines;
273f126e068Smrg    # the IRIX cc adds comments like '#:fec' to the end of the
2748b22bf3fSmrg    # dependency line.
275f126e068Smrg    tr ' ' "$nl" < "$tmpdepfile" \
276f126e068Smrg      | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \
277f126e068Smrg      | tr "$nl" ' ' >> "$depfile"
27896a81b41Smrg    echo >> "$depfile"
2798b22bf3fSmrg    # The second pass generates a dummy entry for each header file.
280f126e068Smrg    tr ' ' "$nl" < "$tmpdepfile" \
281f126e068Smrg      | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
282f126e068Smrg      >> "$depfile"
2838b22bf3fSmrg  else
284f126e068Smrg    make_dummy_depfile
2858b22bf3fSmrg  fi
2868b22bf3fSmrg  rm -f "$tmpdepfile"
2878b22bf3fSmrg  ;;
2888b22bf3fSmrg
289f126e068Smrgxlc)
290f126e068Smrg  # This case exists only to let depend.m4 do its work.  It works by
291f126e068Smrg  # looking at the text of this script.  This case will never be run,
292f126e068Smrg  # since it is checked for above.
293f126e068Smrg  exit 1
294f126e068Smrg  ;;
295f126e068Smrg
2968b22bf3fSmrgaix)
2978b22bf3fSmrg  # The C for AIX Compiler uses -M and outputs the dependencies
2988b22bf3fSmrg  # in a .u file.  In older versions, this file always lives in the
299f126e068Smrg  # current directory.  Also, the AIX compiler puts '$object:' at the
3008b22bf3fSmrg  # start of each line; $object doesn't have directory information.
3018b22bf3fSmrg  # Version 6 uses the directory in both cases.
302f126e068Smrg  set_dir_from "$object"
303f126e068Smrg  set_base_from "$object"
3048b22bf3fSmrg  if test "$libtool" = yes; then
30596a81b41Smrg    tmpdepfile1=$dir$base.u
30696a81b41Smrg    tmpdepfile2=$base.u
30796a81b41Smrg    tmpdepfile3=$dir.libs/$base.u
3088b22bf3fSmrg    "$@" -Wc,-M
3098b22bf3fSmrg  else
31096a81b41Smrg    tmpdepfile1=$dir$base.u
31196a81b41Smrg    tmpdepfile2=$dir$base.u
31296a81b41Smrg    tmpdepfile3=$dir$base.u
3138b22bf3fSmrg    "$@" -M
3148b22bf3fSmrg  fi
3158b22bf3fSmrg  stat=$?
316f126e068Smrg  if test $stat -ne 0; then
31796a81b41Smrg    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
3188b22bf3fSmrg    exit $stat
3198b22bf3fSmrg  fi
3208b22bf3fSmrg
32196a81b41Smrg  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
32296a81b41Smrg  do
32396a81b41Smrg    test -f "$tmpdepfile" && break
32496a81b41Smrg  done
325f126e068Smrg  aix_post_process_depfile
326f126e068Smrg  ;;
327f126e068Smrg
328f126e068Smrgtcc)
329f126e068Smrg  # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26
330f126e068Smrg  # FIXME: That version still under development at the moment of writing.
331f126e068Smrg  #        Make that this statement remains true also for stable, released
332f126e068Smrg  #        versions.
333f126e068Smrg  # It will wrap lines (doesn't matter whether long or short) with a
334f126e068Smrg  # trailing '\', as in:
335f126e068Smrg  #
336f126e068Smrg  #   foo.o : \
337f126e068Smrg  #    foo.c \
338f126e068Smrg  #    foo.h \
339f126e068Smrg  #
340f126e068Smrg  # It will put a trailing '\' even on the last line, and will use leading
341f126e068Smrg  # spaces rather than leading tabs (at least since its commit 0394caf7
342f126e068Smrg  # "Emit spaces for -MD").
343f126e068Smrg  "$@" -MD -MF "$tmpdepfile"
344f126e068Smrg  stat=$?
345f126e068Smrg  if test $stat -ne 0; then
346f126e068Smrg    rm -f "$tmpdepfile"
347f126e068Smrg    exit $stat
3488b22bf3fSmrg  fi
349f126e068Smrg  rm -f "$depfile"
350f126e068Smrg  # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'.
351f126e068Smrg  # We have to change lines of the first kind to '$object: \'.
352f126e068Smrg  sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile"
353f126e068Smrg  # And for each line of the second kind, we have to emit a 'dep.h:'
354f126e068Smrg  # dummy dependency, to avoid the deleted-header problem.
355f126e068Smrg  sed -n -e 's|^  *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile"
3568b22bf3fSmrg  rm -f "$tmpdepfile"
3578b22bf3fSmrg  ;;
3588b22bf3fSmrg
359f126e068Smrg## The order of this option in the case statement is important, since the
360f126e068Smrg## shell code in configure will try each of these formats in the order
361f126e068Smrg## listed in this file.  A plain '-MD' option would be understood by many
362f126e068Smrg## compilers, so we must ensure this comes after the gcc and icc options.
363f126e068Smrgpgcc)
364f126e068Smrg  # Portland's C compiler understands '-MD'.
365f126e068Smrg  # Will always output deps to 'file.d' where file is the root name of the
366f126e068Smrg  # source file under compilation, even if file resides in a subdirectory.
367f126e068Smrg  # The object file name does not affect the name of the '.d' file.
368f126e068Smrg  # pgcc 10.2 will output
3698b22bf3fSmrg  #    foo.o: sub/foo.c sub/foo.h
370f126e068Smrg  # and will wrap long lines using '\' :
3718b22bf3fSmrg  #    foo.o: sub/foo.c ... \
3728b22bf3fSmrg  #     sub/foo.h ... \
3738b22bf3fSmrg  #     ...
374f126e068Smrg  set_dir_from "$object"
375f126e068Smrg  # Use the source, not the object, to determine the base name, since
376f126e068Smrg  # that's sadly what pgcc will do too.
377f126e068Smrg  set_base_from "$source"
378f126e068Smrg  tmpdepfile=$base.d
379f126e068Smrg
380f126e068Smrg  # For projects that build the same source file twice into different object
381f126e068Smrg  # files, the pgcc approach of using the *source* file root name can cause
382f126e068Smrg  # problems in parallel builds.  Use a locking strategy to avoid stomping on
383f126e068Smrg  # the same $tmpdepfile.
384f126e068Smrg  lockdir=$base.d-lock
385f126e068Smrg  trap "
386f126e068Smrg    echo '$0: caught signal, cleaning up...' >&2
387f126e068Smrg    rmdir '$lockdir'
388f126e068Smrg    exit 1
389f126e068Smrg  " 1 2 13 15
390f126e068Smrg  numtries=100
391f126e068Smrg  i=$numtries
392f126e068Smrg  while test $i -gt 0; do
393f126e068Smrg    # mkdir is a portable test-and-set.
394f126e068Smrg    if mkdir "$lockdir" 2>/dev/null; then
395f126e068Smrg      # This process acquired the lock.
396f126e068Smrg      "$@" -MD
397f126e068Smrg      stat=$?
398f126e068Smrg      # Release the lock.
399f126e068Smrg      rmdir "$lockdir"
400f126e068Smrg      break
401f126e068Smrg    else
402f126e068Smrg      # If the lock is being held by a different process, wait
403f126e068Smrg      # until the winning process is done or we timeout.
404f126e068Smrg      while test -d "$lockdir" && test $i -gt 0; do
405f126e068Smrg        sleep 1
406f126e068Smrg        i=`expr $i - 1`
407f126e068Smrg      done
408f126e068Smrg    fi
409f126e068Smrg    i=`expr $i - 1`
410f126e068Smrg  done
411f126e068Smrg  trap - 1 2 13 15
412f126e068Smrg  if test $i -le 0; then
413f126e068Smrg    echo "$0: failed to acquire lock after $numtries attempts" >&2
414f126e068Smrg    echo "$0: check lockdir '$lockdir'" >&2
415f126e068Smrg    exit 1
416f126e068Smrg  fi
4178b22bf3fSmrg
418f126e068Smrg  if test $stat -ne 0; then
4198b22bf3fSmrg    rm -f "$tmpdepfile"
4208b22bf3fSmrg    exit $stat
4218b22bf3fSmrg  fi
4228b22bf3fSmrg  rm -f "$depfile"
4238b22bf3fSmrg  # Each line is of the form `foo.o: dependent.h',
4248b22bf3fSmrg  # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'.
4258b22bf3fSmrg  # Do two passes, one to just change these to
4268b22bf3fSmrg  # `$object: dependent.h' and one to simply `dependent.h:'.
4278b22bf3fSmrg  sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
4288b22bf3fSmrg  # Some versions of the HPUX 10.20 sed can't process this invocation
4298b22bf3fSmrg  # correctly.  Breaking it into two sed invocations is a workaround.
430f126e068Smrg  sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \
431f126e068Smrg    | sed -e 's/$/ :/' >> "$depfile"
4328b22bf3fSmrg  rm -f "$tmpdepfile"
4338b22bf3fSmrg  ;;
4348b22bf3fSmrg
4358b22bf3fSmrghp2)
4368b22bf3fSmrg  # The "hp" stanza above does not work with aCC (C++) and HP's ia64
4378b22bf3fSmrg  # compilers, which have integrated preprocessors.  The correct option
4388b22bf3fSmrg  # to use with these is +Maked; it writes dependencies to a file named
4398b22bf3fSmrg  # 'foo.d', which lands next to the object file, wherever that
4408b22bf3fSmrg  # happens to be.
4418b22bf3fSmrg  # Much of this is similar to the tru64 case; see comments there.
442f126e068Smrg  set_dir_from  "$object"
443f126e068Smrg  set_base_from "$object"
4448b22bf3fSmrg  if test "$libtool" = yes; then
4458b22bf3fSmrg    tmpdepfile1=$dir$base.d
4468b22bf3fSmrg    tmpdepfile2=$dir.libs/$base.d
4478b22bf3fSmrg    "$@" -Wc,+Maked
4488b22bf3fSmrg  else
4498b22bf3fSmrg    tmpdepfile1=$dir$base.d
4508b22bf3fSmrg    tmpdepfile2=$dir$base.d
4518b22bf3fSmrg    "$@" +Maked
4528b22bf3fSmrg  fi
4538b22bf3fSmrg  stat=$?
454f126e068Smrg  if test $stat -ne 0; then
4558b22bf3fSmrg     rm -f "$tmpdepfile1" "$tmpdepfile2"
4568b22bf3fSmrg     exit $stat
4578b22bf3fSmrg  fi
4588b22bf3fSmrg
4598b22bf3fSmrg  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2"
4608b22bf3fSmrg  do
4618b22bf3fSmrg    test -f "$tmpdepfile" && break
4628b22bf3fSmrg  done
4638b22bf3fSmrg  if test -f "$tmpdepfile"; then
464f126e068Smrg    sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile"
465f126e068Smrg    # Add 'dependent.h:' lines.
46696a81b41Smrg    sed -ne '2,${
467f126e068Smrg               s/^ *//
468f126e068Smrg               s/ \\*$//
469f126e068Smrg               s/$/:/
470f126e068Smrg               p
471f126e068Smrg             }' "$tmpdepfile" >> "$depfile"
4728b22bf3fSmrg  else
473f126e068Smrg    make_dummy_depfile
4748b22bf3fSmrg  fi
4758b22bf3fSmrg  rm -f "$tmpdepfile" "$tmpdepfile2"
4768b22bf3fSmrg  ;;
4778b22bf3fSmrg
4788b22bf3fSmrgtru64)
479f126e068Smrg  # The Tru64 compiler uses -MD to generate dependencies as a side
480f126e068Smrg  # effect.  'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'.
481f126e068Smrg  # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
482f126e068Smrg  # dependencies in 'foo.d' instead, so we check for that too.
483f126e068Smrg  # Subdirectories are respected.
484f126e068Smrg  set_dir_from  "$object"
485f126e068Smrg  set_base_from "$object"
486f126e068Smrg
487f126e068Smrg  if test "$libtool" = yes; then
488f126e068Smrg    # Libtool generates 2 separate objects for the 2 libraries.  These
489f126e068Smrg    # two compilations output dependencies in $dir.libs/$base.o.d and
490f126e068Smrg    # in $dir$base.o.d.  We have to check for both files, because
491f126e068Smrg    # one of the two compilations can be disabled.  We should prefer
492f126e068Smrg    # $dir$base.o.d over $dir.libs/$base.o.d because the latter is
493f126e068Smrg    # automatically cleaned when .libs/ is deleted, while ignoring
494f126e068Smrg    # the former would cause a distcleancheck panic.
495f126e068Smrg    tmpdepfile1=$dir$base.o.d          # libtool 1.5
496f126e068Smrg    tmpdepfile2=$dir.libs/$base.o.d    # Likewise.
497f126e068Smrg    tmpdepfile3=$dir.libs/$base.d      # Compaq CCC V6.2-504
498f126e068Smrg    "$@" -Wc,-MD
499f126e068Smrg  else
500f126e068Smrg    tmpdepfile1=$dir$base.d
501f126e068Smrg    tmpdepfile2=$dir$base.d
502f126e068Smrg    tmpdepfile3=$dir$base.d
503f126e068Smrg    "$@" -MD
504f126e068Smrg  fi
505f126e068Smrg
506f126e068Smrg  stat=$?
507f126e068Smrg  if test $stat -ne 0; then
508f126e068Smrg    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
509f126e068Smrg    exit $stat
510f126e068Smrg  fi
511f126e068Smrg
512f126e068Smrg  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
513f126e068Smrg  do
514f126e068Smrg    test -f "$tmpdepfile" && break
515f126e068Smrg  done
516f126e068Smrg  # Same post-processing that is required for AIX mode.
517f126e068Smrg  aix_post_process_depfile
518f126e068Smrg  ;;
519f126e068Smrg
520f126e068Smrgmsvc7)
521f126e068Smrg  if test "$libtool" = yes; then
522f126e068Smrg    showIncludes=-Wc,-showIncludes
523f126e068Smrg  else
524f126e068Smrg    showIncludes=-showIncludes
525f126e068Smrg  fi
526f126e068Smrg  "$@" $showIncludes > "$tmpdepfile"
527f126e068Smrg  stat=$?
528f126e068Smrg  grep -v '^Note: including file: ' "$tmpdepfile"
529f126e068Smrg  if test $stat -ne 0; then
530f126e068Smrg    rm -f "$tmpdepfile"
531f126e068Smrg    exit $stat
532f126e068Smrg  fi
533f126e068Smrg  rm -f "$depfile"
534f126e068Smrg  echo "$object : \\" > "$depfile"
535f126e068Smrg  # The first sed program below extracts the file names and escapes
536f126e068Smrg  # backslashes for cygpath.  The second sed program outputs the file
537f126e068Smrg  # name when reading, but also accumulates all include files in the
538f126e068Smrg  # hold buffer in order to output them again at the end.  This only
539f126e068Smrg  # works with sed implementations that can handle large buffers.
540f126e068Smrg  sed < "$tmpdepfile" -n '
541f126e068Smrg/^Note: including file:  *\(.*\)/ {
542f126e068Smrg  s//\1/
543f126e068Smrg  s/\\/\\\\/g
544f126e068Smrg  p
545f126e068Smrg}' | $cygpath_u | sort -u | sed -n '
546f126e068Smrgs/ /\\ /g
547f126e068Smrgs/\(.*\)/'"$tab"'\1 \\/p
548f126e068Smrgs/.\(.*\) \\/\1:/
549f126e068SmrgH
550f126e068Smrg$ {
551f126e068Smrg  s/.*/'"$tab"'/
552f126e068Smrg  G
553f126e068Smrg  p
554f126e068Smrg}' >> "$depfile"
555f126e068Smrg  echo >> "$depfile" # make sure the fragment doesn't end with a backslash
556f126e068Smrg  rm -f "$tmpdepfile"
557f126e068Smrg  ;;
558f126e068Smrg
559f126e068Smrgmsvc7msys)
560f126e068Smrg  # This case exists only to let depend.m4 do its work.  It works by
561f126e068Smrg  # looking at the text of this script.  This case will never be run,
562f126e068Smrg  # since it is checked for above.
563f126e068Smrg  exit 1
564f126e068Smrg  ;;
5658b22bf3fSmrg
5668b22bf3fSmrg#nosideeffect)
5678b22bf3fSmrg  # This comment above is used by automake to tell side-effect
5688b22bf3fSmrg  # dependency tracking mechanisms from slower ones.
5698b22bf3fSmrg
5708b22bf3fSmrgdashmstdout)
5718b22bf3fSmrg  # Important note: in order to support this mode, a compiler *must*
5728b22bf3fSmrg  # always write the preprocessed file to stdout, regardless of -o.
5738b22bf3fSmrg  "$@" || exit $?
5748b22bf3fSmrg
5758b22bf3fSmrg  # Remove the call to Libtool.
5768b22bf3fSmrg  if test "$libtool" = yes; then
57796a81b41Smrg    while test "X$1" != 'X--mode=compile'; do
5788b22bf3fSmrg      shift
5798b22bf3fSmrg    done
5808b22bf3fSmrg    shift
5818b22bf3fSmrg  fi
5828b22bf3fSmrg
583f126e068Smrg  # Remove '-o $object'.
5848b22bf3fSmrg  IFS=" "
5858b22bf3fSmrg  for arg
5868b22bf3fSmrg  do
5878b22bf3fSmrg    case $arg in
5888b22bf3fSmrg    -o)
5898b22bf3fSmrg      shift
5908b22bf3fSmrg      ;;
5918b22bf3fSmrg    $object)
5928b22bf3fSmrg      shift
5938b22bf3fSmrg      ;;
5948b22bf3fSmrg    *)
5958b22bf3fSmrg      set fnord "$@" "$arg"
5968b22bf3fSmrg      shift # fnord
5978b22bf3fSmrg      shift # $arg
5988b22bf3fSmrg      ;;
5998b22bf3fSmrg    esac
6008b22bf3fSmrg  done
6018b22bf3fSmrg
6028b22bf3fSmrg  test -z "$dashmflag" && dashmflag=-M
603f126e068Smrg  # Require at least two characters before searching for ':'
6048b22bf3fSmrg  # in the target name.  This is to cope with DOS-style filenames:
605f126e068Smrg  # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise.
6068b22bf3fSmrg  "$@" $dashmflag |
607f126e068Smrg    sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile"
6088b22bf3fSmrg  rm -f "$depfile"
6098b22bf3fSmrg  cat < "$tmpdepfile" > "$depfile"
610f126e068Smrg  # Some versions of the HPUX 10.20 sed can't process this sed invocation
611f126e068Smrg  # correctly.  Breaking it into two sed invocations is a workaround.
612f126e068Smrg  tr ' ' "$nl" < "$tmpdepfile" \
613f126e068Smrg    | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
614f126e068Smrg    | sed -e 's/$/ :/' >> "$depfile"
6158b22bf3fSmrg  rm -f "$tmpdepfile"
6168b22bf3fSmrg  ;;
6178b22bf3fSmrg
6188b22bf3fSmrgdashXmstdout)
6198b22bf3fSmrg  # This case only exists to satisfy depend.m4.  It is never actually
6208b22bf3fSmrg  # run, as this mode is specially recognized in the preamble.
6218b22bf3fSmrg  exit 1
6228b22bf3fSmrg  ;;
6238b22bf3fSmrg
6248b22bf3fSmrgmakedepend)
6258b22bf3fSmrg  "$@" || exit $?
6268b22bf3fSmrg  # Remove any Libtool call
6278b22bf3fSmrg  if test "$libtool" = yes; then
62896a81b41Smrg    while test "X$1" != 'X--mode=compile'; do
6298b22bf3fSmrg      shift
6308b22bf3fSmrg    done
6318b22bf3fSmrg    shift
6328b22bf3fSmrg  fi
6338b22bf3fSmrg  # X makedepend
6348b22bf3fSmrg  shift
63596a81b41Smrg  cleared=no eat=no
63696a81b41Smrg  for arg
63796a81b41Smrg  do
6388b22bf3fSmrg    case $cleared in
6398b22bf3fSmrg    no)
6408b22bf3fSmrg      set ""; shift
6418b22bf3fSmrg      cleared=yes ;;
6428b22bf3fSmrg    esac
64396a81b41Smrg    if test $eat = yes; then
64496a81b41Smrg      eat=no
64596a81b41Smrg      continue
64696a81b41Smrg    fi
6478b22bf3fSmrg    case "$arg" in
6488b22bf3fSmrg    -D*|-I*)
6498b22bf3fSmrg      set fnord "$@" "$arg"; shift ;;
6508b22bf3fSmrg    # Strip any option that makedepend may not understand.  Remove
6518b22bf3fSmrg    # the object too, otherwise makedepend will parse it as a source file.
65296a81b41Smrg    -arch)
65396a81b41Smrg      eat=yes ;;
6548b22bf3fSmrg    -*|$object)
6558b22bf3fSmrg      ;;
6568b22bf3fSmrg    *)
6578b22bf3fSmrg      set fnord "$@" "$arg"; shift ;;
6588b22bf3fSmrg    esac
6598b22bf3fSmrg  done
66096a81b41Smrg  obj_suffix=`echo "$object" | sed 's/^.*\././'`
6618b22bf3fSmrg  touch "$tmpdepfile"
6628b22bf3fSmrg  ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
6638b22bf3fSmrg  rm -f "$depfile"
664f126e068Smrg  # makedepend may prepend the VPATH from the source file name to the object.
665f126e068Smrg  # No need to regex-escape $object, excess matching of '.' is harmless.
666f126e068Smrg  sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile"
667f126e068Smrg  # Some versions of the HPUX 10.20 sed can't process the last invocation
668f126e068Smrg  # correctly.  Breaking it into two sed invocations is a workaround.
669f126e068Smrg  sed '1,2d' "$tmpdepfile" \
670f126e068Smrg    | tr ' ' "$nl" \
671f126e068Smrg    | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
672f126e068Smrg    | sed -e 's/$/ :/' >> "$depfile"
6738b22bf3fSmrg  rm -f "$tmpdepfile" "$tmpdepfile".bak
6748b22bf3fSmrg  ;;
6758b22bf3fSmrg
6768b22bf3fSmrgcpp)
6778b22bf3fSmrg  # Important note: in order to support this mode, a compiler *must*
6788b22bf3fSmrg  # always write the preprocessed file to stdout.
6798b22bf3fSmrg  "$@" || exit $?
6808b22bf3fSmrg
6818b22bf3fSmrg  # Remove the call to Libtool.
6828b22bf3fSmrg  if test "$libtool" = yes; then
68396a81b41Smrg    while test "X$1" != 'X--mode=compile'; do
6848b22bf3fSmrg      shift
6858b22bf3fSmrg    done
6868b22bf3fSmrg    shift
6878b22bf3fSmrg  fi
6888b22bf3fSmrg
689f126e068Smrg  # Remove '-o $object'.
6908b22bf3fSmrg  IFS=" "
6918b22bf3fSmrg  for arg
6928b22bf3fSmrg  do
6938b22bf3fSmrg    case $arg in
6948b22bf3fSmrg    -o)
6958b22bf3fSmrg      shift
6968b22bf3fSmrg      ;;
6978b22bf3fSmrg    $object)
6988b22bf3fSmrg      shift
6998b22bf3fSmrg      ;;
7008b22bf3fSmrg    *)
7018b22bf3fSmrg      set fnord "$@" "$arg"
7028b22bf3fSmrg      shift # fnord
7038b22bf3fSmrg      shift # $arg
7048b22bf3fSmrg      ;;
7058b22bf3fSmrg    esac
7068b22bf3fSmrg  done
7078b22bf3fSmrg
708f126e068Smrg  "$@" -E \
709f126e068Smrg    | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
710f126e068Smrg             -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
711f126e068Smrg    | sed '$ s: \\$::' > "$tmpdepfile"
7128b22bf3fSmrg  rm -f "$depfile"
7138b22bf3fSmrg  echo "$object : \\" > "$depfile"
7148b22bf3fSmrg  cat < "$tmpdepfile" >> "$depfile"
7158b22bf3fSmrg  sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
7168b22bf3fSmrg  rm -f "$tmpdepfile"
7178b22bf3fSmrg  ;;
7188b22bf3fSmrg
7198b22bf3fSmrgmsvisualcpp)
7208b22bf3fSmrg  # Important note: in order to support this mode, a compiler *must*
72196a81b41Smrg  # always write the preprocessed file to stdout.
7228b22bf3fSmrg  "$@" || exit $?
72396a81b41Smrg
72496a81b41Smrg  # Remove the call to Libtool.
72596a81b41Smrg  if test "$libtool" = yes; then
72696a81b41Smrg    while test "X$1" != 'X--mode=compile'; do
72796a81b41Smrg      shift
72896a81b41Smrg    done
72996a81b41Smrg    shift
73096a81b41Smrg  fi
73196a81b41Smrg
7328b22bf3fSmrg  IFS=" "
7338b22bf3fSmrg  for arg
7348b22bf3fSmrg  do
7358b22bf3fSmrg    case "$arg" in
73696a81b41Smrg    -o)
73796a81b41Smrg      shift
73896a81b41Smrg      ;;
73996a81b41Smrg    $object)
74096a81b41Smrg      shift
74196a81b41Smrg      ;;
7428b22bf3fSmrg    "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
743f126e068Smrg        set fnord "$@"
744f126e068Smrg        shift
745f126e068Smrg        shift
746f126e068Smrg        ;;
7478b22bf3fSmrg    *)
748f126e068Smrg        set fnord "$@" "$arg"
749f126e068Smrg        shift
750f126e068Smrg        shift
751f126e068Smrg        ;;
7528b22bf3fSmrg    esac
7538b22bf3fSmrg  done
75496a81b41Smrg  "$@" -E 2>/dev/null |
75596a81b41Smrg  sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile"
7568b22bf3fSmrg  rm -f "$depfile"
7578b22bf3fSmrg  echo "$object : \\" > "$depfile"
758f126e068Smrg  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile"
759f126e068Smrg  echo "$tab" >> "$depfile"
76096a81b41Smrg  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile"
7618b22bf3fSmrg  rm -f "$tmpdepfile"
7628b22bf3fSmrg  ;;
7638b22bf3fSmrg
76496a81b41Smrgmsvcmsys)
76596a81b41Smrg  # This case exists only to let depend.m4 do its work.  It works by
76696a81b41Smrg  # looking at the text of this script.  This case will never be run,
76796a81b41Smrg  # since it is checked for above.
76896a81b41Smrg  exit 1
76996a81b41Smrg  ;;
77096a81b41Smrg
7718b22bf3fSmrgnone)
7728b22bf3fSmrg  exec "$@"
7738b22bf3fSmrg  ;;
7748b22bf3fSmrg
7758b22bf3fSmrg*)
7768b22bf3fSmrg  echo "Unknown depmode $depmode" 1>&2
7778b22bf3fSmrg  exit 1
7788b22bf3fSmrg  ;;
7798b22bf3fSmrgesac
7808b22bf3fSmrg
7818b22bf3fSmrgexit 0
7828b22bf3fSmrg
7838b22bf3fSmrg# Local Variables:
7848b22bf3fSmrg# mode: shell-script
7858b22bf3fSmrg# sh-indentation: 2
7869e1184feSmrg# eval: (add-hook 'before-save-hook 'time-stamp)
7878b22bf3fSmrg# time-stamp-start: "scriptversion="
7888b22bf3fSmrg# time-stamp-format: "%:y-%02m-%02d.%02H"
7899e1184feSmrg# time-stamp-time-zone: "UTC0"
79096a81b41Smrg# time-stamp-end: "; # UTC"
7918b22bf3fSmrg# End:
792