depcomp revision e6ecbdae
1c7484f1fSmrg#! /bin/sh
2c7484f1fSmrg# depcomp - compile a program generating dependencies as side-effects
3c7484f1fSmrg
4e6ecbdaeSmrgscriptversion=2013-05-30.07; # UTC
5c7484f1fSmrg
6e6ecbdaeSmrg# Copyright (C) 1999-2013 Free Software Foundation, Inc.
7c7484f1fSmrg
8c7484f1fSmrg# This program is free software; you can redistribute it and/or modify
9c7484f1fSmrg# it under the terms of the GNU General Public License as published by
10c7484f1fSmrg# the Free Software Foundation; either version 2, or (at your option)
11c7484f1fSmrg# any later version.
12c7484f1fSmrg
13c7484f1fSmrg# This program is distributed in the hope that it will be useful,
14c7484f1fSmrg# but WITHOUT ANY WARRANTY; without even the implied warranty of
15c7484f1fSmrg# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16c7484f1fSmrg# GNU General Public License for more details.
17c7484f1fSmrg
18c7484f1fSmrg# You should have received a copy of the GNU General Public License
19baed689fSmrg# along with this program.  If not, see <http://www.gnu.org/licenses/>.
20c7484f1fSmrg
21c7484f1fSmrg# As a special exception to the GNU General Public License, if you
22c7484f1fSmrg# distribute this file as part of a program that contains a
23c7484f1fSmrg# configuration script generated by Autoconf, you may include it under
24c7484f1fSmrg# the same distribution terms that you use for the rest of that program.
25c7484f1fSmrg
26c7484f1fSmrg# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>.
27c7484f1fSmrg
28c7484f1fSmrgcase $1 in
29c7484f1fSmrg  '')
30e6ecbdaeSmrg    echo "$0: No command.  Try '$0 --help' for more information." 1>&2
31e6ecbdaeSmrg    exit 1;
32e6ecbdaeSmrg    ;;
33c7484f1fSmrg  -h | --h*)
34c7484f1fSmrg    cat <<\EOF
35c7484f1fSmrgUsage: depcomp [--help] [--version] PROGRAM [ARGS]
36c7484f1fSmrg
37c7484f1fSmrgRun PROGRAMS ARGS to compile a file, generating dependencies
38c7484f1fSmrgas side-effects.
39c7484f1fSmrg
40c7484f1fSmrgEnvironment variables:
41c7484f1fSmrg  depmode     Dependency tracking mode.
42e6ecbdaeSmrg  source      Source file read by 'PROGRAMS ARGS'.
43e6ecbdaeSmrg  object      Object file output by 'PROGRAMS ARGS'.
44c7484f1fSmrg  DEPDIR      directory where to store dependencies.
45c7484f1fSmrg  depfile     Dependency file to output.
46e6ecbdaeSmrg  tmpdepfile  Temporary file to use when outputting dependencies.
47c7484f1fSmrg  libtool     Whether libtool is used (yes/no).
48c7484f1fSmrg
49c7484f1fSmrgReport bugs to <bug-automake@gnu.org>.
50c7484f1fSmrgEOF
51c7484f1fSmrg    exit $?
52c7484f1fSmrg    ;;
53c7484f1fSmrg  -v | --v*)
54c7484f1fSmrg    echo "depcomp $scriptversion"
55c7484f1fSmrg    exit $?
56c7484f1fSmrg    ;;
57c7484f1fSmrgesac
58c7484f1fSmrg
59e6ecbdaeSmrg# Get the directory component of the given path, and save it in the
60e6ecbdaeSmrg# global variables '$dir'.  Note that this directory component will
61e6ecbdaeSmrg# be either empty or ending with a '/' character.  This is deliberate.
62e6ecbdaeSmrgset_dir_from ()
63e6ecbdaeSmrg{
64e6ecbdaeSmrg  case $1 in
65e6ecbdaeSmrg    */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;;
66e6ecbdaeSmrg      *) dir=;;
67e6ecbdaeSmrg  esac
68e6ecbdaeSmrg}
69e6ecbdaeSmrg
70e6ecbdaeSmrg# Get the suffix-stripped basename of the given path, and save it the
71e6ecbdaeSmrg# global variable '$base'.
72e6ecbdaeSmrgset_base_from ()
73e6ecbdaeSmrg{
74e6ecbdaeSmrg  base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'`
75e6ecbdaeSmrg}
76e6ecbdaeSmrg
77e6ecbdaeSmrg# If no dependency file was actually created by the compiler invocation,
78e6ecbdaeSmrg# we still have to create a dummy depfile, to avoid errors with the
79e6ecbdaeSmrg# Makefile "include basename.Plo" scheme.
80e6ecbdaeSmrgmake_dummy_depfile ()
81e6ecbdaeSmrg{
82e6ecbdaeSmrg  echo "#dummy" > "$depfile"
83e6ecbdaeSmrg}
84e6ecbdaeSmrg
85e6ecbdaeSmrg# Factor out some common post-processing of the generated depfile.
86e6ecbdaeSmrg# Requires the auxiliary global variable '$tmpdepfile' to be set.
87e6ecbdaeSmrgaix_post_process_depfile ()
88e6ecbdaeSmrg{
89e6ecbdaeSmrg  # If the compiler actually managed to produce a dependency file,
90e6ecbdaeSmrg  # post-process it.
91e6ecbdaeSmrg  if test -f "$tmpdepfile"; then
92e6ecbdaeSmrg    # Each line is of the form 'foo.o: dependency.h'.
93e6ecbdaeSmrg    # Do two passes, one to just change these to
94e6ecbdaeSmrg    #   $object: dependency.h
95e6ecbdaeSmrg    # and one to simply output
96e6ecbdaeSmrg    #   dependency.h:
97e6ecbdaeSmrg    # which is needed to avoid the deleted-header problem.
98e6ecbdaeSmrg    { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile"
99e6ecbdaeSmrg      sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile"
100e6ecbdaeSmrg    } > "$depfile"
101e6ecbdaeSmrg    rm -f "$tmpdepfile"
102e6ecbdaeSmrg  else
103e6ecbdaeSmrg    make_dummy_depfile
104e6ecbdaeSmrg  fi
105e6ecbdaeSmrg}
106e6ecbdaeSmrg
107e6ecbdaeSmrg# A tabulation character.
108e6ecbdaeSmrgtab='	'
109e6ecbdaeSmrg# A newline character.
110e6ecbdaeSmrgnl='
111e6ecbdaeSmrg'
112e6ecbdaeSmrg# Character ranges might be problematic outside the C locale.
113e6ecbdaeSmrg# These definitions help.
114e6ecbdaeSmrgupper=ABCDEFGHIJKLMNOPQRSTUVWXYZ
115e6ecbdaeSmrglower=abcdefghijklmnopqrstuvwxyz
116e6ecbdaeSmrgdigits=0123456789
117e6ecbdaeSmrgalpha=${upper}${lower}
118e6ecbdaeSmrg
119c7484f1fSmrgif test -z "$depmode" || test -z "$source" || test -z "$object"; then
120c7484f1fSmrg  echo "depcomp: Variables source, object and depmode must be set" 1>&2
121c7484f1fSmrg  exit 1
122c7484f1fSmrgfi
123c7484f1fSmrg
124c7484f1fSmrg# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.
125c7484f1fSmrgdepfile=${depfile-`echo "$object" |
126c7484f1fSmrg  sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`}
127c7484f1fSmrgtmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
128c7484f1fSmrg
129c7484f1fSmrgrm -f "$tmpdepfile"
130c7484f1fSmrg
131e6ecbdaeSmrg# Avoid interferences from the environment.
132e6ecbdaeSmrggccflag= dashmflag=
133e6ecbdaeSmrg
134c7484f1fSmrg# Some modes work just like other modes, but use different flags.  We
135c7484f1fSmrg# parameterize here, but still list the modes in the big case below,
136c7484f1fSmrg# to make depend.m4 easier to write.  Note that we *cannot* use a case
137c7484f1fSmrg# here, because this file can only contain one case statement.
138c7484f1fSmrgif test "$depmode" = hp; then
139c7484f1fSmrg  # HP compiler uses -M and no extra arg.
140c7484f1fSmrg  gccflag=-M
141c7484f1fSmrg  depmode=gcc
142c7484f1fSmrgfi
143c7484f1fSmrg
144c7484f1fSmrgif test "$depmode" = dashXmstdout; then
145e6ecbdaeSmrg  # This is just like dashmstdout with a different argument.
146e6ecbdaeSmrg  dashmflag=-xM
147e6ecbdaeSmrg  depmode=dashmstdout
148c7484f1fSmrgfi
149c7484f1fSmrg
150baed689fSmrgcygpath_u="cygpath -u -f -"
151baed689fSmrgif test "$depmode" = msvcmsys; then
152e6ecbdaeSmrg  # This is just like msvisualcpp but w/o cygpath translation.
153e6ecbdaeSmrg  # Just convert the backslash-escaped backslashes to single forward
154e6ecbdaeSmrg  # slashes to satisfy depend.m4
155e6ecbdaeSmrg  cygpath_u='sed s,\\\\,/,g'
156e6ecbdaeSmrg  depmode=msvisualcpp
157e6ecbdaeSmrgfi
158e6ecbdaeSmrg
159e6ecbdaeSmrgif test "$depmode" = msvc7msys; then
160e6ecbdaeSmrg  # This is just like msvc7 but w/o cygpath translation.
161e6ecbdaeSmrg  # Just convert the backslash-escaped backslashes to single forward
162e6ecbdaeSmrg  # slashes to satisfy depend.m4
163e6ecbdaeSmrg  cygpath_u='sed s,\\\\,/,g'
164e6ecbdaeSmrg  depmode=msvc7
165e6ecbdaeSmrgfi
166e6ecbdaeSmrg
167e6ecbdaeSmrgif test "$depmode" = xlc; then
168e6ecbdaeSmrg  # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information.
169e6ecbdaeSmrg  gccflag=-qmakedep=gcc,-MF
170e6ecbdaeSmrg  depmode=gcc
171baed689fSmrgfi
172baed689fSmrg
173c7484f1fSmrgcase "$depmode" in
174c7484f1fSmrggcc3)
175c7484f1fSmrg## gcc 3 implements dependency tracking that does exactly what
176c7484f1fSmrg## we want.  Yay!  Note: for some reason libtool 1.4 doesn't like
177c7484f1fSmrg## it if -MD -MP comes after the -MF stuff.  Hmm.
178c7484f1fSmrg## Unfortunately, FreeBSD c89 acceptance of flags depends upon
179c7484f1fSmrg## the command line argument order; so add the flags where they
180c7484f1fSmrg## appear in depend2.am.  Note that the slowdown incurred here
181c7484f1fSmrg## affects only configure: in makefiles, %FASTDEP% shortcuts this.
182c7484f1fSmrg  for arg
183c7484f1fSmrg  do
184c7484f1fSmrg    case $arg in
185c7484f1fSmrg    -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;;
186c7484f1fSmrg    *)  set fnord "$@" "$arg" ;;
187c7484f1fSmrg    esac
188c7484f1fSmrg    shift # fnord
189c7484f1fSmrg    shift # $arg
190c7484f1fSmrg  done
191c7484f1fSmrg  "$@"
192c7484f1fSmrg  stat=$?
193e6ecbdaeSmrg  if test $stat -ne 0; then
194c7484f1fSmrg    rm -f "$tmpdepfile"
195c7484f1fSmrg    exit $stat
196c7484f1fSmrg  fi
197c7484f1fSmrg  mv "$tmpdepfile" "$depfile"
198c7484f1fSmrg  ;;
199c7484f1fSmrg
200c7484f1fSmrggcc)
201e6ecbdaeSmrg## Note that this doesn't just cater to obsosete pre-3.x GCC compilers.
202e6ecbdaeSmrg## but also to in-use compilers like IMB xlc/xlC and the HP C compiler.
203e6ecbdaeSmrg## (see the conditional assignment to $gccflag above).
204c7484f1fSmrg## There are various ways to get dependency output from gcc.  Here's
205c7484f1fSmrg## why we pick this rather obscure method:
206c7484f1fSmrg## - Don't want to use -MD because we'd like the dependencies to end
207c7484f1fSmrg##   up in a subdir.  Having to rename by hand is ugly.
208c7484f1fSmrg##   (We might end up doing this anyway to support other compilers.)
209c7484f1fSmrg## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
210e6ecbdaeSmrg##   -MM, not -M (despite what the docs say).  Also, it might not be
211e6ecbdaeSmrg##   supported by the other compilers which use the 'gcc' depmode.
212c7484f1fSmrg## - Using -M directly means running the compiler twice (even worse
213c7484f1fSmrg##   than renaming).
214c7484f1fSmrg  if test -z "$gccflag"; then
215c7484f1fSmrg    gccflag=-MD,
216c7484f1fSmrg  fi
217c7484f1fSmrg  "$@" -Wp,"$gccflag$tmpdepfile"
218c7484f1fSmrg  stat=$?
219e6ecbdaeSmrg  if test $stat -ne 0; then
220c7484f1fSmrg    rm -f "$tmpdepfile"
221c7484f1fSmrg    exit $stat
222c7484f1fSmrg  fi
223c7484f1fSmrg  rm -f "$depfile"
224c7484f1fSmrg  echo "$object : \\" > "$depfile"
225e6ecbdaeSmrg  # The second -e expression handles DOS-style file names with drive
226e6ecbdaeSmrg  # letters.
227c7484f1fSmrg  sed -e 's/^[^:]*: / /' \
228c7484f1fSmrg      -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
229e6ecbdaeSmrg## This next piece of magic avoids the "deleted header file" problem.
230c7484f1fSmrg## The problem is that when a header file which appears in a .P file
231c7484f1fSmrg## is deleted, the dependency causes make to die (because there is
232c7484f1fSmrg## typically no way to rebuild the header).  We avoid this by adding
233c7484f1fSmrg## dummy dependencies for each header file.  Too bad gcc doesn't do
234c7484f1fSmrg## this for us directly.
235e6ecbdaeSmrg## Some versions of gcc put a space before the ':'.  On the theory
236c7484f1fSmrg## that the space means something, we add a space to the output as
237e6ecbdaeSmrg## well.  hp depmode also adds that space, but also prefixes the VPATH
238e6ecbdaeSmrg## to the object.  Take care to not repeat it in the output.
239c7484f1fSmrg## Some versions of the HPUX 10.20 sed can't process this invocation
240c7484f1fSmrg## correctly.  Breaking it into two sed invocations is a workaround.
241e6ecbdaeSmrg  tr ' ' "$nl" < "$tmpdepfile" \
242e6ecbdaeSmrg    | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \
243e6ecbdaeSmrg    | sed -e 's/$/ :/' >> "$depfile"
244c7484f1fSmrg  rm -f "$tmpdepfile"
245c7484f1fSmrg  ;;
246c7484f1fSmrg
247c7484f1fSmrghp)
248c7484f1fSmrg  # This case exists only to let depend.m4 do its work.  It works by
249c7484f1fSmrg  # looking at the text of this script.  This case will never be run,
250c7484f1fSmrg  # since it is checked for above.
251c7484f1fSmrg  exit 1
252c7484f1fSmrg  ;;
253c7484f1fSmrg
254c7484f1fSmrgsgi)
255c7484f1fSmrg  if test "$libtool" = yes; then
256c7484f1fSmrg    "$@" "-Wp,-MDupdate,$tmpdepfile"
257c7484f1fSmrg  else
258c7484f1fSmrg    "$@" -MDupdate "$tmpdepfile"
259c7484f1fSmrg  fi
260c7484f1fSmrg  stat=$?
261e6ecbdaeSmrg  if test $stat -ne 0; then
262c7484f1fSmrg    rm -f "$tmpdepfile"
263c7484f1fSmrg    exit $stat
264c7484f1fSmrg  fi
265c7484f1fSmrg  rm -f "$depfile"
266c7484f1fSmrg
267c7484f1fSmrg  if test -f "$tmpdepfile"; then  # yes, the sourcefile depend on other files
268c7484f1fSmrg    echo "$object : \\" > "$depfile"
269c7484f1fSmrg    # Clip off the initial element (the dependent).  Don't try to be
270c7484f1fSmrg    # clever and replace this with sed code, as IRIX sed won't handle
271c7484f1fSmrg    # lines with more than a fixed number of characters (4096 in
272c7484f1fSmrg    # IRIX 6.2 sed, 8192 in IRIX 6.5).  We also remove comment lines;
273e6ecbdaeSmrg    # the IRIX cc adds comments like '#:fec' to the end of the
274c7484f1fSmrg    # dependency line.
275e6ecbdaeSmrg    tr ' ' "$nl" < "$tmpdepfile" \
276e6ecbdaeSmrg      | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \
277e6ecbdaeSmrg      | tr "$nl" ' ' >> "$depfile"
278baed689fSmrg    echo >> "$depfile"
279c7484f1fSmrg    # The second pass generates a dummy entry for each header file.
280e6ecbdaeSmrg    tr ' ' "$nl" < "$tmpdepfile" \
281e6ecbdaeSmrg      | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
282e6ecbdaeSmrg      >> "$depfile"
283c7484f1fSmrg  else
284e6ecbdaeSmrg    make_dummy_depfile
285c7484f1fSmrg  fi
286c7484f1fSmrg  rm -f "$tmpdepfile"
287c7484f1fSmrg  ;;
288c7484f1fSmrg
289e6ecbdaeSmrgxlc)
290e6ecbdaeSmrg  # This case exists only to let depend.m4 do its work.  It works by
291e6ecbdaeSmrg  # looking at the text of this script.  This case will never be run,
292e6ecbdaeSmrg  # since it is checked for above.
293e6ecbdaeSmrg  exit 1
294e6ecbdaeSmrg  ;;
295e6ecbdaeSmrg
296c7484f1fSmrgaix)
297c7484f1fSmrg  # The C for AIX Compiler uses -M and outputs the dependencies
298c7484f1fSmrg  # in a .u file.  In older versions, this file always lives in the
299e6ecbdaeSmrg  # current directory.  Also, the AIX compiler puts '$object:' at the
300c7484f1fSmrg  # start of each line; $object doesn't have directory information.
301c7484f1fSmrg  # Version 6 uses the directory in both cases.
302e6ecbdaeSmrg  set_dir_from "$object"
303e6ecbdaeSmrg  set_base_from "$object"
304c7484f1fSmrg  if test "$libtool" = yes; then
305baed689fSmrg    tmpdepfile1=$dir$base.u
306baed689fSmrg    tmpdepfile2=$base.u
307baed689fSmrg    tmpdepfile3=$dir.libs/$base.u
308c7484f1fSmrg    "$@" -Wc,-M
309c7484f1fSmrg  else
310baed689fSmrg    tmpdepfile1=$dir$base.u
311baed689fSmrg    tmpdepfile2=$dir$base.u
312baed689fSmrg    tmpdepfile3=$dir$base.u
313c7484f1fSmrg    "$@" -M
314c7484f1fSmrg  fi
315c7484f1fSmrg  stat=$?
316e6ecbdaeSmrg  if test $stat -ne 0; then
317baed689fSmrg    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
318c7484f1fSmrg    exit $stat
319c7484f1fSmrg  fi
320c7484f1fSmrg
321baed689fSmrg  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
322baed689fSmrg  do
323baed689fSmrg    test -f "$tmpdepfile" && break
324baed689fSmrg  done
325e6ecbdaeSmrg  aix_post_process_depfile
326e6ecbdaeSmrg  ;;
327e6ecbdaeSmrg
328e6ecbdaeSmrgtcc)
329e6ecbdaeSmrg  # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26
330e6ecbdaeSmrg  # FIXME: That version still under development at the moment of writing.
331e6ecbdaeSmrg  #        Make that this statement remains true also for stable, released
332e6ecbdaeSmrg  #        versions.
333e6ecbdaeSmrg  # It will wrap lines (doesn't matter whether long or short) with a
334e6ecbdaeSmrg  # trailing '\', as in:
335e6ecbdaeSmrg  #
336e6ecbdaeSmrg  #   foo.o : \
337e6ecbdaeSmrg  #    foo.c \
338e6ecbdaeSmrg  #    foo.h \
339e6ecbdaeSmrg  #
340e6ecbdaeSmrg  # It will put a trailing '\' even on the last line, and will use leading
341e6ecbdaeSmrg  # spaces rather than leading tabs (at least since its commit 0394caf7
342e6ecbdaeSmrg  # "Emit spaces for -MD").
343e6ecbdaeSmrg  "$@" -MD -MF "$tmpdepfile"
344e6ecbdaeSmrg  stat=$?
345e6ecbdaeSmrg  if test $stat -ne 0; then
346e6ecbdaeSmrg    rm -f "$tmpdepfile"
347e6ecbdaeSmrg    exit $stat
348c7484f1fSmrg  fi
349e6ecbdaeSmrg  rm -f "$depfile"
350e6ecbdaeSmrg  # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'.
351e6ecbdaeSmrg  # We have to change lines of the first kind to '$object: \'.
352e6ecbdaeSmrg  sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile"
353e6ecbdaeSmrg  # And for each line of the second kind, we have to emit a 'dep.h:'
354e6ecbdaeSmrg  # dummy dependency, to avoid the deleted-header problem.
355e6ecbdaeSmrg  sed -n -e 's|^  *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile"
356c7484f1fSmrg  rm -f "$tmpdepfile"
357c7484f1fSmrg  ;;
358c7484f1fSmrg
359e6ecbdaeSmrg## The order of this option in the case statement is important, since the
360e6ecbdaeSmrg## shell code in configure will try each of these formats in the order
361e6ecbdaeSmrg## listed in this file.  A plain '-MD' option would be understood by many
362e6ecbdaeSmrg## compilers, so we must ensure this comes after the gcc and icc options.
363e6ecbdaeSmrgpgcc)
364e6ecbdaeSmrg  # Portland's C compiler understands '-MD'.
365e6ecbdaeSmrg  # Will always output deps to 'file.d' where file is the root name of the
366e6ecbdaeSmrg  # source file under compilation, even if file resides in a subdirectory.
367e6ecbdaeSmrg  # The object file name does not affect the name of the '.d' file.
368e6ecbdaeSmrg  # pgcc 10.2 will output
369c7484f1fSmrg  #    foo.o: sub/foo.c sub/foo.h
370e6ecbdaeSmrg  # and will wrap long lines using '\' :
371c7484f1fSmrg  #    foo.o: sub/foo.c ... \
372c7484f1fSmrg  #     sub/foo.h ... \
373c7484f1fSmrg  #     ...
374e6ecbdaeSmrg  set_dir_from "$object"
375e6ecbdaeSmrg  # Use the source, not the object, to determine the base name, since
376e6ecbdaeSmrg  # that's sadly what pgcc will do too.
377e6ecbdaeSmrg  set_base_from "$source"
378e6ecbdaeSmrg  tmpdepfile=$base.d
379e6ecbdaeSmrg
380e6ecbdaeSmrg  # For projects that build the same source file twice into different object
381e6ecbdaeSmrg  # files, the pgcc approach of using the *source* file root name can cause
382e6ecbdaeSmrg  # problems in parallel builds.  Use a locking strategy to avoid stomping on
383e6ecbdaeSmrg  # the same $tmpdepfile.
384e6ecbdaeSmrg  lockdir=$base.d-lock
385e6ecbdaeSmrg  trap "
386e6ecbdaeSmrg    echo '$0: caught signal, cleaning up...' >&2
387e6ecbdaeSmrg    rmdir '$lockdir'
388e6ecbdaeSmrg    exit 1
389e6ecbdaeSmrg  " 1 2 13 15
390e6ecbdaeSmrg  numtries=100
391e6ecbdaeSmrg  i=$numtries
392e6ecbdaeSmrg  while test $i -gt 0; do
393e6ecbdaeSmrg    # mkdir is a portable test-and-set.
394e6ecbdaeSmrg    if mkdir "$lockdir" 2>/dev/null; then
395e6ecbdaeSmrg      # This process acquired the lock.
396e6ecbdaeSmrg      "$@" -MD
397e6ecbdaeSmrg      stat=$?
398e6ecbdaeSmrg      # Release the lock.
399e6ecbdaeSmrg      rmdir "$lockdir"
400e6ecbdaeSmrg      break
401e6ecbdaeSmrg    else
402e6ecbdaeSmrg      # If the lock is being held by a different process, wait
403e6ecbdaeSmrg      # until the winning process is done or we timeout.
404e6ecbdaeSmrg      while test -d "$lockdir" && test $i -gt 0; do
405e6ecbdaeSmrg        sleep 1
406e6ecbdaeSmrg        i=`expr $i - 1`
407e6ecbdaeSmrg      done
408e6ecbdaeSmrg    fi
409e6ecbdaeSmrg    i=`expr $i - 1`
410e6ecbdaeSmrg  done
411e6ecbdaeSmrg  trap - 1 2 13 15
412e6ecbdaeSmrg  if test $i -le 0; then
413e6ecbdaeSmrg    echo "$0: failed to acquire lock after $numtries attempts" >&2
414e6ecbdaeSmrg    echo "$0: check lockdir '$lockdir'" >&2
415e6ecbdaeSmrg    exit 1
416e6ecbdaeSmrg  fi
417c7484f1fSmrg
418e6ecbdaeSmrg  if test $stat -ne 0; then
419c7484f1fSmrg    rm -f "$tmpdepfile"
420c7484f1fSmrg    exit $stat
421c7484f1fSmrg  fi
422c7484f1fSmrg  rm -f "$depfile"
423c7484f1fSmrg  # Each line is of the form `foo.o: dependent.h',
424c7484f1fSmrg  # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'.
425c7484f1fSmrg  # Do two passes, one to just change these to
426c7484f1fSmrg  # `$object: dependent.h' and one to simply `dependent.h:'.
427c7484f1fSmrg  sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
428c7484f1fSmrg  # Some versions of the HPUX 10.20 sed can't process this invocation
429c7484f1fSmrg  # correctly.  Breaking it into two sed invocations is a workaround.
430e6ecbdaeSmrg  sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \
431e6ecbdaeSmrg    | sed -e 's/$/ :/' >> "$depfile"
432c7484f1fSmrg  rm -f "$tmpdepfile"
433c7484f1fSmrg  ;;
434c7484f1fSmrg
435c7484f1fSmrghp2)
436c7484f1fSmrg  # The "hp" stanza above does not work with aCC (C++) and HP's ia64
437c7484f1fSmrg  # compilers, which have integrated preprocessors.  The correct option
438c7484f1fSmrg  # to use with these is +Maked; it writes dependencies to a file named
439c7484f1fSmrg  # 'foo.d', which lands next to the object file, wherever that
440c7484f1fSmrg  # happens to be.
441c7484f1fSmrg  # Much of this is similar to the tru64 case; see comments there.
442e6ecbdaeSmrg  set_dir_from  "$object"
443e6ecbdaeSmrg  set_base_from "$object"
444c7484f1fSmrg  if test "$libtool" = yes; then
445c7484f1fSmrg    tmpdepfile1=$dir$base.d
446c7484f1fSmrg    tmpdepfile2=$dir.libs/$base.d
447c7484f1fSmrg    "$@" -Wc,+Maked
448c7484f1fSmrg  else
449c7484f1fSmrg    tmpdepfile1=$dir$base.d
450c7484f1fSmrg    tmpdepfile2=$dir$base.d
451c7484f1fSmrg    "$@" +Maked
452c7484f1fSmrg  fi
453c7484f1fSmrg  stat=$?
454e6ecbdaeSmrg  if test $stat -ne 0; then
455c7484f1fSmrg     rm -f "$tmpdepfile1" "$tmpdepfile2"
456c7484f1fSmrg     exit $stat
457c7484f1fSmrg  fi
458c7484f1fSmrg
459c7484f1fSmrg  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2"
460c7484f1fSmrg  do
461c7484f1fSmrg    test -f "$tmpdepfile" && break
462c7484f1fSmrg  done
463c7484f1fSmrg  if test -f "$tmpdepfile"; then
464e6ecbdaeSmrg    sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile"
465e6ecbdaeSmrg    # Add 'dependent.h:' lines.
466baed689fSmrg    sed -ne '2,${
467e6ecbdaeSmrg               s/^ *//
468e6ecbdaeSmrg               s/ \\*$//
469e6ecbdaeSmrg               s/$/:/
470e6ecbdaeSmrg               p
471e6ecbdaeSmrg             }' "$tmpdepfile" >> "$depfile"
472c7484f1fSmrg  else
473e6ecbdaeSmrg    make_dummy_depfile
474c7484f1fSmrg  fi
475c7484f1fSmrg  rm -f "$tmpdepfile" "$tmpdepfile2"
476c7484f1fSmrg  ;;
477c7484f1fSmrg
478c7484f1fSmrgtru64)
479e6ecbdaeSmrg  # The Tru64 compiler uses -MD to generate dependencies as a side
480e6ecbdaeSmrg  # effect.  'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'.
481e6ecbdaeSmrg  # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
482e6ecbdaeSmrg  # dependencies in 'foo.d' instead, so we check for that too.
483e6ecbdaeSmrg  # Subdirectories are respected.
484e6ecbdaeSmrg  set_dir_from  "$object"
485e6ecbdaeSmrg  set_base_from "$object"
486e6ecbdaeSmrg
487e6ecbdaeSmrg  if test "$libtool" = yes; then
488e6ecbdaeSmrg    # Libtool generates 2 separate objects for the 2 libraries.  These
489e6ecbdaeSmrg    # two compilations output dependencies in $dir.libs/$base.o.d and
490e6ecbdaeSmrg    # in $dir$base.o.d.  We have to check for both files, because
491e6ecbdaeSmrg    # one of the two compilations can be disabled.  We should prefer
492e6ecbdaeSmrg    # $dir$base.o.d over $dir.libs/$base.o.d because the latter is
493e6ecbdaeSmrg    # automatically cleaned when .libs/ is deleted, while ignoring
494e6ecbdaeSmrg    # the former would cause a distcleancheck panic.
495e6ecbdaeSmrg    tmpdepfile1=$dir$base.o.d          # libtool 1.5
496e6ecbdaeSmrg    tmpdepfile2=$dir.libs/$base.o.d    # Likewise.
497e6ecbdaeSmrg    tmpdepfile3=$dir.libs/$base.d      # Compaq CCC V6.2-504
498e6ecbdaeSmrg    "$@" -Wc,-MD
499e6ecbdaeSmrg  else
500e6ecbdaeSmrg    tmpdepfile1=$dir$base.d
501e6ecbdaeSmrg    tmpdepfile2=$dir$base.d
502e6ecbdaeSmrg    tmpdepfile3=$dir$base.d
503e6ecbdaeSmrg    "$@" -MD
504e6ecbdaeSmrg  fi
505e6ecbdaeSmrg
506e6ecbdaeSmrg  stat=$?
507e6ecbdaeSmrg  if test $stat -ne 0; then
508e6ecbdaeSmrg    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
509e6ecbdaeSmrg    exit $stat
510e6ecbdaeSmrg  fi
511e6ecbdaeSmrg
512e6ecbdaeSmrg  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
513e6ecbdaeSmrg  do
514e6ecbdaeSmrg    test -f "$tmpdepfile" && break
515e6ecbdaeSmrg  done
516e6ecbdaeSmrg  # Same post-processing that is required for AIX mode.
517e6ecbdaeSmrg  aix_post_process_depfile
518e6ecbdaeSmrg  ;;
519e6ecbdaeSmrg
520e6ecbdaeSmrgmsvc7)
521e6ecbdaeSmrg  if test "$libtool" = yes; then
522e6ecbdaeSmrg    showIncludes=-Wc,-showIncludes
523e6ecbdaeSmrg  else
524e6ecbdaeSmrg    showIncludes=-showIncludes
525e6ecbdaeSmrg  fi
526e6ecbdaeSmrg  "$@" $showIncludes > "$tmpdepfile"
527e6ecbdaeSmrg  stat=$?
528e6ecbdaeSmrg  grep -v '^Note: including file: ' "$tmpdepfile"
529e6ecbdaeSmrg  if test $stat -ne 0; then
530e6ecbdaeSmrg    rm -f "$tmpdepfile"
531e6ecbdaeSmrg    exit $stat
532e6ecbdaeSmrg  fi
533e6ecbdaeSmrg  rm -f "$depfile"
534e6ecbdaeSmrg  echo "$object : \\" > "$depfile"
535e6ecbdaeSmrg  # The first sed program below extracts the file names and escapes
536e6ecbdaeSmrg  # backslashes for cygpath.  The second sed program outputs the file
537e6ecbdaeSmrg  # name when reading, but also accumulates all include files in the
538e6ecbdaeSmrg  # hold buffer in order to output them again at the end.  This only
539e6ecbdaeSmrg  # works with sed implementations that can handle large buffers.
540e6ecbdaeSmrg  sed < "$tmpdepfile" -n '
541e6ecbdaeSmrg/^Note: including file:  *\(.*\)/ {
542e6ecbdaeSmrg  s//\1/
543e6ecbdaeSmrg  s/\\/\\\\/g
544e6ecbdaeSmrg  p
545e6ecbdaeSmrg}' | $cygpath_u | sort -u | sed -n '
546e6ecbdaeSmrgs/ /\\ /g
547e6ecbdaeSmrgs/\(.*\)/'"$tab"'\1 \\/p
548e6ecbdaeSmrgs/.\(.*\) \\/\1:/
549e6ecbdaeSmrgH
550e6ecbdaeSmrg$ {
551e6ecbdaeSmrg  s/.*/'"$tab"'/
552e6ecbdaeSmrg  G
553e6ecbdaeSmrg  p
554e6ecbdaeSmrg}' >> "$depfile"
555e6ecbdaeSmrg  echo >> "$depfile" # make sure the fragment doesn't end with a backslash
556e6ecbdaeSmrg  rm -f "$tmpdepfile"
557e6ecbdaeSmrg  ;;
558e6ecbdaeSmrg
559e6ecbdaeSmrgmsvc7msys)
560e6ecbdaeSmrg  # This case exists only to let depend.m4 do its work.  It works by
561e6ecbdaeSmrg  # looking at the text of this script.  This case will never be run,
562e6ecbdaeSmrg  # since it is checked for above.
563e6ecbdaeSmrg  exit 1
564e6ecbdaeSmrg  ;;
565c7484f1fSmrg
566c7484f1fSmrg#nosideeffect)
567c7484f1fSmrg  # This comment above is used by automake to tell side-effect
568c7484f1fSmrg  # dependency tracking mechanisms from slower ones.
569c7484f1fSmrg
570c7484f1fSmrgdashmstdout)
571c7484f1fSmrg  # Important note: in order to support this mode, a compiler *must*
572c7484f1fSmrg  # always write the preprocessed file to stdout, regardless of -o.
573c7484f1fSmrg  "$@" || exit $?
574c7484f1fSmrg
575c7484f1fSmrg  # Remove the call to Libtool.
576c7484f1fSmrg  if test "$libtool" = yes; then
577baed689fSmrg    while test "X$1" != 'X--mode=compile'; do
578c7484f1fSmrg      shift
579c7484f1fSmrg    done
580c7484f1fSmrg    shift
581c7484f1fSmrg  fi
582c7484f1fSmrg
583e6ecbdaeSmrg  # Remove '-o $object'.
584c7484f1fSmrg  IFS=" "
585c7484f1fSmrg  for arg
586c7484f1fSmrg  do
587c7484f1fSmrg    case $arg in
588c7484f1fSmrg    -o)
589c7484f1fSmrg      shift
590c7484f1fSmrg      ;;
591c7484f1fSmrg    $object)
592c7484f1fSmrg      shift
593c7484f1fSmrg      ;;
594c7484f1fSmrg    *)
595c7484f1fSmrg      set fnord "$@" "$arg"
596c7484f1fSmrg      shift # fnord
597c7484f1fSmrg      shift # $arg
598c7484f1fSmrg      ;;
599c7484f1fSmrg    esac
600c7484f1fSmrg  done
601c7484f1fSmrg
602c7484f1fSmrg  test -z "$dashmflag" && dashmflag=-M
603e6ecbdaeSmrg  # Require at least two characters before searching for ':'
604c7484f1fSmrg  # in the target name.  This is to cope with DOS-style filenames:
605e6ecbdaeSmrg  # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise.
606c7484f1fSmrg  "$@" $dashmflag |
607e6ecbdaeSmrg    sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile"
608c7484f1fSmrg  rm -f "$depfile"
609c7484f1fSmrg  cat < "$tmpdepfile" > "$depfile"
610e6ecbdaeSmrg  # Some versions of the HPUX 10.20 sed can't process this sed invocation
611e6ecbdaeSmrg  # correctly.  Breaking it into two sed invocations is a workaround.
612e6ecbdaeSmrg  tr ' ' "$nl" < "$tmpdepfile" \
613e6ecbdaeSmrg    | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
614e6ecbdaeSmrg    | sed -e 's/$/ :/' >> "$depfile"
615c7484f1fSmrg  rm -f "$tmpdepfile"
616c7484f1fSmrg  ;;
617c7484f1fSmrg
618c7484f1fSmrgdashXmstdout)
619c7484f1fSmrg  # This case only exists to satisfy depend.m4.  It is never actually
620c7484f1fSmrg  # run, as this mode is specially recognized in the preamble.
621c7484f1fSmrg  exit 1
622c7484f1fSmrg  ;;
623c7484f1fSmrg
624c7484f1fSmrgmakedepend)
625c7484f1fSmrg  "$@" || exit $?
626c7484f1fSmrg  # Remove any Libtool call
627c7484f1fSmrg  if test "$libtool" = yes; then
628baed689fSmrg    while test "X$1" != 'X--mode=compile'; do
629c7484f1fSmrg      shift
630c7484f1fSmrg    done
631c7484f1fSmrg    shift
632c7484f1fSmrg  fi
633c7484f1fSmrg  # X makedepend
634c7484f1fSmrg  shift
635baed689fSmrg  cleared=no eat=no
636baed689fSmrg  for arg
637baed689fSmrg  do
638c7484f1fSmrg    case $cleared in
639c7484f1fSmrg    no)
640c7484f1fSmrg      set ""; shift
641c7484f1fSmrg      cleared=yes ;;
642c7484f1fSmrg    esac
643baed689fSmrg    if test $eat = yes; then
644baed689fSmrg      eat=no
645baed689fSmrg      continue
646baed689fSmrg    fi
647c7484f1fSmrg    case "$arg" in
648c7484f1fSmrg    -D*|-I*)
649c7484f1fSmrg      set fnord "$@" "$arg"; shift ;;
650c7484f1fSmrg    # Strip any option that makedepend may not understand.  Remove
651c7484f1fSmrg    # the object too, otherwise makedepend will parse it as a source file.
652baed689fSmrg    -arch)
653baed689fSmrg      eat=yes ;;
654c7484f1fSmrg    -*|$object)
655c7484f1fSmrg      ;;
656c7484f1fSmrg    *)
657c7484f1fSmrg      set fnord "$@" "$arg"; shift ;;
658c7484f1fSmrg    esac
659c7484f1fSmrg  done
660baed689fSmrg  obj_suffix=`echo "$object" | sed 's/^.*\././'`
661c7484f1fSmrg  touch "$tmpdepfile"
662c7484f1fSmrg  ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
663c7484f1fSmrg  rm -f "$depfile"
664e6ecbdaeSmrg  # makedepend may prepend the VPATH from the source file name to the object.
665e6ecbdaeSmrg  # No need to regex-escape $object, excess matching of '.' is harmless.
666e6ecbdaeSmrg  sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile"
667e6ecbdaeSmrg  # Some versions of the HPUX 10.20 sed can't process the last invocation
668e6ecbdaeSmrg  # correctly.  Breaking it into two sed invocations is a workaround.
669e6ecbdaeSmrg  sed '1,2d' "$tmpdepfile" \
670e6ecbdaeSmrg    | tr ' ' "$nl" \
671e6ecbdaeSmrg    | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
672e6ecbdaeSmrg    | sed -e 's/$/ :/' >> "$depfile"
673c7484f1fSmrg  rm -f "$tmpdepfile" "$tmpdepfile".bak
674c7484f1fSmrg  ;;
675c7484f1fSmrg
676c7484f1fSmrgcpp)
677c7484f1fSmrg  # Important note: in order to support this mode, a compiler *must*
678c7484f1fSmrg  # always write the preprocessed file to stdout.
679c7484f1fSmrg  "$@" || exit $?
680c7484f1fSmrg
681c7484f1fSmrg  # Remove the call to Libtool.
682c7484f1fSmrg  if test "$libtool" = yes; then
683baed689fSmrg    while test "X$1" != 'X--mode=compile'; do
684c7484f1fSmrg      shift
685c7484f1fSmrg    done
686c7484f1fSmrg    shift
687c7484f1fSmrg  fi
688c7484f1fSmrg
689e6ecbdaeSmrg  # Remove '-o $object'.
690c7484f1fSmrg  IFS=" "
691c7484f1fSmrg  for arg
692c7484f1fSmrg  do
693c7484f1fSmrg    case $arg in
694c7484f1fSmrg    -o)
695c7484f1fSmrg      shift
696c7484f1fSmrg      ;;
697c7484f1fSmrg    $object)
698c7484f1fSmrg      shift
699c7484f1fSmrg      ;;
700c7484f1fSmrg    *)
701c7484f1fSmrg      set fnord "$@" "$arg"
702c7484f1fSmrg      shift # fnord
703c7484f1fSmrg      shift # $arg
704c7484f1fSmrg      ;;
705c7484f1fSmrg    esac
706c7484f1fSmrg  done
707c7484f1fSmrg
708e6ecbdaeSmrg  "$@" -E \
709e6ecbdaeSmrg    | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
710e6ecbdaeSmrg             -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
711e6ecbdaeSmrg    | sed '$ s: \\$::' > "$tmpdepfile"
712c7484f1fSmrg  rm -f "$depfile"
713c7484f1fSmrg  echo "$object : \\" > "$depfile"
714c7484f1fSmrg  cat < "$tmpdepfile" >> "$depfile"
715c7484f1fSmrg  sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
716c7484f1fSmrg  rm -f "$tmpdepfile"
717c7484f1fSmrg  ;;
718c7484f1fSmrg
719c7484f1fSmrgmsvisualcpp)
720c7484f1fSmrg  # Important note: in order to support this mode, a compiler *must*
721baed689fSmrg  # always write the preprocessed file to stdout.
722c7484f1fSmrg  "$@" || exit $?
723baed689fSmrg
724baed689fSmrg  # Remove the call to Libtool.
725baed689fSmrg  if test "$libtool" = yes; then
726baed689fSmrg    while test "X$1" != 'X--mode=compile'; do
727baed689fSmrg      shift
728baed689fSmrg    done
729baed689fSmrg    shift
730baed689fSmrg  fi
731baed689fSmrg
732c7484f1fSmrg  IFS=" "
733c7484f1fSmrg  for arg
734c7484f1fSmrg  do
735c7484f1fSmrg    case "$arg" in
736baed689fSmrg    -o)
737baed689fSmrg      shift
738baed689fSmrg      ;;
739baed689fSmrg    $object)
740baed689fSmrg      shift
741baed689fSmrg      ;;
742c7484f1fSmrg    "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
743e6ecbdaeSmrg        set fnord "$@"
744e6ecbdaeSmrg        shift
745e6ecbdaeSmrg        shift
746e6ecbdaeSmrg        ;;
747c7484f1fSmrg    *)
748e6ecbdaeSmrg        set fnord "$@" "$arg"
749e6ecbdaeSmrg        shift
750e6ecbdaeSmrg        shift
751e6ecbdaeSmrg        ;;
752c7484f1fSmrg    esac
753c7484f1fSmrg  done
754baed689fSmrg  "$@" -E 2>/dev/null |
755baed689fSmrg  sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile"
756c7484f1fSmrg  rm -f "$depfile"
757c7484f1fSmrg  echo "$object : \\" > "$depfile"
758e6ecbdaeSmrg  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile"
759e6ecbdaeSmrg  echo "$tab" >> "$depfile"
760baed689fSmrg  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile"
761c7484f1fSmrg  rm -f "$tmpdepfile"
762c7484f1fSmrg  ;;
763c7484f1fSmrg
764baed689fSmrgmsvcmsys)
765baed689fSmrg  # This case exists only to let depend.m4 do its work.  It works by
766baed689fSmrg  # looking at the text of this script.  This case will never be run,
767baed689fSmrg  # since it is checked for above.
768baed689fSmrg  exit 1
769baed689fSmrg  ;;
770baed689fSmrg
771c7484f1fSmrgnone)
772c7484f1fSmrg  exec "$@"
773c7484f1fSmrg  ;;
774c7484f1fSmrg
775c7484f1fSmrg*)
776c7484f1fSmrg  echo "Unknown depmode $depmode" 1>&2
777c7484f1fSmrg  exit 1
778c7484f1fSmrg  ;;
779c7484f1fSmrgesac
780c7484f1fSmrg
781c7484f1fSmrgexit 0
782c7484f1fSmrg
783c7484f1fSmrg# Local Variables:
784c7484f1fSmrg# mode: shell-script
785c7484f1fSmrg# sh-indentation: 2
786c7484f1fSmrg# eval: (add-hook 'write-file-hooks 'time-stamp)
787c7484f1fSmrg# time-stamp-start: "scriptversion="
788c7484f1fSmrg# time-stamp-format: "%:y-%02m-%02d.%02H"
789baed689fSmrg# time-stamp-time-zone: "UTC"
790baed689fSmrg# time-stamp-end: "; # UTC"
791c7484f1fSmrg# End:
792