1266e564dSmrg#! /bin/sh
2266e564dSmrg# depcomp - compile a program generating dependencies as side-effects
3266e564dSmrg
43bf3b463Smrgscriptversion=2024-06-19.01; # UTC
5266e564dSmrg
63bf3b463Smrg# Copyright (C) 1999-2024 Free Software Foundation, Inc.
7266e564dSmrg
8266e564dSmrg# This program is free software; you can redistribute it and/or modify
9266e564dSmrg# it under the terms of the GNU General Public License as published by
10266e564dSmrg# the Free Software Foundation; either version 2, or (at your option)
11266e564dSmrg# any later version.
12266e564dSmrg
13266e564dSmrg# This program is distributed in the hope that it will be useful,
14266e564dSmrg# but WITHOUT ANY WARRANTY; without even the implied warranty of
15266e564dSmrg# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16266e564dSmrg# GNU General Public License for more details.
17266e564dSmrg
18266e564dSmrg# You should have received a copy of the GNU General Public License
191009a292Smrg# along with this program.  If not, see <https://www.gnu.org/licenses/>.
20266e564dSmrg
21266e564dSmrg# As a special exception to the GNU General Public License, if you
22266e564dSmrg# distribute this file as part of a program that contains a
23266e564dSmrg# configuration script generated by Autoconf, you may include it under
24266e564dSmrg# the same distribution terms that you use for the rest of that program.
25266e564dSmrg
26266e564dSmrg# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>.
27266e564dSmrg
28266e564dSmrgcase $1 in
29266e564dSmrg  '')
30fb5e8d76Smrg    echo "$0: No command.  Try '$0 --help' for more information." 1>&2
31fb5e8d76Smrg    exit 1;
32fb5e8d76Smrg    ;;
33266e564dSmrg  -h | --h*)
34266e564dSmrg    cat <<\EOF
35266e564dSmrgUsage: depcomp [--help] [--version] PROGRAM [ARGS]
36266e564dSmrg
37266e564dSmrgRun PROGRAMS ARGS to compile a file, generating dependencies
38266e564dSmrgas side-effects.
39266e564dSmrg
40266e564dSmrgEnvironment variables:
41266e564dSmrg  depmode     Dependency tracking mode.
42fb5e8d76Smrg  source      Source file read by 'PROGRAMS ARGS'.
43fb5e8d76Smrg  object      Object file output by 'PROGRAMS ARGS'.
44266e564dSmrg  DEPDIR      directory where to store dependencies.
45266e564dSmrg  depfile     Dependency file to output.
46fb5e8d76Smrg  tmpdepfile  Temporary file to use when outputting dependencies.
47266e564dSmrg  libtool     Whether libtool is used (yes/no).
48266e564dSmrg
49266e564dSmrgReport bugs to <bug-automake@gnu.org>.
503bf3b463SmrgGNU Automake home page: <https://www.gnu.org/software/automake/>.
513bf3b463SmrgGeneral help using GNU software: <https://www.gnu.org/gethelp/>.
52266e564dSmrgEOF
53266e564dSmrg    exit $?
54266e564dSmrg    ;;
55266e564dSmrg  -v | --v*)
563bf3b463Smrg    echo "depcomp (GNU Automake) $scriptversion"
57266e564dSmrg    exit $?
58266e564dSmrg    ;;
59266e564dSmrgesac
60266e564dSmrg
61fb5e8d76Smrg# Get the directory component of the given path, and save it in the
62fb5e8d76Smrg# global variables '$dir'.  Note that this directory component will
63fb5e8d76Smrg# be either empty or ending with a '/' character.  This is deliberate.
64fb5e8d76Smrgset_dir_from ()
65fb5e8d76Smrg{
66fb5e8d76Smrg  case $1 in
67fb5e8d76Smrg    */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;;
68fb5e8d76Smrg      *) dir=;;
69fb5e8d76Smrg  esac
70fb5e8d76Smrg}
71fb5e8d76Smrg
72fb5e8d76Smrg# Get the suffix-stripped basename of the given path, and save it the
73fb5e8d76Smrg# global variable '$base'.
74fb5e8d76Smrgset_base_from ()
75fb5e8d76Smrg{
76fb5e8d76Smrg  base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'`
77fb5e8d76Smrg}
78fb5e8d76Smrg
79fb5e8d76Smrg# If no dependency file was actually created by the compiler invocation,
80fb5e8d76Smrg# we still have to create a dummy depfile, to avoid errors with the
81fb5e8d76Smrg# Makefile "include basename.Plo" scheme.
82fb5e8d76Smrgmake_dummy_depfile ()
83fb5e8d76Smrg{
84fb5e8d76Smrg  echo "#dummy" > "$depfile"
85fb5e8d76Smrg}
86fb5e8d76Smrg
87fb5e8d76Smrg# Factor out some common post-processing of the generated depfile.
88fb5e8d76Smrg# Requires the auxiliary global variable '$tmpdepfile' to be set.
89fb5e8d76Smrgaix_post_process_depfile ()
90fb5e8d76Smrg{
91fb5e8d76Smrg  # If the compiler actually managed to produce a dependency file,
92fb5e8d76Smrg  # post-process it.
93fb5e8d76Smrg  if test -f "$tmpdepfile"; then
94fb5e8d76Smrg    # Each line is of the form 'foo.o: dependency.h'.
95fb5e8d76Smrg    # Do two passes, one to just change these to
96fb5e8d76Smrg    #   $object: dependency.h
97fb5e8d76Smrg    # and one to simply output
98fb5e8d76Smrg    #   dependency.h:
99fb5e8d76Smrg    # which is needed to avoid the deleted-header problem.
100fb5e8d76Smrg    { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile"
101fb5e8d76Smrg      sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile"
102fb5e8d76Smrg    } > "$depfile"
103fb5e8d76Smrg    rm -f "$tmpdepfile"
104fb5e8d76Smrg  else
105fb5e8d76Smrg    make_dummy_depfile
106fb5e8d76Smrg  fi
107fb5e8d76Smrg}
108fb5e8d76Smrg
109fb5e8d76Smrg# A tabulation character.
110fb5e8d76Smrgtab='	'
111fb5e8d76Smrg# A newline character.
112fb5e8d76Smrgnl='
113fb5e8d76Smrg'
114fb5e8d76Smrg# Character ranges might be problematic outside the C locale.
115fb5e8d76Smrg# These definitions help.
116fb5e8d76Smrgupper=ABCDEFGHIJKLMNOPQRSTUVWXYZ
117fb5e8d76Smrglower=abcdefghijklmnopqrstuvwxyz
118fb5e8d76Smrgalpha=${upper}${lower}
119fb5e8d76Smrg
120266e564dSmrgif test -z "$depmode" || test -z "$source" || test -z "$object"; then
121266e564dSmrg  echo "depcomp: Variables source, object and depmode must be set" 1>&2
122266e564dSmrg  exit 1
123266e564dSmrgfi
124266e564dSmrg
125266e564dSmrg# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.
126266e564dSmrgdepfile=${depfile-`echo "$object" |
127266e564dSmrg  sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`}
128266e564dSmrgtmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
129266e564dSmrg
130266e564dSmrgrm -f "$tmpdepfile"
131266e564dSmrg
1323bf3b463Smrg# Avoid interference from the environment.
133fb5e8d76Smrggccflag= dashmflag=
134fb5e8d76Smrg
135266e564dSmrg# Some modes work just like other modes, but use different flags.  We
136266e564dSmrg# parameterize here, but still list the modes in the big case below,
137266e564dSmrg# to make depend.m4 easier to write.  Note that we *cannot* use a case
138266e564dSmrg# here, because this file can only contain one case statement.
139266e564dSmrgif test "$depmode" = hp; then
140266e564dSmrg  # HP compiler uses -M and no extra arg.
141266e564dSmrg  gccflag=-M
142266e564dSmrg  depmode=gcc
143266e564dSmrgfi
144266e564dSmrg
145266e564dSmrgif test "$depmode" = dashXmstdout; then
146fb5e8d76Smrg  # This is just like dashmstdout with a different argument.
147fb5e8d76Smrg  dashmflag=-xM
148fb5e8d76Smrg  depmode=dashmstdout
149266e564dSmrgfi
150266e564dSmrg
151d17cd367Smrgcygpath_u="cygpath -u -f -"
152d17cd367Smrgif test "$depmode" = msvcmsys; then
153fb5e8d76Smrg  # This is just like msvisualcpp but w/o cygpath translation.
154fb5e8d76Smrg  # Just convert the backslash-escaped backslashes to single forward
155fb5e8d76Smrg  # slashes to satisfy depend.m4
156fb5e8d76Smrg  cygpath_u='sed s,\\\\,/,g'
157fb5e8d76Smrg  depmode=msvisualcpp
158fb5e8d76Smrgfi
159fb5e8d76Smrg
160fb5e8d76Smrgif test "$depmode" = msvc7msys; then
161fb5e8d76Smrg  # This is just like msvc7 but w/o cygpath translation.
162fb5e8d76Smrg  # Just convert the backslash-escaped backslashes to single forward
163fb5e8d76Smrg  # slashes to satisfy depend.m4
164fb5e8d76Smrg  cygpath_u='sed s,\\\\,/,g'
165fb5e8d76Smrg  depmode=msvc7
166fb5e8d76Smrgfi
167fb5e8d76Smrg
168fb5e8d76Smrgif test "$depmode" = xlc; then
169fb5e8d76Smrg  # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information.
170fb5e8d76Smrg  gccflag=-qmakedep=gcc,-MF
171fb5e8d76Smrg  depmode=gcc
172d17cd367Smrgfi
173d17cd367Smrg
174266e564dSmrgcase "$depmode" in
175266e564dSmrggcc3)
176266e564dSmrg## gcc 3 implements dependency tracking that does exactly what
177266e564dSmrg## we want.  Yay!  Note: for some reason libtool 1.4 doesn't like
178266e564dSmrg## it if -MD -MP comes after the -MF stuff.  Hmm.
179266e564dSmrg## Unfortunately, FreeBSD c89 acceptance of flags depends upon
180266e564dSmrg## the command line argument order; so add the flags where they
181266e564dSmrg## appear in depend2.am.  Note that the slowdown incurred here
182266e564dSmrg## affects only configure: in makefiles, %FASTDEP% shortcuts this.
183266e564dSmrg  for arg
184266e564dSmrg  do
185266e564dSmrg    case $arg in
186266e564dSmrg    -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;;
187266e564dSmrg    *)  set fnord "$@" "$arg" ;;
188266e564dSmrg    esac
189266e564dSmrg    shift # fnord
190266e564dSmrg    shift # $arg
191266e564dSmrg  done
192266e564dSmrg  "$@"
193266e564dSmrg  stat=$?
194fb5e8d76Smrg  if test $stat -ne 0; then
195266e564dSmrg    rm -f "$tmpdepfile"
196266e564dSmrg    exit $stat
197266e564dSmrg  fi
198266e564dSmrg  mv "$tmpdepfile" "$depfile"
199266e564dSmrg  ;;
200266e564dSmrg
201266e564dSmrggcc)
2023bf3b463Smrg## Note that this doesn't just cater to obsolete pre-3.x GCC compilers.
2033bf3b463Smrg## but also to in-use compilers like IBM xlc/xlC and the HP C compiler.
204fb5e8d76Smrg## (see the conditional assignment to $gccflag above).
205266e564dSmrg## There are various ways to get dependency output from gcc.  Here's
206266e564dSmrg## why we pick this rather obscure method:
207266e564dSmrg## - Don't want to use -MD because we'd like the dependencies to end
208266e564dSmrg##   up in a subdir.  Having to rename by hand is ugly.
209266e564dSmrg##   (We might end up doing this anyway to support other compilers.)
210266e564dSmrg## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
211fb5e8d76Smrg##   -MM, not -M (despite what the docs say).  Also, it might not be
212fb5e8d76Smrg##   supported by the other compilers which use the 'gcc' depmode.
213266e564dSmrg## - Using -M directly means running the compiler twice (even worse
214266e564dSmrg##   than renaming).
215266e564dSmrg  if test -z "$gccflag"; then
216266e564dSmrg    gccflag=-MD,
217266e564dSmrg  fi
218266e564dSmrg  "$@" -Wp,"$gccflag$tmpdepfile"
219266e564dSmrg  stat=$?
220fb5e8d76Smrg  if test $stat -ne 0; then
221266e564dSmrg    rm -f "$tmpdepfile"
222266e564dSmrg    exit $stat
223266e564dSmrg  fi
224266e564dSmrg  rm -f "$depfile"
225266e564dSmrg  echo "$object : \\" > "$depfile"
226fb5e8d76Smrg  # The second -e expression handles DOS-style file names with drive
227fb5e8d76Smrg  # letters.
228266e564dSmrg  sed -e 's/^[^:]*: / /' \
229266e564dSmrg      -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
230fb5e8d76Smrg## This next piece of magic avoids the "deleted header file" problem.
231266e564dSmrg## The problem is that when a header file which appears in a .P file
232266e564dSmrg## is deleted, the dependency causes make to die (because there is
233266e564dSmrg## typically no way to rebuild the header).  We avoid this by adding
234266e564dSmrg## dummy dependencies for each header file.  Too bad gcc doesn't do
235266e564dSmrg## this for us directly.
236fb5e8d76Smrg## Some versions of gcc put a space before the ':'.  On the theory
237266e564dSmrg## that the space means something, we add a space to the output as
238fb5e8d76Smrg## well.  hp depmode also adds that space, but also prefixes the VPATH
239fb5e8d76Smrg## to the object.  Take care to not repeat it in the output.
240266e564dSmrg## Some versions of the HPUX 10.20 sed can't process this invocation
241266e564dSmrg## correctly.  Breaking it into two sed invocations is a workaround.
242fb5e8d76Smrg  tr ' ' "$nl" < "$tmpdepfile" \
243fb5e8d76Smrg    | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \
244fb5e8d76Smrg    | sed -e 's/$/ :/' >> "$depfile"
245266e564dSmrg  rm -f "$tmpdepfile"
246266e564dSmrg  ;;
247266e564dSmrg
248266e564dSmrghp)
249266e564dSmrg  # This case exists only to let depend.m4 do its work.  It works by
250266e564dSmrg  # looking at the text of this script.  This case will never be run,
251266e564dSmrg  # since it is checked for above.
252266e564dSmrg  exit 1
253266e564dSmrg  ;;
254266e564dSmrg
255266e564dSmrgsgi)
256266e564dSmrg  if test "$libtool" = yes; then
257266e564dSmrg    "$@" "-Wp,-MDupdate,$tmpdepfile"
258266e564dSmrg  else
259266e564dSmrg    "$@" -MDupdate "$tmpdepfile"
260266e564dSmrg  fi
261266e564dSmrg  stat=$?
262fb5e8d76Smrg  if test $stat -ne 0; then
263266e564dSmrg    rm -f "$tmpdepfile"
264266e564dSmrg    exit $stat
265266e564dSmrg  fi
266266e564dSmrg  rm -f "$depfile"
267266e564dSmrg
268266e564dSmrg  if test -f "$tmpdepfile"; then  # yes, the sourcefile depend on other files
269266e564dSmrg    echo "$object : \\" > "$depfile"
270266e564dSmrg    # Clip off the initial element (the dependent).  Don't try to be
271266e564dSmrg    # clever and replace this with sed code, as IRIX sed won't handle
272266e564dSmrg    # lines with more than a fixed number of characters (4096 in
273266e564dSmrg    # IRIX 6.2 sed, 8192 in IRIX 6.5).  We also remove comment lines;
274fb5e8d76Smrg    # the IRIX cc adds comments like '#:fec' to the end of the
275266e564dSmrg    # dependency line.
276fb5e8d76Smrg    tr ' ' "$nl" < "$tmpdepfile" \
277fb5e8d76Smrg      | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \
278fb5e8d76Smrg      | tr "$nl" ' ' >> "$depfile"
279d17cd367Smrg    echo >> "$depfile"
280266e564dSmrg    # The second pass generates a dummy entry for each header file.
281fb5e8d76Smrg    tr ' ' "$nl" < "$tmpdepfile" \
282fb5e8d76Smrg      | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
283fb5e8d76Smrg      >> "$depfile"
284266e564dSmrg  else
285fb5e8d76Smrg    make_dummy_depfile
286266e564dSmrg  fi
287266e564dSmrg  rm -f "$tmpdepfile"
288266e564dSmrg  ;;
289266e564dSmrg
290fb5e8d76Smrgxlc)
291fb5e8d76Smrg  # This case exists only to let depend.m4 do its work.  It works by
292fb5e8d76Smrg  # looking at the text of this script.  This case will never be run,
293fb5e8d76Smrg  # since it is checked for above.
294fb5e8d76Smrg  exit 1
295fb5e8d76Smrg  ;;
296fb5e8d76Smrg
297266e564dSmrgaix)
298266e564dSmrg  # The C for AIX Compiler uses -M and outputs the dependencies
299266e564dSmrg  # in a .u file.  In older versions, this file always lives in the
300fb5e8d76Smrg  # current directory.  Also, the AIX compiler puts '$object:' at the
301266e564dSmrg  # start of each line; $object doesn't have directory information.
302266e564dSmrg  # Version 6 uses the directory in both cases.
303fb5e8d76Smrg  set_dir_from "$object"
304fb5e8d76Smrg  set_base_from "$object"
305266e564dSmrg  if test "$libtool" = yes; then
306c5629e66Smrg    tmpdepfile1=$dir$base.u
307c5629e66Smrg    tmpdepfile2=$base.u
308c5629e66Smrg    tmpdepfile3=$dir.libs/$base.u
309266e564dSmrg    "$@" -Wc,-M
310266e564dSmrg  else
311c5629e66Smrg    tmpdepfile1=$dir$base.u
312c5629e66Smrg    tmpdepfile2=$dir$base.u
313c5629e66Smrg    tmpdepfile3=$dir$base.u
314266e564dSmrg    "$@" -M
315266e564dSmrg  fi
316266e564dSmrg  stat=$?
317fb5e8d76Smrg  if test $stat -ne 0; then
318c5629e66Smrg    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
319266e564dSmrg    exit $stat
320266e564dSmrg  fi
321266e564dSmrg
322c5629e66Smrg  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
323c5629e66Smrg  do
324c5629e66Smrg    test -f "$tmpdepfile" && break
325c5629e66Smrg  done
326fb5e8d76Smrg  aix_post_process_depfile
327fb5e8d76Smrg  ;;
328fb5e8d76Smrg
329fb5e8d76Smrgtcc)
330fb5e8d76Smrg  # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26
331fb5e8d76Smrg  # FIXME: That version still under development at the moment of writing.
332fb5e8d76Smrg  #        Make that this statement remains true also for stable, released
333fb5e8d76Smrg  #        versions.
334fb5e8d76Smrg  # It will wrap lines (doesn't matter whether long or short) with a
335fb5e8d76Smrg  # trailing '\', as in:
336fb5e8d76Smrg  #
337fb5e8d76Smrg  #   foo.o : \
338fb5e8d76Smrg  #    foo.c \
339fb5e8d76Smrg  #    foo.h \
340fb5e8d76Smrg  #
341fb5e8d76Smrg  # It will put a trailing '\' even on the last line, and will use leading
342fb5e8d76Smrg  # spaces rather than leading tabs (at least since its commit 0394caf7
343fb5e8d76Smrg  # "Emit spaces for -MD").
344fb5e8d76Smrg  "$@" -MD -MF "$tmpdepfile"
345fb5e8d76Smrg  stat=$?
346fb5e8d76Smrg  if test $stat -ne 0; then
347fb5e8d76Smrg    rm -f "$tmpdepfile"
348fb5e8d76Smrg    exit $stat
349266e564dSmrg  fi
350fb5e8d76Smrg  rm -f "$depfile"
351fb5e8d76Smrg  # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'.
352fb5e8d76Smrg  # We have to change lines of the first kind to '$object: \'.
353fb5e8d76Smrg  sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile"
354fb5e8d76Smrg  # And for each line of the second kind, we have to emit a 'dep.h:'
355fb5e8d76Smrg  # dummy dependency, to avoid the deleted-header problem.
356fb5e8d76Smrg  sed -n -e 's|^  *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile"
357266e564dSmrg  rm -f "$tmpdepfile"
358266e564dSmrg  ;;
359266e564dSmrg
360fb5e8d76Smrg## The order of this option in the case statement is important, since the
361fb5e8d76Smrg## shell code in configure will try each of these formats in the order
362fb5e8d76Smrg## listed in this file.  A plain '-MD' option would be understood by many
363fb5e8d76Smrg## compilers, so we must ensure this comes after the gcc and icc options.
364fb5e8d76Smrgpgcc)
365fb5e8d76Smrg  # Portland's C compiler understands '-MD'.
366fb5e8d76Smrg  # Will always output deps to 'file.d' where file is the root name of the
367fb5e8d76Smrg  # source file under compilation, even if file resides in a subdirectory.
368fb5e8d76Smrg  # The object file name does not affect the name of the '.d' file.
369fb5e8d76Smrg  # pgcc 10.2 will output
370266e564dSmrg  #    foo.o: sub/foo.c sub/foo.h
371fb5e8d76Smrg  # and will wrap long lines using '\' :
372266e564dSmrg  #    foo.o: sub/foo.c ... \
373266e564dSmrg  #     sub/foo.h ... \
374266e564dSmrg  #     ...
375fb5e8d76Smrg  set_dir_from "$object"
376fb5e8d76Smrg  # Use the source, not the object, to determine the base name, since
377fb5e8d76Smrg  # that's sadly what pgcc will do too.
378fb5e8d76Smrg  set_base_from "$source"
379fb5e8d76Smrg  tmpdepfile=$base.d
380fb5e8d76Smrg
381fb5e8d76Smrg  # For projects that build the same source file twice into different object
382fb5e8d76Smrg  # files, the pgcc approach of using the *source* file root name can cause
383fb5e8d76Smrg  # problems in parallel builds.  Use a locking strategy to avoid stomping on
384fb5e8d76Smrg  # the same $tmpdepfile.
385fb5e8d76Smrg  lockdir=$base.d-lock
386fb5e8d76Smrg  trap "
387fb5e8d76Smrg    echo '$0: caught signal, cleaning up...' >&2
388fb5e8d76Smrg    rmdir '$lockdir'
389fb5e8d76Smrg    exit 1
390fb5e8d76Smrg  " 1 2 13 15
391fb5e8d76Smrg  numtries=100
392fb5e8d76Smrg  i=$numtries
393fb5e8d76Smrg  while test $i -gt 0; do
394fb5e8d76Smrg    # mkdir is a portable test-and-set.
395fb5e8d76Smrg    if mkdir "$lockdir" 2>/dev/null; then
396fb5e8d76Smrg      # This process acquired the lock.
397fb5e8d76Smrg      "$@" -MD
398fb5e8d76Smrg      stat=$?
399fb5e8d76Smrg      # Release the lock.
400fb5e8d76Smrg      rmdir "$lockdir"
401fb5e8d76Smrg      break
402fb5e8d76Smrg    else
403fb5e8d76Smrg      # If the lock is being held by a different process, wait
404fb5e8d76Smrg      # until the winning process is done or we timeout.
405fb5e8d76Smrg      while test -d "$lockdir" && test $i -gt 0; do
406fb5e8d76Smrg        sleep 1
407fb5e8d76Smrg        i=`expr $i - 1`
408fb5e8d76Smrg      done
409fb5e8d76Smrg    fi
410fb5e8d76Smrg    i=`expr $i - 1`
411fb5e8d76Smrg  done
412fb5e8d76Smrg  trap - 1 2 13 15
413fb5e8d76Smrg  if test $i -le 0; then
414fb5e8d76Smrg    echo "$0: failed to acquire lock after $numtries attempts" >&2
415fb5e8d76Smrg    echo "$0: check lockdir '$lockdir'" >&2
416fb5e8d76Smrg    exit 1
417fb5e8d76Smrg  fi
418266e564dSmrg
419fb5e8d76Smrg  if test $stat -ne 0; then
420266e564dSmrg    rm -f "$tmpdepfile"
421266e564dSmrg    exit $stat
422266e564dSmrg  fi
423266e564dSmrg  rm -f "$depfile"
424266e564dSmrg  # Each line is of the form `foo.o: dependent.h',
425266e564dSmrg  # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'.
426266e564dSmrg  # Do two passes, one to just change these to
427266e564dSmrg  # `$object: dependent.h' and one to simply `dependent.h:'.
428266e564dSmrg  sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
429266e564dSmrg  # Some versions of the HPUX 10.20 sed can't process this invocation
430266e564dSmrg  # correctly.  Breaking it into two sed invocations is a workaround.
431fb5e8d76Smrg  sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \
432fb5e8d76Smrg    | sed -e 's/$/ :/' >> "$depfile"
433266e564dSmrg  rm -f "$tmpdepfile"
434266e564dSmrg  ;;
435266e564dSmrg
436266e564dSmrghp2)
437266e564dSmrg  # The "hp" stanza above does not work with aCC (C++) and HP's ia64
438266e564dSmrg  # compilers, which have integrated preprocessors.  The correct option
439266e564dSmrg  # to use with these is +Maked; it writes dependencies to a file named
440266e564dSmrg  # 'foo.d', which lands next to the object file, wherever that
441266e564dSmrg  # happens to be.
442266e564dSmrg  # Much of this is similar to the tru64 case; see comments there.
443fb5e8d76Smrg  set_dir_from  "$object"
444fb5e8d76Smrg  set_base_from "$object"
445266e564dSmrg  if test "$libtool" = yes; then
446266e564dSmrg    tmpdepfile1=$dir$base.d
447266e564dSmrg    tmpdepfile2=$dir.libs/$base.d
448266e564dSmrg    "$@" -Wc,+Maked
449266e564dSmrg  else
450266e564dSmrg    tmpdepfile1=$dir$base.d
451266e564dSmrg    tmpdepfile2=$dir$base.d
452266e564dSmrg    "$@" +Maked
453266e564dSmrg  fi
454266e564dSmrg  stat=$?
455fb5e8d76Smrg  if test $stat -ne 0; then
456266e564dSmrg     rm -f "$tmpdepfile1" "$tmpdepfile2"
457266e564dSmrg     exit $stat
458266e564dSmrg  fi
459266e564dSmrg
460266e564dSmrg  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2"
461266e564dSmrg  do
462266e564dSmrg    test -f "$tmpdepfile" && break
463266e564dSmrg  done
464266e564dSmrg  if test -f "$tmpdepfile"; then
465fb5e8d76Smrg    sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile"
466fb5e8d76Smrg    # Add 'dependent.h:' lines.
467d17cd367Smrg    sed -ne '2,${
468fb5e8d76Smrg               s/^ *//
469fb5e8d76Smrg               s/ \\*$//
470fb5e8d76Smrg               s/$/:/
471fb5e8d76Smrg               p
472fb5e8d76Smrg             }' "$tmpdepfile" >> "$depfile"
473266e564dSmrg  else
474fb5e8d76Smrg    make_dummy_depfile
475266e564dSmrg  fi
476266e564dSmrg  rm -f "$tmpdepfile" "$tmpdepfile2"
477266e564dSmrg  ;;
478266e564dSmrg
479266e564dSmrgtru64)
480fb5e8d76Smrg  # The Tru64 compiler uses -MD to generate dependencies as a side
481fb5e8d76Smrg  # effect.  'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'.
482fb5e8d76Smrg  # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
483fb5e8d76Smrg  # dependencies in 'foo.d' instead, so we check for that too.
484fb5e8d76Smrg  # Subdirectories are respected.
485fb5e8d76Smrg  set_dir_from  "$object"
486fb5e8d76Smrg  set_base_from "$object"
487fb5e8d76Smrg
488fb5e8d76Smrg  if test "$libtool" = yes; then
489fb5e8d76Smrg    # Libtool generates 2 separate objects for the 2 libraries.  These
490fb5e8d76Smrg    # two compilations output dependencies in $dir.libs/$base.o.d and
491fb5e8d76Smrg    # in $dir$base.o.d.  We have to check for both files, because
492fb5e8d76Smrg    # one of the two compilations can be disabled.  We should prefer
493fb5e8d76Smrg    # $dir$base.o.d over $dir.libs/$base.o.d because the latter is
494fb5e8d76Smrg    # automatically cleaned when .libs/ is deleted, while ignoring
495fb5e8d76Smrg    # the former would cause a distcleancheck panic.
496fb5e8d76Smrg    tmpdepfile1=$dir$base.o.d          # libtool 1.5
497fb5e8d76Smrg    tmpdepfile2=$dir.libs/$base.o.d    # Likewise.
498fb5e8d76Smrg    tmpdepfile3=$dir.libs/$base.d      # Compaq CCC V6.2-504
499fb5e8d76Smrg    "$@" -Wc,-MD
500fb5e8d76Smrg  else
501fb5e8d76Smrg    tmpdepfile1=$dir$base.d
502fb5e8d76Smrg    tmpdepfile2=$dir$base.d
503fb5e8d76Smrg    tmpdepfile3=$dir$base.d
504fb5e8d76Smrg    "$@" -MD
505fb5e8d76Smrg  fi
506fb5e8d76Smrg
507fb5e8d76Smrg  stat=$?
508fb5e8d76Smrg  if test $stat -ne 0; then
509fb5e8d76Smrg    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
510fb5e8d76Smrg    exit $stat
511fb5e8d76Smrg  fi
512fb5e8d76Smrg
513fb5e8d76Smrg  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
514fb5e8d76Smrg  do
515fb5e8d76Smrg    test -f "$tmpdepfile" && break
516fb5e8d76Smrg  done
517fb5e8d76Smrg  # Same post-processing that is required for AIX mode.
518fb5e8d76Smrg  aix_post_process_depfile
519fb5e8d76Smrg  ;;
520fb5e8d76Smrg
521fb5e8d76Smrgmsvc7)
522fb5e8d76Smrg  if test "$libtool" = yes; then
523fb5e8d76Smrg    showIncludes=-Wc,-showIncludes
524fb5e8d76Smrg  else
525fb5e8d76Smrg    showIncludes=-showIncludes
526fb5e8d76Smrg  fi
527fb5e8d76Smrg  "$@" $showIncludes > "$tmpdepfile"
528fb5e8d76Smrg  stat=$?
529fb5e8d76Smrg  grep -v '^Note: including file: ' "$tmpdepfile"
530fb5e8d76Smrg  if test $stat -ne 0; then
531fb5e8d76Smrg    rm -f "$tmpdepfile"
532fb5e8d76Smrg    exit $stat
533fb5e8d76Smrg  fi
534fb5e8d76Smrg  rm -f "$depfile"
535fb5e8d76Smrg  echo "$object : \\" > "$depfile"
536fb5e8d76Smrg  # The first sed program below extracts the file names and escapes
537fb5e8d76Smrg  # backslashes for cygpath.  The second sed program outputs the file
538fb5e8d76Smrg  # name when reading, but also accumulates all include files in the
539fb5e8d76Smrg  # hold buffer in order to output them again at the end.  This only
540fb5e8d76Smrg  # works with sed implementations that can handle large buffers.
541fb5e8d76Smrg  sed < "$tmpdepfile" -n '
542fb5e8d76Smrg/^Note: including file:  *\(.*\)/ {
543fb5e8d76Smrg  s//\1/
544fb5e8d76Smrg  s/\\/\\\\/g
545fb5e8d76Smrg  p
546fb5e8d76Smrg}' | $cygpath_u | sort -u | sed -n '
547fb5e8d76Smrgs/ /\\ /g
548fb5e8d76Smrgs/\(.*\)/'"$tab"'\1 \\/p
549fb5e8d76Smrgs/.\(.*\) \\/\1:/
550fb5e8d76SmrgH
551fb5e8d76Smrg$ {
552fb5e8d76Smrg  s/.*/'"$tab"'/
553fb5e8d76Smrg  G
554fb5e8d76Smrg  p
555fb5e8d76Smrg}' >> "$depfile"
556fb5e8d76Smrg  echo >> "$depfile" # make sure the fragment doesn't end with a backslash
557fb5e8d76Smrg  rm -f "$tmpdepfile"
558fb5e8d76Smrg  ;;
559fb5e8d76Smrg
560fb5e8d76Smrgmsvc7msys)
561fb5e8d76Smrg  # This case exists only to let depend.m4 do its work.  It works by
562fb5e8d76Smrg  # looking at the text of this script.  This case will never be run,
563fb5e8d76Smrg  # since it is checked for above.
564fb5e8d76Smrg  exit 1
565fb5e8d76Smrg  ;;
566266e564dSmrg
567266e564dSmrg#nosideeffect)
568266e564dSmrg  # This comment above is used by automake to tell side-effect
569266e564dSmrg  # dependency tracking mechanisms from slower ones.
570266e564dSmrg
571266e564dSmrgdashmstdout)
572266e564dSmrg  # Important note: in order to support this mode, a compiler *must*
573266e564dSmrg  # always write the preprocessed file to stdout, regardless of -o.
574266e564dSmrg  "$@" || exit $?
575266e564dSmrg
576266e564dSmrg  # Remove the call to Libtool.
577266e564dSmrg  if test "$libtool" = yes; then
578d17cd367Smrg    while test "X$1" != 'X--mode=compile'; do
579266e564dSmrg      shift
580266e564dSmrg    done
581266e564dSmrg    shift
582266e564dSmrg  fi
583266e564dSmrg
584fb5e8d76Smrg  # Remove '-o $object'.
585266e564dSmrg  IFS=" "
586266e564dSmrg  for arg
587266e564dSmrg  do
588266e564dSmrg    case $arg in
589266e564dSmrg    -o)
590266e564dSmrg      shift
591266e564dSmrg      ;;
592266e564dSmrg    $object)
593266e564dSmrg      shift
594266e564dSmrg      ;;
595266e564dSmrg    *)
596266e564dSmrg      set fnord "$@" "$arg"
597266e564dSmrg      shift # fnord
598266e564dSmrg      shift # $arg
599266e564dSmrg      ;;
600266e564dSmrg    esac
601266e564dSmrg  done
602266e564dSmrg
603266e564dSmrg  test -z "$dashmflag" && dashmflag=-M
604fb5e8d76Smrg  # Require at least two characters before searching for ':'
605266e564dSmrg  # in the target name.  This is to cope with DOS-style filenames:
606fb5e8d76Smrg  # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise.
607266e564dSmrg  "$@" $dashmflag |
608fb5e8d76Smrg    sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile"
609266e564dSmrg  rm -f "$depfile"
610266e564dSmrg  cat < "$tmpdepfile" > "$depfile"
611fb5e8d76Smrg  # Some versions of the HPUX 10.20 sed can't process this sed invocation
612fb5e8d76Smrg  # correctly.  Breaking it into two sed invocations is a workaround.
613fb5e8d76Smrg  tr ' ' "$nl" < "$tmpdepfile" \
614fb5e8d76Smrg    | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
615fb5e8d76Smrg    | sed -e 's/$/ :/' >> "$depfile"
616266e564dSmrg  rm -f "$tmpdepfile"
617266e564dSmrg  ;;
618266e564dSmrg
619266e564dSmrgdashXmstdout)
620266e564dSmrg  # This case only exists to satisfy depend.m4.  It is never actually
621266e564dSmrg  # run, as this mode is specially recognized in the preamble.
622266e564dSmrg  exit 1
623266e564dSmrg  ;;
624266e564dSmrg
625266e564dSmrgmakedepend)
626266e564dSmrg  "$@" || exit $?
627266e564dSmrg  # Remove any Libtool call
628266e564dSmrg  if test "$libtool" = yes; then
629d17cd367Smrg    while test "X$1" != 'X--mode=compile'; do
630266e564dSmrg      shift
631266e564dSmrg    done
632266e564dSmrg    shift
633266e564dSmrg  fi
634266e564dSmrg  # X makedepend
635266e564dSmrg  shift
636d17cd367Smrg  cleared=no eat=no
637d17cd367Smrg  for arg
638d17cd367Smrg  do
639266e564dSmrg    case $cleared in
640266e564dSmrg    no)
641266e564dSmrg      set ""; shift
642266e564dSmrg      cleared=yes ;;
643266e564dSmrg    esac
644d17cd367Smrg    if test $eat = yes; then
645d17cd367Smrg      eat=no
646d17cd367Smrg      continue
647d17cd367Smrg    fi
648266e564dSmrg    case "$arg" in
649266e564dSmrg    -D*|-I*)
650266e564dSmrg      set fnord "$@" "$arg"; shift ;;
651266e564dSmrg    # Strip any option that makedepend may not understand.  Remove
652266e564dSmrg    # the object too, otherwise makedepend will parse it as a source file.
653d17cd367Smrg    -arch)
654d17cd367Smrg      eat=yes ;;
655266e564dSmrg    -*|$object)
656266e564dSmrg      ;;
657266e564dSmrg    *)
658266e564dSmrg      set fnord "$@" "$arg"; shift ;;
659266e564dSmrg    esac
660266e564dSmrg  done
661d17cd367Smrg  obj_suffix=`echo "$object" | sed 's/^.*\././'`
662266e564dSmrg  touch "$tmpdepfile"
663266e564dSmrg  ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
664266e564dSmrg  rm -f "$depfile"
665fb5e8d76Smrg  # makedepend may prepend the VPATH from the source file name to the object.
666fb5e8d76Smrg  # No need to regex-escape $object, excess matching of '.' is harmless.
667fb5e8d76Smrg  sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile"
668fb5e8d76Smrg  # Some versions of the HPUX 10.20 sed can't process the last invocation
669fb5e8d76Smrg  # correctly.  Breaking it into two sed invocations is a workaround.
670fb5e8d76Smrg  sed '1,2d' "$tmpdepfile" \
671fb5e8d76Smrg    | tr ' ' "$nl" \
672fb5e8d76Smrg    | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
673fb5e8d76Smrg    | sed -e 's/$/ :/' >> "$depfile"
674266e564dSmrg  rm -f "$tmpdepfile" "$tmpdepfile".bak
675266e564dSmrg  ;;
676266e564dSmrg
677266e564dSmrgcpp)
678266e564dSmrg  # Important note: in order to support this mode, a compiler *must*
679266e564dSmrg  # always write the preprocessed file to stdout.
680266e564dSmrg  "$@" || exit $?
681266e564dSmrg
682266e564dSmrg  # Remove the call to Libtool.
683266e564dSmrg  if test "$libtool" = yes; then
684d17cd367Smrg    while test "X$1" != 'X--mode=compile'; do
685266e564dSmrg      shift
686266e564dSmrg    done
687266e564dSmrg    shift
688266e564dSmrg  fi
689266e564dSmrg
690fb5e8d76Smrg  # Remove '-o $object'.
691266e564dSmrg  IFS=" "
692266e564dSmrg  for arg
693266e564dSmrg  do
694266e564dSmrg    case $arg in
695266e564dSmrg    -o)
696266e564dSmrg      shift
697266e564dSmrg      ;;
698266e564dSmrg    $object)
699266e564dSmrg      shift
700266e564dSmrg      ;;
701266e564dSmrg    *)
702266e564dSmrg      set fnord "$@" "$arg"
703266e564dSmrg      shift # fnord
704266e564dSmrg      shift # $arg
705266e564dSmrg      ;;
706266e564dSmrg    esac
707266e564dSmrg  done
708266e564dSmrg
709fb5e8d76Smrg  "$@" -E \
710fb5e8d76Smrg    | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
711fb5e8d76Smrg             -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
712fb5e8d76Smrg    | sed '$ s: \\$::' > "$tmpdepfile"
713266e564dSmrg  rm -f "$depfile"
714266e564dSmrg  echo "$object : \\" > "$depfile"
715266e564dSmrg  cat < "$tmpdepfile" >> "$depfile"
716266e564dSmrg  sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
717266e564dSmrg  rm -f "$tmpdepfile"
718266e564dSmrg  ;;
719266e564dSmrg
720266e564dSmrgmsvisualcpp)
721266e564dSmrg  # Important note: in order to support this mode, a compiler *must*
722d17cd367Smrg  # always write the preprocessed file to stdout.
723266e564dSmrg  "$@" || exit $?
724d17cd367Smrg
725d17cd367Smrg  # Remove the call to Libtool.
726d17cd367Smrg  if test "$libtool" = yes; then
727d17cd367Smrg    while test "X$1" != 'X--mode=compile'; do
728d17cd367Smrg      shift
729d17cd367Smrg    done
730d17cd367Smrg    shift
731d17cd367Smrg  fi
732d17cd367Smrg
733266e564dSmrg  IFS=" "
734266e564dSmrg  for arg
735266e564dSmrg  do
736266e564dSmrg    case "$arg" in
737d17cd367Smrg    -o)
738d17cd367Smrg      shift
739d17cd367Smrg      ;;
740d17cd367Smrg    $object)
741d17cd367Smrg      shift
742d17cd367Smrg      ;;
743266e564dSmrg    "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
744fb5e8d76Smrg        set fnord "$@"
745fb5e8d76Smrg        shift
746fb5e8d76Smrg        shift
747fb5e8d76Smrg        ;;
748266e564dSmrg    *)
749fb5e8d76Smrg        set fnord "$@" "$arg"
750fb5e8d76Smrg        shift
751fb5e8d76Smrg        shift
752fb5e8d76Smrg        ;;
753266e564dSmrg    esac
754266e564dSmrg  done
755d17cd367Smrg  "$@" -E 2>/dev/null |
756d17cd367Smrg  sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile"
757266e564dSmrg  rm -f "$depfile"
758266e564dSmrg  echo "$object : \\" > "$depfile"
759fb5e8d76Smrg  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile"
760fb5e8d76Smrg  echo "$tab" >> "$depfile"
761d17cd367Smrg  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile"
762266e564dSmrg  rm -f "$tmpdepfile"
763266e564dSmrg  ;;
764266e564dSmrg
765d17cd367Smrgmsvcmsys)
766d17cd367Smrg  # This case exists only to let depend.m4 do its work.  It works by
767d17cd367Smrg  # looking at the text of this script.  This case will never be run,
768d17cd367Smrg  # since it is checked for above.
769d17cd367Smrg  exit 1
770d17cd367Smrg  ;;
771d17cd367Smrg
772266e564dSmrgnone)
773266e564dSmrg  exec "$@"
774266e564dSmrg  ;;
775266e564dSmrg
776266e564dSmrg*)
777266e564dSmrg  echo "Unknown depmode $depmode" 1>&2
778266e564dSmrg  exit 1
779266e564dSmrg  ;;
780266e564dSmrgesac
781266e564dSmrg
782266e564dSmrgexit 0
783266e564dSmrg
784266e564dSmrg# Local Variables:
785266e564dSmrg# mode: shell-script
786266e564dSmrg# sh-indentation: 2
7871009a292Smrg# eval: (add-hook 'before-save-hook 'time-stamp)
788266e564dSmrg# time-stamp-start: "scriptversion="
789266e564dSmrg# time-stamp-format: "%:y-%02m-%02d.%02H"
7901009a292Smrg# time-stamp-time-zone: "UTC0"
791d17cd367Smrg# time-stamp-end: "; # UTC"
792266e564dSmrg# End:
793