1010cdda0Smrg#! /bin/sh
2010cdda0Smrg# depcomp - compile a program generating dependencies as side-effects
3b3eb03f3Smrg
4945aa7e3Smrgscriptversion=2018-03-07.03; # UTC
5b3eb03f3Smrg
6945aa7e3Smrg# Copyright (C) 1999-2021 Free Software Foundation, Inc.
7010cdda0Smrg
8010cdda0Smrg# This program is free software; you can redistribute it and/or modify
9010cdda0Smrg# it under the terms of the GNU General Public License as published by
10010cdda0Smrg# the Free Software Foundation; either version 2, or (at your option)
11010cdda0Smrg# any later version.
12010cdda0Smrg
13010cdda0Smrg# This program is distributed in the hope that it will be useful,
14010cdda0Smrg# but WITHOUT ANY WARRANTY; without even the implied warranty of
15010cdda0Smrg# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16010cdda0Smrg# GNU General Public License for more details.
17010cdda0Smrg
18010cdda0Smrg# You should have received a copy of the GNU General Public License
19945aa7e3Smrg# along with this program.  If not, see <https://www.gnu.org/licenses/>.
20010cdda0Smrg
21010cdda0Smrg# As a special exception to the GNU General Public License, if you
22010cdda0Smrg# distribute this file as part of a program that contains a
23010cdda0Smrg# configuration script generated by Autoconf, you may include it under
24010cdda0Smrg# the same distribution terms that you use for the rest of that program.
25010cdda0Smrg
26010cdda0Smrg# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>.
27010cdda0Smrg
28b3eb03f3Smrgcase $1 in
29b3eb03f3Smrg  '')
30945aa7e3Smrg    echo "$0: No command.  Try '$0 --help' for more information." 1>&2
31945aa7e3Smrg    exit 1;
32945aa7e3Smrg    ;;
33b3eb03f3Smrg  -h | --h*)
34b3eb03f3Smrg    cat <<\EOF
35b3eb03f3SmrgUsage: depcomp [--help] [--version] PROGRAM [ARGS]
36b3eb03f3Smrg
37b3eb03f3SmrgRun PROGRAMS ARGS to compile a file, generating dependencies
38b3eb03f3Smrgas side-effects.
39b3eb03f3Smrg
40b3eb03f3SmrgEnvironment variables:
41b3eb03f3Smrg  depmode     Dependency tracking mode.
42945aa7e3Smrg  source      Source file read by 'PROGRAMS ARGS'.
43945aa7e3Smrg  object      Object file output by 'PROGRAMS ARGS'.
44b3eb03f3Smrg  DEPDIR      directory where to store dependencies.
45b3eb03f3Smrg  depfile     Dependency file to output.
46b4485a66Smrg  tmpdepfile  Temporary file to use when outputting dependencies.
47b3eb03f3Smrg  libtool     Whether libtool is used (yes/no).
48b3eb03f3Smrg
49b3eb03f3SmrgReport bugs to <bug-automake@gnu.org>.
50b3eb03f3SmrgEOF
51b3eb03f3Smrg    exit $?
52b3eb03f3Smrg    ;;
53b3eb03f3Smrg  -v | --v*)
54b3eb03f3Smrg    echo "depcomp $scriptversion"
55b3eb03f3Smrg    exit $?
56b3eb03f3Smrg    ;;
57b3eb03f3Smrgesac
58b3eb03f3Smrg
59945aa7e3Smrg# Get the directory component of the given path, and save it in the
60945aa7e3Smrg# global variables '$dir'.  Note that this directory component will
61945aa7e3Smrg# be either empty or ending with a '/' character.  This is deliberate.
62945aa7e3Smrgset_dir_from ()
63945aa7e3Smrg{
64945aa7e3Smrg  case $1 in
65945aa7e3Smrg    */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;;
66945aa7e3Smrg      *) dir=;;
67945aa7e3Smrg  esac
68945aa7e3Smrg}
69945aa7e3Smrg
70945aa7e3Smrg# Get the suffix-stripped basename of the given path, and save it the
71945aa7e3Smrg# global variable '$base'.
72945aa7e3Smrgset_base_from ()
73945aa7e3Smrg{
74945aa7e3Smrg  base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'`
75945aa7e3Smrg}
76945aa7e3Smrg
77945aa7e3Smrg# If no dependency file was actually created by the compiler invocation,
78945aa7e3Smrg# we still have to create a dummy depfile, to avoid errors with the
79945aa7e3Smrg# Makefile "include basename.Plo" scheme.
80945aa7e3Smrgmake_dummy_depfile ()
81945aa7e3Smrg{
82945aa7e3Smrg  echo "#dummy" > "$depfile"
83945aa7e3Smrg}
84945aa7e3Smrg
85945aa7e3Smrg# Factor out some common post-processing of the generated depfile.
86945aa7e3Smrg# Requires the auxiliary global variable '$tmpdepfile' to be set.
87945aa7e3Smrgaix_post_process_depfile ()
88945aa7e3Smrg{
89945aa7e3Smrg  # If the compiler actually managed to produce a dependency file,
90945aa7e3Smrg  # post-process it.
91945aa7e3Smrg  if test -f "$tmpdepfile"; then
92945aa7e3Smrg    # Each line is of the form 'foo.o: dependency.h'.
93945aa7e3Smrg    # Do two passes, one to just change these to
94945aa7e3Smrg    #   $object: dependency.h
95945aa7e3Smrg    # and one to simply output
96945aa7e3Smrg    #   dependency.h:
97945aa7e3Smrg    # which is needed to avoid the deleted-header problem.
98945aa7e3Smrg    { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile"
99945aa7e3Smrg      sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile"
100945aa7e3Smrg    } > "$depfile"
101945aa7e3Smrg    rm -f "$tmpdepfile"
102945aa7e3Smrg  else
103945aa7e3Smrg    make_dummy_depfile
104945aa7e3Smrg  fi
105945aa7e3Smrg}
106945aa7e3Smrg
107945aa7e3Smrg# A tabulation character.
108945aa7e3Smrgtab='	'
109945aa7e3Smrg# A newline character.
110945aa7e3Smrgnl='
111945aa7e3Smrg'
112945aa7e3Smrg# Character ranges might be problematic outside the C locale.
113945aa7e3Smrg# These definitions help.
114945aa7e3Smrgupper=ABCDEFGHIJKLMNOPQRSTUVWXYZ
115945aa7e3Smrglower=abcdefghijklmnopqrstuvwxyz
116945aa7e3Smrgdigits=0123456789
117945aa7e3Smrgalpha=${upper}${lower}
118945aa7e3Smrg
119010cdda0Smrgif test -z "$depmode" || test -z "$source" || test -z "$object"; then
120010cdda0Smrg  echo "depcomp: Variables source, object and depmode must be set" 1>&2
121010cdda0Smrg  exit 1
122010cdda0Smrgfi
123010cdda0Smrg
124b3eb03f3Smrg# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.
125b3eb03f3Smrgdepfile=${depfile-`echo "$object" |
126b3eb03f3Smrg  sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`}
127010cdda0Smrgtmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
128010cdda0Smrg
129010cdda0Smrgrm -f "$tmpdepfile"
130010cdda0Smrg
131945aa7e3Smrg# Avoid interferences from the environment.
132945aa7e3Smrggccflag= dashmflag=
133945aa7e3Smrg
134010cdda0Smrg# Some modes work just like other modes, but use different flags.  We
135010cdda0Smrg# parameterize here, but still list the modes in the big case below,
136010cdda0Smrg# to make depend.m4 easier to write.  Note that we *cannot* use a case
137010cdda0Smrg# here, because this file can only contain one case statement.
138010cdda0Smrgif test "$depmode" = hp; then
139010cdda0Smrg  # HP compiler uses -M and no extra arg.
140010cdda0Smrg  gccflag=-M
141010cdda0Smrg  depmode=gcc
142010cdda0Smrgfi
143010cdda0Smrg
144010cdda0Smrgif test "$depmode" = dashXmstdout; then
145945aa7e3Smrg  # This is just like dashmstdout with a different argument.
146945aa7e3Smrg  dashmflag=-xM
147945aa7e3Smrg  depmode=dashmstdout
148010cdda0Smrgfi
149010cdda0Smrg
150b3eb03f3Smrgcygpath_u="cygpath -u -f -"
151b3eb03f3Smrgif test "$depmode" = msvcmsys; then
152945aa7e3Smrg  # This is just like msvisualcpp but w/o cygpath translation.
153945aa7e3Smrg  # Just convert the backslash-escaped backslashes to single forward
154945aa7e3Smrg  # slashes to satisfy depend.m4
155945aa7e3Smrg  cygpath_u='sed s,\\\\,/,g'
156945aa7e3Smrg  depmode=msvisualcpp
157b3eb03f3Smrgfi
158b3eb03f3Smrg
159b4485a66Smrgif test "$depmode" = msvc7msys; then
160945aa7e3Smrg  # This is just like msvc7 but w/o cygpath translation.
161945aa7e3Smrg  # Just convert the backslash-escaped backslashes to single forward
162945aa7e3Smrg  # slashes to satisfy depend.m4
163945aa7e3Smrg  cygpath_u='sed s,\\\\,/,g'
164945aa7e3Smrg  depmode=msvc7
165945aa7e3Smrgfi
166945aa7e3Smrg
167945aa7e3Smrgif test "$depmode" = xlc; then
168945aa7e3Smrg  # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information.
169945aa7e3Smrg  gccflag=-qmakedep=gcc,-MF
170945aa7e3Smrg  depmode=gcc
171b4485a66Smrgfi
172b4485a66Smrg
173010cdda0Smrgcase "$depmode" in
174010cdda0Smrggcc3)
175010cdda0Smrg## gcc 3 implements dependency tracking that does exactly what
176010cdda0Smrg## we want.  Yay!  Note: for some reason libtool 1.4 doesn't like
177010cdda0Smrg## it if -MD -MP comes after the -MF stuff.  Hmm.
178b3eb03f3Smrg## Unfortunately, FreeBSD c89 acceptance of flags depends upon
179b3eb03f3Smrg## the command line argument order; so add the flags where they
180b3eb03f3Smrg## appear in depend2.am.  Note that the slowdown incurred here
181b3eb03f3Smrg## affects only configure: in makefiles, %FASTDEP% shortcuts this.
182b3eb03f3Smrg  for arg
183b3eb03f3Smrg  do
184b3eb03f3Smrg    case $arg in
185b3eb03f3Smrg    -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;;
186b3eb03f3Smrg    *)  set fnord "$@" "$arg" ;;
187b3eb03f3Smrg    esac
188b3eb03f3Smrg    shift # fnord
189b3eb03f3Smrg    shift # $arg
190b3eb03f3Smrg  done
191b3eb03f3Smrg  "$@"
192010cdda0Smrg  stat=$?
193945aa7e3Smrg  if test $stat -ne 0; then
194010cdda0Smrg    rm -f "$tmpdepfile"
195010cdda0Smrg    exit $stat
196010cdda0Smrg  fi
197010cdda0Smrg  mv "$tmpdepfile" "$depfile"
198010cdda0Smrg  ;;
199010cdda0Smrg
200010cdda0Smrggcc)
201945aa7e3Smrg## Note that this doesn't just cater to obsosete pre-3.x GCC compilers.
202945aa7e3Smrg## but also to in-use compilers like IMB xlc/xlC and the HP C compiler.
203945aa7e3Smrg## (see the conditional assignment to $gccflag above).
204010cdda0Smrg## There are various ways to get dependency output from gcc.  Here's
205010cdda0Smrg## why we pick this rather obscure method:
206010cdda0Smrg## - Don't want to use -MD because we'd like the dependencies to end
207010cdda0Smrg##   up in a subdir.  Having to rename by hand is ugly.
208010cdda0Smrg##   (We might end up doing this anyway to support other compilers.)
209010cdda0Smrg## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
210945aa7e3Smrg##   -MM, not -M (despite what the docs say).  Also, it might not be
211945aa7e3Smrg##   supported by the other compilers which use the 'gcc' depmode.
212010cdda0Smrg## - Using -M directly means running the compiler twice (even worse
213010cdda0Smrg##   than renaming).
214010cdda0Smrg  if test -z "$gccflag"; then
215010cdda0Smrg    gccflag=-MD,
216010cdda0Smrg  fi
217010cdda0Smrg  "$@" -Wp,"$gccflag$tmpdepfile"
218010cdda0Smrg  stat=$?
219945aa7e3Smrg  if test $stat -ne 0; then
220010cdda0Smrg    rm -f "$tmpdepfile"
221010cdda0Smrg    exit $stat
222010cdda0Smrg  fi
223010cdda0Smrg  rm -f "$depfile"
224010cdda0Smrg  echo "$object : \\" > "$depfile"
225945aa7e3Smrg  # The second -e expression handles DOS-style file names with drive
226945aa7e3Smrg  # letters.
227010cdda0Smrg  sed -e 's/^[^:]*: / /' \
228010cdda0Smrg      -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
229945aa7e3Smrg## This next piece of magic avoids the "deleted header file" problem.
230010cdda0Smrg## The problem is that when a header file which appears in a .P file
231010cdda0Smrg## is deleted, the dependency causes make to die (because there is
232010cdda0Smrg## typically no way to rebuild the header).  We avoid this by adding
233010cdda0Smrg## dummy dependencies for each header file.  Too bad gcc doesn't do
234010cdda0Smrg## this for us directly.
235945aa7e3Smrg## Some versions of gcc put a space before the ':'.  On the theory
236010cdda0Smrg## that the space means something, we add a space to the output as
237b4485a66Smrg## well.  hp depmode also adds that space, but also prefixes the VPATH
238b4485a66Smrg## to the object.  Take care to not repeat it in the output.
239010cdda0Smrg## Some versions of the HPUX 10.20 sed can't process this invocation
240010cdda0Smrg## correctly.  Breaking it into two sed invocations is a workaround.
241945aa7e3Smrg  tr ' ' "$nl" < "$tmpdepfile" \
242945aa7e3Smrg    | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \
243945aa7e3Smrg    | sed -e 's/$/ :/' >> "$depfile"
244010cdda0Smrg  rm -f "$tmpdepfile"
245010cdda0Smrg  ;;
246010cdda0Smrg
247010cdda0Smrghp)
248010cdda0Smrg  # This case exists only to let depend.m4 do its work.  It works by
249010cdda0Smrg  # looking at the text of this script.  This case will never be run,
250010cdda0Smrg  # since it is checked for above.
251010cdda0Smrg  exit 1
252010cdda0Smrg  ;;
253010cdda0Smrg
254010cdda0Smrgsgi)
255010cdda0Smrg  if test "$libtool" = yes; then
256010cdda0Smrg    "$@" "-Wp,-MDupdate,$tmpdepfile"
257010cdda0Smrg  else
258010cdda0Smrg    "$@" -MDupdate "$tmpdepfile"
259010cdda0Smrg  fi
260010cdda0Smrg  stat=$?
261945aa7e3Smrg  if test $stat -ne 0; then
262010cdda0Smrg    rm -f "$tmpdepfile"
263010cdda0Smrg    exit $stat
264010cdda0Smrg  fi
265010cdda0Smrg  rm -f "$depfile"
266010cdda0Smrg
267010cdda0Smrg  if test -f "$tmpdepfile"; then  # yes, the sourcefile depend on other files
268010cdda0Smrg    echo "$object : \\" > "$depfile"
269010cdda0Smrg    # Clip off the initial element (the dependent).  Don't try to be
270010cdda0Smrg    # clever and replace this with sed code, as IRIX sed won't handle
271010cdda0Smrg    # lines with more than a fixed number of characters (4096 in
272010cdda0Smrg    # IRIX 6.2 sed, 8192 in IRIX 6.5).  We also remove comment lines;
273945aa7e3Smrg    # the IRIX cc adds comments like '#:fec' to the end of the
274010cdda0Smrg    # dependency line.
275945aa7e3Smrg    tr ' ' "$nl" < "$tmpdepfile" \
276945aa7e3Smrg      | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \
277945aa7e3Smrg      | tr "$nl" ' ' >> "$depfile"
278b3eb03f3Smrg    echo >> "$depfile"
279010cdda0Smrg    # The second pass generates a dummy entry for each header file.
280945aa7e3Smrg    tr ' ' "$nl" < "$tmpdepfile" \
281945aa7e3Smrg      | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
282945aa7e3Smrg      >> "$depfile"
283010cdda0Smrg  else
284945aa7e3Smrg    make_dummy_depfile
285010cdda0Smrg  fi
286010cdda0Smrg  rm -f "$tmpdepfile"
287010cdda0Smrg  ;;
288010cdda0Smrg
289945aa7e3Smrgxlc)
290945aa7e3Smrg  # This case exists only to let depend.m4 do its work.  It works by
291945aa7e3Smrg  # looking at the text of this script.  This case will never be run,
292945aa7e3Smrg  # since it is checked for above.
293945aa7e3Smrg  exit 1
294945aa7e3Smrg  ;;
295945aa7e3Smrg
296010cdda0Smrgaix)
297010cdda0Smrg  # The C for AIX Compiler uses -M and outputs the dependencies
298010cdda0Smrg  # in a .u file.  In older versions, this file always lives in the
299945aa7e3Smrg  # current directory.  Also, the AIX compiler puts '$object:' at the
300010cdda0Smrg  # start of each line; $object doesn't have directory information.
301010cdda0Smrg  # Version 6 uses the directory in both cases.
302945aa7e3Smrg  set_dir_from "$object"
303945aa7e3Smrg  set_base_from "$object"
304010cdda0Smrg  if test "$libtool" = yes; then
305b3eb03f3Smrg    tmpdepfile1=$dir$base.u
306b3eb03f3Smrg    tmpdepfile2=$base.u
307b3eb03f3Smrg    tmpdepfile3=$dir.libs/$base.u
308010cdda0Smrg    "$@" -Wc,-M
309010cdda0Smrg  else
310b3eb03f3Smrg    tmpdepfile1=$dir$base.u
311b3eb03f3Smrg    tmpdepfile2=$dir$base.u
312b3eb03f3Smrg    tmpdepfile3=$dir$base.u
313010cdda0Smrg    "$@" -M
314010cdda0Smrg  fi
315010cdda0Smrg  stat=$?
316945aa7e3Smrg  if test $stat -ne 0; then
317b3eb03f3Smrg    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
318010cdda0Smrg    exit $stat
319010cdda0Smrg  fi
320010cdda0Smrg
321b3eb03f3Smrg  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
322b3eb03f3Smrg  do
323b3eb03f3Smrg    test -f "$tmpdepfile" && break
324b3eb03f3Smrg  done
325945aa7e3Smrg  aix_post_process_depfile
326945aa7e3Smrg  ;;
327945aa7e3Smrg
328945aa7e3Smrgtcc)
329945aa7e3Smrg  # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26
330945aa7e3Smrg  # FIXME: That version still under development at the moment of writing.
331945aa7e3Smrg  #        Make that this statement remains true also for stable, released
332945aa7e3Smrg  #        versions.
333945aa7e3Smrg  # It will wrap lines (doesn't matter whether long or short) with a
334945aa7e3Smrg  # trailing '\', as in:
335945aa7e3Smrg  #
336945aa7e3Smrg  #   foo.o : \
337945aa7e3Smrg  #    foo.c \
338945aa7e3Smrg  #    foo.h \
339945aa7e3Smrg  #
340945aa7e3Smrg  # It will put a trailing '\' even on the last line, and will use leading
341945aa7e3Smrg  # spaces rather than leading tabs (at least since its commit 0394caf7
342945aa7e3Smrg  # "Emit spaces for -MD").
343945aa7e3Smrg  "$@" -MD -MF "$tmpdepfile"
344945aa7e3Smrg  stat=$?
345945aa7e3Smrg  if test $stat -ne 0; then
346945aa7e3Smrg    rm -f "$tmpdepfile"
347945aa7e3Smrg    exit $stat
348010cdda0Smrg  fi
349945aa7e3Smrg  rm -f "$depfile"
350945aa7e3Smrg  # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'.
351945aa7e3Smrg  # We have to change lines of the first kind to '$object: \'.
352945aa7e3Smrg  sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile"
353945aa7e3Smrg  # And for each line of the second kind, we have to emit a 'dep.h:'
354945aa7e3Smrg  # dummy dependency, to avoid the deleted-header problem.
355945aa7e3Smrg  sed -n -e 's|^  *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile"
356010cdda0Smrg  rm -f "$tmpdepfile"
357010cdda0Smrg  ;;
358010cdda0Smrg
359945aa7e3Smrg## The order of this option in the case statement is important, since the
360945aa7e3Smrg## shell code in configure will try each of these formats in the order
361945aa7e3Smrg## listed in this file.  A plain '-MD' option would be understood by many
362945aa7e3Smrg## compilers, so we must ensure this comes after the gcc and icc options.
363945aa7e3Smrgpgcc)
364945aa7e3Smrg  # Portland's C compiler understands '-MD'.
365945aa7e3Smrg  # Will always output deps to 'file.d' where file is the root name of the
366945aa7e3Smrg  # source file under compilation, even if file resides in a subdirectory.
367945aa7e3Smrg  # The object file name does not affect the name of the '.d' file.
368945aa7e3Smrg  # pgcc 10.2 will output
369010cdda0Smrg  #    foo.o: sub/foo.c sub/foo.h
370945aa7e3Smrg  # and will wrap long lines using '\' :
371010cdda0Smrg  #    foo.o: sub/foo.c ... \
372010cdda0Smrg  #     sub/foo.h ... \
373010cdda0Smrg  #     ...
374945aa7e3Smrg  set_dir_from "$object"
375945aa7e3Smrg  # Use the source, not the object, to determine the base name, since
376945aa7e3Smrg  # that's sadly what pgcc will do too.
377945aa7e3Smrg  set_base_from "$source"
378945aa7e3Smrg  tmpdepfile=$base.d
379945aa7e3Smrg
380945aa7e3Smrg  # For projects that build the same source file twice into different object
381945aa7e3Smrg  # files, the pgcc approach of using the *source* file root name can cause
382945aa7e3Smrg  # problems in parallel builds.  Use a locking strategy to avoid stomping on
383945aa7e3Smrg  # the same $tmpdepfile.
384945aa7e3Smrg  lockdir=$base.d-lock
385945aa7e3Smrg  trap "
386945aa7e3Smrg    echo '$0: caught signal, cleaning up...' >&2
387945aa7e3Smrg    rmdir '$lockdir'
388945aa7e3Smrg    exit 1
389945aa7e3Smrg  " 1 2 13 15
390945aa7e3Smrg  numtries=100
391945aa7e3Smrg  i=$numtries
392945aa7e3Smrg  while test $i -gt 0; do
393945aa7e3Smrg    # mkdir is a portable test-and-set.
394945aa7e3Smrg    if mkdir "$lockdir" 2>/dev/null; then
395945aa7e3Smrg      # This process acquired the lock.
396945aa7e3Smrg      "$@" -MD
397945aa7e3Smrg      stat=$?
398945aa7e3Smrg      # Release the lock.
399945aa7e3Smrg      rmdir "$lockdir"
400945aa7e3Smrg      break
401945aa7e3Smrg    else
402945aa7e3Smrg      # If the lock is being held by a different process, wait
403945aa7e3Smrg      # until the winning process is done or we timeout.
404945aa7e3Smrg      while test -d "$lockdir" && test $i -gt 0; do
405945aa7e3Smrg        sleep 1
406945aa7e3Smrg        i=`expr $i - 1`
407945aa7e3Smrg      done
408945aa7e3Smrg    fi
409945aa7e3Smrg    i=`expr $i - 1`
410945aa7e3Smrg  done
411945aa7e3Smrg  trap - 1 2 13 15
412945aa7e3Smrg  if test $i -le 0; then
413945aa7e3Smrg    echo "$0: failed to acquire lock after $numtries attempts" >&2
414945aa7e3Smrg    echo "$0: check lockdir '$lockdir'" >&2
415945aa7e3Smrg    exit 1
416945aa7e3Smrg  fi
417010cdda0Smrg
418945aa7e3Smrg  if test $stat -ne 0; then
419010cdda0Smrg    rm -f "$tmpdepfile"
420010cdda0Smrg    exit $stat
421010cdda0Smrg  fi
422010cdda0Smrg  rm -f "$depfile"
423010cdda0Smrg  # Each line is of the form `foo.o: dependent.h',
424010cdda0Smrg  # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'.
425010cdda0Smrg  # Do two passes, one to just change these to
426010cdda0Smrg  # `$object: dependent.h' and one to simply `dependent.h:'.
427010cdda0Smrg  sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
428010cdda0Smrg  # Some versions of the HPUX 10.20 sed can't process this invocation
429010cdda0Smrg  # correctly.  Breaking it into two sed invocations is a workaround.
430945aa7e3Smrg  sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \
431945aa7e3Smrg    | sed -e 's/$/ :/' >> "$depfile"
432010cdda0Smrg  rm -f "$tmpdepfile"
433010cdda0Smrg  ;;
434010cdda0Smrg
435b3eb03f3Smrghp2)
436b3eb03f3Smrg  # The "hp" stanza above does not work with aCC (C++) and HP's ia64
437b3eb03f3Smrg  # compilers, which have integrated preprocessors.  The correct option
438b3eb03f3Smrg  # to use with these is +Maked; it writes dependencies to a file named
439b3eb03f3Smrg  # 'foo.d', which lands next to the object file, wherever that
440b3eb03f3Smrg  # happens to be.
441b3eb03f3Smrg  # Much of this is similar to the tru64 case; see comments there.
442945aa7e3Smrg  set_dir_from  "$object"
443945aa7e3Smrg  set_base_from "$object"
444b3eb03f3Smrg  if test "$libtool" = yes; then
445b3eb03f3Smrg    tmpdepfile1=$dir$base.d
446b3eb03f3Smrg    tmpdepfile2=$dir.libs/$base.d
447b3eb03f3Smrg    "$@" -Wc,+Maked
448b3eb03f3Smrg  else
449b3eb03f3Smrg    tmpdepfile1=$dir$base.d
450b3eb03f3Smrg    tmpdepfile2=$dir$base.d
451b3eb03f3Smrg    "$@" +Maked
452b3eb03f3Smrg  fi
453b3eb03f3Smrg  stat=$?
454945aa7e3Smrg  if test $stat -ne 0; then
455b3eb03f3Smrg     rm -f "$tmpdepfile1" "$tmpdepfile2"
456b3eb03f3Smrg     exit $stat
457b3eb03f3Smrg  fi
458b3eb03f3Smrg
459b3eb03f3Smrg  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2"
460b3eb03f3Smrg  do
461b3eb03f3Smrg    test -f "$tmpdepfile" && break
462b3eb03f3Smrg  done
463b3eb03f3Smrg  if test -f "$tmpdepfile"; then
464945aa7e3Smrg    sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile"
465945aa7e3Smrg    # Add 'dependent.h:' lines.
466b3eb03f3Smrg    sed -ne '2,${
467945aa7e3Smrg               s/^ *//
468945aa7e3Smrg               s/ \\*$//
469945aa7e3Smrg               s/$/:/
470945aa7e3Smrg               p
471945aa7e3Smrg             }' "$tmpdepfile" >> "$depfile"
472b3eb03f3Smrg  else
473945aa7e3Smrg    make_dummy_depfile
474b3eb03f3Smrg  fi
475b3eb03f3Smrg  rm -f "$tmpdepfile" "$tmpdepfile2"
476b3eb03f3Smrg  ;;
477b3eb03f3Smrg
478010cdda0Smrgtru64)
479945aa7e3Smrg  # The Tru64 compiler uses -MD to generate dependencies as a side
480945aa7e3Smrg  # effect.  'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'.
481945aa7e3Smrg  # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
482945aa7e3Smrg  # dependencies in 'foo.d' instead, so we check for that too.
483945aa7e3Smrg  # Subdirectories are respected.
484945aa7e3Smrg  set_dir_from  "$object"
485945aa7e3Smrg  set_base_from "$object"
486945aa7e3Smrg
487945aa7e3Smrg  if test "$libtool" = yes; then
488945aa7e3Smrg    # Libtool generates 2 separate objects for the 2 libraries.  These
489945aa7e3Smrg    # two compilations output dependencies in $dir.libs/$base.o.d and
490945aa7e3Smrg    # in $dir$base.o.d.  We have to check for both files, because
491945aa7e3Smrg    # one of the two compilations can be disabled.  We should prefer
492945aa7e3Smrg    # $dir$base.o.d over $dir.libs/$base.o.d because the latter is
493945aa7e3Smrg    # automatically cleaned when .libs/ is deleted, while ignoring
494945aa7e3Smrg    # the former would cause a distcleancheck panic.
495945aa7e3Smrg    tmpdepfile1=$dir$base.o.d          # libtool 1.5
496945aa7e3Smrg    tmpdepfile2=$dir.libs/$base.o.d    # Likewise.
497945aa7e3Smrg    tmpdepfile3=$dir.libs/$base.d      # Compaq CCC V6.2-504
498945aa7e3Smrg    "$@" -Wc,-MD
499945aa7e3Smrg  else
500945aa7e3Smrg    tmpdepfile1=$dir$base.d
501945aa7e3Smrg    tmpdepfile2=$dir$base.d
502945aa7e3Smrg    tmpdepfile3=$dir$base.d
503945aa7e3Smrg    "$@" -MD
504945aa7e3Smrg  fi
505945aa7e3Smrg
506945aa7e3Smrg  stat=$?
507945aa7e3Smrg  if test $stat -ne 0; then
508945aa7e3Smrg    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
509945aa7e3Smrg    exit $stat
510945aa7e3Smrg  fi
511945aa7e3Smrg
512945aa7e3Smrg  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
513945aa7e3Smrg  do
514945aa7e3Smrg    test -f "$tmpdepfile" && break
515945aa7e3Smrg  done
516945aa7e3Smrg  # Same post-processing that is required for AIX mode.
517945aa7e3Smrg  aix_post_process_depfile
518945aa7e3Smrg  ;;
519010cdda0Smrg
520b4485a66Smrgmsvc7)
521b4485a66Smrg  if test "$libtool" = yes; then
522b4485a66Smrg    showIncludes=-Wc,-showIncludes
523b4485a66Smrg  else
524b4485a66Smrg    showIncludes=-showIncludes
525b4485a66Smrg  fi
526b4485a66Smrg  "$@" $showIncludes > "$tmpdepfile"
527b4485a66Smrg  stat=$?
528b4485a66Smrg  grep -v '^Note: including file: ' "$tmpdepfile"
529945aa7e3Smrg  if test $stat -ne 0; then
530b4485a66Smrg    rm -f "$tmpdepfile"
531b4485a66Smrg    exit $stat
532b4485a66Smrg  fi
533b4485a66Smrg  rm -f "$depfile"
534b4485a66Smrg  echo "$object : \\" > "$depfile"
535b4485a66Smrg  # The first sed program below extracts the file names and escapes
536b4485a66Smrg  # backslashes for cygpath.  The second sed program outputs the file
537b4485a66Smrg  # name when reading, but also accumulates all include files in the
538b4485a66Smrg  # hold buffer in order to output them again at the end.  This only
539b4485a66Smrg  # works with sed implementations that can handle large buffers.
540b4485a66Smrg  sed < "$tmpdepfile" -n '
541b4485a66Smrg/^Note: including file:  *\(.*\)/ {
542b4485a66Smrg  s//\1/
543b4485a66Smrg  s/\\/\\\\/g
544b4485a66Smrg  p
545b4485a66Smrg}' | $cygpath_u | sort -u | sed -n '
546b4485a66Smrgs/ /\\ /g
547945aa7e3Smrgs/\(.*\)/'"$tab"'\1 \\/p
548b4485a66Smrgs/.\(.*\) \\/\1:/
549b4485a66SmrgH
550b4485a66Smrg$ {
551945aa7e3Smrg  s/.*/'"$tab"'/
552b4485a66Smrg  G
553b4485a66Smrg  p
554b4485a66Smrg}' >> "$depfile"
555945aa7e3Smrg  echo >> "$depfile" # make sure the fragment doesn't end with a backslash
556b4485a66Smrg  rm -f "$tmpdepfile"
557b4485a66Smrg  ;;
558b4485a66Smrg
559b4485a66Smrgmsvc7msys)
560b4485a66Smrg  # This case exists only to let depend.m4 do its work.  It works by
561b4485a66Smrg  # looking at the text of this script.  This case will never be run,
562b4485a66Smrg  # since it is checked for above.
563b4485a66Smrg  exit 1
564b4485a66Smrg  ;;
565b4485a66Smrg
566010cdda0Smrg#nosideeffect)
567010cdda0Smrg  # This comment above is used by automake to tell side-effect
568010cdda0Smrg  # dependency tracking mechanisms from slower ones.
569010cdda0Smrg
570010cdda0Smrgdashmstdout)
571010cdda0Smrg  # Important note: in order to support this mode, a compiler *must*
572010cdda0Smrg  # always write the preprocessed file to stdout, regardless of -o.
573010cdda0Smrg  "$@" || exit $?
574010cdda0Smrg
575010cdda0Smrg  # Remove the call to Libtool.
576010cdda0Smrg  if test "$libtool" = yes; then
577b3eb03f3Smrg    while test "X$1" != 'X--mode=compile'; do
578010cdda0Smrg      shift
579010cdda0Smrg    done
580010cdda0Smrg    shift
581010cdda0Smrg  fi
582010cdda0Smrg
583945aa7e3Smrg  # Remove '-o $object'.
584010cdda0Smrg  IFS=" "
585010cdda0Smrg  for arg
586010cdda0Smrg  do
587010cdda0Smrg    case $arg in
588010cdda0Smrg    -o)
589010cdda0Smrg      shift
590010cdda0Smrg      ;;
591010cdda0Smrg    $object)
592010cdda0Smrg      shift
593010cdda0Smrg      ;;
594010cdda0Smrg    *)
595010cdda0Smrg      set fnord "$@" "$arg"
596010cdda0Smrg      shift # fnord
597010cdda0Smrg      shift # $arg
598010cdda0Smrg      ;;
599010cdda0Smrg    esac
600010cdda0Smrg  done
601010cdda0Smrg
602010cdda0Smrg  test -z "$dashmflag" && dashmflag=-M
603945aa7e3Smrg  # Require at least two characters before searching for ':'
604010cdda0Smrg  # in the target name.  This is to cope with DOS-style filenames:
605945aa7e3Smrg  # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise.
606010cdda0Smrg  "$@" $dashmflag |
607945aa7e3Smrg    sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile"
608010cdda0Smrg  rm -f "$depfile"
609010cdda0Smrg  cat < "$tmpdepfile" > "$depfile"
610945aa7e3Smrg  # Some versions of the HPUX 10.20 sed can't process this sed invocation
611945aa7e3Smrg  # correctly.  Breaking it into two sed invocations is a workaround.
612945aa7e3Smrg  tr ' ' "$nl" < "$tmpdepfile" \
613945aa7e3Smrg    | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
614945aa7e3Smrg    | sed -e 's/$/ :/' >> "$depfile"
615010cdda0Smrg  rm -f "$tmpdepfile"
616010cdda0Smrg  ;;
617010cdda0Smrg
618010cdda0SmrgdashXmstdout)
619010cdda0Smrg  # This case only exists to satisfy depend.m4.  It is never actually
620010cdda0Smrg  # run, as this mode is specially recognized in the preamble.
621010cdda0Smrg  exit 1
622010cdda0Smrg  ;;
623010cdda0Smrg
624010cdda0Smrgmakedepend)
625010cdda0Smrg  "$@" || exit $?
626010cdda0Smrg  # Remove any Libtool call
627010cdda0Smrg  if test "$libtool" = yes; then
628b3eb03f3Smrg    while test "X$1" != 'X--mode=compile'; do
629010cdda0Smrg      shift
630010cdda0Smrg    done
631010cdda0Smrg    shift
632010cdda0Smrg  fi
633010cdda0Smrg  # X makedepend
634010cdda0Smrg  shift
635b3eb03f3Smrg  cleared=no eat=no
636b3eb03f3Smrg  for arg
637b3eb03f3Smrg  do
638010cdda0Smrg    case $cleared in
639010cdda0Smrg    no)
640010cdda0Smrg      set ""; shift
641010cdda0Smrg      cleared=yes ;;
642010cdda0Smrg    esac
643b3eb03f3Smrg    if test $eat = yes; then
644b3eb03f3Smrg      eat=no
645b3eb03f3Smrg      continue
646b3eb03f3Smrg    fi
647010cdda0Smrg    case "$arg" in
648010cdda0Smrg    -D*|-I*)
649010cdda0Smrg      set fnord "$@" "$arg"; shift ;;
650010cdda0Smrg    # Strip any option that makedepend may not understand.  Remove
651010cdda0Smrg    # the object too, otherwise makedepend will parse it as a source file.
652b3eb03f3Smrg    -arch)
653b3eb03f3Smrg      eat=yes ;;
654010cdda0Smrg    -*|$object)
655010cdda0Smrg      ;;
656010cdda0Smrg    *)
657010cdda0Smrg      set fnord "$@" "$arg"; shift ;;
658010cdda0Smrg    esac
659010cdda0Smrg  done
660b3eb03f3Smrg  obj_suffix=`echo "$object" | sed 's/^.*\././'`
661010cdda0Smrg  touch "$tmpdepfile"
662010cdda0Smrg  ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
663010cdda0Smrg  rm -f "$depfile"
664b4485a66Smrg  # makedepend may prepend the VPATH from the source file name to the object.
665b4485a66Smrg  # No need to regex-escape $object, excess matching of '.' is harmless.
666b4485a66Smrg  sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile"
667945aa7e3Smrg  # Some versions of the HPUX 10.20 sed can't process the last invocation
668945aa7e3Smrg  # correctly.  Breaking it into two sed invocations is a workaround.
669945aa7e3Smrg  sed '1,2d' "$tmpdepfile" \
670945aa7e3Smrg    | tr ' ' "$nl" \
671945aa7e3Smrg    | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
672945aa7e3Smrg    | sed -e 's/$/ :/' >> "$depfile"
673010cdda0Smrg  rm -f "$tmpdepfile" "$tmpdepfile".bak
674010cdda0Smrg  ;;
675010cdda0Smrg
676010cdda0Smrgcpp)
677010cdda0Smrg  # Important note: in order to support this mode, a compiler *must*
678010cdda0Smrg  # always write the preprocessed file to stdout.
679010cdda0Smrg  "$@" || exit $?
680010cdda0Smrg
681010cdda0Smrg  # Remove the call to Libtool.
682010cdda0Smrg  if test "$libtool" = yes; then
683b3eb03f3Smrg    while test "X$1" != 'X--mode=compile'; do
684010cdda0Smrg      shift
685010cdda0Smrg    done
686010cdda0Smrg    shift
687010cdda0Smrg  fi
688010cdda0Smrg
689945aa7e3Smrg  # Remove '-o $object'.
690010cdda0Smrg  IFS=" "
691010cdda0Smrg  for arg
692010cdda0Smrg  do
693010cdda0Smrg    case $arg in
694010cdda0Smrg    -o)
695010cdda0Smrg      shift
696010cdda0Smrg      ;;
697010cdda0Smrg    $object)
698010cdda0Smrg      shift
699010cdda0Smrg      ;;
700010cdda0Smrg    *)
701010cdda0Smrg      set fnord "$@" "$arg"
702010cdda0Smrg      shift # fnord
703010cdda0Smrg      shift # $arg
704010cdda0Smrg      ;;
705010cdda0Smrg    esac
706010cdda0Smrg  done
707010cdda0Smrg
708945aa7e3Smrg  "$@" -E \
709945aa7e3Smrg    | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
710945aa7e3Smrg             -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
711945aa7e3Smrg    | sed '$ s: \\$::' > "$tmpdepfile"
712010cdda0Smrg  rm -f "$depfile"
713010cdda0Smrg  echo "$object : \\" > "$depfile"
714010cdda0Smrg  cat < "$tmpdepfile" >> "$depfile"
715010cdda0Smrg  sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
716010cdda0Smrg  rm -f "$tmpdepfile"
717010cdda0Smrg  ;;
718010cdda0Smrg
719010cdda0Smrgmsvisualcpp)
720010cdda0Smrg  # Important note: in order to support this mode, a compiler *must*
721b3eb03f3Smrg  # always write the preprocessed file to stdout.
722010cdda0Smrg  "$@" || exit $?
723b3eb03f3Smrg
724b3eb03f3Smrg  # Remove the call to Libtool.
725b3eb03f3Smrg  if test "$libtool" = yes; then
726b3eb03f3Smrg    while test "X$1" != 'X--mode=compile'; do
727b3eb03f3Smrg      shift
728b3eb03f3Smrg    done
729b3eb03f3Smrg    shift
730b3eb03f3Smrg  fi
731b3eb03f3Smrg
732010cdda0Smrg  IFS=" "
733010cdda0Smrg  for arg
734010cdda0Smrg  do
735010cdda0Smrg    case "$arg" in
736b3eb03f3Smrg    -o)
737b3eb03f3Smrg      shift
738b3eb03f3Smrg      ;;
739b3eb03f3Smrg    $object)
740b3eb03f3Smrg      shift
741b3eb03f3Smrg      ;;
742010cdda0Smrg    "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
743945aa7e3Smrg        set fnord "$@"
744945aa7e3Smrg        shift
745945aa7e3Smrg        shift
746945aa7e3Smrg        ;;
747010cdda0Smrg    *)
748945aa7e3Smrg        set fnord "$@" "$arg"
749945aa7e3Smrg        shift
750945aa7e3Smrg        shift
751945aa7e3Smrg        ;;
752010cdda0Smrg    esac
753010cdda0Smrg  done
754b3eb03f3Smrg  "$@" -E 2>/dev/null |
755b3eb03f3Smrg  sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile"
756010cdda0Smrg  rm -f "$depfile"
757010cdda0Smrg  echo "$object : \\" > "$depfile"
758945aa7e3Smrg  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile"
759945aa7e3Smrg  echo "$tab" >> "$depfile"
760b3eb03f3Smrg  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile"
761010cdda0Smrg  rm -f "$tmpdepfile"
762010cdda0Smrg  ;;
763010cdda0Smrg
764b3eb03f3Smrgmsvcmsys)
765b3eb03f3Smrg  # This case exists only to let depend.m4 do its work.  It works by
766b3eb03f3Smrg  # looking at the text of this script.  This case will never be run,
767b3eb03f3Smrg  # since it is checked for above.
768b3eb03f3Smrg  exit 1
769b3eb03f3Smrg  ;;
770b3eb03f3Smrg
771010cdda0Smrgnone)
772010cdda0Smrg  exec "$@"
773010cdda0Smrg  ;;
774010cdda0Smrg
775010cdda0Smrg*)
776010cdda0Smrg  echo "Unknown depmode $depmode" 1>&2
777010cdda0Smrg  exit 1
778010cdda0Smrg  ;;
779010cdda0Smrgesac
780010cdda0Smrg
781010cdda0Smrgexit 0
782b3eb03f3Smrg
783b3eb03f3Smrg# Local Variables:
784b3eb03f3Smrg# mode: shell-script
785b3eb03f3Smrg# sh-indentation: 2
786945aa7e3Smrg# eval: (add-hook 'before-save-hook 'time-stamp)
787b3eb03f3Smrg# time-stamp-start: "scriptversion="
788b3eb03f3Smrg# time-stamp-format: "%:y-%02m-%02d.%02H"
789945aa7e3Smrg# time-stamp-time-zone: "UTC0"
790b3eb03f3Smrg# time-stamp-end: "; # UTC"
791b3eb03f3Smrg# End:
792