depcomp revision b8414663
17d5e3a19Smrg#! /bin/sh
27d5e3a19Smrg# depcomp - compile a program generating dependencies as side-effects
37d5e3a19Smrg
4b8414663Smrgscriptversion=2013-05-30.07; # UTC
57d5e3a19Smrg
6b8414663Smrg# Copyright (C) 1999-2014 Free Software Foundation, Inc.
77d5e3a19Smrg
87d5e3a19Smrg# This program is free software; you can redistribute it and/or modify
97d5e3a19Smrg# it under the terms of the GNU General Public License as published by
107d5e3a19Smrg# the Free Software Foundation; either version 2, or (at your option)
117d5e3a19Smrg# any later version.
127d5e3a19Smrg
137d5e3a19Smrg# This program is distributed in the hope that it will be useful,
147d5e3a19Smrg# but WITHOUT ANY WARRANTY; without even the implied warranty of
157d5e3a19Smrg# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
167d5e3a19Smrg# GNU General Public License for more details.
177d5e3a19Smrg
187d5e3a19Smrg# You should have received a copy of the GNU General Public License
19765486e8Smrg# along with this program.  If not, see <http://www.gnu.org/licenses/>.
207d5e3a19Smrg
217d5e3a19Smrg# As a special exception to the GNU General Public License, if you
227d5e3a19Smrg# distribute this file as part of a program that contains a
237d5e3a19Smrg# configuration script generated by Autoconf, you may include it under
247d5e3a19Smrg# the same distribution terms that you use for the rest of that program.
257d5e3a19Smrg
267d5e3a19Smrg# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>.
277d5e3a19Smrg
287d5e3a19Smrgcase $1 in
297d5e3a19Smrg  '')
30b8414663Smrg    echo "$0: No command.  Try '$0 --help' for more information." 1>&2
31b8414663Smrg    exit 1;
32b8414663Smrg    ;;
337d5e3a19Smrg  -h | --h*)
347d5e3a19Smrg    cat <<\EOF
357d5e3a19SmrgUsage: depcomp [--help] [--version] PROGRAM [ARGS]
367d5e3a19Smrg
377d5e3a19SmrgRun PROGRAMS ARGS to compile a file, generating dependencies
387d5e3a19Smrgas side-effects.
397d5e3a19Smrg
407d5e3a19SmrgEnvironment variables:
417d5e3a19Smrg  depmode     Dependency tracking mode.
42b8414663Smrg  source      Source file read by 'PROGRAMS ARGS'.
43b8414663Smrg  object      Object file output by 'PROGRAMS ARGS'.
447d5e3a19Smrg  DEPDIR      directory where to store dependencies.
457d5e3a19Smrg  depfile     Dependency file to output.
46b8414663Smrg  tmpdepfile  Temporary file to use when outputting dependencies.
477d5e3a19Smrg  libtool     Whether libtool is used (yes/no).
487d5e3a19Smrg
497d5e3a19SmrgReport bugs to <bug-automake@gnu.org>.
507d5e3a19SmrgEOF
517d5e3a19Smrg    exit $?
527d5e3a19Smrg    ;;
537d5e3a19Smrg  -v | --v*)
547d5e3a19Smrg    echo "depcomp $scriptversion"
557d5e3a19Smrg    exit $?
567d5e3a19Smrg    ;;
577d5e3a19Smrgesac
587d5e3a19Smrg
59b8414663Smrg# Get the directory component of the given path, and save it in the
60b8414663Smrg# global variables '$dir'.  Note that this directory component will
61b8414663Smrg# be either empty or ending with a '/' character.  This is deliberate.
62b8414663Smrgset_dir_from ()
63b8414663Smrg{
64b8414663Smrg  case $1 in
65b8414663Smrg    */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;;
66b8414663Smrg      *) dir=;;
67b8414663Smrg  esac
68b8414663Smrg}
69b8414663Smrg
70b8414663Smrg# Get the suffix-stripped basename of the given path, and save it the
71b8414663Smrg# global variable '$base'.
72b8414663Smrgset_base_from ()
73b8414663Smrg{
74b8414663Smrg  base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'`
75b8414663Smrg}
76b8414663Smrg
77b8414663Smrg# If no dependency file was actually created by the compiler invocation,
78b8414663Smrg# we still have to create a dummy depfile, to avoid errors with the
79b8414663Smrg# Makefile "include basename.Plo" scheme.
80b8414663Smrgmake_dummy_depfile ()
81b8414663Smrg{
82b8414663Smrg  echo "#dummy" > "$depfile"
83b8414663Smrg}
84b8414663Smrg
85b8414663Smrg# Factor out some common post-processing of the generated depfile.
86b8414663Smrg# Requires the auxiliary global variable '$tmpdepfile' to be set.
87b8414663Smrgaix_post_process_depfile ()
88b8414663Smrg{
89b8414663Smrg  # If the compiler actually managed to produce a dependency file,
90b8414663Smrg  # post-process it.
91b8414663Smrg  if test -f "$tmpdepfile"; then
92b8414663Smrg    # Each line is of the form 'foo.o: dependency.h'.
93b8414663Smrg    # Do two passes, one to just change these to
94b8414663Smrg    #   $object: dependency.h
95b8414663Smrg    # and one to simply output
96b8414663Smrg    #   dependency.h:
97b8414663Smrg    # which is needed to avoid the deleted-header problem.
98b8414663Smrg    { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile"
99b8414663Smrg      sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile"
100b8414663Smrg    } > "$depfile"
101b8414663Smrg    rm -f "$tmpdepfile"
102b8414663Smrg  else
103b8414663Smrg    make_dummy_depfile
104b8414663Smrg  fi
105b8414663Smrg}
106b8414663Smrg
107b8414663Smrg# A tabulation character.
108b8414663Smrgtab='	'
109b8414663Smrg# A newline character.
110b8414663Smrgnl='
111b8414663Smrg'
112b8414663Smrg# Character ranges might be problematic outside the C locale.
113b8414663Smrg# These definitions help.
114b8414663Smrgupper=ABCDEFGHIJKLMNOPQRSTUVWXYZ
115b8414663Smrglower=abcdefghijklmnopqrstuvwxyz
116b8414663Smrgdigits=0123456789
117b8414663Smrgalpha=${upper}${lower}
118b8414663Smrg
1197d5e3a19Smrgif test -z "$depmode" || test -z "$source" || test -z "$object"; then
1207d5e3a19Smrg  echo "depcomp: Variables source, object and depmode must be set" 1>&2
1217d5e3a19Smrg  exit 1
1227d5e3a19Smrgfi
1237d5e3a19Smrg
1247d5e3a19Smrg# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.
1257d5e3a19Smrgdepfile=${depfile-`echo "$object" |
1267d5e3a19Smrg  sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`}
1277d5e3a19Smrgtmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
1287d5e3a19Smrg
1297d5e3a19Smrgrm -f "$tmpdepfile"
1307d5e3a19Smrg
131b8414663Smrg# Avoid interferences from the environment.
132b8414663Smrggccflag= dashmflag=
133b8414663Smrg
1347d5e3a19Smrg# Some modes work just like other modes, but use different flags.  We
1357d5e3a19Smrg# parameterize here, but still list the modes in the big case below,
1367d5e3a19Smrg# to make depend.m4 easier to write.  Note that we *cannot* use a case
1377d5e3a19Smrg# here, because this file can only contain one case statement.
1387d5e3a19Smrgif test "$depmode" = hp; then
1397d5e3a19Smrg  # HP compiler uses -M and no extra arg.
1407d5e3a19Smrg  gccflag=-M
1417d5e3a19Smrg  depmode=gcc
1427d5e3a19Smrgfi
1437d5e3a19Smrg
1447d5e3a19Smrgif test "$depmode" = dashXmstdout; then
145b8414663Smrg  # This is just like dashmstdout with a different argument.
146b8414663Smrg  dashmflag=-xM
147b8414663Smrg  depmode=dashmstdout
1487d5e3a19Smrgfi
1497d5e3a19Smrg
150765486e8Smrgcygpath_u="cygpath -u -f -"
151765486e8Smrgif test "$depmode" = msvcmsys; then
152b8414663Smrg  # This is just like msvisualcpp but w/o cygpath translation.
153b8414663Smrg  # Just convert the backslash-escaped backslashes to single forward
154b8414663Smrg  # slashes to satisfy depend.m4
155b8414663Smrg  cygpath_u='sed s,\\\\,/,g'
156b8414663Smrg  depmode=msvisualcpp
157b8414663Smrgfi
158b8414663Smrg
159b8414663Smrgif test "$depmode" = msvc7msys; then
160b8414663Smrg  # This is just like msvc7 but w/o cygpath translation.
161b8414663Smrg  # Just convert the backslash-escaped backslashes to single forward
162b8414663Smrg  # slashes to satisfy depend.m4
163b8414663Smrg  cygpath_u='sed s,\\\\,/,g'
164b8414663Smrg  depmode=msvc7
165b8414663Smrgfi
166b8414663Smrg
167b8414663Smrgif test "$depmode" = xlc; then
168b8414663Smrg  # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information.
169b8414663Smrg  gccflag=-qmakedep=gcc,-MF
170b8414663Smrg  depmode=gcc
171765486e8Smrgfi
172765486e8Smrg
1737d5e3a19Smrgcase "$depmode" in
1747d5e3a19Smrggcc3)
1757d5e3a19Smrg## gcc 3 implements dependency tracking that does exactly what
1767d5e3a19Smrg## we want.  Yay!  Note: for some reason libtool 1.4 doesn't like
1777d5e3a19Smrg## it if -MD -MP comes after the -MF stuff.  Hmm.
1787d5e3a19Smrg## Unfortunately, FreeBSD c89 acceptance of flags depends upon
1797d5e3a19Smrg## the command line argument order; so add the flags where they
1807d5e3a19Smrg## appear in depend2.am.  Note that the slowdown incurred here
1817d5e3a19Smrg## affects only configure: in makefiles, %FASTDEP% shortcuts this.
1827d5e3a19Smrg  for arg
1837d5e3a19Smrg  do
1847d5e3a19Smrg    case $arg in
1857d5e3a19Smrg    -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;;
1867d5e3a19Smrg    *)  set fnord "$@" "$arg" ;;
1877d5e3a19Smrg    esac
1887d5e3a19Smrg    shift # fnord
1897d5e3a19Smrg    shift # $arg
1907d5e3a19Smrg  done
1917d5e3a19Smrg  "$@"
1927d5e3a19Smrg  stat=$?
193b8414663Smrg  if test $stat -ne 0; then
1947d5e3a19Smrg    rm -f "$tmpdepfile"
1957d5e3a19Smrg    exit $stat
1967d5e3a19Smrg  fi
1977d5e3a19Smrg  mv "$tmpdepfile" "$depfile"
1987d5e3a19Smrg  ;;
1997d5e3a19Smrg
2007d5e3a19Smrggcc)
201b8414663Smrg## Note that this doesn't just cater to obsosete pre-3.x GCC compilers.
202b8414663Smrg## but also to in-use compilers like IMB xlc/xlC and the HP C compiler.
203b8414663Smrg## (see the conditional assignment to $gccflag above).
2047d5e3a19Smrg## There are various ways to get dependency output from gcc.  Here's
2057d5e3a19Smrg## why we pick this rather obscure method:
2067d5e3a19Smrg## - Don't want to use -MD because we'd like the dependencies to end
2077d5e3a19Smrg##   up in a subdir.  Having to rename by hand is ugly.
2087d5e3a19Smrg##   (We might end up doing this anyway to support other compilers.)
2097d5e3a19Smrg## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
210b8414663Smrg##   -MM, not -M (despite what the docs say).  Also, it might not be
211b8414663Smrg##   supported by the other compilers which use the 'gcc' depmode.
2127d5e3a19Smrg## - Using -M directly means running the compiler twice (even worse
2137d5e3a19Smrg##   than renaming).
2147d5e3a19Smrg  if test -z "$gccflag"; then
2157d5e3a19Smrg    gccflag=-MD,
2167d5e3a19Smrg  fi
2177d5e3a19Smrg  "$@" -Wp,"$gccflag$tmpdepfile"
2187d5e3a19Smrg  stat=$?
219b8414663Smrg  if test $stat -ne 0; then
2207d5e3a19Smrg    rm -f "$tmpdepfile"
2217d5e3a19Smrg    exit $stat
2227d5e3a19Smrg  fi
2237d5e3a19Smrg  rm -f "$depfile"
2247d5e3a19Smrg  echo "$object : \\" > "$depfile"
225b8414663Smrg  # The second -e expression handles DOS-style file names with drive
226b8414663Smrg  # letters.
2277d5e3a19Smrg  sed -e 's/^[^:]*: / /' \
2287d5e3a19Smrg      -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
229b8414663Smrg## This next piece of magic avoids the "deleted header file" problem.
2307d5e3a19Smrg## The problem is that when a header file which appears in a .P file
2317d5e3a19Smrg## is deleted, the dependency causes make to die (because there is
2327d5e3a19Smrg## typically no way to rebuild the header).  We avoid this by adding
2337d5e3a19Smrg## dummy dependencies for each header file.  Too bad gcc doesn't do
2347d5e3a19Smrg## this for us directly.
235b8414663Smrg## Some versions of gcc put a space before the ':'.  On the theory
2367d5e3a19Smrg## that the space means something, we add a space to the output as
237b8414663Smrg## well.  hp depmode also adds that space, but also prefixes the VPATH
238b8414663Smrg## to the object.  Take care to not repeat it in the output.
2397d5e3a19Smrg## Some versions of the HPUX 10.20 sed can't process this invocation
2407d5e3a19Smrg## correctly.  Breaking it into two sed invocations is a workaround.
241b8414663Smrg  tr ' ' "$nl" < "$tmpdepfile" \
242b8414663Smrg    | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \
243b8414663Smrg    | sed -e 's/$/ :/' >> "$depfile"
2447d5e3a19Smrg  rm -f "$tmpdepfile"
2457d5e3a19Smrg  ;;
2467d5e3a19Smrg
2477d5e3a19Smrghp)
2487d5e3a19Smrg  # This case exists only to let depend.m4 do its work.  It works by
2497d5e3a19Smrg  # looking at the text of this script.  This case will never be run,
2507d5e3a19Smrg  # since it is checked for above.
2517d5e3a19Smrg  exit 1
2527d5e3a19Smrg  ;;
2537d5e3a19Smrg
2547d5e3a19Smrgsgi)
2557d5e3a19Smrg  if test "$libtool" = yes; then
2567d5e3a19Smrg    "$@" "-Wp,-MDupdate,$tmpdepfile"
2577d5e3a19Smrg  else
2587d5e3a19Smrg    "$@" -MDupdate "$tmpdepfile"
2597d5e3a19Smrg  fi
2607d5e3a19Smrg  stat=$?
261b8414663Smrg  if test $stat -ne 0; then
2627d5e3a19Smrg    rm -f "$tmpdepfile"
2637d5e3a19Smrg    exit $stat
2647d5e3a19Smrg  fi
2657d5e3a19Smrg  rm -f "$depfile"
2667d5e3a19Smrg
2677d5e3a19Smrg  if test -f "$tmpdepfile"; then  # yes, the sourcefile depend on other files
2687d5e3a19Smrg    echo "$object : \\" > "$depfile"
2697d5e3a19Smrg    # Clip off the initial element (the dependent).  Don't try to be
2707d5e3a19Smrg    # clever and replace this with sed code, as IRIX sed won't handle
2717d5e3a19Smrg    # lines with more than a fixed number of characters (4096 in
2727d5e3a19Smrg    # IRIX 6.2 sed, 8192 in IRIX 6.5).  We also remove comment lines;
273b8414663Smrg    # the IRIX cc adds comments like '#:fec' to the end of the
2747d5e3a19Smrg    # dependency line.
275b8414663Smrg    tr ' ' "$nl" < "$tmpdepfile" \
276b8414663Smrg      | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \
277b8414663Smrg      | tr "$nl" ' ' >> "$depfile"
278765486e8Smrg    echo >> "$depfile"
2797d5e3a19Smrg    # The second pass generates a dummy entry for each header file.
280b8414663Smrg    tr ' ' "$nl" < "$tmpdepfile" \
281b8414663Smrg      | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
282b8414663Smrg      >> "$depfile"
2837d5e3a19Smrg  else
284b8414663Smrg    make_dummy_depfile
2857d5e3a19Smrg  fi
2867d5e3a19Smrg  rm -f "$tmpdepfile"
2877d5e3a19Smrg  ;;
2887d5e3a19Smrg
289b8414663Smrgxlc)
290b8414663Smrg  # This case exists only to let depend.m4 do its work.  It works by
291b8414663Smrg  # looking at the text of this script.  This case will never be run,
292b8414663Smrg  # since it is checked for above.
293b8414663Smrg  exit 1
294b8414663Smrg  ;;
295b8414663Smrg
2967d5e3a19Smrgaix)
2977d5e3a19Smrg  # The C for AIX Compiler uses -M and outputs the dependencies
2987d5e3a19Smrg  # in a .u file.  In older versions, this file always lives in the
299b8414663Smrg  # current directory.  Also, the AIX compiler puts '$object:' at the
3007d5e3a19Smrg  # start of each line; $object doesn't have directory information.
3017d5e3a19Smrg  # Version 6 uses the directory in both cases.
302b8414663Smrg  set_dir_from "$object"
303b8414663Smrg  set_base_from "$object"
3047d5e3a19Smrg  if test "$libtool" = yes; then
3051568b75bSmrg    tmpdepfile1=$dir$base.u
3061568b75bSmrg    tmpdepfile2=$base.u
3071568b75bSmrg    tmpdepfile3=$dir.libs/$base.u
3087d5e3a19Smrg    "$@" -Wc,-M
3097d5e3a19Smrg  else
3101568b75bSmrg    tmpdepfile1=$dir$base.u
3111568b75bSmrg    tmpdepfile2=$dir$base.u
3121568b75bSmrg    tmpdepfile3=$dir$base.u
3137d5e3a19Smrg    "$@" -M
3147d5e3a19Smrg  fi
3157d5e3a19Smrg  stat=$?
316b8414663Smrg  if test $stat -ne 0; then
3171568b75bSmrg    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
3187d5e3a19Smrg    exit $stat
3197d5e3a19Smrg  fi
3207d5e3a19Smrg
3211568b75bSmrg  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
3221568b75bSmrg  do
3231568b75bSmrg    test -f "$tmpdepfile" && break
3241568b75bSmrg  done
325b8414663Smrg  aix_post_process_depfile
326b8414663Smrg  ;;
327b8414663Smrg
328b8414663Smrgtcc)
329b8414663Smrg  # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26
330b8414663Smrg  # FIXME: That version still under development at the moment of writing.
331b8414663Smrg  #        Make that this statement remains true also for stable, released
332b8414663Smrg  #        versions.
333b8414663Smrg  # It will wrap lines (doesn't matter whether long or short) with a
334b8414663Smrg  # trailing '\', as in:
335b8414663Smrg  #
336b8414663Smrg  #   foo.o : \
337b8414663Smrg  #    foo.c \
338b8414663Smrg  #    foo.h \
339b8414663Smrg  #
340b8414663Smrg  # It will put a trailing '\' even on the last line, and will use leading
341b8414663Smrg  # spaces rather than leading tabs (at least since its commit 0394caf7
342b8414663Smrg  # "Emit spaces for -MD").
343b8414663Smrg  "$@" -MD -MF "$tmpdepfile"
344b8414663Smrg  stat=$?
345b8414663Smrg  if test $stat -ne 0; then
346b8414663Smrg    rm -f "$tmpdepfile"
347b8414663Smrg    exit $stat
3487d5e3a19Smrg  fi
349b8414663Smrg  rm -f "$depfile"
350b8414663Smrg  # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'.
351b8414663Smrg  # We have to change lines of the first kind to '$object: \'.
352b8414663Smrg  sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile"
353b8414663Smrg  # And for each line of the second kind, we have to emit a 'dep.h:'
354b8414663Smrg  # dummy dependency, to avoid the deleted-header problem.
355b8414663Smrg  sed -n -e 's|^  *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile"
3567d5e3a19Smrg  rm -f "$tmpdepfile"
3577d5e3a19Smrg  ;;
3587d5e3a19Smrg
359b8414663Smrg## The order of this option in the case statement is important, since the
360b8414663Smrg## shell code in configure will try each of these formats in the order
361b8414663Smrg## listed in this file.  A plain '-MD' option would be understood by many
362b8414663Smrg## compilers, so we must ensure this comes after the gcc and icc options.
363b8414663Smrgpgcc)
364b8414663Smrg  # Portland's C compiler understands '-MD'.
365b8414663Smrg  # Will always output deps to 'file.d' where file is the root name of the
366b8414663Smrg  # source file under compilation, even if file resides in a subdirectory.
367b8414663Smrg  # The object file name does not affect the name of the '.d' file.
368b8414663Smrg  # pgcc 10.2 will output
3697d5e3a19Smrg  #    foo.o: sub/foo.c sub/foo.h
370b8414663Smrg  # and will wrap long lines using '\' :
3717d5e3a19Smrg  #    foo.o: sub/foo.c ... \
3727d5e3a19Smrg  #     sub/foo.h ... \
3737d5e3a19Smrg  #     ...
374b8414663Smrg  set_dir_from "$object"
375b8414663Smrg  # Use the source, not the object, to determine the base name, since
376b8414663Smrg  # that's sadly what pgcc will do too.
377b8414663Smrg  set_base_from "$source"
378b8414663Smrg  tmpdepfile=$base.d
379b8414663Smrg
380b8414663Smrg  # For projects that build the same source file twice into different object
381b8414663Smrg  # files, the pgcc approach of using the *source* file root name can cause
382b8414663Smrg  # problems in parallel builds.  Use a locking strategy to avoid stomping on
383b8414663Smrg  # the same $tmpdepfile.
384b8414663Smrg  lockdir=$base.d-lock
385b8414663Smrg  trap "
386b8414663Smrg    echo '$0: caught signal, cleaning up...' >&2
387b8414663Smrg    rmdir '$lockdir'
388b8414663Smrg    exit 1
389b8414663Smrg  " 1 2 13 15
390b8414663Smrg  numtries=100
391b8414663Smrg  i=$numtries
392b8414663Smrg  while test $i -gt 0; do
393b8414663Smrg    # mkdir is a portable test-and-set.
394b8414663Smrg    if mkdir "$lockdir" 2>/dev/null; then
395b8414663Smrg      # This process acquired the lock.
396b8414663Smrg      "$@" -MD
397b8414663Smrg      stat=$?
398b8414663Smrg      # Release the lock.
399b8414663Smrg      rmdir "$lockdir"
400b8414663Smrg      break
401b8414663Smrg    else
402b8414663Smrg      # If the lock is being held by a different process, wait
403b8414663Smrg      # until the winning process is done or we timeout.
404b8414663Smrg      while test -d "$lockdir" && test $i -gt 0; do
405b8414663Smrg        sleep 1
406b8414663Smrg        i=`expr $i - 1`
407b8414663Smrg      done
408b8414663Smrg    fi
409b8414663Smrg    i=`expr $i - 1`
410b8414663Smrg  done
411b8414663Smrg  trap - 1 2 13 15
412b8414663Smrg  if test $i -le 0; then
413b8414663Smrg    echo "$0: failed to acquire lock after $numtries attempts" >&2
414b8414663Smrg    echo "$0: check lockdir '$lockdir'" >&2
415b8414663Smrg    exit 1
416b8414663Smrg  fi
4177d5e3a19Smrg
418b8414663Smrg  if test $stat -ne 0; then
4197d5e3a19Smrg    rm -f "$tmpdepfile"
4207d5e3a19Smrg    exit $stat
4217d5e3a19Smrg  fi
4227d5e3a19Smrg  rm -f "$depfile"
4237d5e3a19Smrg  # Each line is of the form `foo.o: dependent.h',
4247d5e3a19Smrg  # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'.
4257d5e3a19Smrg  # Do two passes, one to just change these to
4267d5e3a19Smrg  # `$object: dependent.h' and one to simply `dependent.h:'.
4277d5e3a19Smrg  sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
4287d5e3a19Smrg  # Some versions of the HPUX 10.20 sed can't process this invocation
4297d5e3a19Smrg  # correctly.  Breaking it into two sed invocations is a workaround.
430b8414663Smrg  sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \
431b8414663Smrg    | sed -e 's/$/ :/' >> "$depfile"
4327d5e3a19Smrg  rm -f "$tmpdepfile"
4337d5e3a19Smrg  ;;
4347d5e3a19Smrg
4357d5e3a19Smrghp2)
4367d5e3a19Smrg  # The "hp" stanza above does not work with aCC (C++) and HP's ia64
4377d5e3a19Smrg  # compilers, which have integrated preprocessors.  The correct option
4387d5e3a19Smrg  # to use with these is +Maked; it writes dependencies to a file named
4397d5e3a19Smrg  # 'foo.d', which lands next to the object file, wherever that
4407d5e3a19Smrg  # happens to be.
4417d5e3a19Smrg  # Much of this is similar to the tru64 case; see comments there.
442b8414663Smrg  set_dir_from  "$object"
443b8414663Smrg  set_base_from "$object"
4447d5e3a19Smrg  if test "$libtool" = yes; then
4457d5e3a19Smrg    tmpdepfile1=$dir$base.d
4467d5e3a19Smrg    tmpdepfile2=$dir.libs/$base.d
4477d5e3a19Smrg    "$@" -Wc,+Maked
4487d5e3a19Smrg  else
4497d5e3a19Smrg    tmpdepfile1=$dir$base.d
4507d5e3a19Smrg    tmpdepfile2=$dir$base.d
4517d5e3a19Smrg    "$@" +Maked
4527d5e3a19Smrg  fi
4537d5e3a19Smrg  stat=$?
454b8414663Smrg  if test $stat -ne 0; then
4557d5e3a19Smrg     rm -f "$tmpdepfile1" "$tmpdepfile2"
4567d5e3a19Smrg     exit $stat
4577d5e3a19Smrg  fi
4587d5e3a19Smrg
4597d5e3a19Smrg  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2"
4607d5e3a19Smrg  do
4617d5e3a19Smrg    test -f "$tmpdepfile" && break
4627d5e3a19Smrg  done
4637d5e3a19Smrg  if test -f "$tmpdepfile"; then
464b8414663Smrg    sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile"
465b8414663Smrg    # Add 'dependent.h:' lines.
466765486e8Smrg    sed -ne '2,${
467b8414663Smrg               s/^ *//
468b8414663Smrg               s/ \\*$//
469b8414663Smrg               s/$/:/
470b8414663Smrg               p
471b8414663Smrg             }' "$tmpdepfile" >> "$depfile"
4727d5e3a19Smrg  else
473b8414663Smrg    make_dummy_depfile
4747d5e3a19Smrg  fi
4757d5e3a19Smrg  rm -f "$tmpdepfile" "$tmpdepfile2"
4767d5e3a19Smrg  ;;
4777d5e3a19Smrg
4787d5e3a19Smrgtru64)
479b8414663Smrg  # The Tru64 compiler uses -MD to generate dependencies as a side
480b8414663Smrg  # effect.  'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'.
481b8414663Smrg  # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
482b8414663Smrg  # dependencies in 'foo.d' instead, so we check for that too.
483b8414663Smrg  # Subdirectories are respected.
484b8414663Smrg  set_dir_from  "$object"
485b8414663Smrg  set_base_from "$object"
486b8414663Smrg
487b8414663Smrg  if test "$libtool" = yes; then
488b8414663Smrg    # Libtool generates 2 separate objects for the 2 libraries.  These
489b8414663Smrg    # two compilations output dependencies in $dir.libs/$base.o.d and
490b8414663Smrg    # in $dir$base.o.d.  We have to check for both files, because
491b8414663Smrg    # one of the two compilations can be disabled.  We should prefer
492b8414663Smrg    # $dir$base.o.d over $dir.libs/$base.o.d because the latter is
493b8414663Smrg    # automatically cleaned when .libs/ is deleted, while ignoring
494b8414663Smrg    # the former would cause a distcleancheck panic.
495b8414663Smrg    tmpdepfile1=$dir$base.o.d          # libtool 1.5
496b8414663Smrg    tmpdepfile2=$dir.libs/$base.o.d    # Likewise.
497b8414663Smrg    tmpdepfile3=$dir.libs/$base.d      # Compaq CCC V6.2-504
498b8414663Smrg    "$@" -Wc,-MD
499b8414663Smrg  else
500b8414663Smrg    tmpdepfile1=$dir$base.d
501b8414663Smrg    tmpdepfile2=$dir$base.d
502b8414663Smrg    tmpdepfile3=$dir$base.d
503b8414663Smrg    "$@" -MD
504b8414663Smrg  fi
505b8414663Smrg
506b8414663Smrg  stat=$?
507b8414663Smrg  if test $stat -ne 0; then
508b8414663Smrg    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
509b8414663Smrg    exit $stat
510b8414663Smrg  fi
511b8414663Smrg
512b8414663Smrg  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
513b8414663Smrg  do
514b8414663Smrg    test -f "$tmpdepfile" && break
515b8414663Smrg  done
516b8414663Smrg  # Same post-processing that is required for AIX mode.
517b8414663Smrg  aix_post_process_depfile
518b8414663Smrg  ;;
519b8414663Smrg
520b8414663Smrgmsvc7)
521b8414663Smrg  if test "$libtool" = yes; then
522b8414663Smrg    showIncludes=-Wc,-showIncludes
523b8414663Smrg  else
524b8414663Smrg    showIncludes=-showIncludes
525b8414663Smrg  fi
526b8414663Smrg  "$@" $showIncludes > "$tmpdepfile"
527b8414663Smrg  stat=$?
528b8414663Smrg  grep -v '^Note: including file: ' "$tmpdepfile"
529b8414663Smrg  if test $stat -ne 0; then
530b8414663Smrg    rm -f "$tmpdepfile"
531b8414663Smrg    exit $stat
532b8414663Smrg  fi
533b8414663Smrg  rm -f "$depfile"
534b8414663Smrg  echo "$object : \\" > "$depfile"
535b8414663Smrg  # The first sed program below extracts the file names and escapes
536b8414663Smrg  # backslashes for cygpath.  The second sed program outputs the file
537b8414663Smrg  # name when reading, but also accumulates all include files in the
538b8414663Smrg  # hold buffer in order to output them again at the end.  This only
539b8414663Smrg  # works with sed implementations that can handle large buffers.
540b8414663Smrg  sed < "$tmpdepfile" -n '
541b8414663Smrg/^Note: including file:  *\(.*\)/ {
542b8414663Smrg  s//\1/
543b8414663Smrg  s/\\/\\\\/g
544b8414663Smrg  p
545b8414663Smrg}' | $cygpath_u | sort -u | sed -n '
546b8414663Smrgs/ /\\ /g
547b8414663Smrgs/\(.*\)/'"$tab"'\1 \\/p
548b8414663Smrgs/.\(.*\) \\/\1:/
549b8414663SmrgH
550b8414663Smrg$ {
551b8414663Smrg  s/.*/'"$tab"'/
552b8414663Smrg  G
553b8414663Smrg  p
554b8414663Smrg}' >> "$depfile"
555b8414663Smrg  echo >> "$depfile" # make sure the fragment doesn't end with a backslash
556b8414663Smrg  rm -f "$tmpdepfile"
557b8414663Smrg  ;;
558b8414663Smrg
559b8414663Smrgmsvc7msys)
560b8414663Smrg  # This case exists only to let depend.m4 do its work.  It works by
561b8414663Smrg  # looking at the text of this script.  This case will never be run,
562b8414663Smrg  # since it is checked for above.
563b8414663Smrg  exit 1
564b8414663Smrg  ;;
5657d5e3a19Smrg
5667d5e3a19Smrg#nosideeffect)
5677d5e3a19Smrg  # This comment above is used by automake to tell side-effect
5687d5e3a19Smrg  # dependency tracking mechanisms from slower ones.
5697d5e3a19Smrg
5707d5e3a19Smrgdashmstdout)
5717d5e3a19Smrg  # Important note: in order to support this mode, a compiler *must*
5727d5e3a19Smrg  # always write the preprocessed file to stdout, regardless of -o.
5737d5e3a19Smrg  "$@" || exit $?
5747d5e3a19Smrg
5757d5e3a19Smrg  # Remove the call to Libtool.
5767d5e3a19Smrg  if test "$libtool" = yes; then
577765486e8Smrg    while test "X$1" != 'X--mode=compile'; do
5787d5e3a19Smrg      shift
5797d5e3a19Smrg    done
5807d5e3a19Smrg    shift
5817d5e3a19Smrg  fi
5827d5e3a19Smrg
583b8414663Smrg  # Remove '-o $object'.
5847d5e3a19Smrg  IFS=" "
5857d5e3a19Smrg  for arg
5867d5e3a19Smrg  do
5877d5e3a19Smrg    case $arg in
5887d5e3a19Smrg    -o)
5897d5e3a19Smrg      shift
5907d5e3a19Smrg      ;;
5917d5e3a19Smrg    $object)
5927d5e3a19Smrg      shift
5937d5e3a19Smrg      ;;
5947d5e3a19Smrg    *)
5957d5e3a19Smrg      set fnord "$@" "$arg"
5967d5e3a19Smrg      shift # fnord
5977d5e3a19Smrg      shift # $arg
5987d5e3a19Smrg      ;;
5997d5e3a19Smrg    esac
6007d5e3a19Smrg  done
6017d5e3a19Smrg
6027d5e3a19Smrg  test -z "$dashmflag" && dashmflag=-M
603b8414663Smrg  # Require at least two characters before searching for ':'
6047d5e3a19Smrg  # in the target name.  This is to cope with DOS-style filenames:
605b8414663Smrg  # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise.
6067d5e3a19Smrg  "$@" $dashmflag |
607b8414663Smrg    sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile"
6087d5e3a19Smrg  rm -f "$depfile"
6097d5e3a19Smrg  cat < "$tmpdepfile" > "$depfile"
610b8414663Smrg  # Some versions of the HPUX 10.20 sed can't process this sed invocation
611b8414663Smrg  # correctly.  Breaking it into two sed invocations is a workaround.
612b8414663Smrg  tr ' ' "$nl" < "$tmpdepfile" \
613b8414663Smrg    | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
614b8414663Smrg    | sed -e 's/$/ :/' >> "$depfile"
6157d5e3a19Smrg  rm -f "$tmpdepfile"
6167d5e3a19Smrg  ;;
6177d5e3a19Smrg
6187d5e3a19SmrgdashXmstdout)
6197d5e3a19Smrg  # This case only exists to satisfy depend.m4.  It is never actually
6207d5e3a19Smrg  # run, as this mode is specially recognized in the preamble.
6217d5e3a19Smrg  exit 1
6227d5e3a19Smrg  ;;
6237d5e3a19Smrg
6247d5e3a19Smrgmakedepend)
6257d5e3a19Smrg  "$@" || exit $?
6267d5e3a19Smrg  # Remove any Libtool call
6277d5e3a19Smrg  if test "$libtool" = yes; then
628765486e8Smrg    while test "X$1" != 'X--mode=compile'; do
6297d5e3a19Smrg      shift
6307d5e3a19Smrg    done
6317d5e3a19Smrg    shift
6327d5e3a19Smrg  fi
6337d5e3a19Smrg  # X makedepend
6347d5e3a19Smrg  shift
635765486e8Smrg  cleared=no eat=no
636765486e8Smrg  for arg
637765486e8Smrg  do
6387d5e3a19Smrg    case $cleared in
6397d5e3a19Smrg    no)
6407d5e3a19Smrg      set ""; shift
6417d5e3a19Smrg      cleared=yes ;;
6427d5e3a19Smrg    esac
643765486e8Smrg    if test $eat = yes; then
644765486e8Smrg      eat=no
645765486e8Smrg      continue
646765486e8Smrg    fi
6477d5e3a19Smrg    case "$arg" in
6487d5e3a19Smrg    -D*|-I*)
6497d5e3a19Smrg      set fnord "$@" "$arg"; shift ;;
6507d5e3a19Smrg    # Strip any option that makedepend may not understand.  Remove
6517d5e3a19Smrg    # the object too, otherwise makedepend will parse it as a source file.
652765486e8Smrg    -arch)
653765486e8Smrg      eat=yes ;;
6547d5e3a19Smrg    -*|$object)
6557d5e3a19Smrg      ;;
6567d5e3a19Smrg    *)
6577d5e3a19Smrg      set fnord "$@" "$arg"; shift ;;
6587d5e3a19Smrg    esac
6597d5e3a19Smrg  done
660765486e8Smrg  obj_suffix=`echo "$object" | sed 's/^.*\././'`
6617d5e3a19Smrg  touch "$tmpdepfile"
6627d5e3a19Smrg  ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
6637d5e3a19Smrg  rm -f "$depfile"
664b8414663Smrg  # makedepend may prepend the VPATH from the source file name to the object.
665b8414663Smrg  # No need to regex-escape $object, excess matching of '.' is harmless.
666b8414663Smrg  sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile"
667b8414663Smrg  # Some versions of the HPUX 10.20 sed can't process the last invocation
668b8414663Smrg  # correctly.  Breaking it into two sed invocations is a workaround.
669b8414663Smrg  sed '1,2d' "$tmpdepfile" \
670b8414663Smrg    | tr ' ' "$nl" \
671b8414663Smrg    | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
672b8414663Smrg    | sed -e 's/$/ :/' >> "$depfile"
6737d5e3a19Smrg  rm -f "$tmpdepfile" "$tmpdepfile".bak
6747d5e3a19Smrg  ;;
6757d5e3a19Smrg
6767d5e3a19Smrgcpp)
6777d5e3a19Smrg  # Important note: in order to support this mode, a compiler *must*
6787d5e3a19Smrg  # always write the preprocessed file to stdout.
6797d5e3a19Smrg  "$@" || exit $?
6807d5e3a19Smrg
6817d5e3a19Smrg  # Remove the call to Libtool.
6827d5e3a19Smrg  if test "$libtool" = yes; then
683765486e8Smrg    while test "X$1" != 'X--mode=compile'; do
6847d5e3a19Smrg      shift
6857d5e3a19Smrg    done
6867d5e3a19Smrg    shift
6877d5e3a19Smrg  fi
6887d5e3a19Smrg
689b8414663Smrg  # Remove '-o $object'.
6907d5e3a19Smrg  IFS=" "
6917d5e3a19Smrg  for arg
6927d5e3a19Smrg  do
6937d5e3a19Smrg    case $arg in
6947d5e3a19Smrg    -o)
6957d5e3a19Smrg      shift
6967d5e3a19Smrg      ;;
6977d5e3a19Smrg    $object)
6987d5e3a19Smrg      shift
6997d5e3a19Smrg      ;;
7007d5e3a19Smrg    *)
7017d5e3a19Smrg      set fnord "$@" "$arg"
7027d5e3a19Smrg      shift # fnord
7037d5e3a19Smrg      shift # $arg
7047d5e3a19Smrg      ;;
7057d5e3a19Smrg    esac
7067d5e3a19Smrg  done
7077d5e3a19Smrg
708b8414663Smrg  "$@" -E \
709b8414663Smrg    | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
710b8414663Smrg             -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
711b8414663Smrg    | sed '$ s: \\$::' > "$tmpdepfile"
7127d5e3a19Smrg  rm -f "$depfile"
7137d5e3a19Smrg  echo "$object : \\" > "$depfile"
7147d5e3a19Smrg  cat < "$tmpdepfile" >> "$depfile"
7157d5e3a19Smrg  sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
7167d5e3a19Smrg  rm -f "$tmpdepfile"
7177d5e3a19Smrg  ;;
7187d5e3a19Smrg
7197d5e3a19Smrgmsvisualcpp)
7207d5e3a19Smrg  # Important note: in order to support this mode, a compiler *must*
721765486e8Smrg  # always write the preprocessed file to stdout.
7227d5e3a19Smrg  "$@" || exit $?
723765486e8Smrg
724765486e8Smrg  # Remove the call to Libtool.
725765486e8Smrg  if test "$libtool" = yes; then
726765486e8Smrg    while test "X$1" != 'X--mode=compile'; do
727765486e8Smrg      shift
728765486e8Smrg    done
729765486e8Smrg    shift
730765486e8Smrg  fi
731765486e8Smrg
7327d5e3a19Smrg  IFS=" "
7337d5e3a19Smrg  for arg
7347d5e3a19Smrg  do
7357d5e3a19Smrg    case "$arg" in
736765486e8Smrg    -o)
737765486e8Smrg      shift
738765486e8Smrg      ;;
739765486e8Smrg    $object)
740765486e8Smrg      shift
741765486e8Smrg      ;;
7427d5e3a19Smrg    "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
743b8414663Smrg        set fnord "$@"
744b8414663Smrg        shift
745b8414663Smrg        shift
746b8414663Smrg        ;;
7477d5e3a19Smrg    *)
748b8414663Smrg        set fnord "$@" "$arg"
749b8414663Smrg        shift
750b8414663Smrg        shift
751b8414663Smrg        ;;
7527d5e3a19Smrg    esac
7537d5e3a19Smrg  done
754765486e8Smrg  "$@" -E 2>/dev/null |
755765486e8Smrg  sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile"
7567d5e3a19Smrg  rm -f "$depfile"
7577d5e3a19Smrg  echo "$object : \\" > "$depfile"
758b8414663Smrg  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile"
759b8414663Smrg  echo "$tab" >> "$depfile"
760765486e8Smrg  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile"
7617d5e3a19Smrg  rm -f "$tmpdepfile"
7627d5e3a19Smrg  ;;
7637d5e3a19Smrg
764765486e8Smrgmsvcmsys)
765765486e8Smrg  # This case exists only to let depend.m4 do its work.  It works by
766765486e8Smrg  # looking at the text of this script.  This case will never be run,
767765486e8Smrg  # since it is checked for above.
768765486e8Smrg  exit 1
769765486e8Smrg  ;;
770765486e8Smrg
7717d5e3a19Smrgnone)
7727d5e3a19Smrg  exec "$@"
7737d5e3a19Smrg  ;;
7747d5e3a19Smrg
7757d5e3a19Smrg*)
7767d5e3a19Smrg  echo "Unknown depmode $depmode" 1>&2
7777d5e3a19Smrg  exit 1
7787d5e3a19Smrg  ;;
7797d5e3a19Smrgesac
7807d5e3a19Smrg
7817d5e3a19Smrgexit 0
7827d5e3a19Smrg
7837d5e3a19Smrg# Local Variables:
7847d5e3a19Smrg# mode: shell-script
7857d5e3a19Smrg# sh-indentation: 2
7867d5e3a19Smrg# eval: (add-hook 'write-file-hooks 'time-stamp)
7877d5e3a19Smrg# time-stamp-start: "scriptversion="
7887d5e3a19Smrg# time-stamp-format: "%:y-%02m-%02d.%02H"
789765486e8Smrg# time-stamp-time-zone: "UTC"
790765486e8Smrg# time-stamp-end: "; # UTC"
7917d5e3a19Smrg# End:
792