1191cded7Smrg#! /bin/sh
2191cded7Smrg# depcomp - compile a program generating dependencies as side-effects
3191cded7Smrg
48f9fac4aSmrgscriptversion=2024-06-19.01; # UTC
5191cded7Smrg
68f9fac4aSmrg# Copyright (C) 1999-2024 Free Software Foundation, Inc.
7191cded7Smrg
8191cded7Smrg# This program is free software; you can redistribute it and/or modify
9191cded7Smrg# it under the terms of the GNU General Public License as published by
10191cded7Smrg# the Free Software Foundation; either version 2, or (at your option)
11191cded7Smrg# any later version.
12191cded7Smrg
13191cded7Smrg# This program is distributed in the hope that it will be useful,
14191cded7Smrg# but WITHOUT ANY WARRANTY; without even the implied warranty of
15191cded7Smrg# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16191cded7Smrg# GNU General Public License for more details.
17191cded7Smrg
18191cded7Smrg# You should have received a copy of the GNU General Public License
19ee3e8c14Smrg# along with this program.  If not, see <https://www.gnu.org/licenses/>.
20191cded7Smrg
21191cded7Smrg# As a special exception to the GNU General Public License, if you
22191cded7Smrg# distribute this file as part of a program that contains a
23191cded7Smrg# configuration script generated by Autoconf, you may include it under
24191cded7Smrg# the same distribution terms that you use for the rest of that program.
25191cded7Smrg
26191cded7Smrg# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>.
27191cded7Smrg
28191cded7Smrgcase $1 in
29191cded7Smrg  '')
30d9dcd5aeSmrg    echo "$0: No command.  Try '$0 --help' for more information." 1>&2
31d9dcd5aeSmrg    exit 1;
32d9dcd5aeSmrg    ;;
33191cded7Smrg  -h | --h*)
34191cded7Smrg    cat <<\EOF
35191cded7SmrgUsage: depcomp [--help] [--version] PROGRAM [ARGS]
36191cded7Smrg
37191cded7SmrgRun PROGRAMS ARGS to compile a file, generating dependencies
38191cded7Smrgas side-effects.
39191cded7Smrg
40191cded7SmrgEnvironment variables:
41191cded7Smrg  depmode     Dependency tracking mode.
42d9dcd5aeSmrg  source      Source file read by 'PROGRAMS ARGS'.
43d9dcd5aeSmrg  object      Object file output by 'PROGRAMS ARGS'.
44191cded7Smrg  DEPDIR      directory where to store dependencies.
45191cded7Smrg  depfile     Dependency file to output.
46d9dcd5aeSmrg  tmpdepfile  Temporary file to use when outputting dependencies.
47191cded7Smrg  libtool     Whether libtool is used (yes/no).
48191cded7Smrg
49191cded7SmrgReport bugs to <bug-automake@gnu.org>.
508f9fac4aSmrgGNU Automake home page: <https://www.gnu.org/software/automake/>.
518f9fac4aSmrgGeneral help using GNU software: <https://www.gnu.org/gethelp/>.
52191cded7SmrgEOF
53191cded7Smrg    exit $?
54191cded7Smrg    ;;
55191cded7Smrg  -v | --v*)
568f9fac4aSmrg    echo "depcomp (GNU Automake) $scriptversion"
57191cded7Smrg    exit $?
58191cded7Smrg    ;;
59191cded7Smrgesac
60191cded7Smrg
61d9dcd5aeSmrg# Get the directory component of the given path, and save it in the
62d9dcd5aeSmrg# global variables '$dir'.  Note that this directory component will
63d9dcd5aeSmrg# be either empty or ending with a '/' character.  This is deliberate.
64d9dcd5aeSmrgset_dir_from ()
65d9dcd5aeSmrg{
66d9dcd5aeSmrg  case $1 in
67d9dcd5aeSmrg    */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;;
68d9dcd5aeSmrg      *) dir=;;
69d9dcd5aeSmrg  esac
70d9dcd5aeSmrg}
71d9dcd5aeSmrg
72d9dcd5aeSmrg# Get the suffix-stripped basename of the given path, and save it the
73d9dcd5aeSmrg# global variable '$base'.
74d9dcd5aeSmrgset_base_from ()
75d9dcd5aeSmrg{
76d9dcd5aeSmrg  base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'`
77d9dcd5aeSmrg}
78d9dcd5aeSmrg
79d9dcd5aeSmrg# If no dependency file was actually created by the compiler invocation,
80d9dcd5aeSmrg# we still have to create a dummy depfile, to avoid errors with the
81d9dcd5aeSmrg# Makefile "include basename.Plo" scheme.
82d9dcd5aeSmrgmake_dummy_depfile ()
83d9dcd5aeSmrg{
84d9dcd5aeSmrg  echo "#dummy" > "$depfile"
85d9dcd5aeSmrg}
86d9dcd5aeSmrg
87d9dcd5aeSmrg# Factor out some common post-processing of the generated depfile.
88d9dcd5aeSmrg# Requires the auxiliary global variable '$tmpdepfile' to be set.
89d9dcd5aeSmrgaix_post_process_depfile ()
90d9dcd5aeSmrg{
91d9dcd5aeSmrg  # If the compiler actually managed to produce a dependency file,
92d9dcd5aeSmrg  # post-process it.
93d9dcd5aeSmrg  if test -f "$tmpdepfile"; then
94d9dcd5aeSmrg    # Each line is of the form 'foo.o: dependency.h'.
95d9dcd5aeSmrg    # Do two passes, one to just change these to
96d9dcd5aeSmrg    #   $object: dependency.h
97d9dcd5aeSmrg    # and one to simply output
98d9dcd5aeSmrg    #   dependency.h:
99d9dcd5aeSmrg    # which is needed to avoid the deleted-header problem.
100d9dcd5aeSmrg    { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile"
101d9dcd5aeSmrg      sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile"
102d9dcd5aeSmrg    } > "$depfile"
103d9dcd5aeSmrg    rm -f "$tmpdepfile"
104d9dcd5aeSmrg  else
105d9dcd5aeSmrg    make_dummy_depfile
106d9dcd5aeSmrg  fi
107d9dcd5aeSmrg}
108d9dcd5aeSmrg
109d9dcd5aeSmrg# A tabulation character.
110d9dcd5aeSmrgtab='	'
111d9dcd5aeSmrg# A newline character.
112d9dcd5aeSmrgnl='
113d9dcd5aeSmrg'
114d9dcd5aeSmrg# Character ranges might be problematic outside the C locale.
115d9dcd5aeSmrg# These definitions help.
116d9dcd5aeSmrgupper=ABCDEFGHIJKLMNOPQRSTUVWXYZ
117d9dcd5aeSmrglower=abcdefghijklmnopqrstuvwxyz
118d9dcd5aeSmrgalpha=${upper}${lower}
119d9dcd5aeSmrg
120191cded7Smrgif test -z "$depmode" || test -z "$source" || test -z "$object"; then
121191cded7Smrg  echo "depcomp: Variables source, object and depmode must be set" 1>&2
122191cded7Smrg  exit 1
123191cded7Smrgfi
124191cded7Smrg
125191cded7Smrg# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.
126191cded7Smrgdepfile=${depfile-`echo "$object" |
127191cded7Smrg  sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`}
128191cded7Smrgtmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
129191cded7Smrg
130191cded7Smrgrm -f "$tmpdepfile"
131191cded7Smrg
1328f9fac4aSmrg# Avoid interference from the environment.
133d9dcd5aeSmrggccflag= dashmflag=
134d9dcd5aeSmrg
135191cded7Smrg# Some modes work just like other modes, but use different flags.  We
136191cded7Smrg# parameterize here, but still list the modes in the big case below,
137191cded7Smrg# to make depend.m4 easier to write.  Note that we *cannot* use a case
138191cded7Smrg# here, because this file can only contain one case statement.
139191cded7Smrgif test "$depmode" = hp; then
140191cded7Smrg  # HP compiler uses -M and no extra arg.
141191cded7Smrg  gccflag=-M
142191cded7Smrg  depmode=gcc
143191cded7Smrgfi
144191cded7Smrg
145191cded7Smrgif test "$depmode" = dashXmstdout; then
146d9dcd5aeSmrg  # This is just like dashmstdout with a different argument.
147d9dcd5aeSmrg  dashmflag=-xM
148d9dcd5aeSmrg  depmode=dashmstdout
149191cded7Smrgfi
150191cded7Smrg
151ba064abeSmrgcygpath_u="cygpath -u -f -"
152ba064abeSmrgif test "$depmode" = msvcmsys; then
153d9dcd5aeSmrg  # This is just like msvisualcpp but w/o cygpath translation.
154d9dcd5aeSmrg  # Just convert the backslash-escaped backslashes to single forward
155d9dcd5aeSmrg  # slashes to satisfy depend.m4
156d9dcd5aeSmrg  cygpath_u='sed s,\\\\,/,g'
157d9dcd5aeSmrg  depmode=msvisualcpp
158d9dcd5aeSmrgfi
159d9dcd5aeSmrg
160d9dcd5aeSmrgif test "$depmode" = msvc7msys; then
161d9dcd5aeSmrg  # This is just like msvc7 but w/o cygpath translation.
162d9dcd5aeSmrg  # Just convert the backslash-escaped backslashes to single forward
163d9dcd5aeSmrg  # slashes to satisfy depend.m4
164d9dcd5aeSmrg  cygpath_u='sed s,\\\\,/,g'
165d9dcd5aeSmrg  depmode=msvc7
166d9dcd5aeSmrgfi
167d9dcd5aeSmrg
168d9dcd5aeSmrgif test "$depmode" = xlc; then
169d9dcd5aeSmrg  # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information.
170d9dcd5aeSmrg  gccflag=-qmakedep=gcc,-MF
171d9dcd5aeSmrg  depmode=gcc
172ba064abeSmrgfi
173ba064abeSmrg
174191cded7Smrgcase "$depmode" in
175191cded7Smrggcc3)
176191cded7Smrg## gcc 3 implements dependency tracking that does exactly what
177191cded7Smrg## we want.  Yay!  Note: for some reason libtool 1.4 doesn't like
178191cded7Smrg## it if -MD -MP comes after the -MF stuff.  Hmm.
179b290cf36Smrg## Unfortunately, FreeBSD c89 acceptance of flags depends upon
180b290cf36Smrg## the command line argument order; so add the flags where they
181b290cf36Smrg## appear in depend2.am.  Note that the slowdown incurred here
182b290cf36Smrg## affects only configure: in makefiles, %FASTDEP% shortcuts this.
183b290cf36Smrg  for arg
184b290cf36Smrg  do
185b290cf36Smrg    case $arg in
186b290cf36Smrg    -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;;
187b290cf36Smrg    *)  set fnord "$@" "$arg" ;;
188b290cf36Smrg    esac
189b290cf36Smrg    shift # fnord
190b290cf36Smrg    shift # $arg
191b290cf36Smrg  done
192b290cf36Smrg  "$@"
193191cded7Smrg  stat=$?
194d9dcd5aeSmrg  if test $stat -ne 0; then
195191cded7Smrg    rm -f "$tmpdepfile"
196191cded7Smrg    exit $stat
197191cded7Smrg  fi
198191cded7Smrg  mv "$tmpdepfile" "$depfile"
199191cded7Smrg  ;;
200191cded7Smrg
201191cded7Smrggcc)
2028f9fac4aSmrg## Note that this doesn't just cater to obsolete pre-3.x GCC compilers.
2038f9fac4aSmrg## but also to in-use compilers like IBM xlc/xlC and the HP C compiler.
204d9dcd5aeSmrg## (see the conditional assignment to $gccflag above).
205191cded7Smrg## There are various ways to get dependency output from gcc.  Here's
206191cded7Smrg## why we pick this rather obscure method:
207191cded7Smrg## - Don't want to use -MD because we'd like the dependencies to end
208191cded7Smrg##   up in a subdir.  Having to rename by hand is ugly.
209191cded7Smrg##   (We might end up doing this anyway to support other compilers.)
210191cded7Smrg## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
211d9dcd5aeSmrg##   -MM, not -M (despite what the docs say).  Also, it might not be
212d9dcd5aeSmrg##   supported by the other compilers which use the 'gcc' depmode.
213191cded7Smrg## - Using -M directly means running the compiler twice (even worse
214191cded7Smrg##   than renaming).
215191cded7Smrg  if test -z "$gccflag"; then
216191cded7Smrg    gccflag=-MD,
217191cded7Smrg  fi
218191cded7Smrg  "$@" -Wp,"$gccflag$tmpdepfile"
219191cded7Smrg  stat=$?
220d9dcd5aeSmrg  if test $stat -ne 0; then
221191cded7Smrg    rm -f "$tmpdepfile"
222191cded7Smrg    exit $stat
223191cded7Smrg  fi
224191cded7Smrg  rm -f "$depfile"
225191cded7Smrg  echo "$object : \\" > "$depfile"
226d9dcd5aeSmrg  # The second -e expression handles DOS-style file names with drive
227d9dcd5aeSmrg  # letters.
228191cded7Smrg  sed -e 's/^[^:]*: / /' \
229191cded7Smrg      -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
230d9dcd5aeSmrg## This next piece of magic avoids the "deleted header file" problem.
231191cded7Smrg## The problem is that when a header file which appears in a .P file
232191cded7Smrg## is deleted, the dependency causes make to die (because there is
233191cded7Smrg## typically no way to rebuild the header).  We avoid this by adding
234191cded7Smrg## dummy dependencies for each header file.  Too bad gcc doesn't do
235191cded7Smrg## this for us directly.
236d9dcd5aeSmrg## Some versions of gcc put a space before the ':'.  On the theory
237191cded7Smrg## that the space means something, we add a space to the output as
238d9dcd5aeSmrg## well.  hp depmode also adds that space, but also prefixes the VPATH
239d9dcd5aeSmrg## to the object.  Take care to not repeat it in the output.
240191cded7Smrg## Some versions of the HPUX 10.20 sed can't process this invocation
241191cded7Smrg## correctly.  Breaking it into two sed invocations is a workaround.
242d9dcd5aeSmrg  tr ' ' "$nl" < "$tmpdepfile" \
243d9dcd5aeSmrg    | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \
244d9dcd5aeSmrg    | sed -e 's/$/ :/' >> "$depfile"
245191cded7Smrg  rm -f "$tmpdepfile"
246191cded7Smrg  ;;
247191cded7Smrg
248191cded7Smrghp)
249191cded7Smrg  # This case exists only to let depend.m4 do its work.  It works by
250191cded7Smrg  # looking at the text of this script.  This case will never be run,
251191cded7Smrg  # since it is checked for above.
252191cded7Smrg  exit 1
253191cded7Smrg  ;;
254191cded7Smrg
255191cded7Smrgsgi)
256191cded7Smrg  if test "$libtool" = yes; then
257191cded7Smrg    "$@" "-Wp,-MDupdate,$tmpdepfile"
258191cded7Smrg  else
259191cded7Smrg    "$@" -MDupdate "$tmpdepfile"
260191cded7Smrg  fi
261191cded7Smrg  stat=$?
262d9dcd5aeSmrg  if test $stat -ne 0; then
263191cded7Smrg    rm -f "$tmpdepfile"
264191cded7Smrg    exit $stat
265191cded7Smrg  fi
266191cded7Smrg  rm -f "$depfile"
267191cded7Smrg
268191cded7Smrg  if test -f "$tmpdepfile"; then  # yes, the sourcefile depend on other files
269191cded7Smrg    echo "$object : \\" > "$depfile"
270191cded7Smrg    # Clip off the initial element (the dependent).  Don't try to be
271191cded7Smrg    # clever and replace this with sed code, as IRIX sed won't handle
272191cded7Smrg    # lines with more than a fixed number of characters (4096 in
273191cded7Smrg    # IRIX 6.2 sed, 8192 in IRIX 6.5).  We also remove comment lines;
274d9dcd5aeSmrg    # the IRIX cc adds comments like '#:fec' to the end of the
275191cded7Smrg    # dependency line.
276d9dcd5aeSmrg    tr ' ' "$nl" < "$tmpdepfile" \
277d9dcd5aeSmrg      | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \
278d9dcd5aeSmrg      | tr "$nl" ' ' >> "$depfile"
279ba064abeSmrg    echo >> "$depfile"
280191cded7Smrg    # The second pass generates a dummy entry for each header file.
281d9dcd5aeSmrg    tr ' ' "$nl" < "$tmpdepfile" \
282d9dcd5aeSmrg      | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
283d9dcd5aeSmrg      >> "$depfile"
284191cded7Smrg  else
285d9dcd5aeSmrg    make_dummy_depfile
286191cded7Smrg  fi
287191cded7Smrg  rm -f "$tmpdepfile"
288191cded7Smrg  ;;
289191cded7Smrg
290d9dcd5aeSmrgxlc)
291d9dcd5aeSmrg  # This case exists only to let depend.m4 do its work.  It works by
292d9dcd5aeSmrg  # looking at the text of this script.  This case will never be run,
293d9dcd5aeSmrg  # since it is checked for above.
294d9dcd5aeSmrg  exit 1
295d9dcd5aeSmrg  ;;
296d9dcd5aeSmrg
297191cded7Smrgaix)
298191cded7Smrg  # The C for AIX Compiler uses -M and outputs the dependencies
299191cded7Smrg  # in a .u file.  In older versions, this file always lives in the
300d9dcd5aeSmrg  # current directory.  Also, the AIX compiler puts '$object:' at the
301191cded7Smrg  # start of each line; $object doesn't have directory information.
302191cded7Smrg  # Version 6 uses the directory in both cases.
303d9dcd5aeSmrg  set_dir_from "$object"
304d9dcd5aeSmrg  set_base_from "$object"
305191cded7Smrg  if test "$libtool" = yes; then
306b290cf36Smrg    tmpdepfile1=$dir$base.u
307b290cf36Smrg    tmpdepfile2=$base.u
308b290cf36Smrg    tmpdepfile3=$dir.libs/$base.u
309191cded7Smrg    "$@" -Wc,-M
310191cded7Smrg  else
311b290cf36Smrg    tmpdepfile1=$dir$base.u
312b290cf36Smrg    tmpdepfile2=$dir$base.u
313b290cf36Smrg    tmpdepfile3=$dir$base.u
314191cded7Smrg    "$@" -M
315191cded7Smrg  fi
316191cded7Smrg  stat=$?
317d9dcd5aeSmrg  if test $stat -ne 0; then
318b290cf36Smrg    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
319191cded7Smrg    exit $stat
320191cded7Smrg  fi
321191cded7Smrg
322b290cf36Smrg  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
323b290cf36Smrg  do
324b290cf36Smrg    test -f "$tmpdepfile" && break
325b290cf36Smrg  done
326d9dcd5aeSmrg  aix_post_process_depfile
327d9dcd5aeSmrg  ;;
328d9dcd5aeSmrg
329d9dcd5aeSmrgtcc)
330d9dcd5aeSmrg  # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26
331d9dcd5aeSmrg  # FIXME: That version still under development at the moment of writing.
332d9dcd5aeSmrg  #        Make that this statement remains true also for stable, released
333d9dcd5aeSmrg  #        versions.
334d9dcd5aeSmrg  # It will wrap lines (doesn't matter whether long or short) with a
335d9dcd5aeSmrg  # trailing '\', as in:
336d9dcd5aeSmrg  #
337d9dcd5aeSmrg  #   foo.o : \
338d9dcd5aeSmrg  #    foo.c \
339d9dcd5aeSmrg  #    foo.h \
340d9dcd5aeSmrg  #
341d9dcd5aeSmrg  # It will put a trailing '\' even on the last line, and will use leading
342d9dcd5aeSmrg  # spaces rather than leading tabs (at least since its commit 0394caf7
343d9dcd5aeSmrg  # "Emit spaces for -MD").
344d9dcd5aeSmrg  "$@" -MD -MF "$tmpdepfile"
345d9dcd5aeSmrg  stat=$?
346d9dcd5aeSmrg  if test $stat -ne 0; then
347d9dcd5aeSmrg    rm -f "$tmpdepfile"
348d9dcd5aeSmrg    exit $stat
349191cded7Smrg  fi
350d9dcd5aeSmrg  rm -f "$depfile"
351d9dcd5aeSmrg  # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'.
352d9dcd5aeSmrg  # We have to change lines of the first kind to '$object: \'.
353d9dcd5aeSmrg  sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile"
354d9dcd5aeSmrg  # And for each line of the second kind, we have to emit a 'dep.h:'
355d9dcd5aeSmrg  # dummy dependency, to avoid the deleted-header problem.
356d9dcd5aeSmrg  sed -n -e 's|^  *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile"
357191cded7Smrg  rm -f "$tmpdepfile"
358191cded7Smrg  ;;
359191cded7Smrg
360d9dcd5aeSmrg## The order of this option in the case statement is important, since the
361d9dcd5aeSmrg## shell code in configure will try each of these formats in the order
362d9dcd5aeSmrg## listed in this file.  A plain '-MD' option would be understood by many
363d9dcd5aeSmrg## compilers, so we must ensure this comes after the gcc and icc options.
364d9dcd5aeSmrgpgcc)
365d9dcd5aeSmrg  # Portland's C compiler understands '-MD'.
366d9dcd5aeSmrg  # Will always output deps to 'file.d' where file is the root name of the
367d9dcd5aeSmrg  # source file under compilation, even if file resides in a subdirectory.
368d9dcd5aeSmrg  # The object file name does not affect the name of the '.d' file.
369d9dcd5aeSmrg  # pgcc 10.2 will output
370191cded7Smrg  #    foo.o: sub/foo.c sub/foo.h
371d9dcd5aeSmrg  # and will wrap long lines using '\' :
372191cded7Smrg  #    foo.o: sub/foo.c ... \
373191cded7Smrg  #     sub/foo.h ... \
374191cded7Smrg  #     ...
375d9dcd5aeSmrg  set_dir_from "$object"
376d9dcd5aeSmrg  # Use the source, not the object, to determine the base name, since
377d9dcd5aeSmrg  # that's sadly what pgcc will do too.
378d9dcd5aeSmrg  set_base_from "$source"
379d9dcd5aeSmrg  tmpdepfile=$base.d
380d9dcd5aeSmrg
381d9dcd5aeSmrg  # For projects that build the same source file twice into different object
382d9dcd5aeSmrg  # files, the pgcc approach of using the *source* file root name can cause
383d9dcd5aeSmrg  # problems in parallel builds.  Use a locking strategy to avoid stomping on
384d9dcd5aeSmrg  # the same $tmpdepfile.
385d9dcd5aeSmrg  lockdir=$base.d-lock
386d9dcd5aeSmrg  trap "
387d9dcd5aeSmrg    echo '$0: caught signal, cleaning up...' >&2
388d9dcd5aeSmrg    rmdir '$lockdir'
389d9dcd5aeSmrg    exit 1
390d9dcd5aeSmrg  " 1 2 13 15
391d9dcd5aeSmrg  numtries=100
392d9dcd5aeSmrg  i=$numtries
393d9dcd5aeSmrg  while test $i -gt 0; do
394d9dcd5aeSmrg    # mkdir is a portable test-and-set.
395d9dcd5aeSmrg    if mkdir "$lockdir" 2>/dev/null; then
396d9dcd5aeSmrg      # This process acquired the lock.
397d9dcd5aeSmrg      "$@" -MD
398d9dcd5aeSmrg      stat=$?
399d9dcd5aeSmrg      # Release the lock.
400d9dcd5aeSmrg      rmdir "$lockdir"
401d9dcd5aeSmrg      break
402d9dcd5aeSmrg    else
403d9dcd5aeSmrg      # If the lock is being held by a different process, wait
404d9dcd5aeSmrg      # until the winning process is done or we timeout.
405d9dcd5aeSmrg      while test -d "$lockdir" && test $i -gt 0; do
406d9dcd5aeSmrg        sleep 1
407d9dcd5aeSmrg        i=`expr $i - 1`
408d9dcd5aeSmrg      done
409d9dcd5aeSmrg    fi
410d9dcd5aeSmrg    i=`expr $i - 1`
411d9dcd5aeSmrg  done
412d9dcd5aeSmrg  trap - 1 2 13 15
413d9dcd5aeSmrg  if test $i -le 0; then
414d9dcd5aeSmrg    echo "$0: failed to acquire lock after $numtries attempts" >&2
415d9dcd5aeSmrg    echo "$0: check lockdir '$lockdir'" >&2
416d9dcd5aeSmrg    exit 1
417d9dcd5aeSmrg  fi
418191cded7Smrg
419d9dcd5aeSmrg  if test $stat -ne 0; then
420191cded7Smrg    rm -f "$tmpdepfile"
421191cded7Smrg    exit $stat
422191cded7Smrg  fi
423191cded7Smrg  rm -f "$depfile"
424191cded7Smrg  # Each line is of the form `foo.o: dependent.h',
425191cded7Smrg  # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'.
426191cded7Smrg  # Do two passes, one to just change these to
427191cded7Smrg  # `$object: dependent.h' and one to simply `dependent.h:'.
428191cded7Smrg  sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
429191cded7Smrg  # Some versions of the HPUX 10.20 sed can't process this invocation
430191cded7Smrg  # correctly.  Breaking it into two sed invocations is a workaround.
431d9dcd5aeSmrg  sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \
432d9dcd5aeSmrg    | sed -e 's/$/ :/' >> "$depfile"
433191cded7Smrg  rm -f "$tmpdepfile"
434191cded7Smrg  ;;
435191cded7Smrg
436b290cf36Smrghp2)
437b290cf36Smrg  # The "hp" stanza above does not work with aCC (C++) and HP's ia64
438b290cf36Smrg  # compilers, which have integrated preprocessors.  The correct option
439b290cf36Smrg  # to use with these is +Maked; it writes dependencies to a file named
440b290cf36Smrg  # 'foo.d', which lands next to the object file, wherever that
441b290cf36Smrg  # happens to be.
442b290cf36Smrg  # Much of this is similar to the tru64 case; see comments there.
443d9dcd5aeSmrg  set_dir_from  "$object"
444d9dcd5aeSmrg  set_base_from "$object"
445b290cf36Smrg  if test "$libtool" = yes; then
446b290cf36Smrg    tmpdepfile1=$dir$base.d
447b290cf36Smrg    tmpdepfile2=$dir.libs/$base.d
448b290cf36Smrg    "$@" -Wc,+Maked
449b290cf36Smrg  else
450b290cf36Smrg    tmpdepfile1=$dir$base.d
451b290cf36Smrg    tmpdepfile2=$dir$base.d
452b290cf36Smrg    "$@" +Maked
453b290cf36Smrg  fi
454b290cf36Smrg  stat=$?
455d9dcd5aeSmrg  if test $stat -ne 0; then
456b290cf36Smrg     rm -f "$tmpdepfile1" "$tmpdepfile2"
457b290cf36Smrg     exit $stat
458b290cf36Smrg  fi
459b290cf36Smrg
460b290cf36Smrg  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2"
461b290cf36Smrg  do
462b290cf36Smrg    test -f "$tmpdepfile" && break
463b290cf36Smrg  done
464b290cf36Smrg  if test -f "$tmpdepfile"; then
465d9dcd5aeSmrg    sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile"
466d9dcd5aeSmrg    # Add 'dependent.h:' lines.
467ba064abeSmrg    sed -ne '2,${
468d9dcd5aeSmrg               s/^ *//
469d9dcd5aeSmrg               s/ \\*$//
470d9dcd5aeSmrg               s/$/:/
471d9dcd5aeSmrg               p
472d9dcd5aeSmrg             }' "$tmpdepfile" >> "$depfile"
473b290cf36Smrg  else
474d9dcd5aeSmrg    make_dummy_depfile
475b290cf36Smrg  fi
476b290cf36Smrg  rm -f "$tmpdepfile" "$tmpdepfile2"
477b290cf36Smrg  ;;
478b290cf36Smrg
479191cded7Smrgtru64)
480d9dcd5aeSmrg  # The Tru64 compiler uses -MD to generate dependencies as a side
481d9dcd5aeSmrg  # effect.  'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'.
482d9dcd5aeSmrg  # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
483d9dcd5aeSmrg  # dependencies in 'foo.d' instead, so we check for that too.
484d9dcd5aeSmrg  # Subdirectories are respected.
485d9dcd5aeSmrg  set_dir_from  "$object"
486d9dcd5aeSmrg  set_base_from "$object"
487d9dcd5aeSmrg
488d9dcd5aeSmrg  if test "$libtool" = yes; then
489d9dcd5aeSmrg    # Libtool generates 2 separate objects for the 2 libraries.  These
490d9dcd5aeSmrg    # two compilations output dependencies in $dir.libs/$base.o.d and
491d9dcd5aeSmrg    # in $dir$base.o.d.  We have to check for both files, because
492d9dcd5aeSmrg    # one of the two compilations can be disabled.  We should prefer
493d9dcd5aeSmrg    # $dir$base.o.d over $dir.libs/$base.o.d because the latter is
494d9dcd5aeSmrg    # automatically cleaned when .libs/ is deleted, while ignoring
495d9dcd5aeSmrg    # the former would cause a distcleancheck panic.
496d9dcd5aeSmrg    tmpdepfile1=$dir$base.o.d          # libtool 1.5
497d9dcd5aeSmrg    tmpdepfile2=$dir.libs/$base.o.d    # Likewise.
498d9dcd5aeSmrg    tmpdepfile3=$dir.libs/$base.d      # Compaq CCC V6.2-504
499d9dcd5aeSmrg    "$@" -Wc,-MD
500d9dcd5aeSmrg  else
501d9dcd5aeSmrg    tmpdepfile1=$dir$base.d
502d9dcd5aeSmrg    tmpdepfile2=$dir$base.d
503d9dcd5aeSmrg    tmpdepfile3=$dir$base.d
504d9dcd5aeSmrg    "$@" -MD
505d9dcd5aeSmrg  fi
506d9dcd5aeSmrg
507d9dcd5aeSmrg  stat=$?
508d9dcd5aeSmrg  if test $stat -ne 0; then
509d9dcd5aeSmrg    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
510d9dcd5aeSmrg    exit $stat
511d9dcd5aeSmrg  fi
512d9dcd5aeSmrg
513d9dcd5aeSmrg  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
514d9dcd5aeSmrg  do
515d9dcd5aeSmrg    test -f "$tmpdepfile" && break
516d9dcd5aeSmrg  done
517d9dcd5aeSmrg  # Same post-processing that is required for AIX mode.
518d9dcd5aeSmrg  aix_post_process_depfile
519d9dcd5aeSmrg  ;;
520d9dcd5aeSmrg
521d9dcd5aeSmrgmsvc7)
522d9dcd5aeSmrg  if test "$libtool" = yes; then
523d9dcd5aeSmrg    showIncludes=-Wc,-showIncludes
524d9dcd5aeSmrg  else
525d9dcd5aeSmrg    showIncludes=-showIncludes
526d9dcd5aeSmrg  fi
527d9dcd5aeSmrg  "$@" $showIncludes > "$tmpdepfile"
528d9dcd5aeSmrg  stat=$?
529d9dcd5aeSmrg  grep -v '^Note: including file: ' "$tmpdepfile"
530d9dcd5aeSmrg  if test $stat -ne 0; then
531d9dcd5aeSmrg    rm -f "$tmpdepfile"
532d9dcd5aeSmrg    exit $stat
533d9dcd5aeSmrg  fi
534d9dcd5aeSmrg  rm -f "$depfile"
535d9dcd5aeSmrg  echo "$object : \\" > "$depfile"
536d9dcd5aeSmrg  # The first sed program below extracts the file names and escapes
537d9dcd5aeSmrg  # backslashes for cygpath.  The second sed program outputs the file
538d9dcd5aeSmrg  # name when reading, but also accumulates all include files in the
539d9dcd5aeSmrg  # hold buffer in order to output them again at the end.  This only
540d9dcd5aeSmrg  # works with sed implementations that can handle large buffers.
541d9dcd5aeSmrg  sed < "$tmpdepfile" -n '
542d9dcd5aeSmrg/^Note: including file:  *\(.*\)/ {
543d9dcd5aeSmrg  s//\1/
544d9dcd5aeSmrg  s/\\/\\\\/g
545d9dcd5aeSmrg  p
546d9dcd5aeSmrg}' | $cygpath_u | sort -u | sed -n '
547d9dcd5aeSmrgs/ /\\ /g
548d9dcd5aeSmrgs/\(.*\)/'"$tab"'\1 \\/p
549d9dcd5aeSmrgs/.\(.*\) \\/\1:/
550d9dcd5aeSmrgH
551d9dcd5aeSmrg$ {
552d9dcd5aeSmrg  s/.*/'"$tab"'/
553d9dcd5aeSmrg  G
554d9dcd5aeSmrg  p
555d9dcd5aeSmrg}' >> "$depfile"
55658deefebSmrg  echo >> "$depfile" # make sure the fragment doesn't end with a backslash
557d9dcd5aeSmrg  rm -f "$tmpdepfile"
558d9dcd5aeSmrg  ;;
559d9dcd5aeSmrg
560d9dcd5aeSmrgmsvc7msys)
561d9dcd5aeSmrg  # This case exists only to let depend.m4 do its work.  It works by
562d9dcd5aeSmrg  # looking at the text of this script.  This case will never be run,
563d9dcd5aeSmrg  # since it is checked for above.
564d9dcd5aeSmrg  exit 1
565d9dcd5aeSmrg  ;;
566191cded7Smrg
567191cded7Smrg#nosideeffect)
568191cded7Smrg  # This comment above is used by automake to tell side-effect
569191cded7Smrg  # dependency tracking mechanisms from slower ones.
570191cded7Smrg
571191cded7Smrgdashmstdout)
572191cded7Smrg  # Important note: in order to support this mode, a compiler *must*
573191cded7Smrg  # always write the preprocessed file to stdout, regardless of -o.
574191cded7Smrg  "$@" || exit $?
575191cded7Smrg
576191cded7Smrg  # Remove the call to Libtool.
577191cded7Smrg  if test "$libtool" = yes; then
578ba064abeSmrg    while test "X$1" != 'X--mode=compile'; do
579191cded7Smrg      shift
580191cded7Smrg    done
581191cded7Smrg    shift
582191cded7Smrg  fi
583191cded7Smrg
584d9dcd5aeSmrg  # Remove '-o $object'.
585191cded7Smrg  IFS=" "
586191cded7Smrg  for arg
587191cded7Smrg  do
588191cded7Smrg    case $arg in
589191cded7Smrg    -o)
590191cded7Smrg      shift
591191cded7Smrg      ;;
592191cded7Smrg    $object)
593191cded7Smrg      shift
594191cded7Smrg      ;;
595191cded7Smrg    *)
596191cded7Smrg      set fnord "$@" "$arg"
597191cded7Smrg      shift # fnord
598191cded7Smrg      shift # $arg
599191cded7Smrg      ;;
600191cded7Smrg    esac
601191cded7Smrg  done
602191cded7Smrg
603191cded7Smrg  test -z "$dashmflag" && dashmflag=-M
604d9dcd5aeSmrg  # Require at least two characters before searching for ':'
605191cded7Smrg  # in the target name.  This is to cope with DOS-style filenames:
606d9dcd5aeSmrg  # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise.
607191cded7Smrg  "$@" $dashmflag |
608d9dcd5aeSmrg    sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile"
609191cded7Smrg  rm -f "$depfile"
610191cded7Smrg  cat < "$tmpdepfile" > "$depfile"
611d9dcd5aeSmrg  # Some versions of the HPUX 10.20 sed can't process this sed invocation
612d9dcd5aeSmrg  # correctly.  Breaking it into two sed invocations is a workaround.
613d9dcd5aeSmrg  tr ' ' "$nl" < "$tmpdepfile" \
614d9dcd5aeSmrg    | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
615d9dcd5aeSmrg    | sed -e 's/$/ :/' >> "$depfile"
616191cded7Smrg  rm -f "$tmpdepfile"
617191cded7Smrg  ;;
618191cded7Smrg
619191cded7SmrgdashXmstdout)
620191cded7Smrg  # This case only exists to satisfy depend.m4.  It is never actually
621191cded7Smrg  # run, as this mode is specially recognized in the preamble.
622191cded7Smrg  exit 1
623191cded7Smrg  ;;
624191cded7Smrg
625191cded7Smrgmakedepend)
626191cded7Smrg  "$@" || exit $?
627191cded7Smrg  # Remove any Libtool call
628191cded7Smrg  if test "$libtool" = yes; then
629ba064abeSmrg    while test "X$1" != 'X--mode=compile'; do
630191cded7Smrg      shift
631191cded7Smrg    done
632191cded7Smrg    shift
633191cded7Smrg  fi
634191cded7Smrg  # X makedepend
635191cded7Smrg  shift
636ba064abeSmrg  cleared=no eat=no
637ba064abeSmrg  for arg
638ba064abeSmrg  do
639191cded7Smrg    case $cleared in
640191cded7Smrg    no)
641191cded7Smrg      set ""; shift
642191cded7Smrg      cleared=yes ;;
643191cded7Smrg    esac
644ba064abeSmrg    if test $eat = yes; then
645ba064abeSmrg      eat=no
646ba064abeSmrg      continue
647ba064abeSmrg    fi
648191cded7Smrg    case "$arg" in
649191cded7Smrg    -D*|-I*)
650191cded7Smrg      set fnord "$@" "$arg"; shift ;;
651191cded7Smrg    # Strip any option that makedepend may not understand.  Remove
652191cded7Smrg    # the object too, otherwise makedepend will parse it as a source file.
653ba064abeSmrg    -arch)
654ba064abeSmrg      eat=yes ;;
655191cded7Smrg    -*|$object)
656191cded7Smrg      ;;
657191cded7Smrg    *)
658191cded7Smrg      set fnord "$@" "$arg"; shift ;;
659191cded7Smrg    esac
660191cded7Smrg  done
661ba064abeSmrg  obj_suffix=`echo "$object" | sed 's/^.*\././'`
662191cded7Smrg  touch "$tmpdepfile"
663191cded7Smrg  ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
664191cded7Smrg  rm -f "$depfile"
665d9dcd5aeSmrg  # makedepend may prepend the VPATH from the source file name to the object.
666d9dcd5aeSmrg  # No need to regex-escape $object, excess matching of '.' is harmless.
667d9dcd5aeSmrg  sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile"
668d9dcd5aeSmrg  # Some versions of the HPUX 10.20 sed can't process the last invocation
669d9dcd5aeSmrg  # correctly.  Breaking it into two sed invocations is a workaround.
670d9dcd5aeSmrg  sed '1,2d' "$tmpdepfile" \
671d9dcd5aeSmrg    | tr ' ' "$nl" \
672d9dcd5aeSmrg    | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
673d9dcd5aeSmrg    | sed -e 's/$/ :/' >> "$depfile"
674191cded7Smrg  rm -f "$tmpdepfile" "$tmpdepfile".bak
675191cded7Smrg  ;;
676191cded7Smrg
677191cded7Smrgcpp)
678191cded7Smrg  # Important note: in order to support this mode, a compiler *must*
679191cded7Smrg  # always write the preprocessed file to stdout.
680191cded7Smrg  "$@" || exit $?
681191cded7Smrg
682191cded7Smrg  # Remove the call to Libtool.
683191cded7Smrg  if test "$libtool" = yes; then
684ba064abeSmrg    while test "X$1" != 'X--mode=compile'; do
685191cded7Smrg      shift
686191cded7Smrg    done
687191cded7Smrg    shift
688191cded7Smrg  fi
689191cded7Smrg
690d9dcd5aeSmrg  # Remove '-o $object'.
691191cded7Smrg  IFS=" "
692191cded7Smrg  for arg
693191cded7Smrg  do
694191cded7Smrg    case $arg in
695191cded7Smrg    -o)
696191cded7Smrg      shift
697191cded7Smrg      ;;
698191cded7Smrg    $object)
699191cded7Smrg      shift
700191cded7Smrg      ;;
701191cded7Smrg    *)
702191cded7Smrg      set fnord "$@" "$arg"
703191cded7Smrg      shift # fnord
704191cded7Smrg      shift # $arg
705191cded7Smrg      ;;
706191cded7Smrg    esac
707191cded7Smrg  done
708191cded7Smrg
709d9dcd5aeSmrg  "$@" -E \
710d9dcd5aeSmrg    | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
711d9dcd5aeSmrg             -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
712d9dcd5aeSmrg    | sed '$ s: \\$::' > "$tmpdepfile"
713191cded7Smrg  rm -f "$depfile"
714191cded7Smrg  echo "$object : \\" > "$depfile"
715191cded7Smrg  cat < "$tmpdepfile" >> "$depfile"
716191cded7Smrg  sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
717191cded7Smrg  rm -f "$tmpdepfile"
718191cded7Smrg  ;;
719191cded7Smrg
720191cded7Smrgmsvisualcpp)
721191cded7Smrg  # Important note: in order to support this mode, a compiler *must*
722ba064abeSmrg  # always write the preprocessed file to stdout.
723191cded7Smrg  "$@" || exit $?
724ba064abeSmrg
725ba064abeSmrg  # Remove the call to Libtool.
726ba064abeSmrg  if test "$libtool" = yes; then
727ba064abeSmrg    while test "X$1" != 'X--mode=compile'; do
728ba064abeSmrg      shift
729ba064abeSmrg    done
730ba064abeSmrg    shift
731ba064abeSmrg  fi
732ba064abeSmrg
733191cded7Smrg  IFS=" "
734191cded7Smrg  for arg
735191cded7Smrg  do
736191cded7Smrg    case "$arg" in
737ba064abeSmrg    -o)
738ba064abeSmrg      shift
739ba064abeSmrg      ;;
740ba064abeSmrg    $object)
741ba064abeSmrg      shift
742ba064abeSmrg      ;;
743191cded7Smrg    "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
744d9dcd5aeSmrg        set fnord "$@"
745d9dcd5aeSmrg        shift
746d9dcd5aeSmrg        shift
747d9dcd5aeSmrg        ;;
748191cded7Smrg    *)
749d9dcd5aeSmrg        set fnord "$@" "$arg"
750d9dcd5aeSmrg        shift
751d9dcd5aeSmrg        shift
752d9dcd5aeSmrg        ;;
753191cded7Smrg    esac
754191cded7Smrg  done
755ba064abeSmrg  "$@" -E 2>/dev/null |
756ba064abeSmrg  sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile"
757191cded7Smrg  rm -f "$depfile"
758191cded7Smrg  echo "$object : \\" > "$depfile"
759d9dcd5aeSmrg  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile"
760d9dcd5aeSmrg  echo "$tab" >> "$depfile"
761ba064abeSmrg  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile"
762191cded7Smrg  rm -f "$tmpdepfile"
763191cded7Smrg  ;;
764191cded7Smrg
765ba064abeSmrgmsvcmsys)
766ba064abeSmrg  # This case exists only to let depend.m4 do its work.  It works by
767ba064abeSmrg  # looking at the text of this script.  This case will never be run,
768ba064abeSmrg  # since it is checked for above.
769ba064abeSmrg  exit 1
770ba064abeSmrg  ;;
771ba064abeSmrg
772191cded7Smrgnone)
773191cded7Smrg  exec "$@"
774191cded7Smrg  ;;
775191cded7Smrg
776191cded7Smrg*)
777191cded7Smrg  echo "Unknown depmode $depmode" 1>&2
778191cded7Smrg  exit 1
779191cded7Smrg  ;;
780191cded7Smrgesac
781191cded7Smrg
782191cded7Smrgexit 0
783191cded7Smrg
784191cded7Smrg# Local Variables:
785191cded7Smrg# mode: shell-script
786191cded7Smrg# sh-indentation: 2
787ee3e8c14Smrg# eval: (add-hook 'before-save-hook 'time-stamp)
788191cded7Smrg# time-stamp-start: "scriptversion="
789191cded7Smrg# time-stamp-format: "%:y-%02m-%02d.%02H"
790ee3e8c14Smrg# time-stamp-time-zone: "UTC0"
791ba064abeSmrg# time-stamp-end: "; # UTC"
792191cded7Smrg# End:
793