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