1fe5e51b7Smrg#! /bin/sh
2fe5e51b7Smrg# depcomp - compile a program generating dependencies as side-effects
3fe5e51b7Smrg
41e423a8fSmrgscriptversion=2018-03-07.03; # UTC
5fe5e51b7Smrg
61e423a8fSmrg# Copyright (C) 1999-2021 Free Software Foundation, Inc.
7fe5e51b7Smrg
8fe5e51b7Smrg# This program is free software; you can redistribute it and/or modify
9fe5e51b7Smrg# it under the terms of the GNU General Public License as published by
10fe5e51b7Smrg# the Free Software Foundation; either version 2, or (at your option)
11fe5e51b7Smrg# any later version.
12fe5e51b7Smrg
13fe5e51b7Smrg# This program is distributed in the hope that it will be useful,
14fe5e51b7Smrg# but WITHOUT ANY WARRANTY; without even the implied warranty of
15fe5e51b7Smrg# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16fe5e51b7Smrg# GNU General Public License for more details.
17fe5e51b7Smrg
18fe5e51b7Smrg# You should have received a copy of the GNU General Public License
191e423a8fSmrg# along with this program.  If not, see <https://www.gnu.org/licenses/>.
20fe5e51b7Smrg
21fe5e51b7Smrg# As a special exception to the GNU General Public License, if you
22fe5e51b7Smrg# distribute this file as part of a program that contains a
23fe5e51b7Smrg# configuration script generated by Autoconf, you may include it under
24fe5e51b7Smrg# the same distribution terms that you use for the rest of that program.
25fe5e51b7Smrg
26fe5e51b7Smrg# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>.
27fe5e51b7Smrg
28fe5e51b7Smrgcase $1 in
29fe5e51b7Smrg  '')
30493f84f4Smrg    echo "$0: No command.  Try '$0 --help' for more information." 1>&2
31493f84f4Smrg    exit 1;
32493f84f4Smrg    ;;
33fe5e51b7Smrg  -h | --h*)
34fe5e51b7Smrg    cat <<\EOF
35fe5e51b7SmrgUsage: depcomp [--help] [--version] PROGRAM [ARGS]
36fe5e51b7Smrg
37fe5e51b7SmrgRun PROGRAMS ARGS to compile a file, generating dependencies
38fe5e51b7Smrgas side-effects.
39fe5e51b7Smrg
40fe5e51b7SmrgEnvironment variables:
41fe5e51b7Smrg  depmode     Dependency tracking mode.
42acd6767fSmrg  source      Source file read by 'PROGRAMS ARGS'.
43acd6767fSmrg  object      Object file output by 'PROGRAMS ARGS'.
44fe5e51b7Smrg  DEPDIR      directory where to store dependencies.
45fe5e51b7Smrg  depfile     Dependency file to output.
460bb88ba4Smrg  tmpdepfile  Temporary file to use when outputting dependencies.
47fe5e51b7Smrg  libtool     Whether libtool is used (yes/no).
48fe5e51b7Smrg
49fe5e51b7SmrgReport bugs to <bug-automake@gnu.org>.
50fe5e51b7SmrgEOF
51fe5e51b7Smrg    exit $?
52fe5e51b7Smrg    ;;
53fe5e51b7Smrg  -v | --v*)
54fe5e51b7Smrg    echo "depcomp $scriptversion"
55fe5e51b7Smrg    exit $?
56fe5e51b7Smrg    ;;
57fe5e51b7Smrgesac
58fe5e51b7Smrg
59493f84f4Smrg# Get the directory component of the given path, and save it in the
60493f84f4Smrg# global variables '$dir'.  Note that this directory component will
61493f84f4Smrg# be either empty or ending with a '/' character.  This is deliberate.
62493f84f4Smrgset_dir_from ()
63493f84f4Smrg{
64493f84f4Smrg  case $1 in
65493f84f4Smrg    */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;;
66493f84f4Smrg      *) dir=;;
67493f84f4Smrg  esac
68493f84f4Smrg}
69493f84f4Smrg
70493f84f4Smrg# Get the suffix-stripped basename of the given path, and save it the
71493f84f4Smrg# global variable '$base'.
72493f84f4Smrgset_base_from ()
73493f84f4Smrg{
74493f84f4Smrg  base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'`
75493f84f4Smrg}
76493f84f4Smrg
77493f84f4Smrg# If no dependency file was actually created by the compiler invocation,
78493f84f4Smrg# we still have to create a dummy depfile, to avoid errors with the
79493f84f4Smrg# Makefile "include basename.Plo" scheme.
80493f84f4Smrgmake_dummy_depfile ()
81493f84f4Smrg{
82493f84f4Smrg  echo "#dummy" > "$depfile"
83493f84f4Smrg}
84493f84f4Smrg
85493f84f4Smrg# Factor out some common post-processing of the generated depfile.
86493f84f4Smrg# Requires the auxiliary global variable '$tmpdepfile' to be set.
87493f84f4Smrgaix_post_process_depfile ()
88493f84f4Smrg{
89493f84f4Smrg  # If the compiler actually managed to produce a dependency file,
90493f84f4Smrg  # post-process it.
91493f84f4Smrg  if test -f "$tmpdepfile"; then
92493f84f4Smrg    # Each line is of the form 'foo.o: dependency.h'.
93493f84f4Smrg    # Do two passes, one to just change these to
94493f84f4Smrg    #   $object: dependency.h
95493f84f4Smrg    # and one to simply output
96493f84f4Smrg    #   dependency.h:
97493f84f4Smrg    # which is needed to avoid the deleted-header problem.
98493f84f4Smrg    { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile"
99493f84f4Smrg      sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile"
100493f84f4Smrg    } > "$depfile"
101493f84f4Smrg    rm -f "$tmpdepfile"
102493f84f4Smrg  else
103493f84f4Smrg    make_dummy_depfile
104493f84f4Smrg  fi
105493f84f4Smrg}
106493f84f4Smrg
107acd6767fSmrg# A tabulation character.
108acd6767fSmrgtab='	'
109acd6767fSmrg# A newline character.
110acd6767fSmrgnl='
111acd6767fSmrg'
112493f84f4Smrg# Character ranges might be problematic outside the C locale.
113493f84f4Smrg# These definitions help.
114493f84f4Smrgupper=ABCDEFGHIJKLMNOPQRSTUVWXYZ
115493f84f4Smrglower=abcdefghijklmnopqrstuvwxyz
116493f84f4Smrgdigits=0123456789
117493f84f4Smrgalpha=${upper}${lower}
118acd6767fSmrg
119fe5e51b7Smrgif test -z "$depmode" || test -z "$source" || test -z "$object"; then
120fe5e51b7Smrg  echo "depcomp: Variables source, object and depmode must be set" 1>&2
121fe5e51b7Smrg  exit 1
122fe5e51b7Smrgfi
123fe5e51b7Smrg
124fe5e51b7Smrg# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.
125fe5e51b7Smrgdepfile=${depfile-`echo "$object" |
126fe5e51b7Smrg  sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`}
127fe5e51b7Smrgtmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
128fe5e51b7Smrg
129fe5e51b7Smrgrm -f "$tmpdepfile"
130fe5e51b7Smrg
131493f84f4Smrg# Avoid interferences from the environment.
132493f84f4Smrggccflag= dashmflag=
133493f84f4Smrg
134fe5e51b7Smrg# Some modes work just like other modes, but use different flags.  We
135fe5e51b7Smrg# parameterize here, but still list the modes in the big case below,
136fe5e51b7Smrg# to make depend.m4 easier to write.  Note that we *cannot* use a case
137fe5e51b7Smrg# here, because this file can only contain one case statement.
138fe5e51b7Smrgif test "$depmode" = hp; then
139fe5e51b7Smrg  # HP compiler uses -M and no extra arg.
140fe5e51b7Smrg  gccflag=-M
141fe5e51b7Smrg  depmode=gcc
142fe5e51b7Smrgfi
143fe5e51b7Smrg
144fe5e51b7Smrgif test "$depmode" = dashXmstdout; then
145493f84f4Smrg  # This is just like dashmstdout with a different argument.
146493f84f4Smrg  dashmflag=-xM
147493f84f4Smrg  depmode=dashmstdout
148fe5e51b7Smrgfi
149fe5e51b7Smrg
1500bb88ba4Smrgcygpath_u="cygpath -u -f -"
1510bb88ba4Smrgif test "$depmode" = msvcmsys; then
152493f84f4Smrg  # This is just like msvisualcpp but w/o cygpath translation.
153493f84f4Smrg  # Just convert the backslash-escaped backslashes to single forward
154493f84f4Smrg  # slashes to satisfy depend.m4
155493f84f4Smrg  cygpath_u='sed s,\\\\,/,g'
156493f84f4Smrg  depmode=msvisualcpp
1570bb88ba4Smrgfi
1580bb88ba4Smrg
1590bb88ba4Smrgif test "$depmode" = msvc7msys; then
160493f84f4Smrg  # This is just like msvc7 but w/o cygpath translation.
161493f84f4Smrg  # Just convert the backslash-escaped backslashes to single forward
162493f84f4Smrg  # slashes to satisfy depend.m4
163493f84f4Smrg  cygpath_u='sed s,\\\\,/,g'
164493f84f4Smrg  depmode=msvc7
1650bb88ba4Smrgfi
1660bb88ba4Smrg
167acd6767fSmrgif test "$depmode" = xlc; then
168493f84f4Smrg  # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information.
169493f84f4Smrg  gccflag=-qmakedep=gcc,-MF
170493f84f4Smrg  depmode=gcc
171acd6767fSmrgfi
172acd6767fSmrg
173fe5e51b7Smrgcase "$depmode" in
174fe5e51b7Smrggcc3)
175fe5e51b7Smrg## gcc 3 implements dependency tracking that does exactly what
176fe5e51b7Smrg## we want.  Yay!  Note: for some reason libtool 1.4 doesn't like
177fe5e51b7Smrg## it if -MD -MP comes after the -MF stuff.  Hmm.
178fe5e51b7Smrg## Unfortunately, FreeBSD c89 acceptance of flags depends upon
179fe5e51b7Smrg## the command line argument order; so add the flags where they
180fe5e51b7Smrg## appear in depend2.am.  Note that the slowdown incurred here
181fe5e51b7Smrg## affects only configure: in makefiles, %FASTDEP% shortcuts this.
182fe5e51b7Smrg  for arg
183fe5e51b7Smrg  do
184fe5e51b7Smrg    case $arg in
185fe5e51b7Smrg    -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;;
186fe5e51b7Smrg    *)  set fnord "$@" "$arg" ;;
187fe5e51b7Smrg    esac
188fe5e51b7Smrg    shift # fnord
189fe5e51b7Smrg    shift # $arg
190fe5e51b7Smrg  done
191fe5e51b7Smrg  "$@"
192fe5e51b7Smrg  stat=$?
193493f84f4Smrg  if test $stat -ne 0; then
194fe5e51b7Smrg    rm -f "$tmpdepfile"
195fe5e51b7Smrg    exit $stat
196fe5e51b7Smrg  fi
197fe5e51b7Smrg  mv "$tmpdepfile" "$depfile"
198fe5e51b7Smrg  ;;
199fe5e51b7Smrg
200fe5e51b7Smrggcc)
201493f84f4Smrg## Note that this doesn't just cater to obsosete pre-3.x GCC compilers.
202493f84f4Smrg## but also to in-use compilers like IMB xlc/xlC and the HP C compiler.
203493f84f4Smrg## (see the conditional assignment to $gccflag above).
204fe5e51b7Smrg## There are various ways to get dependency output from gcc.  Here's
205fe5e51b7Smrg## why we pick this rather obscure method:
206fe5e51b7Smrg## - Don't want to use -MD because we'd like the dependencies to end
207fe5e51b7Smrg##   up in a subdir.  Having to rename by hand is ugly.
208fe5e51b7Smrg##   (We might end up doing this anyway to support other compilers.)
209fe5e51b7Smrg## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
210493f84f4Smrg##   -MM, not -M (despite what the docs say).  Also, it might not be
211493f84f4Smrg##   supported by the other compilers which use the 'gcc' depmode.
212fe5e51b7Smrg## - Using -M directly means running the compiler twice (even worse
213fe5e51b7Smrg##   than renaming).
214fe5e51b7Smrg  if test -z "$gccflag"; then
215fe5e51b7Smrg    gccflag=-MD,
216fe5e51b7Smrg  fi
217fe5e51b7Smrg  "$@" -Wp,"$gccflag$tmpdepfile"
218fe5e51b7Smrg  stat=$?
219493f84f4Smrg  if test $stat -ne 0; then
220fe5e51b7Smrg    rm -f "$tmpdepfile"
221fe5e51b7Smrg    exit $stat
222fe5e51b7Smrg  fi
223fe5e51b7Smrg  rm -f "$depfile"
224fe5e51b7Smrg  echo "$object : \\" > "$depfile"
225493f84f4Smrg  # The second -e expression handles DOS-style file names with drive
226493f84f4Smrg  # letters.
227fe5e51b7Smrg  sed -e 's/^[^:]*: / /' \
228fe5e51b7Smrg      -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
229acd6767fSmrg## This next piece of magic avoids the "deleted header file" problem.
230fe5e51b7Smrg## The problem is that when a header file which appears in a .P file
231fe5e51b7Smrg## is deleted, the dependency causes make to die (because there is
232fe5e51b7Smrg## typically no way to rebuild the header).  We avoid this by adding
233fe5e51b7Smrg## dummy dependencies for each header file.  Too bad gcc doesn't do
234fe5e51b7Smrg## this for us directly.
235acd6767fSmrg## Some versions of gcc put a space before the ':'.  On the theory
236fe5e51b7Smrg## that the space means something, we add a space to the output as
2370bb88ba4Smrg## well.  hp depmode also adds that space, but also prefixes the VPATH
2380bb88ba4Smrg## to the object.  Take care to not repeat it in the output.
239fe5e51b7Smrg## Some versions of the HPUX 10.20 sed can't process this invocation
240fe5e51b7Smrg## correctly.  Breaking it into two sed invocations is a workaround.
241493f84f4Smrg  tr ' ' "$nl" < "$tmpdepfile" \
242493f84f4Smrg    | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \
243493f84f4Smrg    | sed -e 's/$/ :/' >> "$depfile"
244fe5e51b7Smrg  rm -f "$tmpdepfile"
245fe5e51b7Smrg  ;;
246fe5e51b7Smrg
247fe5e51b7Smrghp)
248fe5e51b7Smrg  # This case exists only to let depend.m4 do its work.  It works by
249fe5e51b7Smrg  # looking at the text of this script.  This case will never be run,
250fe5e51b7Smrg  # since it is checked for above.
251fe5e51b7Smrg  exit 1
252fe5e51b7Smrg  ;;
253fe5e51b7Smrg
254fe5e51b7Smrgsgi)
255fe5e51b7Smrg  if test "$libtool" = yes; then
256fe5e51b7Smrg    "$@" "-Wp,-MDupdate,$tmpdepfile"
257fe5e51b7Smrg  else
258fe5e51b7Smrg    "$@" -MDupdate "$tmpdepfile"
259fe5e51b7Smrg  fi
260fe5e51b7Smrg  stat=$?
261493f84f4Smrg  if test $stat -ne 0; then
262fe5e51b7Smrg    rm -f "$tmpdepfile"
263fe5e51b7Smrg    exit $stat
264fe5e51b7Smrg  fi
265fe5e51b7Smrg  rm -f "$depfile"
266fe5e51b7Smrg
267fe5e51b7Smrg  if test -f "$tmpdepfile"; then  # yes, the sourcefile depend on other files
268fe5e51b7Smrg    echo "$object : \\" > "$depfile"
269fe5e51b7Smrg    # Clip off the initial element (the dependent).  Don't try to be
270fe5e51b7Smrg    # clever and replace this with sed code, as IRIX sed won't handle
271fe5e51b7Smrg    # lines with more than a fixed number of characters (4096 in
272fe5e51b7Smrg    # IRIX 6.2 sed, 8192 in IRIX 6.5).  We also remove comment lines;
273acd6767fSmrg    # the IRIX cc adds comments like '#:fec' to the end of the
274fe5e51b7Smrg    # dependency line.
275acd6767fSmrg    tr ' ' "$nl" < "$tmpdepfile" \
276493f84f4Smrg      | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \
277493f84f4Smrg      | tr "$nl" ' ' >> "$depfile"
2780bb88ba4Smrg    echo >> "$depfile"
279fe5e51b7Smrg    # The second pass generates a dummy entry for each header file.
280acd6767fSmrg    tr ' ' "$nl" < "$tmpdepfile" \
281493f84f4Smrg      | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
282493f84f4Smrg      >> "$depfile"
283fe5e51b7Smrg  else
284493f84f4Smrg    make_dummy_depfile
285fe5e51b7Smrg  fi
286fe5e51b7Smrg  rm -f "$tmpdepfile"
287fe5e51b7Smrg  ;;
288fe5e51b7Smrg
289acd6767fSmrgxlc)
290acd6767fSmrg  # This case exists only to let depend.m4 do its work.  It works by
291acd6767fSmrg  # looking at the text of this script.  This case will never be run,
292acd6767fSmrg  # since it is checked for above.
293acd6767fSmrg  exit 1
294acd6767fSmrg  ;;
295acd6767fSmrg
296fe5e51b7Smrgaix)
297fe5e51b7Smrg  # The C for AIX Compiler uses -M and outputs the dependencies
298fe5e51b7Smrg  # in a .u file.  In older versions, this file always lives in the
299acd6767fSmrg  # current directory.  Also, the AIX compiler puts '$object:' at the
300fe5e51b7Smrg  # start of each line; $object doesn't have directory information.
301fe5e51b7Smrg  # Version 6 uses the directory in both cases.
302493f84f4Smrg  set_dir_from "$object"
303493f84f4Smrg  set_base_from "$object"
304fe5e51b7Smrg  if test "$libtool" = yes; then
305eda3803bSmrg    tmpdepfile1=$dir$base.u
306eda3803bSmrg    tmpdepfile2=$base.u
307eda3803bSmrg    tmpdepfile3=$dir.libs/$base.u
308fe5e51b7Smrg    "$@" -Wc,-M
309fe5e51b7Smrg  else
310eda3803bSmrg    tmpdepfile1=$dir$base.u
311eda3803bSmrg    tmpdepfile2=$dir$base.u
312eda3803bSmrg    tmpdepfile3=$dir$base.u
313fe5e51b7Smrg    "$@" -M
314fe5e51b7Smrg  fi
315fe5e51b7Smrg  stat=$?
316493f84f4Smrg  if test $stat -ne 0; then
317eda3803bSmrg    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
318fe5e51b7Smrg    exit $stat
319fe5e51b7Smrg  fi
320fe5e51b7Smrg
321eda3803bSmrg  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
322eda3803bSmrg  do
323eda3803bSmrg    test -f "$tmpdepfile" && break
324eda3803bSmrg  done
325493f84f4Smrg  aix_post_process_depfile
326493f84f4Smrg  ;;
327493f84f4Smrg
328493f84f4Smrgtcc)
329493f84f4Smrg  # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26
330493f84f4Smrg  # FIXME: That version still under development at the moment of writing.
331493f84f4Smrg  #        Make that this statement remains true also for stable, released
332493f84f4Smrg  #        versions.
333493f84f4Smrg  # It will wrap lines (doesn't matter whether long or short) with a
334493f84f4Smrg  # trailing '\', as in:
335493f84f4Smrg  #
336493f84f4Smrg  #   foo.o : \
337493f84f4Smrg  #    foo.c \
338493f84f4Smrg  #    foo.h \
339493f84f4Smrg  #
340493f84f4Smrg  # It will put a trailing '\' even on the last line, and will use leading
341493f84f4Smrg  # spaces rather than leading tabs (at least since its commit 0394caf7
342493f84f4Smrg  # "Emit spaces for -MD").
343493f84f4Smrg  "$@" -MD -MF "$tmpdepfile"
344493f84f4Smrg  stat=$?
345493f84f4Smrg  if test $stat -ne 0; then
346493f84f4Smrg    rm -f "$tmpdepfile"
347493f84f4Smrg    exit $stat
348fe5e51b7Smrg  fi
349493f84f4Smrg  rm -f "$depfile"
350493f84f4Smrg  # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'.
351493f84f4Smrg  # We have to change lines of the first kind to '$object: \'.
352493f84f4Smrg  sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile"
353493f84f4Smrg  # And for each line of the second kind, we have to emit a 'dep.h:'
354493f84f4Smrg  # dummy dependency, to avoid the deleted-header problem.
355493f84f4Smrg  sed -n -e 's|^  *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile"
356fe5e51b7Smrg  rm -f "$tmpdepfile"
357fe5e51b7Smrg  ;;
358fe5e51b7Smrg
359493f84f4Smrg## The order of this option in the case statement is important, since the
360493f84f4Smrg## shell code in configure will try each of these formats in the order
361493f84f4Smrg## listed in this file.  A plain '-MD' option would be understood by many
362493f84f4Smrg## compilers, so we must ensure this comes after the gcc and icc options.
363493f84f4Smrgpgcc)
364493f84f4Smrg  # Portland's C compiler understands '-MD'.
365493f84f4Smrg  # Will always output deps to 'file.d' where file is the root name of the
366493f84f4Smrg  # source file under compilation, even if file resides in a subdirectory.
367493f84f4Smrg  # The object file name does not affect the name of the '.d' file.
368493f84f4Smrg  # pgcc 10.2 will output
369fe5e51b7Smrg  #    foo.o: sub/foo.c sub/foo.h
370493f84f4Smrg  # and will wrap long lines using '\' :
371fe5e51b7Smrg  #    foo.o: sub/foo.c ... \
372fe5e51b7Smrg  #     sub/foo.h ... \
373fe5e51b7Smrg  #     ...
374493f84f4Smrg  set_dir_from "$object"
375493f84f4Smrg  # Use the source, not the object, to determine the base name, since
376493f84f4Smrg  # that's sadly what pgcc will do too.
377493f84f4Smrg  set_base_from "$source"
378493f84f4Smrg  tmpdepfile=$base.d
379493f84f4Smrg
380493f84f4Smrg  # For projects that build the same source file twice into different object
381493f84f4Smrg  # files, the pgcc approach of using the *source* file root name can cause
382493f84f4Smrg  # problems in parallel builds.  Use a locking strategy to avoid stomping on
383493f84f4Smrg  # the same $tmpdepfile.
384493f84f4Smrg  lockdir=$base.d-lock
385493f84f4Smrg  trap "
386493f84f4Smrg    echo '$0: caught signal, cleaning up...' >&2
387493f84f4Smrg    rmdir '$lockdir'
388493f84f4Smrg    exit 1
389493f84f4Smrg  " 1 2 13 15
390493f84f4Smrg  numtries=100
391493f84f4Smrg  i=$numtries
392493f84f4Smrg  while test $i -gt 0; do
393493f84f4Smrg    # mkdir is a portable test-and-set.
394493f84f4Smrg    if mkdir "$lockdir" 2>/dev/null; then
395493f84f4Smrg      # This process acquired the lock.
396493f84f4Smrg      "$@" -MD
397493f84f4Smrg      stat=$?
398493f84f4Smrg      # Release the lock.
399493f84f4Smrg      rmdir "$lockdir"
400493f84f4Smrg      break
401493f84f4Smrg    else
402493f84f4Smrg      # If the lock is being held by a different process, wait
403493f84f4Smrg      # until the winning process is done or we timeout.
404493f84f4Smrg      while test -d "$lockdir" && test $i -gt 0; do
405493f84f4Smrg        sleep 1
406493f84f4Smrg        i=`expr $i - 1`
407493f84f4Smrg      done
408493f84f4Smrg    fi
409493f84f4Smrg    i=`expr $i - 1`
410493f84f4Smrg  done
411493f84f4Smrg  trap - 1 2 13 15
412493f84f4Smrg  if test $i -le 0; then
413493f84f4Smrg    echo "$0: failed to acquire lock after $numtries attempts" >&2
414493f84f4Smrg    echo "$0: check lockdir '$lockdir'" >&2
415493f84f4Smrg    exit 1
416493f84f4Smrg  fi
417493f84f4Smrg
418493f84f4Smrg  if test $stat -ne 0; then
419fe5e51b7Smrg    rm -f "$tmpdepfile"
420fe5e51b7Smrg    exit $stat
421fe5e51b7Smrg  fi
422fe5e51b7Smrg  rm -f "$depfile"
423493f84f4Smrg  # Each line is of the form `foo.o: dependent.h',
424493f84f4Smrg  # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'.
425fe5e51b7Smrg  # Do two passes, one to just change these to
426493f84f4Smrg  # `$object: dependent.h' and one to simply `dependent.h:'.
427493f84f4Smrg  sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
428493f84f4Smrg  # Some versions of the HPUX 10.20 sed can't process this invocation
429493f84f4Smrg  # correctly.  Breaking it into two sed invocations is a workaround.
430493f84f4Smrg  sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \
431493f84f4Smrg    | sed -e 's/$/ :/' >> "$depfile"
432fe5e51b7Smrg  rm -f "$tmpdepfile"
433fe5e51b7Smrg  ;;
434fe5e51b7Smrg
435fe5e51b7Smrghp2)
436fe5e51b7Smrg  # The "hp" stanza above does not work with aCC (C++) and HP's ia64
437fe5e51b7Smrg  # compilers, which have integrated preprocessors.  The correct option
438fe5e51b7Smrg  # to use with these is +Maked; it writes dependencies to a file named
439fe5e51b7Smrg  # 'foo.d', which lands next to the object file, wherever that
440fe5e51b7Smrg  # happens to be.
441fe5e51b7Smrg  # Much of this is similar to the tru64 case; see comments there.
442493f84f4Smrg  set_dir_from  "$object"
443493f84f4Smrg  set_base_from "$object"
444fe5e51b7Smrg  if test "$libtool" = yes; then
445fe5e51b7Smrg    tmpdepfile1=$dir$base.d
446fe5e51b7Smrg    tmpdepfile2=$dir.libs/$base.d
447fe5e51b7Smrg    "$@" -Wc,+Maked
448fe5e51b7Smrg  else
449fe5e51b7Smrg    tmpdepfile1=$dir$base.d
450fe5e51b7Smrg    tmpdepfile2=$dir$base.d
451fe5e51b7Smrg    "$@" +Maked
452fe5e51b7Smrg  fi
453fe5e51b7Smrg  stat=$?
454493f84f4Smrg  if test $stat -ne 0; then
455fe5e51b7Smrg     rm -f "$tmpdepfile1" "$tmpdepfile2"
456fe5e51b7Smrg     exit $stat
457fe5e51b7Smrg  fi
458fe5e51b7Smrg
459fe5e51b7Smrg  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2"
460fe5e51b7Smrg  do
461fe5e51b7Smrg    test -f "$tmpdepfile" && break
462fe5e51b7Smrg  done
463fe5e51b7Smrg  if test -f "$tmpdepfile"; then
464493f84f4Smrg    sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile"
465acd6767fSmrg    # Add 'dependent.h:' lines.
4660bb88ba4Smrg    sed -ne '2,${
467493f84f4Smrg               s/^ *//
468493f84f4Smrg               s/ \\*$//
469493f84f4Smrg               s/$/:/
470493f84f4Smrg               p
471493f84f4Smrg             }' "$tmpdepfile" >> "$depfile"
472fe5e51b7Smrg  else
473493f84f4Smrg    make_dummy_depfile
474fe5e51b7Smrg  fi
475fe5e51b7Smrg  rm -f "$tmpdepfile" "$tmpdepfile2"
476fe5e51b7Smrg  ;;
477fe5e51b7Smrg
478fe5e51b7Smrgtru64)
479493f84f4Smrg  # The Tru64 compiler uses -MD to generate dependencies as a side
480493f84f4Smrg  # effect.  'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'.
481493f84f4Smrg  # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
482493f84f4Smrg  # dependencies in 'foo.d' instead, so we check for that too.
483493f84f4Smrg  # Subdirectories are respected.
484493f84f4Smrg  set_dir_from  "$object"
485493f84f4Smrg  set_base_from "$object"
486493f84f4Smrg
487493f84f4Smrg  if test "$libtool" = yes; then
488493f84f4Smrg    # Libtool generates 2 separate objects for the 2 libraries.  These
489493f84f4Smrg    # two compilations output dependencies in $dir.libs/$base.o.d and
490493f84f4Smrg    # in $dir$base.o.d.  We have to check for both files, because
491493f84f4Smrg    # one of the two compilations can be disabled.  We should prefer
492493f84f4Smrg    # $dir$base.o.d over $dir.libs/$base.o.d because the latter is
493493f84f4Smrg    # automatically cleaned when .libs/ is deleted, while ignoring
494493f84f4Smrg    # the former would cause a distcleancheck panic.
495493f84f4Smrg    tmpdepfile1=$dir$base.o.d          # libtool 1.5
496493f84f4Smrg    tmpdepfile2=$dir.libs/$base.o.d    # Likewise.
497493f84f4Smrg    tmpdepfile3=$dir.libs/$base.d      # Compaq CCC V6.2-504
498493f84f4Smrg    "$@" -Wc,-MD
499493f84f4Smrg  else
500493f84f4Smrg    tmpdepfile1=$dir$base.d
501493f84f4Smrg    tmpdepfile2=$dir$base.d
502493f84f4Smrg    tmpdepfile3=$dir$base.d
503493f84f4Smrg    "$@" -MD
504493f84f4Smrg  fi
505493f84f4Smrg
506493f84f4Smrg  stat=$?
507493f84f4Smrg  if test $stat -ne 0; then
508493f84f4Smrg    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
509493f84f4Smrg    exit $stat
510493f84f4Smrg  fi
511493f84f4Smrg
512493f84f4Smrg  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
513493f84f4Smrg  do
514493f84f4Smrg    test -f "$tmpdepfile" && break
515493f84f4Smrg  done
516493f84f4Smrg  # Same post-processing that is required for AIX mode.
517493f84f4Smrg  aix_post_process_depfile
518493f84f4Smrg  ;;
519fe5e51b7Smrg
5200bb88ba4Smrgmsvc7)
5210bb88ba4Smrg  if test "$libtool" = yes; then
5220bb88ba4Smrg    showIncludes=-Wc,-showIncludes
5230bb88ba4Smrg  else
5240bb88ba4Smrg    showIncludes=-showIncludes
5250bb88ba4Smrg  fi
5260bb88ba4Smrg  "$@" $showIncludes > "$tmpdepfile"
5270bb88ba4Smrg  stat=$?
5280bb88ba4Smrg  grep -v '^Note: including file: ' "$tmpdepfile"
529493f84f4Smrg  if test $stat -ne 0; then
5300bb88ba4Smrg    rm -f "$tmpdepfile"
5310bb88ba4Smrg    exit $stat
5320bb88ba4Smrg  fi
5330bb88ba4Smrg  rm -f "$depfile"
5340bb88ba4Smrg  echo "$object : \\" > "$depfile"
5350bb88ba4Smrg  # The first sed program below extracts the file names and escapes
5360bb88ba4Smrg  # backslashes for cygpath.  The second sed program outputs the file
5370bb88ba4Smrg  # name when reading, but also accumulates all include files in the
5380bb88ba4Smrg  # hold buffer in order to output them again at the end.  This only
5390bb88ba4Smrg  # works with sed implementations that can handle large buffers.
5400bb88ba4Smrg  sed < "$tmpdepfile" -n '
5410bb88ba4Smrg/^Note: including file:  *\(.*\)/ {
5420bb88ba4Smrg  s//\1/
5430bb88ba4Smrg  s/\\/\\\\/g
5440bb88ba4Smrg  p
5450bb88ba4Smrg}' | $cygpath_u | sort -u | sed -n '
5460bb88ba4Smrgs/ /\\ /g
547acd6767fSmrgs/\(.*\)/'"$tab"'\1 \\/p
5480bb88ba4Smrgs/.\(.*\) \\/\1:/
5490bb88ba4SmrgH
5500bb88ba4Smrg$ {
551acd6767fSmrg  s/.*/'"$tab"'/
5520bb88ba4Smrg  G
5530bb88ba4Smrg  p
5540bb88ba4Smrg}' >> "$depfile"
555493f84f4Smrg  echo >> "$depfile" # make sure the fragment doesn't end with a backslash
5560bb88ba4Smrg  rm -f "$tmpdepfile"
5570bb88ba4Smrg  ;;
5580bb88ba4Smrg
5590bb88ba4Smrgmsvc7msys)
5600bb88ba4Smrg  # This case exists only to let depend.m4 do its work.  It works by
5610bb88ba4Smrg  # looking at the text of this script.  This case will never be run,
5620bb88ba4Smrg  # since it is checked for above.
5630bb88ba4Smrg  exit 1
5640bb88ba4Smrg  ;;
5650bb88ba4Smrg
566fe5e51b7Smrg#nosideeffect)
567fe5e51b7Smrg  # This comment above is used by automake to tell side-effect
568fe5e51b7Smrg  # dependency tracking mechanisms from slower ones.
569fe5e51b7Smrg
570fe5e51b7Smrgdashmstdout)
571fe5e51b7Smrg  # Important note: in order to support this mode, a compiler *must*
572fe5e51b7Smrg  # always write the preprocessed file to stdout, regardless of -o.
573fe5e51b7Smrg  "$@" || exit $?
574fe5e51b7Smrg
575fe5e51b7Smrg  # Remove the call to Libtool.
576fe5e51b7Smrg  if test "$libtool" = yes; then
5770bb88ba4Smrg    while test "X$1" != 'X--mode=compile'; do
578fe5e51b7Smrg      shift
579fe5e51b7Smrg    done
580fe5e51b7Smrg    shift
581fe5e51b7Smrg  fi
582fe5e51b7Smrg
583acd6767fSmrg  # Remove '-o $object'.
584fe5e51b7Smrg  IFS=" "
585fe5e51b7Smrg  for arg
586fe5e51b7Smrg  do
587fe5e51b7Smrg    case $arg in
588fe5e51b7Smrg    -o)
589fe5e51b7Smrg      shift
590fe5e51b7Smrg      ;;
591fe5e51b7Smrg    $object)
592fe5e51b7Smrg      shift
593fe5e51b7Smrg      ;;
594fe5e51b7Smrg    *)
595fe5e51b7Smrg      set fnord "$@" "$arg"
596fe5e51b7Smrg      shift # fnord
597fe5e51b7Smrg      shift # $arg
598fe5e51b7Smrg      ;;
599fe5e51b7Smrg    esac
600fe5e51b7Smrg  done
601fe5e51b7Smrg
602fe5e51b7Smrg  test -z "$dashmflag" && dashmflag=-M
603acd6767fSmrg  # Require at least two characters before searching for ':'
604fe5e51b7Smrg  # in the target name.  This is to cope with DOS-style filenames:
605acd6767fSmrg  # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise.
606fe5e51b7Smrg  "$@" $dashmflag |
607493f84f4Smrg    sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile"
608fe5e51b7Smrg  rm -f "$depfile"
609fe5e51b7Smrg  cat < "$tmpdepfile" > "$depfile"
610493f84f4Smrg  # Some versions of the HPUX 10.20 sed can't process this sed invocation
611493f84f4Smrg  # correctly.  Breaking it into two sed invocations is a workaround.
612493f84f4Smrg  tr ' ' "$nl" < "$tmpdepfile" \
613493f84f4Smrg    | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
614493f84f4Smrg    | sed -e 's/$/ :/' >> "$depfile"
615fe5e51b7Smrg  rm -f "$tmpdepfile"
616fe5e51b7Smrg  ;;
617fe5e51b7Smrg
618fe5e51b7SmrgdashXmstdout)
619fe5e51b7Smrg  # This case only exists to satisfy depend.m4.  It is never actually
620fe5e51b7Smrg  # run, as this mode is specially recognized in the preamble.
621fe5e51b7Smrg  exit 1
622fe5e51b7Smrg  ;;
623fe5e51b7Smrg
624fe5e51b7Smrgmakedepend)
625fe5e51b7Smrg  "$@" || exit $?
626fe5e51b7Smrg  # Remove any Libtool call
627fe5e51b7Smrg  if test "$libtool" = yes; then
6280bb88ba4Smrg    while test "X$1" != 'X--mode=compile'; do
629fe5e51b7Smrg      shift
630fe5e51b7Smrg    done
631fe5e51b7Smrg    shift
632fe5e51b7Smrg  fi
633fe5e51b7Smrg  # X makedepend
634fe5e51b7Smrg  shift
6350bb88ba4Smrg  cleared=no eat=no
6360bb88ba4Smrg  for arg
6370bb88ba4Smrg  do
638fe5e51b7Smrg    case $cleared in
639fe5e51b7Smrg    no)
640fe5e51b7Smrg      set ""; shift
641fe5e51b7Smrg      cleared=yes ;;
642fe5e51b7Smrg    esac
6430bb88ba4Smrg    if test $eat = yes; then
6440bb88ba4Smrg      eat=no
6450bb88ba4Smrg      continue
6460bb88ba4Smrg    fi
647fe5e51b7Smrg    case "$arg" in
648fe5e51b7Smrg    -D*|-I*)
649fe5e51b7Smrg      set fnord "$@" "$arg"; shift ;;
650fe5e51b7Smrg    # Strip any option that makedepend may not understand.  Remove
651fe5e51b7Smrg    # the object too, otherwise makedepend will parse it as a source file.
6520bb88ba4Smrg    -arch)
6530bb88ba4Smrg      eat=yes ;;
654fe5e51b7Smrg    -*|$object)
655fe5e51b7Smrg      ;;
656fe5e51b7Smrg    *)
657fe5e51b7Smrg      set fnord "$@" "$arg"; shift ;;
658fe5e51b7Smrg    esac
659fe5e51b7Smrg  done
6600bb88ba4Smrg  obj_suffix=`echo "$object" | sed 's/^.*\././'`
661fe5e51b7Smrg  touch "$tmpdepfile"
662fe5e51b7Smrg  ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
663fe5e51b7Smrg  rm -f "$depfile"
6640bb88ba4Smrg  # makedepend may prepend the VPATH from the source file name to the object.
6650bb88ba4Smrg  # No need to regex-escape $object, excess matching of '.' is harmless.
6660bb88ba4Smrg  sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile"
667493f84f4Smrg  # Some versions of the HPUX 10.20 sed can't process the last invocation
668493f84f4Smrg  # correctly.  Breaking it into two sed invocations is a workaround.
669493f84f4Smrg  sed '1,2d' "$tmpdepfile" \
670493f84f4Smrg    | tr ' ' "$nl" \
671493f84f4Smrg    | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
672493f84f4Smrg    | sed -e 's/$/ :/' >> "$depfile"
673fe5e51b7Smrg  rm -f "$tmpdepfile" "$tmpdepfile".bak
674fe5e51b7Smrg  ;;
675fe5e51b7Smrg
676fe5e51b7Smrgcpp)
677fe5e51b7Smrg  # Important note: in order to support this mode, a compiler *must*
678fe5e51b7Smrg  # always write the preprocessed file to stdout.
679fe5e51b7Smrg  "$@" || exit $?
680fe5e51b7Smrg
681fe5e51b7Smrg  # Remove the call to Libtool.
682fe5e51b7Smrg  if test "$libtool" = yes; then
6830bb88ba4Smrg    while test "X$1" != 'X--mode=compile'; do
684fe5e51b7Smrg      shift
685fe5e51b7Smrg    done
686fe5e51b7Smrg    shift
687fe5e51b7Smrg  fi
688fe5e51b7Smrg
689acd6767fSmrg  # Remove '-o $object'.
690fe5e51b7Smrg  IFS=" "
691fe5e51b7Smrg  for arg
692fe5e51b7Smrg  do
693fe5e51b7Smrg    case $arg in
694fe5e51b7Smrg    -o)
695fe5e51b7Smrg      shift
696fe5e51b7Smrg      ;;
697fe5e51b7Smrg    $object)
698fe5e51b7Smrg      shift
699fe5e51b7Smrg      ;;
700fe5e51b7Smrg    *)
701fe5e51b7Smrg      set fnord "$@" "$arg"
702fe5e51b7Smrg      shift # fnord
703fe5e51b7Smrg      shift # $arg
704fe5e51b7Smrg      ;;
705fe5e51b7Smrg    esac
706fe5e51b7Smrg  done
707fe5e51b7Smrg
708493f84f4Smrg  "$@" -E \
709493f84f4Smrg    | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
710493f84f4Smrg             -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
711493f84f4Smrg    | sed '$ s: \\$::' > "$tmpdepfile"
712fe5e51b7Smrg  rm -f "$depfile"
713fe5e51b7Smrg  echo "$object : \\" > "$depfile"
714fe5e51b7Smrg  cat < "$tmpdepfile" >> "$depfile"
715fe5e51b7Smrg  sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
716fe5e51b7Smrg  rm -f "$tmpdepfile"
717fe5e51b7Smrg  ;;
718fe5e51b7Smrg
719fe5e51b7Smrgmsvisualcpp)
720fe5e51b7Smrg  # Important note: in order to support this mode, a compiler *must*
7210bb88ba4Smrg  # always write the preprocessed file to stdout.
722fe5e51b7Smrg  "$@" || exit $?
7230bb88ba4Smrg
7240bb88ba4Smrg  # Remove the call to Libtool.
7250bb88ba4Smrg  if test "$libtool" = yes; then
7260bb88ba4Smrg    while test "X$1" != 'X--mode=compile'; do
7270bb88ba4Smrg      shift
7280bb88ba4Smrg    done
7290bb88ba4Smrg    shift
7300bb88ba4Smrg  fi
7310bb88ba4Smrg
732fe5e51b7Smrg  IFS=" "
733fe5e51b7Smrg  for arg
734fe5e51b7Smrg  do
735fe5e51b7Smrg    case "$arg" in
7360bb88ba4Smrg    -o)
7370bb88ba4Smrg      shift
7380bb88ba4Smrg      ;;
7390bb88ba4Smrg    $object)
7400bb88ba4Smrg      shift
7410bb88ba4Smrg      ;;
742fe5e51b7Smrg    "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
743493f84f4Smrg        set fnord "$@"
744493f84f4Smrg        shift
745493f84f4Smrg        shift
746493f84f4Smrg        ;;
747fe5e51b7Smrg    *)
748493f84f4Smrg        set fnord "$@" "$arg"
749493f84f4Smrg        shift
750493f84f4Smrg        shift
751493f84f4Smrg        ;;
752fe5e51b7Smrg    esac
753fe5e51b7Smrg  done
7540bb88ba4Smrg  "$@" -E 2>/dev/null |
7550bb88ba4Smrg  sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile"
756fe5e51b7Smrg  rm -f "$depfile"
757fe5e51b7Smrg  echo "$object : \\" > "$depfile"
758acd6767fSmrg  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile"
759acd6767fSmrg  echo "$tab" >> "$depfile"
7600bb88ba4Smrg  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile"
761fe5e51b7Smrg  rm -f "$tmpdepfile"
762fe5e51b7Smrg  ;;
763fe5e51b7Smrg
7640bb88ba4Smrgmsvcmsys)
7650bb88ba4Smrg  # This case exists only to let depend.m4 do its work.  It works by
7660bb88ba4Smrg  # looking at the text of this script.  This case will never be run,
7670bb88ba4Smrg  # since it is checked for above.
7680bb88ba4Smrg  exit 1
7690bb88ba4Smrg  ;;
7700bb88ba4Smrg
771fe5e51b7Smrgnone)
772fe5e51b7Smrg  exec "$@"
773fe5e51b7Smrg  ;;
774fe5e51b7Smrg
775fe5e51b7Smrg*)
776fe5e51b7Smrg  echo "Unknown depmode $depmode" 1>&2
777fe5e51b7Smrg  exit 1
778fe5e51b7Smrg  ;;
779fe5e51b7Smrgesac
780fe5e51b7Smrg
781fe5e51b7Smrgexit 0
782fe5e51b7Smrg
783fe5e51b7Smrg# Local Variables:
784fe5e51b7Smrg# mode: shell-script
785fe5e51b7Smrg# sh-indentation: 2
7861e423a8fSmrg# eval: (add-hook 'before-save-hook 'time-stamp)
787fe5e51b7Smrg# time-stamp-start: "scriptversion="
788fe5e51b7Smrg# time-stamp-format: "%:y-%02m-%02d.%02H"
7891e423a8fSmrg# time-stamp-time-zone: "UTC0"
7900bb88ba4Smrg# time-stamp-end: "; # UTC"
791fe5e51b7Smrg# End:
792