depcomp revision cf503b78
115fb4814Smrg#! /bin/sh
215fb4814Smrg# depcomp - compile a program generating dependencies as side-effects
315fb4814Smrg
4cf503b78Smrgscriptversion=2012-10-18.11; # UTC
515fb4814Smrg
6cf503b78Smrg# Copyright (C) 1999-2013 Free Software Foundation, Inc.
715fb4814Smrg
815fb4814Smrg# This program is free software; you can redistribute it and/or modify
915fb4814Smrg# it under the terms of the GNU General Public License as published by
1015fb4814Smrg# the Free Software Foundation; either version 2, or (at your option)
1115fb4814Smrg# any later version.
1215fb4814Smrg
1315fb4814Smrg# This program is distributed in the hope that it will be useful,
1415fb4814Smrg# but WITHOUT ANY WARRANTY; without even the implied warranty of
1515fb4814Smrg# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1615fb4814Smrg# GNU General Public License for more details.
1715fb4814Smrg
1815fb4814Smrg# You should have received a copy of the GNU General Public License
19b4d38c65Smrg# along with this program.  If not, see <http://www.gnu.org/licenses/>.
2015fb4814Smrg
2115fb4814Smrg# As a special exception to the GNU General Public License, if you
2215fb4814Smrg# distribute this file as part of a program that contains a
2315fb4814Smrg# configuration script generated by Autoconf, you may include it under
2415fb4814Smrg# the same distribution terms that you use for the rest of that program.
2515fb4814Smrg
2615fb4814Smrg# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>.
2715fb4814Smrg
2815fb4814Smrgcase $1 in
2915fb4814Smrg  '')
30cf503b78Smrg    echo "$0: No command.  Try '$0 --help' for more information." 1>&2
31cf503b78Smrg    exit 1;
32cf503b78Smrg    ;;
3315fb4814Smrg  -h | --h*)
3415fb4814Smrg    cat <<\EOF
3515fb4814SmrgUsage: depcomp [--help] [--version] PROGRAM [ARGS]
3615fb4814Smrg
3715fb4814SmrgRun PROGRAMS ARGS to compile a file, generating dependencies
3815fb4814Smrgas side-effects.
3915fb4814Smrg
4015fb4814SmrgEnvironment variables:
4115fb4814Smrg  depmode     Dependency tracking mode.
42cf503b78Smrg  source      Source file read by 'PROGRAMS ARGS'.
43cf503b78Smrg  object      Object file output by 'PROGRAMS ARGS'.
4415fb4814Smrg  DEPDIR      directory where to store dependencies.
4515fb4814Smrg  depfile     Dependency file to output.
46cf503b78Smrg  tmpdepfile  Temporary file to use when outputting dependencies.
4715fb4814Smrg  libtool     Whether libtool is used (yes/no).
4815fb4814Smrg
4915fb4814SmrgReport bugs to <bug-automake@gnu.org>.
5015fb4814SmrgEOF
5115fb4814Smrg    exit $?
5215fb4814Smrg    ;;
5315fb4814Smrg  -v | --v*)
5415fb4814Smrg    echo "depcomp $scriptversion"
5515fb4814Smrg    exit $?
5615fb4814Smrg    ;;
5715fb4814Smrgesac
5815fb4814Smrg
59cf503b78Smrg# Get the directory component of the given path, and save it in the
60cf503b78Smrg# global variables '$dir'.  Note that this directory component will
61cf503b78Smrg# be either empty or ending with a '/' character.  This is deliberate.
62cf503b78Smrgset_dir_from ()
63cf503b78Smrg{
64cf503b78Smrg  case $1 in
65cf503b78Smrg    */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;;
66cf503b78Smrg      *) dir=;;
67cf503b78Smrg  esac
68cf503b78Smrg}
69cf503b78Smrg
70cf503b78Smrg# Get the suffix-stripped basename of the given path, and save it the
71cf503b78Smrg# global variable '$base'.
72cf503b78Smrgset_base_from ()
73cf503b78Smrg{
74cf503b78Smrg  base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'`
75cf503b78Smrg}
76cf503b78Smrg
77cf503b78Smrg# If no dependency file was actually created by the compiler invocation,
78cf503b78Smrg# we still have to create a dummy depfile, to avoid errors with the
79cf503b78Smrg# Makefile "include basename.Plo" scheme.
80cf503b78Smrgmake_dummy_depfile ()
81cf503b78Smrg{
82cf503b78Smrg  echo "#dummy" > "$depfile"
83cf503b78Smrg}
84cf503b78Smrg
85cf503b78Smrg# Factor out some common post-processing of the generated depfile.
86cf503b78Smrg# Requires the auxiliary global variable '$tmpdepfile' to be set.
87cf503b78Smrgaix_post_process_depfile ()
88cf503b78Smrg{
89cf503b78Smrg  # If the compiler actually managed to produce a dependency file,
90cf503b78Smrg  # post-process it.
91cf503b78Smrg  if test -f "$tmpdepfile"; then
92cf503b78Smrg    # Each line is of the form 'foo.o: dependency.h'.
93cf503b78Smrg    # Do two passes, one to just change these to
94cf503b78Smrg    #   $object: dependency.h
95cf503b78Smrg    # and one to simply output
96cf503b78Smrg    #   dependency.h:
97cf503b78Smrg    # which is needed to avoid the deleted-header problem.
98cf503b78Smrg    { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile"
99cf503b78Smrg      sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile"
100cf503b78Smrg    } > "$depfile"
101cf503b78Smrg    rm -f "$tmpdepfile"
102cf503b78Smrg  else
103cf503b78Smrg    make_dummy_depfile
104cf503b78Smrg  fi
105cf503b78Smrg}
106cf503b78Smrg
107cf503b78Smrg# A tabulation character.
108cf503b78Smrgtab='	'
109cf503b78Smrg# A newline character.
110cf503b78Smrgnl='
111cf503b78Smrg'
112cf503b78Smrg# Character ranges might be problematic outside the C locale.
113cf503b78Smrg# These definitions help.
114cf503b78Smrgupper=ABCDEFGHIJKLMNOPQRSTUVWXYZ
115cf503b78Smrglower=abcdefghijklmnopqrstuvwxyz
116cf503b78Smrgdigits=0123456789
117cf503b78Smrgalpha=${upper}${lower}
118cf503b78Smrg
11915fb4814Smrgif test -z "$depmode" || test -z "$source" || test -z "$object"; then
12015fb4814Smrg  echo "depcomp: Variables source, object and depmode must be set" 1>&2
12115fb4814Smrg  exit 1
12215fb4814Smrgfi
12315fb4814Smrg
12415fb4814Smrg# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.
12515fb4814Smrgdepfile=${depfile-`echo "$object" |
12615fb4814Smrg  sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`}
12715fb4814Smrgtmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
12815fb4814Smrg
12915fb4814Smrgrm -f "$tmpdepfile"
13015fb4814Smrg
131cf503b78Smrg# Avoid interferences from the environment.
132cf503b78Smrggccflag= dashmflag=
133cf503b78Smrg
13415fb4814Smrg# Some modes work just like other modes, but use different flags.  We
13515fb4814Smrg# parameterize here, but still list the modes in the big case below,
13615fb4814Smrg# to make depend.m4 easier to write.  Note that we *cannot* use a case
13715fb4814Smrg# here, because this file can only contain one case statement.
13815fb4814Smrgif test "$depmode" = hp; then
13915fb4814Smrg  # HP compiler uses -M and no extra arg.
14015fb4814Smrg  gccflag=-M
14115fb4814Smrg  depmode=gcc
14215fb4814Smrgfi
14315fb4814Smrg
14415fb4814Smrgif test "$depmode" = dashXmstdout; then
145cf503b78Smrg  # This is just like dashmstdout with a different argument.
146cf503b78Smrg  dashmflag=-xM
147cf503b78Smrg  depmode=dashmstdout
14815fb4814Smrgfi
14915fb4814Smrg
150b4d38c65Smrgcygpath_u="cygpath -u -f -"
151b4d38c65Smrgif test "$depmode" = msvcmsys; then
152cf503b78Smrg  # This is just like msvisualcpp but w/o cygpath translation.
153cf503b78Smrg  # Just convert the backslash-escaped backslashes to single forward
154cf503b78Smrg  # slashes to satisfy depend.m4
155cf503b78Smrg  cygpath_u='sed s,\\\\,/,g'
156cf503b78Smrg  depmode=msvisualcpp
157cf503b78Smrgfi
158cf503b78Smrg
159cf503b78Smrgif test "$depmode" = msvc7msys; then
160cf503b78Smrg  # This is just like msvc7 but w/o cygpath translation.
161cf503b78Smrg  # Just convert the backslash-escaped backslashes to single forward
162cf503b78Smrg  # slashes to satisfy depend.m4
163cf503b78Smrg  cygpath_u='sed s,\\\\,/,g'
164cf503b78Smrg  depmode=msvc7
165cf503b78Smrgfi
166cf503b78Smrg
167cf503b78Smrgif test "$depmode" = xlc; then
168cf503b78Smrg  # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information.
169cf503b78Smrg  gccflag=-qmakedep=gcc,-MF
170cf503b78Smrg  depmode=gcc
171b4d38c65Smrgfi
172b4d38c65Smrg
17315fb4814Smrgcase "$depmode" in
17415fb4814Smrggcc3)
17515fb4814Smrg## gcc 3 implements dependency tracking that does exactly what
17615fb4814Smrg## we want.  Yay!  Note: for some reason libtool 1.4 doesn't like
17715fb4814Smrg## it if -MD -MP comes after the -MF stuff.  Hmm.
178de78e416Smrg## Unfortunately, FreeBSD c89 acceptance of flags depends upon
179de78e416Smrg## the command line argument order; so add the flags where they
180de78e416Smrg## appear in depend2.am.  Note that the slowdown incurred here
181de78e416Smrg## affects only configure: in makefiles, %FASTDEP% shortcuts this.
182de78e416Smrg  for arg
183de78e416Smrg  do
184de78e416Smrg    case $arg in
185de78e416Smrg    -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;;
186de78e416Smrg    *)  set fnord "$@" "$arg" ;;
187de78e416Smrg    esac
188de78e416Smrg    shift # fnord
189de78e416Smrg    shift # $arg
190de78e416Smrg  done
191de78e416Smrg  "$@"
19215fb4814Smrg  stat=$?
193cf503b78Smrg  if test $stat -ne 0; then
19415fb4814Smrg    rm -f "$tmpdepfile"
19515fb4814Smrg    exit $stat
19615fb4814Smrg  fi
19715fb4814Smrg  mv "$tmpdepfile" "$depfile"
19815fb4814Smrg  ;;
19915fb4814Smrg
20015fb4814Smrggcc)
201cf503b78Smrg## Note that this doesn't just cater to obsosete pre-3.x GCC compilers.
202cf503b78Smrg## but also to in-use compilers like IMB xlc/xlC and the HP C compiler.
203cf503b78Smrg## (see the conditional assignment to $gccflag above).
20415fb4814Smrg## There are various ways to get dependency output from gcc.  Here's
20515fb4814Smrg## why we pick this rather obscure method:
20615fb4814Smrg## - Don't want to use -MD because we'd like the dependencies to end
20715fb4814Smrg##   up in a subdir.  Having to rename by hand is ugly.
20815fb4814Smrg##   (We might end up doing this anyway to support other compilers.)
20915fb4814Smrg## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
210cf503b78Smrg##   -MM, not -M (despite what the docs say).  Also, it might not be
211cf503b78Smrg##   supported by the other compilers which use the 'gcc' depmode.
21215fb4814Smrg## - Using -M directly means running the compiler twice (even worse
21315fb4814Smrg##   than renaming).
21415fb4814Smrg  if test -z "$gccflag"; then
21515fb4814Smrg    gccflag=-MD,
21615fb4814Smrg  fi
21715fb4814Smrg  "$@" -Wp,"$gccflag$tmpdepfile"
21815fb4814Smrg  stat=$?
219cf503b78Smrg  if test $stat -ne 0; then
22015fb4814Smrg    rm -f "$tmpdepfile"
22115fb4814Smrg    exit $stat
22215fb4814Smrg  fi
22315fb4814Smrg  rm -f "$depfile"
22415fb4814Smrg  echo "$object : \\" > "$depfile"
225cf503b78Smrg  # The second -e expression handles DOS-style file names with drive
226cf503b78Smrg  # letters.
22715fb4814Smrg  sed -e 's/^[^:]*: / /' \
22815fb4814Smrg      -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
229cf503b78Smrg## This next piece of magic avoids the "deleted header file" problem.
23015fb4814Smrg## The problem is that when a header file which appears in a .P file
23115fb4814Smrg## is deleted, the dependency causes make to die (because there is
23215fb4814Smrg## typically no way to rebuild the header).  We avoid this by adding
23315fb4814Smrg## dummy dependencies for each header file.  Too bad gcc doesn't do
23415fb4814Smrg## this for us directly.
235cf503b78Smrg## Some versions of gcc put a space before the ':'.  On the theory
23615fb4814Smrg## that the space means something, we add a space to the output as
237cf503b78Smrg## well.  hp depmode also adds that space, but also prefixes the VPATH
238cf503b78Smrg## to the object.  Take care to not repeat it in the output.
23915fb4814Smrg## Some versions of the HPUX 10.20 sed can't process this invocation
24015fb4814Smrg## correctly.  Breaking it into two sed invocations is a workaround.
241cf503b78Smrg  tr ' ' "$nl" < "$tmpdepfile" \
242cf503b78Smrg    | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \
243cf503b78Smrg    | sed -e 's/$/ :/' >> "$depfile"
24415fb4814Smrg  rm -f "$tmpdepfile"
24515fb4814Smrg  ;;
24615fb4814Smrg
24715fb4814Smrghp)
24815fb4814Smrg  # This case exists only to let depend.m4 do its work.  It works by
24915fb4814Smrg  # looking at the text of this script.  This case will never be run,
25015fb4814Smrg  # since it is checked for above.
25115fb4814Smrg  exit 1
25215fb4814Smrg  ;;
25315fb4814Smrg
25415fb4814Smrgsgi)
25515fb4814Smrg  if test "$libtool" = yes; then
25615fb4814Smrg    "$@" "-Wp,-MDupdate,$tmpdepfile"
25715fb4814Smrg  else
25815fb4814Smrg    "$@" -MDupdate "$tmpdepfile"
25915fb4814Smrg  fi
26015fb4814Smrg  stat=$?
261cf503b78Smrg  if test $stat -ne 0; then
26215fb4814Smrg    rm -f "$tmpdepfile"
26315fb4814Smrg    exit $stat
26415fb4814Smrg  fi
26515fb4814Smrg  rm -f "$depfile"
26615fb4814Smrg
26715fb4814Smrg  if test -f "$tmpdepfile"; then  # yes, the sourcefile depend on other files
26815fb4814Smrg    echo "$object : \\" > "$depfile"
26915fb4814Smrg    # Clip off the initial element (the dependent).  Don't try to be
27015fb4814Smrg    # clever and replace this with sed code, as IRIX sed won't handle
27115fb4814Smrg    # lines with more than a fixed number of characters (4096 in
27215fb4814Smrg    # IRIX 6.2 sed, 8192 in IRIX 6.5).  We also remove comment lines;
273cf503b78Smrg    # the IRIX cc adds comments like '#:fec' to the end of the
27415fb4814Smrg    # dependency line.
275cf503b78Smrg    tr ' ' "$nl" < "$tmpdepfile" \
276cf503b78Smrg      | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \
277cf503b78Smrg      | tr "$nl" ' ' >> "$depfile"
278b4d38c65Smrg    echo >> "$depfile"
27915fb4814Smrg    # The second pass generates a dummy entry for each header file.
280cf503b78Smrg    tr ' ' "$nl" < "$tmpdepfile" \
281cf503b78Smrg      | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
282cf503b78Smrg      >> "$depfile"
28315fb4814Smrg  else
284cf503b78Smrg    make_dummy_depfile
28515fb4814Smrg  fi
28615fb4814Smrg  rm -f "$tmpdepfile"
28715fb4814Smrg  ;;
28815fb4814Smrg
289cf503b78Smrgxlc)
290cf503b78Smrg  # This case exists only to let depend.m4 do its work.  It works by
291cf503b78Smrg  # looking at the text of this script.  This case will never be run,
292cf503b78Smrg  # since it is checked for above.
293cf503b78Smrg  exit 1
294cf503b78Smrg  ;;
295cf503b78Smrg
29615fb4814Smrgaix)
29715fb4814Smrg  # The C for AIX Compiler uses -M and outputs the dependencies
29815fb4814Smrg  # in a .u file.  In older versions, this file always lives in the
299cf503b78Smrg  # current directory.  Also, the AIX compiler puts '$object:' at the
30015fb4814Smrg  # start of each line; $object doesn't have directory information.
30115fb4814Smrg  # Version 6 uses the directory in both cases.
302cf503b78Smrg  set_dir_from "$object"
303cf503b78Smrg  set_base_from "$object"
30415fb4814Smrg  if test "$libtool" = yes; then
305b4d38c65Smrg    tmpdepfile1=$dir$base.u
306b4d38c65Smrg    tmpdepfile2=$base.u
307b4d38c65Smrg    tmpdepfile3=$dir.libs/$base.u
30815fb4814Smrg    "$@" -Wc,-M
30915fb4814Smrg  else
310b4d38c65Smrg    tmpdepfile1=$dir$base.u
311b4d38c65Smrg    tmpdepfile2=$dir$base.u
312b4d38c65Smrg    tmpdepfile3=$dir$base.u
31315fb4814Smrg    "$@" -M
31415fb4814Smrg  fi
31515fb4814Smrg  stat=$?
316cf503b78Smrg  if test $stat -ne 0; then
317b4d38c65Smrg    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
31815fb4814Smrg    exit $stat
31915fb4814Smrg  fi
32015fb4814Smrg
321b4d38c65Smrg  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
322b4d38c65Smrg  do
323b4d38c65Smrg    test -f "$tmpdepfile" && break
324b4d38c65Smrg  done
325cf503b78Smrg  aix_post_process_depfile
326cf503b78Smrg  ;;
327cf503b78Smrg
328cf503b78Smrgtcc)
329cf503b78Smrg  # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26
330cf503b78Smrg  # FIXME: That version still under development at the moment of writing.
331cf503b78Smrg  #        Make that this statement remains true also for stable, released
332cf503b78Smrg  #        versions.
333cf503b78Smrg  # It will wrap lines (doesn't matter whether long or short) with a
334cf503b78Smrg  # trailing '\', as in:
335cf503b78Smrg  #
336cf503b78Smrg  #   foo.o : \
337cf503b78Smrg  #    foo.c \
338cf503b78Smrg  #    foo.h \
339cf503b78Smrg  #
340cf503b78Smrg  # It will put a trailing '\' even on the last line, and will use leading
341cf503b78Smrg  # spaces rather than leading tabs (at least since its commit 0394caf7
342cf503b78Smrg  # "Emit spaces for -MD").
343cf503b78Smrg  "$@" -MD -MF "$tmpdepfile"
344cf503b78Smrg  stat=$?
345cf503b78Smrg  if test $stat -ne 0; then
346cf503b78Smrg    rm -f "$tmpdepfile"
347cf503b78Smrg    exit $stat
34815fb4814Smrg  fi
349cf503b78Smrg  rm -f "$depfile"
350cf503b78Smrg  # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'.
351cf503b78Smrg  # We have to change lines of the first kind to '$object: \'.
352cf503b78Smrg  sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile"
353cf503b78Smrg  # And for each line of the second kind, we have to emit a 'dep.h:'
354cf503b78Smrg  # dummy dependency, to avoid the deleted-header problem.
355cf503b78Smrg  sed -n -e 's|^  *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile"
35615fb4814Smrg  rm -f "$tmpdepfile"
35715fb4814Smrg  ;;
35815fb4814Smrg
359cf503b78Smrg## The order of this option in the case statement is important, since the
360cf503b78Smrg## shell code in configure will try each of these formats in the order
361cf503b78Smrg## listed in this file.  A plain '-MD' option would be understood by many
362cf503b78Smrg## compilers, so we must ensure this comes after the gcc and icc options.
363cf503b78Smrgpgcc)
364cf503b78Smrg  # Portland's C compiler understands '-MD'.
365cf503b78Smrg  # Will always output deps to 'file.d' where file is the root name of the
366cf503b78Smrg  # source file under compilation, even if file resides in a subdirectory.
367cf503b78Smrg  # The object file name does not affect the name of the '.d' file.
368cf503b78Smrg  # pgcc 10.2 will output
36915fb4814Smrg  #    foo.o: sub/foo.c sub/foo.h
370cf503b78Smrg  # and will wrap long lines using '\' :
37115fb4814Smrg  #    foo.o: sub/foo.c ... \
37215fb4814Smrg  #     sub/foo.h ... \
37315fb4814Smrg  #     ...
374cf503b78Smrg  set_dir_from "$object"
375cf503b78Smrg  # Use the source, not the object, to determine the base name, since
376cf503b78Smrg  # that's sadly what pgcc will do too.
377cf503b78Smrg  set_base_from "$source"
378cf503b78Smrg  tmpdepfile=$base.d
379cf503b78Smrg
380cf503b78Smrg  # For projects that build the same source file twice into different object
381cf503b78Smrg  # files, the pgcc approach of using the *source* file root name can cause
382cf503b78Smrg  # problems in parallel builds.  Use a locking strategy to avoid stomping on
383cf503b78Smrg  # the same $tmpdepfile.
384cf503b78Smrg  lockdir=$base.d-lock
385cf503b78Smrg  trap "
386cf503b78Smrg    echo '$0: caught signal, cleaning up...' >&2
387cf503b78Smrg    rmdir '$lockdir'
388cf503b78Smrg    exit 1
389cf503b78Smrg  " 1 2 13 15
390cf503b78Smrg  numtries=100
391cf503b78Smrg  i=$numtries
392cf503b78Smrg  while test $i -gt 0; do
393cf503b78Smrg    # mkdir is a portable test-and-set.
394cf503b78Smrg    if mkdir "$lockdir" 2>/dev/null; then
395cf503b78Smrg      # This process acquired the lock.
396cf503b78Smrg      "$@" -MD
397cf503b78Smrg      stat=$?
398cf503b78Smrg      # Release the lock.
399cf503b78Smrg      rmdir "$lockdir"
400cf503b78Smrg      break
401cf503b78Smrg    else
402cf503b78Smrg      # If the lock is being held by a different process, wait
403cf503b78Smrg      # until the winning process is done or we timeout.
404cf503b78Smrg      while test -d "$lockdir" && test $i -gt 0; do
405cf503b78Smrg        sleep 1
406cf503b78Smrg        i=`expr $i - 1`
407cf503b78Smrg      done
408cf503b78Smrg    fi
409cf503b78Smrg    i=`expr $i - 1`
410cf503b78Smrg  done
411cf503b78Smrg  trap - 1 2 13 15
412cf503b78Smrg  if test $i -le 0; then
413cf503b78Smrg    echo "$0: failed to acquire lock after $numtries attempts" >&2
414cf503b78Smrg    echo "$0: check lockdir '$lockdir'" >&2
415cf503b78Smrg    exit 1
416cf503b78Smrg  fi
41715fb4814Smrg
418cf503b78Smrg  if test $stat -ne 0; then
41915fb4814Smrg    rm -f "$tmpdepfile"
42015fb4814Smrg    exit $stat
42115fb4814Smrg  fi
42215fb4814Smrg  rm -f "$depfile"
42315fb4814Smrg  # Each line is of the form `foo.o: dependent.h',
42415fb4814Smrg  # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'.
42515fb4814Smrg  # Do two passes, one to just change these to
42615fb4814Smrg  # `$object: dependent.h' and one to simply `dependent.h:'.
42715fb4814Smrg  sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
42815fb4814Smrg  # Some versions of the HPUX 10.20 sed can't process this invocation
42915fb4814Smrg  # correctly.  Breaking it into two sed invocations is a workaround.
430cf503b78Smrg  sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \
431cf503b78Smrg    | sed -e 's/$/ :/' >> "$depfile"
43215fb4814Smrg  rm -f "$tmpdepfile"
43315fb4814Smrg  ;;
43415fb4814Smrg
435de78e416Smrghp2)
436de78e416Smrg  # The "hp" stanza above does not work with aCC (C++) and HP's ia64
437de78e416Smrg  # compilers, which have integrated preprocessors.  The correct option
438de78e416Smrg  # to use with these is +Maked; it writes dependencies to a file named
439de78e416Smrg  # 'foo.d', which lands next to the object file, wherever that
440de78e416Smrg  # happens to be.
441de78e416Smrg  # Much of this is similar to the tru64 case; see comments there.
442cf503b78Smrg  set_dir_from  "$object"
443cf503b78Smrg  set_base_from "$object"
444de78e416Smrg  if test "$libtool" = yes; then
445de78e416Smrg    tmpdepfile1=$dir$base.d
446de78e416Smrg    tmpdepfile2=$dir.libs/$base.d
447de78e416Smrg    "$@" -Wc,+Maked
448de78e416Smrg  else
449de78e416Smrg    tmpdepfile1=$dir$base.d
450de78e416Smrg    tmpdepfile2=$dir$base.d
451de78e416Smrg    "$@" +Maked
452de78e416Smrg  fi
453de78e416Smrg  stat=$?
454cf503b78Smrg  if test $stat -ne 0; then
455de78e416Smrg     rm -f "$tmpdepfile1" "$tmpdepfile2"
456de78e416Smrg     exit $stat
457de78e416Smrg  fi
458de78e416Smrg
459de78e416Smrg  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2"
460de78e416Smrg  do
461de78e416Smrg    test -f "$tmpdepfile" && break
462de78e416Smrg  done
463de78e416Smrg  if test -f "$tmpdepfile"; then
464cf503b78Smrg    sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile"
465cf503b78Smrg    # Add 'dependent.h:' lines.
466b4d38c65Smrg    sed -ne '2,${
467cf503b78Smrg               s/^ *//
468cf503b78Smrg               s/ \\*$//
469cf503b78Smrg               s/$/:/
470cf503b78Smrg               p
471cf503b78Smrg             }' "$tmpdepfile" >> "$depfile"
472de78e416Smrg  else
473cf503b78Smrg    make_dummy_depfile
474de78e416Smrg  fi
475de78e416Smrg  rm -f "$tmpdepfile" "$tmpdepfile2"
476de78e416Smrg  ;;
477de78e416Smrg
47815fb4814Smrgtru64)
479cf503b78Smrg  # The Tru64 compiler uses -MD to generate dependencies as a side
480cf503b78Smrg  # effect.  'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'.
481cf503b78Smrg  # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
482cf503b78Smrg  # dependencies in 'foo.d' instead, so we check for that too.
483cf503b78Smrg  # Subdirectories are respected.
484cf503b78Smrg  set_dir_from  "$object"
485cf503b78Smrg  set_base_from "$object"
486cf503b78Smrg
487cf503b78Smrg  if test "$libtool" = yes; then
488cf503b78Smrg    # Libtool generates 2 separate objects for the 2 libraries.  These
489cf503b78Smrg    # two compilations output dependencies in $dir.libs/$base.o.d and
490cf503b78Smrg    # in $dir$base.o.d.  We have to check for both files, because
491cf503b78Smrg    # one of the two compilations can be disabled.  We should prefer
492cf503b78Smrg    # $dir$base.o.d over $dir.libs/$base.o.d because the latter is
493cf503b78Smrg    # automatically cleaned when .libs/ is deleted, while ignoring
494cf503b78Smrg    # the former would cause a distcleancheck panic.
495cf503b78Smrg    tmpdepfile1=$dir$base.o.d          # libtool 1.5
496cf503b78Smrg    tmpdepfile2=$dir.libs/$base.o.d    # Likewise.
497cf503b78Smrg    tmpdepfile3=$dir.libs/$base.d      # Compaq CCC V6.2-504
498cf503b78Smrg    "$@" -Wc,-MD
499cf503b78Smrg  else
500cf503b78Smrg    tmpdepfile1=$dir$base.d
501cf503b78Smrg    tmpdepfile2=$dir$base.d
502cf503b78Smrg    tmpdepfile3=$dir$base.d
503cf503b78Smrg    "$@" -MD
504cf503b78Smrg  fi
505cf503b78Smrg
506cf503b78Smrg  stat=$?
507cf503b78Smrg  if test $stat -ne 0; then
508cf503b78Smrg    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
509cf503b78Smrg    exit $stat
510cf503b78Smrg  fi
511cf503b78Smrg
512cf503b78Smrg  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
513cf503b78Smrg  do
514cf503b78Smrg    test -f "$tmpdepfile" && break
515cf503b78Smrg  done
516cf503b78Smrg  # Same post-processing that is required for AIX mode.
517cf503b78Smrg  aix_post_process_depfile
518cf503b78Smrg  ;;
519cf503b78Smrg
520cf503b78Smrgmsvc7)
521cf503b78Smrg  if test "$libtool" = yes; then
522cf503b78Smrg    showIncludes=-Wc,-showIncludes
523cf503b78Smrg  else
524cf503b78Smrg    showIncludes=-showIncludes
525cf503b78Smrg  fi
526cf503b78Smrg  "$@" $showIncludes > "$tmpdepfile"
527cf503b78Smrg  stat=$?
528cf503b78Smrg  grep -v '^Note: including file: ' "$tmpdepfile"
529cf503b78Smrg  if test $stat -ne 0; then
530cf503b78Smrg    rm -f "$tmpdepfile"
531cf503b78Smrg    exit $stat
532cf503b78Smrg  fi
533cf503b78Smrg  rm -f "$depfile"
534cf503b78Smrg  echo "$object : \\" > "$depfile"
535cf503b78Smrg  # The first sed program below extracts the file names and escapes
536cf503b78Smrg  # backslashes for cygpath.  The second sed program outputs the file
537cf503b78Smrg  # name when reading, but also accumulates all include files in the
538cf503b78Smrg  # hold buffer in order to output them again at the end.  This only
539cf503b78Smrg  # works with sed implementations that can handle large buffers.
540cf503b78Smrg  sed < "$tmpdepfile" -n '
541cf503b78Smrg/^Note: including file:  *\(.*\)/ {
542cf503b78Smrg  s//\1/
543cf503b78Smrg  s/\\/\\\\/g
544cf503b78Smrg  p
545cf503b78Smrg}' | $cygpath_u | sort -u | sed -n '
546cf503b78Smrgs/ /\\ /g
547cf503b78Smrgs/\(.*\)/'"$tab"'\1 \\/p
548cf503b78Smrgs/.\(.*\) \\/\1:/
549cf503b78SmrgH
550cf503b78Smrg$ {
551cf503b78Smrg  s/.*/'"$tab"'/
552cf503b78Smrg  G
553cf503b78Smrg  p
554cf503b78Smrg}' >> "$depfile"
555cf503b78Smrg  rm -f "$tmpdepfile"
556cf503b78Smrg  ;;
557cf503b78Smrg
558cf503b78Smrgmsvc7msys)
559cf503b78Smrg  # This case exists only to let depend.m4 do its work.  It works by
560cf503b78Smrg  # looking at the text of this script.  This case will never be run,
561cf503b78Smrg  # since it is checked for above.
562cf503b78Smrg  exit 1
563cf503b78Smrg  ;;
56415fb4814Smrg
56515fb4814Smrg#nosideeffect)
56615fb4814Smrg  # This comment above is used by automake to tell side-effect
56715fb4814Smrg  # dependency tracking mechanisms from slower ones.
56815fb4814Smrg
56915fb4814Smrgdashmstdout)
57015fb4814Smrg  # Important note: in order to support this mode, a compiler *must*
57115fb4814Smrg  # always write the preprocessed file to stdout, regardless of -o.
57215fb4814Smrg  "$@" || exit $?
57315fb4814Smrg
57415fb4814Smrg  # Remove the call to Libtool.
57515fb4814Smrg  if test "$libtool" = yes; then
576b4d38c65Smrg    while test "X$1" != 'X--mode=compile'; do
57715fb4814Smrg      shift
57815fb4814Smrg    done
57915fb4814Smrg    shift
58015fb4814Smrg  fi
58115fb4814Smrg
582cf503b78Smrg  # Remove '-o $object'.
58315fb4814Smrg  IFS=" "
58415fb4814Smrg  for arg
58515fb4814Smrg  do
58615fb4814Smrg    case $arg in
58715fb4814Smrg    -o)
58815fb4814Smrg      shift
58915fb4814Smrg      ;;
59015fb4814Smrg    $object)
59115fb4814Smrg      shift
59215fb4814Smrg      ;;
59315fb4814Smrg    *)
59415fb4814Smrg      set fnord "$@" "$arg"
59515fb4814Smrg      shift # fnord
59615fb4814Smrg      shift # $arg
59715fb4814Smrg      ;;
59815fb4814Smrg    esac
59915fb4814Smrg  done
60015fb4814Smrg
60115fb4814Smrg  test -z "$dashmflag" && dashmflag=-M
602cf503b78Smrg  # Require at least two characters before searching for ':'
60315fb4814Smrg  # in the target name.  This is to cope with DOS-style filenames:
604cf503b78Smrg  # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise.
60515fb4814Smrg  "$@" $dashmflag |
606cf503b78Smrg    sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile"
60715fb4814Smrg  rm -f "$depfile"
60815fb4814Smrg  cat < "$tmpdepfile" > "$depfile"
609cf503b78Smrg  # Some versions of the HPUX 10.20 sed can't process this sed invocation
610cf503b78Smrg  # correctly.  Breaking it into two sed invocations is a workaround.
611cf503b78Smrg  tr ' ' "$nl" < "$tmpdepfile" \
612cf503b78Smrg    | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
613cf503b78Smrg    | sed -e 's/$/ :/' >> "$depfile"
61415fb4814Smrg  rm -f "$tmpdepfile"
61515fb4814Smrg  ;;
61615fb4814Smrg
61715fb4814SmrgdashXmstdout)
61815fb4814Smrg  # This case only exists to satisfy depend.m4.  It is never actually
61915fb4814Smrg  # run, as this mode is specially recognized in the preamble.
62015fb4814Smrg  exit 1
62115fb4814Smrg  ;;
62215fb4814Smrg
62315fb4814Smrgmakedepend)
62415fb4814Smrg  "$@" || exit $?
62515fb4814Smrg  # Remove any Libtool call
62615fb4814Smrg  if test "$libtool" = yes; then
627b4d38c65Smrg    while test "X$1" != 'X--mode=compile'; do
62815fb4814Smrg      shift
62915fb4814Smrg    done
63015fb4814Smrg    shift
63115fb4814Smrg  fi
63215fb4814Smrg  # X makedepend
63315fb4814Smrg  shift
634b4d38c65Smrg  cleared=no eat=no
635b4d38c65Smrg  for arg
636b4d38c65Smrg  do
63715fb4814Smrg    case $cleared in
63815fb4814Smrg    no)
63915fb4814Smrg      set ""; shift
64015fb4814Smrg      cleared=yes ;;
64115fb4814Smrg    esac
642b4d38c65Smrg    if test $eat = yes; then
643b4d38c65Smrg      eat=no
644b4d38c65Smrg      continue
645b4d38c65Smrg    fi
64615fb4814Smrg    case "$arg" in
64715fb4814Smrg    -D*|-I*)
64815fb4814Smrg      set fnord "$@" "$arg"; shift ;;
64915fb4814Smrg    # Strip any option that makedepend may not understand.  Remove
65015fb4814Smrg    # the object too, otherwise makedepend will parse it as a source file.
651b4d38c65Smrg    -arch)
652b4d38c65Smrg      eat=yes ;;
65315fb4814Smrg    -*|$object)
65415fb4814Smrg      ;;
65515fb4814Smrg    *)
65615fb4814Smrg      set fnord "$@" "$arg"; shift ;;
65715fb4814Smrg    esac
65815fb4814Smrg  done
659b4d38c65Smrg  obj_suffix=`echo "$object" | sed 's/^.*\././'`
66015fb4814Smrg  touch "$tmpdepfile"
66115fb4814Smrg  ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
66215fb4814Smrg  rm -f "$depfile"
663cf503b78Smrg  # makedepend may prepend the VPATH from the source file name to the object.
664cf503b78Smrg  # No need to regex-escape $object, excess matching of '.' is harmless.
665cf503b78Smrg  sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile"
666cf503b78Smrg  # Some versions of the HPUX 10.20 sed can't process the last invocation
667cf503b78Smrg  # correctly.  Breaking it into two sed invocations is a workaround.
668cf503b78Smrg  sed '1,2d' "$tmpdepfile" \
669cf503b78Smrg    | tr ' ' "$nl" \
670cf503b78Smrg    | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
671cf503b78Smrg    | sed -e 's/$/ :/' >> "$depfile"
67215fb4814Smrg  rm -f "$tmpdepfile" "$tmpdepfile".bak
67315fb4814Smrg  ;;
67415fb4814Smrg
67515fb4814Smrgcpp)
67615fb4814Smrg  # Important note: in order to support this mode, a compiler *must*
67715fb4814Smrg  # always write the preprocessed file to stdout.
67815fb4814Smrg  "$@" || exit $?
67915fb4814Smrg
68015fb4814Smrg  # Remove the call to Libtool.
68115fb4814Smrg  if test "$libtool" = yes; then
682b4d38c65Smrg    while test "X$1" != 'X--mode=compile'; do
68315fb4814Smrg      shift
68415fb4814Smrg    done
68515fb4814Smrg    shift
68615fb4814Smrg  fi
68715fb4814Smrg
688cf503b78Smrg  # Remove '-o $object'.
68915fb4814Smrg  IFS=" "
69015fb4814Smrg  for arg
69115fb4814Smrg  do
69215fb4814Smrg    case $arg in
69315fb4814Smrg    -o)
69415fb4814Smrg      shift
69515fb4814Smrg      ;;
69615fb4814Smrg    $object)
69715fb4814Smrg      shift
69815fb4814Smrg      ;;
69915fb4814Smrg    *)
70015fb4814Smrg      set fnord "$@" "$arg"
70115fb4814Smrg      shift # fnord
70215fb4814Smrg      shift # $arg
70315fb4814Smrg      ;;
70415fb4814Smrg    esac
70515fb4814Smrg  done
70615fb4814Smrg
707cf503b78Smrg  "$@" -E \
708cf503b78Smrg    | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
709cf503b78Smrg             -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
710cf503b78Smrg    | sed '$ s: \\$::' > "$tmpdepfile"
71115fb4814Smrg  rm -f "$depfile"
71215fb4814Smrg  echo "$object : \\" > "$depfile"
71315fb4814Smrg  cat < "$tmpdepfile" >> "$depfile"
71415fb4814Smrg  sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
71515fb4814Smrg  rm -f "$tmpdepfile"
71615fb4814Smrg  ;;
71715fb4814Smrg
71815fb4814Smrgmsvisualcpp)
71915fb4814Smrg  # Important note: in order to support this mode, a compiler *must*
720b4d38c65Smrg  # always write the preprocessed file to stdout.
72115fb4814Smrg  "$@" || exit $?
722b4d38c65Smrg
723b4d38c65Smrg  # Remove the call to Libtool.
724b4d38c65Smrg  if test "$libtool" = yes; then
725b4d38c65Smrg    while test "X$1" != 'X--mode=compile'; do
726b4d38c65Smrg      shift
727b4d38c65Smrg    done
728b4d38c65Smrg    shift
729b4d38c65Smrg  fi
730b4d38c65Smrg
73115fb4814Smrg  IFS=" "
73215fb4814Smrg  for arg
73315fb4814Smrg  do
73415fb4814Smrg    case "$arg" in
735b4d38c65Smrg    -o)
736b4d38c65Smrg      shift
737b4d38c65Smrg      ;;
738b4d38c65Smrg    $object)
739b4d38c65Smrg      shift
740b4d38c65Smrg      ;;
74115fb4814Smrg    "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
742cf503b78Smrg        set fnord "$@"
743cf503b78Smrg        shift
744cf503b78Smrg        shift
745cf503b78Smrg        ;;
74615fb4814Smrg    *)
747cf503b78Smrg        set fnord "$@" "$arg"
748cf503b78Smrg        shift
749cf503b78Smrg        shift
750cf503b78Smrg        ;;
75115fb4814Smrg    esac
75215fb4814Smrg  done
753b4d38c65Smrg  "$@" -E 2>/dev/null |
754b4d38c65Smrg  sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile"
75515fb4814Smrg  rm -f "$depfile"
75615fb4814Smrg  echo "$object : \\" > "$depfile"
757cf503b78Smrg  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile"
758cf503b78Smrg  echo "$tab" >> "$depfile"
759b4d38c65Smrg  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile"
76015fb4814Smrg  rm -f "$tmpdepfile"
76115fb4814Smrg  ;;
76215fb4814Smrg
763b4d38c65Smrgmsvcmsys)
764b4d38c65Smrg  # This case exists only to let depend.m4 do its work.  It works by
765b4d38c65Smrg  # looking at the text of this script.  This case will never be run,
766b4d38c65Smrg  # since it is checked for above.
767b4d38c65Smrg  exit 1
768b4d38c65Smrg  ;;
769b4d38c65Smrg
77015fb4814Smrgnone)
77115fb4814Smrg  exec "$@"
77215fb4814Smrg  ;;
77315fb4814Smrg
77415fb4814Smrg*)
77515fb4814Smrg  echo "Unknown depmode $depmode" 1>&2
77615fb4814Smrg  exit 1
77715fb4814Smrg  ;;
77815fb4814Smrgesac
77915fb4814Smrg
78015fb4814Smrgexit 0
78115fb4814Smrg
78215fb4814Smrg# Local Variables:
78315fb4814Smrg# mode: shell-script
78415fb4814Smrg# sh-indentation: 2
78515fb4814Smrg# eval: (add-hook 'write-file-hooks 'time-stamp)
78615fb4814Smrg# time-stamp-start: "scriptversion="
78715fb4814Smrg# time-stamp-format: "%:y-%02m-%02d.%02H"
788b4d38c65Smrg# time-stamp-time-zone: "UTC"
789b4d38c65Smrg# time-stamp-end: "; # UTC"
79015fb4814Smrg# End:
791