depcomp revision ee3e8c14
1191cded7Smrg#! /bin/sh
2191cded7Smrg# depcomp - compile a program generating dependencies as side-effects
3191cded7Smrg
4ee3e8c14Smrgscriptversion=2018-03-07.03; # UTC
5191cded7Smrg
6ee3e8c14Smrg# Copyright (C) 1999-2021 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>.
50191cded7SmrgEOF
51191cded7Smrg    exit $?
52191cded7Smrg    ;;
53191cded7Smrg  -v | --v*)
54191cded7Smrg    echo "depcomp $scriptversion"
55191cded7Smrg    exit $?
56191cded7Smrg    ;;
57191cded7Smrgesac
58191cded7Smrg
59d9dcd5aeSmrg# Get the directory component of the given path, and save it in the
60d9dcd5aeSmrg# global variables '$dir'.  Note that this directory component will
61d9dcd5aeSmrg# be either empty or ending with a '/' character.  This is deliberate.
62d9dcd5aeSmrgset_dir_from ()
63d9dcd5aeSmrg{
64d9dcd5aeSmrg  case $1 in
65d9dcd5aeSmrg    */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;;
66d9dcd5aeSmrg      *) dir=;;
67d9dcd5aeSmrg  esac
68d9dcd5aeSmrg}
69d9dcd5aeSmrg
70d9dcd5aeSmrg# Get the suffix-stripped basename of the given path, and save it the
71d9dcd5aeSmrg# global variable '$base'.
72d9dcd5aeSmrgset_base_from ()
73d9dcd5aeSmrg{
74d9dcd5aeSmrg  base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'`
75d9dcd5aeSmrg}
76d9dcd5aeSmrg
77d9dcd5aeSmrg# If no dependency file was actually created by the compiler invocation,
78d9dcd5aeSmrg# we still have to create a dummy depfile, to avoid errors with the
79d9dcd5aeSmrg# Makefile "include basename.Plo" scheme.
80d9dcd5aeSmrgmake_dummy_depfile ()
81d9dcd5aeSmrg{
82d9dcd5aeSmrg  echo "#dummy" > "$depfile"
83d9dcd5aeSmrg}
84d9dcd5aeSmrg
85d9dcd5aeSmrg# Factor out some common post-processing of the generated depfile.
86d9dcd5aeSmrg# Requires the auxiliary global variable '$tmpdepfile' to be set.
87d9dcd5aeSmrgaix_post_process_depfile ()
88d9dcd5aeSmrg{
89d9dcd5aeSmrg  # If the compiler actually managed to produce a dependency file,
90d9dcd5aeSmrg  # post-process it.
91d9dcd5aeSmrg  if test -f "$tmpdepfile"; then
92d9dcd5aeSmrg    # Each line is of the form 'foo.o: dependency.h'.
93d9dcd5aeSmrg    # Do two passes, one to just change these to
94d9dcd5aeSmrg    #   $object: dependency.h
95d9dcd5aeSmrg    # and one to simply output
96d9dcd5aeSmrg    #   dependency.h:
97d9dcd5aeSmrg    # which is needed to avoid the deleted-header problem.
98d9dcd5aeSmrg    { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile"
99d9dcd5aeSmrg      sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile"
100d9dcd5aeSmrg    } > "$depfile"
101d9dcd5aeSmrg    rm -f "$tmpdepfile"
102d9dcd5aeSmrg  else
103d9dcd5aeSmrg    make_dummy_depfile
104d9dcd5aeSmrg  fi
105d9dcd5aeSmrg}
106d9dcd5aeSmrg
107d9dcd5aeSmrg# A tabulation character.
108d9dcd5aeSmrgtab='	'
109d9dcd5aeSmrg# A newline character.
110d9dcd5aeSmrgnl='
111d9dcd5aeSmrg'
112d9dcd5aeSmrg# Character ranges might be problematic outside the C locale.
113d9dcd5aeSmrg# These definitions help.
114d9dcd5aeSmrgupper=ABCDEFGHIJKLMNOPQRSTUVWXYZ
115d9dcd5aeSmrglower=abcdefghijklmnopqrstuvwxyz
116d9dcd5aeSmrgdigits=0123456789
117d9dcd5aeSmrgalpha=${upper}${lower}
118d9dcd5aeSmrg
119191cded7Smrgif test -z "$depmode" || test -z "$source" || test -z "$object"; then
120191cded7Smrg  echo "depcomp: Variables source, object and depmode must be set" 1>&2
121191cded7Smrg  exit 1
122191cded7Smrgfi
123191cded7Smrg
124191cded7Smrg# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.
125191cded7Smrgdepfile=${depfile-`echo "$object" |
126191cded7Smrg  sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`}
127191cded7Smrgtmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
128191cded7Smrg
129191cded7Smrgrm -f "$tmpdepfile"
130191cded7Smrg
131d9dcd5aeSmrg# Avoid interferences from the environment.
132d9dcd5aeSmrggccflag= dashmflag=
133d9dcd5aeSmrg
134191cded7Smrg# Some modes work just like other modes, but use different flags.  We
135191cded7Smrg# parameterize here, but still list the modes in the big case below,
136191cded7Smrg# to make depend.m4 easier to write.  Note that we *cannot* use a case
137191cded7Smrg# here, because this file can only contain one case statement.
138191cded7Smrgif test "$depmode" = hp; then
139191cded7Smrg  # HP compiler uses -M and no extra arg.
140191cded7Smrg  gccflag=-M
141191cded7Smrg  depmode=gcc
142191cded7Smrgfi
143191cded7Smrg
144191cded7Smrgif test "$depmode" = dashXmstdout; then
145d9dcd5aeSmrg  # This is just like dashmstdout with a different argument.
146d9dcd5aeSmrg  dashmflag=-xM
147d9dcd5aeSmrg  depmode=dashmstdout
148191cded7Smrgfi
149191cded7Smrg
150ba064abeSmrgcygpath_u="cygpath -u -f -"
151ba064abeSmrgif test "$depmode" = msvcmsys; then
152d9dcd5aeSmrg  # This is just like msvisualcpp but w/o cygpath translation.
153d9dcd5aeSmrg  # Just convert the backslash-escaped backslashes to single forward
154d9dcd5aeSmrg  # slashes to satisfy depend.m4
155d9dcd5aeSmrg  cygpath_u='sed s,\\\\,/,g'
156d9dcd5aeSmrg  depmode=msvisualcpp
157d9dcd5aeSmrgfi
158d9dcd5aeSmrg
159d9dcd5aeSmrgif test "$depmode" = msvc7msys; then
160d9dcd5aeSmrg  # This is just like msvc7 but w/o cygpath translation.
161d9dcd5aeSmrg  # Just convert the backslash-escaped backslashes to single forward
162d9dcd5aeSmrg  # slashes to satisfy depend.m4
163d9dcd5aeSmrg  cygpath_u='sed s,\\\\,/,g'
164d9dcd5aeSmrg  depmode=msvc7
165d9dcd5aeSmrgfi
166d9dcd5aeSmrg
167d9dcd5aeSmrgif test "$depmode" = xlc; then
168d9dcd5aeSmrg  # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information.
169d9dcd5aeSmrg  gccflag=-qmakedep=gcc,-MF
170d9dcd5aeSmrg  depmode=gcc
171ba064abeSmrgfi
172ba064abeSmrg
173191cded7Smrgcase "$depmode" in
174191cded7Smrggcc3)
175191cded7Smrg## gcc 3 implements dependency tracking that does exactly what
176191cded7Smrg## we want.  Yay!  Note: for some reason libtool 1.4 doesn't like
177191cded7Smrg## it if -MD -MP comes after the -MF stuff.  Hmm.
178b290cf36Smrg## Unfortunately, FreeBSD c89 acceptance of flags depends upon
179b290cf36Smrg## the command line argument order; so add the flags where they
180b290cf36Smrg## appear in depend2.am.  Note that the slowdown incurred here
181b290cf36Smrg## affects only configure: in makefiles, %FASTDEP% shortcuts this.
182b290cf36Smrg  for arg
183b290cf36Smrg  do
184b290cf36Smrg    case $arg in
185b290cf36Smrg    -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;;
186b290cf36Smrg    *)  set fnord "$@" "$arg" ;;
187b290cf36Smrg    esac
188b290cf36Smrg    shift # fnord
189b290cf36Smrg    shift # $arg
190b290cf36Smrg  done
191b290cf36Smrg  "$@"
192191cded7Smrg  stat=$?
193d9dcd5aeSmrg  if test $stat -ne 0; then
194191cded7Smrg    rm -f "$tmpdepfile"
195191cded7Smrg    exit $stat
196191cded7Smrg  fi
197191cded7Smrg  mv "$tmpdepfile" "$depfile"
198191cded7Smrg  ;;
199191cded7Smrg
200191cded7Smrggcc)
201d9dcd5aeSmrg## Note that this doesn't just cater to obsosete pre-3.x GCC compilers.
202d9dcd5aeSmrg## but also to in-use compilers like IMB xlc/xlC and the HP C compiler.
203d9dcd5aeSmrg## (see the conditional assignment to $gccflag above).
204191cded7Smrg## There are various ways to get dependency output from gcc.  Here's
205191cded7Smrg## why we pick this rather obscure method:
206191cded7Smrg## - Don't want to use -MD because we'd like the dependencies to end
207191cded7Smrg##   up in a subdir.  Having to rename by hand is ugly.
208191cded7Smrg##   (We might end up doing this anyway to support other compilers.)
209191cded7Smrg## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
210d9dcd5aeSmrg##   -MM, not -M (despite what the docs say).  Also, it might not be
211d9dcd5aeSmrg##   supported by the other compilers which use the 'gcc' depmode.
212191cded7Smrg## - Using -M directly means running the compiler twice (even worse
213191cded7Smrg##   than renaming).
214191cded7Smrg  if test -z "$gccflag"; then
215191cded7Smrg    gccflag=-MD,
216191cded7Smrg  fi
217191cded7Smrg  "$@" -Wp,"$gccflag$tmpdepfile"
218191cded7Smrg  stat=$?
219d9dcd5aeSmrg  if test $stat -ne 0; then
220191cded7Smrg    rm -f "$tmpdepfile"
221191cded7Smrg    exit $stat
222191cded7Smrg  fi
223191cded7Smrg  rm -f "$depfile"
224191cded7Smrg  echo "$object : \\" > "$depfile"
225d9dcd5aeSmrg  # The second -e expression handles DOS-style file names with drive
226d9dcd5aeSmrg  # letters.
227191cded7Smrg  sed -e 's/^[^:]*: / /' \
228191cded7Smrg      -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
229d9dcd5aeSmrg## This next piece of magic avoids the "deleted header file" problem.
230191cded7Smrg## The problem is that when a header file which appears in a .P file
231191cded7Smrg## is deleted, the dependency causes make to die (because there is
232191cded7Smrg## typically no way to rebuild the header).  We avoid this by adding
233191cded7Smrg## dummy dependencies for each header file.  Too bad gcc doesn't do
234191cded7Smrg## this for us directly.
235d9dcd5aeSmrg## Some versions of gcc put a space before the ':'.  On the theory
236191cded7Smrg## that the space means something, we add a space to the output as
237d9dcd5aeSmrg## well.  hp depmode also adds that space, but also prefixes the VPATH
238d9dcd5aeSmrg## to the object.  Take care to not repeat it in the output.
239191cded7Smrg## Some versions of the HPUX 10.20 sed can't process this invocation
240191cded7Smrg## correctly.  Breaking it into two sed invocations is a workaround.
241d9dcd5aeSmrg  tr ' ' "$nl" < "$tmpdepfile" \
242d9dcd5aeSmrg    | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \
243d9dcd5aeSmrg    | sed -e 's/$/ :/' >> "$depfile"
244191cded7Smrg  rm -f "$tmpdepfile"
245191cded7Smrg  ;;
246191cded7Smrg
247191cded7Smrghp)
248191cded7Smrg  # This case exists only to let depend.m4 do its work.  It works by
249191cded7Smrg  # looking at the text of this script.  This case will never be run,
250191cded7Smrg  # since it is checked for above.
251191cded7Smrg  exit 1
252191cded7Smrg  ;;
253191cded7Smrg
254191cded7Smrgsgi)
255191cded7Smrg  if test "$libtool" = yes; then
256191cded7Smrg    "$@" "-Wp,-MDupdate,$tmpdepfile"
257191cded7Smrg  else
258191cded7Smrg    "$@" -MDupdate "$tmpdepfile"
259191cded7Smrg  fi
260191cded7Smrg  stat=$?
261d9dcd5aeSmrg  if test $stat -ne 0; then
262191cded7Smrg    rm -f "$tmpdepfile"
263191cded7Smrg    exit $stat
264191cded7Smrg  fi
265191cded7Smrg  rm -f "$depfile"
266191cded7Smrg
267191cded7Smrg  if test -f "$tmpdepfile"; then  # yes, the sourcefile depend on other files
268191cded7Smrg    echo "$object : \\" > "$depfile"
269191cded7Smrg    # Clip off the initial element (the dependent).  Don't try to be
270191cded7Smrg    # clever and replace this with sed code, as IRIX sed won't handle
271191cded7Smrg    # lines with more than a fixed number of characters (4096 in
272191cded7Smrg    # IRIX 6.2 sed, 8192 in IRIX 6.5).  We also remove comment lines;
273d9dcd5aeSmrg    # the IRIX cc adds comments like '#:fec' to the end of the
274191cded7Smrg    # dependency line.
275d9dcd5aeSmrg    tr ' ' "$nl" < "$tmpdepfile" \
276d9dcd5aeSmrg      | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \
277d9dcd5aeSmrg      | tr "$nl" ' ' >> "$depfile"
278ba064abeSmrg    echo >> "$depfile"
279191cded7Smrg    # The second pass generates a dummy entry for each header file.
280d9dcd5aeSmrg    tr ' ' "$nl" < "$tmpdepfile" \
281d9dcd5aeSmrg      | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
282d9dcd5aeSmrg      >> "$depfile"
283191cded7Smrg  else
284d9dcd5aeSmrg    make_dummy_depfile
285191cded7Smrg  fi
286191cded7Smrg  rm -f "$tmpdepfile"
287191cded7Smrg  ;;
288191cded7Smrg
289d9dcd5aeSmrgxlc)
290d9dcd5aeSmrg  # This case exists only to let depend.m4 do its work.  It works by
291d9dcd5aeSmrg  # looking at the text of this script.  This case will never be run,
292d9dcd5aeSmrg  # since it is checked for above.
293d9dcd5aeSmrg  exit 1
294d9dcd5aeSmrg  ;;
295d9dcd5aeSmrg
296191cded7Smrgaix)
297191cded7Smrg  # The C for AIX Compiler uses -M and outputs the dependencies
298191cded7Smrg  # in a .u file.  In older versions, this file always lives in the
299d9dcd5aeSmrg  # current directory.  Also, the AIX compiler puts '$object:' at the
300191cded7Smrg  # start of each line; $object doesn't have directory information.
301191cded7Smrg  # Version 6 uses the directory in both cases.
302d9dcd5aeSmrg  set_dir_from "$object"
303d9dcd5aeSmrg  set_base_from "$object"
304191cded7Smrg  if test "$libtool" = yes; then
305b290cf36Smrg    tmpdepfile1=$dir$base.u
306b290cf36Smrg    tmpdepfile2=$base.u
307b290cf36Smrg    tmpdepfile3=$dir.libs/$base.u
308191cded7Smrg    "$@" -Wc,-M
309191cded7Smrg  else
310b290cf36Smrg    tmpdepfile1=$dir$base.u
311b290cf36Smrg    tmpdepfile2=$dir$base.u
312b290cf36Smrg    tmpdepfile3=$dir$base.u
313191cded7Smrg    "$@" -M
314191cded7Smrg  fi
315191cded7Smrg  stat=$?
316d9dcd5aeSmrg  if test $stat -ne 0; then
317b290cf36Smrg    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
318191cded7Smrg    exit $stat
319191cded7Smrg  fi
320191cded7Smrg
321b290cf36Smrg  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
322b290cf36Smrg  do
323b290cf36Smrg    test -f "$tmpdepfile" && break
324b290cf36Smrg  done
325d9dcd5aeSmrg  aix_post_process_depfile
326d9dcd5aeSmrg  ;;
327d9dcd5aeSmrg
328d9dcd5aeSmrgtcc)
329d9dcd5aeSmrg  # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26
330d9dcd5aeSmrg  # FIXME: That version still under development at the moment of writing.
331d9dcd5aeSmrg  #        Make that this statement remains true also for stable, released
332d9dcd5aeSmrg  #        versions.
333d9dcd5aeSmrg  # It will wrap lines (doesn't matter whether long or short) with a
334d9dcd5aeSmrg  # trailing '\', as in:
335d9dcd5aeSmrg  #
336d9dcd5aeSmrg  #   foo.o : \
337d9dcd5aeSmrg  #    foo.c \
338d9dcd5aeSmrg  #    foo.h \
339d9dcd5aeSmrg  #
340d9dcd5aeSmrg  # It will put a trailing '\' even on the last line, and will use leading
341d9dcd5aeSmrg  # spaces rather than leading tabs (at least since its commit 0394caf7
342d9dcd5aeSmrg  # "Emit spaces for -MD").
343d9dcd5aeSmrg  "$@" -MD -MF "$tmpdepfile"
344d9dcd5aeSmrg  stat=$?
345d9dcd5aeSmrg  if test $stat -ne 0; then
346d9dcd5aeSmrg    rm -f "$tmpdepfile"
347d9dcd5aeSmrg    exit $stat
348191cded7Smrg  fi
349d9dcd5aeSmrg  rm -f "$depfile"
350d9dcd5aeSmrg  # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'.
351d9dcd5aeSmrg  # We have to change lines of the first kind to '$object: \'.
352d9dcd5aeSmrg  sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile"
353d9dcd5aeSmrg  # And for each line of the second kind, we have to emit a 'dep.h:'
354d9dcd5aeSmrg  # dummy dependency, to avoid the deleted-header problem.
355d9dcd5aeSmrg  sed -n -e 's|^  *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile"
356191cded7Smrg  rm -f "$tmpdepfile"
357191cded7Smrg  ;;
358191cded7Smrg
359d9dcd5aeSmrg## The order of this option in the case statement is important, since the
360d9dcd5aeSmrg## shell code in configure will try each of these formats in the order
361d9dcd5aeSmrg## listed in this file.  A plain '-MD' option would be understood by many
362d9dcd5aeSmrg## compilers, so we must ensure this comes after the gcc and icc options.
363d9dcd5aeSmrgpgcc)
364d9dcd5aeSmrg  # Portland's C compiler understands '-MD'.
365d9dcd5aeSmrg  # Will always output deps to 'file.d' where file is the root name of the
366d9dcd5aeSmrg  # source file under compilation, even if file resides in a subdirectory.
367d9dcd5aeSmrg  # The object file name does not affect the name of the '.d' file.
368d9dcd5aeSmrg  # pgcc 10.2 will output
369191cded7Smrg  #    foo.o: sub/foo.c sub/foo.h
370d9dcd5aeSmrg  # and will wrap long lines using '\' :
371191cded7Smrg  #    foo.o: sub/foo.c ... \
372191cded7Smrg  #     sub/foo.h ... \
373191cded7Smrg  #     ...
374d9dcd5aeSmrg  set_dir_from "$object"
375d9dcd5aeSmrg  # Use the source, not the object, to determine the base name, since
376d9dcd5aeSmrg  # that's sadly what pgcc will do too.
377d9dcd5aeSmrg  set_base_from "$source"
378d9dcd5aeSmrg  tmpdepfile=$base.d
379d9dcd5aeSmrg
380d9dcd5aeSmrg  # For projects that build the same source file twice into different object
381d9dcd5aeSmrg  # files, the pgcc approach of using the *source* file root name can cause
382d9dcd5aeSmrg  # problems in parallel builds.  Use a locking strategy to avoid stomping on
383d9dcd5aeSmrg  # the same $tmpdepfile.
384d9dcd5aeSmrg  lockdir=$base.d-lock
385d9dcd5aeSmrg  trap "
386d9dcd5aeSmrg    echo '$0: caught signal, cleaning up...' >&2
387d9dcd5aeSmrg    rmdir '$lockdir'
388d9dcd5aeSmrg    exit 1
389d9dcd5aeSmrg  " 1 2 13 15
390d9dcd5aeSmrg  numtries=100
391d9dcd5aeSmrg  i=$numtries
392d9dcd5aeSmrg  while test $i -gt 0; do
393d9dcd5aeSmrg    # mkdir is a portable test-and-set.
394d9dcd5aeSmrg    if mkdir "$lockdir" 2>/dev/null; then
395d9dcd5aeSmrg      # This process acquired the lock.
396d9dcd5aeSmrg      "$@" -MD
397d9dcd5aeSmrg      stat=$?
398d9dcd5aeSmrg      # Release the lock.
399d9dcd5aeSmrg      rmdir "$lockdir"
400d9dcd5aeSmrg      break
401d9dcd5aeSmrg    else
402d9dcd5aeSmrg      # If the lock is being held by a different process, wait
403d9dcd5aeSmrg      # until the winning process is done or we timeout.
404d9dcd5aeSmrg      while test -d "$lockdir" && test $i -gt 0; do
405d9dcd5aeSmrg        sleep 1
406d9dcd5aeSmrg        i=`expr $i - 1`
407d9dcd5aeSmrg      done
408d9dcd5aeSmrg    fi
409d9dcd5aeSmrg    i=`expr $i - 1`
410d9dcd5aeSmrg  done
411d9dcd5aeSmrg  trap - 1 2 13 15
412d9dcd5aeSmrg  if test $i -le 0; then
413d9dcd5aeSmrg    echo "$0: failed to acquire lock after $numtries attempts" >&2
414d9dcd5aeSmrg    echo "$0: check lockdir '$lockdir'" >&2
415d9dcd5aeSmrg    exit 1
416d9dcd5aeSmrg  fi
417191cded7Smrg
418d9dcd5aeSmrg  if test $stat -ne 0; then
419191cded7Smrg    rm -f "$tmpdepfile"
420191cded7Smrg    exit $stat
421191cded7Smrg  fi
422191cded7Smrg  rm -f "$depfile"
423191cded7Smrg  # Each line is of the form `foo.o: dependent.h',
424191cded7Smrg  # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'.
425191cded7Smrg  # Do two passes, one to just change these to
426191cded7Smrg  # `$object: dependent.h' and one to simply `dependent.h:'.
427191cded7Smrg  sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
428191cded7Smrg  # Some versions of the HPUX 10.20 sed can't process this invocation
429191cded7Smrg  # correctly.  Breaking it into two sed invocations is a workaround.
430d9dcd5aeSmrg  sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \
431d9dcd5aeSmrg    | sed -e 's/$/ :/' >> "$depfile"
432191cded7Smrg  rm -f "$tmpdepfile"
433191cded7Smrg  ;;
434191cded7Smrg
435b290cf36Smrghp2)
436b290cf36Smrg  # The "hp" stanza above does not work with aCC (C++) and HP's ia64
437b290cf36Smrg  # compilers, which have integrated preprocessors.  The correct option
438b290cf36Smrg  # to use with these is +Maked; it writes dependencies to a file named
439b290cf36Smrg  # 'foo.d', which lands next to the object file, wherever that
440b290cf36Smrg  # happens to be.
441b290cf36Smrg  # Much of this is similar to the tru64 case; see comments there.
442d9dcd5aeSmrg  set_dir_from  "$object"
443d9dcd5aeSmrg  set_base_from "$object"
444b290cf36Smrg  if test "$libtool" = yes; then
445b290cf36Smrg    tmpdepfile1=$dir$base.d
446b290cf36Smrg    tmpdepfile2=$dir.libs/$base.d
447b290cf36Smrg    "$@" -Wc,+Maked
448b290cf36Smrg  else
449b290cf36Smrg    tmpdepfile1=$dir$base.d
450b290cf36Smrg    tmpdepfile2=$dir$base.d
451b290cf36Smrg    "$@" +Maked
452b290cf36Smrg  fi
453b290cf36Smrg  stat=$?
454d9dcd5aeSmrg  if test $stat -ne 0; then
455b290cf36Smrg     rm -f "$tmpdepfile1" "$tmpdepfile2"
456b290cf36Smrg     exit $stat
457b290cf36Smrg  fi
458b290cf36Smrg
459b290cf36Smrg  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2"
460b290cf36Smrg  do
461b290cf36Smrg    test -f "$tmpdepfile" && break
462b290cf36Smrg  done
463b290cf36Smrg  if test -f "$tmpdepfile"; then
464d9dcd5aeSmrg    sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile"
465d9dcd5aeSmrg    # Add 'dependent.h:' lines.
466ba064abeSmrg    sed -ne '2,${
467d9dcd5aeSmrg               s/^ *//
468d9dcd5aeSmrg               s/ \\*$//
469d9dcd5aeSmrg               s/$/:/
470d9dcd5aeSmrg               p
471d9dcd5aeSmrg             }' "$tmpdepfile" >> "$depfile"
472b290cf36Smrg  else
473d9dcd5aeSmrg    make_dummy_depfile
474b290cf36Smrg  fi
475b290cf36Smrg  rm -f "$tmpdepfile" "$tmpdepfile2"
476b290cf36Smrg  ;;
477b290cf36Smrg
478191cded7Smrgtru64)
479d9dcd5aeSmrg  # The Tru64 compiler uses -MD to generate dependencies as a side
480d9dcd5aeSmrg  # effect.  'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'.
481d9dcd5aeSmrg  # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
482d9dcd5aeSmrg  # dependencies in 'foo.d' instead, so we check for that too.
483d9dcd5aeSmrg  # Subdirectories are respected.
484d9dcd5aeSmrg  set_dir_from  "$object"
485d9dcd5aeSmrg  set_base_from "$object"
486d9dcd5aeSmrg
487d9dcd5aeSmrg  if test "$libtool" = yes; then
488d9dcd5aeSmrg    # Libtool generates 2 separate objects for the 2 libraries.  These
489d9dcd5aeSmrg    # two compilations output dependencies in $dir.libs/$base.o.d and
490d9dcd5aeSmrg    # in $dir$base.o.d.  We have to check for both files, because
491d9dcd5aeSmrg    # one of the two compilations can be disabled.  We should prefer
492d9dcd5aeSmrg    # $dir$base.o.d over $dir.libs/$base.o.d because the latter is
493d9dcd5aeSmrg    # automatically cleaned when .libs/ is deleted, while ignoring
494d9dcd5aeSmrg    # the former would cause a distcleancheck panic.
495d9dcd5aeSmrg    tmpdepfile1=$dir$base.o.d          # libtool 1.5
496d9dcd5aeSmrg    tmpdepfile2=$dir.libs/$base.o.d    # Likewise.
497d9dcd5aeSmrg    tmpdepfile3=$dir.libs/$base.d      # Compaq CCC V6.2-504
498d9dcd5aeSmrg    "$@" -Wc,-MD
499d9dcd5aeSmrg  else
500d9dcd5aeSmrg    tmpdepfile1=$dir$base.d
501d9dcd5aeSmrg    tmpdepfile2=$dir$base.d
502d9dcd5aeSmrg    tmpdepfile3=$dir$base.d
503d9dcd5aeSmrg    "$@" -MD
504d9dcd5aeSmrg  fi
505d9dcd5aeSmrg
506d9dcd5aeSmrg  stat=$?
507d9dcd5aeSmrg  if test $stat -ne 0; then
508d9dcd5aeSmrg    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
509d9dcd5aeSmrg    exit $stat
510d9dcd5aeSmrg  fi
511d9dcd5aeSmrg
512d9dcd5aeSmrg  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
513d9dcd5aeSmrg  do
514d9dcd5aeSmrg    test -f "$tmpdepfile" && break
515d9dcd5aeSmrg  done
516d9dcd5aeSmrg  # Same post-processing that is required for AIX mode.
517d9dcd5aeSmrg  aix_post_process_depfile
518d9dcd5aeSmrg  ;;
519d9dcd5aeSmrg
520d9dcd5aeSmrgmsvc7)
521d9dcd5aeSmrg  if test "$libtool" = yes; then
522d9dcd5aeSmrg    showIncludes=-Wc,-showIncludes
523d9dcd5aeSmrg  else
524d9dcd5aeSmrg    showIncludes=-showIncludes
525d9dcd5aeSmrg  fi
526d9dcd5aeSmrg  "$@" $showIncludes > "$tmpdepfile"
527d9dcd5aeSmrg  stat=$?
528d9dcd5aeSmrg  grep -v '^Note: including file: ' "$tmpdepfile"
529d9dcd5aeSmrg  if test $stat -ne 0; then
530d9dcd5aeSmrg    rm -f "$tmpdepfile"
531d9dcd5aeSmrg    exit $stat
532d9dcd5aeSmrg  fi
533d9dcd5aeSmrg  rm -f "$depfile"
534d9dcd5aeSmrg  echo "$object : \\" > "$depfile"
535d9dcd5aeSmrg  # The first sed program below extracts the file names and escapes
536d9dcd5aeSmrg  # backslashes for cygpath.  The second sed program outputs the file
537d9dcd5aeSmrg  # name when reading, but also accumulates all include files in the
538d9dcd5aeSmrg  # hold buffer in order to output them again at the end.  This only
539d9dcd5aeSmrg  # works with sed implementations that can handle large buffers.
540d9dcd5aeSmrg  sed < "$tmpdepfile" -n '
541d9dcd5aeSmrg/^Note: including file:  *\(.*\)/ {
542d9dcd5aeSmrg  s//\1/
543d9dcd5aeSmrg  s/\\/\\\\/g
544d9dcd5aeSmrg  p
545d9dcd5aeSmrg}' | $cygpath_u | sort -u | sed -n '
546d9dcd5aeSmrgs/ /\\ /g
547d9dcd5aeSmrgs/\(.*\)/'"$tab"'\1 \\/p
548d9dcd5aeSmrgs/.\(.*\) \\/\1:/
549d9dcd5aeSmrgH
550d9dcd5aeSmrg$ {
551d9dcd5aeSmrg  s/.*/'"$tab"'/
552d9dcd5aeSmrg  G
553d9dcd5aeSmrg  p
554d9dcd5aeSmrg}' >> "$depfile"
55558deefebSmrg  echo >> "$depfile" # make sure the fragment doesn't end with a backslash
556d9dcd5aeSmrg  rm -f "$tmpdepfile"
557d9dcd5aeSmrg  ;;
558d9dcd5aeSmrg
559d9dcd5aeSmrgmsvc7msys)
560d9dcd5aeSmrg  # This case exists only to let depend.m4 do its work.  It works by
561d9dcd5aeSmrg  # looking at the text of this script.  This case will never be run,
562d9dcd5aeSmrg  # since it is checked for above.
563d9dcd5aeSmrg  exit 1
564d9dcd5aeSmrg  ;;
565191cded7Smrg
566191cded7Smrg#nosideeffect)
567191cded7Smrg  # This comment above is used by automake to tell side-effect
568191cded7Smrg  # dependency tracking mechanisms from slower ones.
569191cded7Smrg
570191cded7Smrgdashmstdout)
571191cded7Smrg  # Important note: in order to support this mode, a compiler *must*
572191cded7Smrg  # always write the preprocessed file to stdout, regardless of -o.
573191cded7Smrg  "$@" || exit $?
574191cded7Smrg
575191cded7Smrg  # Remove the call to Libtool.
576191cded7Smrg  if test "$libtool" = yes; then
577ba064abeSmrg    while test "X$1" != 'X--mode=compile'; do
578191cded7Smrg      shift
579191cded7Smrg    done
580191cded7Smrg    shift
581191cded7Smrg  fi
582191cded7Smrg
583d9dcd5aeSmrg  # Remove '-o $object'.
584191cded7Smrg  IFS=" "
585191cded7Smrg  for arg
586191cded7Smrg  do
587191cded7Smrg    case $arg in
588191cded7Smrg    -o)
589191cded7Smrg      shift
590191cded7Smrg      ;;
591191cded7Smrg    $object)
592191cded7Smrg      shift
593191cded7Smrg      ;;
594191cded7Smrg    *)
595191cded7Smrg      set fnord "$@" "$arg"
596191cded7Smrg      shift # fnord
597191cded7Smrg      shift # $arg
598191cded7Smrg      ;;
599191cded7Smrg    esac
600191cded7Smrg  done
601191cded7Smrg
602191cded7Smrg  test -z "$dashmflag" && dashmflag=-M
603d9dcd5aeSmrg  # Require at least two characters before searching for ':'
604191cded7Smrg  # in the target name.  This is to cope with DOS-style filenames:
605d9dcd5aeSmrg  # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise.
606191cded7Smrg  "$@" $dashmflag |
607d9dcd5aeSmrg    sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile"
608191cded7Smrg  rm -f "$depfile"
609191cded7Smrg  cat < "$tmpdepfile" > "$depfile"
610d9dcd5aeSmrg  # Some versions of the HPUX 10.20 sed can't process this sed invocation
611d9dcd5aeSmrg  # correctly.  Breaking it into two sed invocations is a workaround.
612d9dcd5aeSmrg  tr ' ' "$nl" < "$tmpdepfile" \
613d9dcd5aeSmrg    | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
614d9dcd5aeSmrg    | sed -e 's/$/ :/' >> "$depfile"
615191cded7Smrg  rm -f "$tmpdepfile"
616191cded7Smrg  ;;
617191cded7Smrg
618191cded7SmrgdashXmstdout)
619191cded7Smrg  # This case only exists to satisfy depend.m4.  It is never actually
620191cded7Smrg  # run, as this mode is specially recognized in the preamble.
621191cded7Smrg  exit 1
622191cded7Smrg  ;;
623191cded7Smrg
624191cded7Smrgmakedepend)
625191cded7Smrg  "$@" || exit $?
626191cded7Smrg  # Remove any Libtool call
627191cded7Smrg  if test "$libtool" = yes; then
628ba064abeSmrg    while test "X$1" != 'X--mode=compile'; do
629191cded7Smrg      shift
630191cded7Smrg    done
631191cded7Smrg    shift
632191cded7Smrg  fi
633191cded7Smrg  # X makedepend
634191cded7Smrg  shift
635ba064abeSmrg  cleared=no eat=no
636ba064abeSmrg  for arg
637ba064abeSmrg  do
638191cded7Smrg    case $cleared in
639191cded7Smrg    no)
640191cded7Smrg      set ""; shift
641191cded7Smrg      cleared=yes ;;
642191cded7Smrg    esac
643ba064abeSmrg    if test $eat = yes; then
644ba064abeSmrg      eat=no
645ba064abeSmrg      continue
646ba064abeSmrg    fi
647191cded7Smrg    case "$arg" in
648191cded7Smrg    -D*|-I*)
649191cded7Smrg      set fnord "$@" "$arg"; shift ;;
650191cded7Smrg    # Strip any option that makedepend may not understand.  Remove
651191cded7Smrg    # the object too, otherwise makedepend will parse it as a source file.
652ba064abeSmrg    -arch)
653ba064abeSmrg      eat=yes ;;
654191cded7Smrg    -*|$object)
655191cded7Smrg      ;;
656191cded7Smrg    *)
657191cded7Smrg      set fnord "$@" "$arg"; shift ;;
658191cded7Smrg    esac
659191cded7Smrg  done
660ba064abeSmrg  obj_suffix=`echo "$object" | sed 's/^.*\././'`
661191cded7Smrg  touch "$tmpdepfile"
662191cded7Smrg  ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
663191cded7Smrg  rm -f "$depfile"
664d9dcd5aeSmrg  # makedepend may prepend the VPATH from the source file name to the object.
665d9dcd5aeSmrg  # No need to regex-escape $object, excess matching of '.' is harmless.
666d9dcd5aeSmrg  sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile"
667d9dcd5aeSmrg  # Some versions of the HPUX 10.20 sed can't process the last invocation
668d9dcd5aeSmrg  # correctly.  Breaking it into two sed invocations is a workaround.
669d9dcd5aeSmrg  sed '1,2d' "$tmpdepfile" \
670d9dcd5aeSmrg    | tr ' ' "$nl" \
671d9dcd5aeSmrg    | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
672d9dcd5aeSmrg    | sed -e 's/$/ :/' >> "$depfile"
673191cded7Smrg  rm -f "$tmpdepfile" "$tmpdepfile".bak
674191cded7Smrg  ;;
675191cded7Smrg
676191cded7Smrgcpp)
677191cded7Smrg  # Important note: in order to support this mode, a compiler *must*
678191cded7Smrg  # always write the preprocessed file to stdout.
679191cded7Smrg  "$@" || exit $?
680191cded7Smrg
681191cded7Smrg  # Remove the call to Libtool.
682191cded7Smrg  if test "$libtool" = yes; then
683ba064abeSmrg    while test "X$1" != 'X--mode=compile'; do
684191cded7Smrg      shift
685191cded7Smrg    done
686191cded7Smrg    shift
687191cded7Smrg  fi
688191cded7Smrg
689d9dcd5aeSmrg  # Remove '-o $object'.
690191cded7Smrg  IFS=" "
691191cded7Smrg  for arg
692191cded7Smrg  do
693191cded7Smrg    case $arg in
694191cded7Smrg    -o)
695191cded7Smrg      shift
696191cded7Smrg      ;;
697191cded7Smrg    $object)
698191cded7Smrg      shift
699191cded7Smrg      ;;
700191cded7Smrg    *)
701191cded7Smrg      set fnord "$@" "$arg"
702191cded7Smrg      shift # fnord
703191cded7Smrg      shift # $arg
704191cded7Smrg      ;;
705191cded7Smrg    esac
706191cded7Smrg  done
707191cded7Smrg
708d9dcd5aeSmrg  "$@" -E \
709d9dcd5aeSmrg    | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
710d9dcd5aeSmrg             -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
711d9dcd5aeSmrg    | sed '$ s: \\$::' > "$tmpdepfile"
712191cded7Smrg  rm -f "$depfile"
713191cded7Smrg  echo "$object : \\" > "$depfile"
714191cded7Smrg  cat < "$tmpdepfile" >> "$depfile"
715191cded7Smrg  sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
716191cded7Smrg  rm -f "$tmpdepfile"
717191cded7Smrg  ;;
718191cded7Smrg
719191cded7Smrgmsvisualcpp)
720191cded7Smrg  # Important note: in order to support this mode, a compiler *must*
721ba064abeSmrg  # always write the preprocessed file to stdout.
722191cded7Smrg  "$@" || exit $?
723ba064abeSmrg
724ba064abeSmrg  # Remove the call to Libtool.
725ba064abeSmrg  if test "$libtool" = yes; then
726ba064abeSmrg    while test "X$1" != 'X--mode=compile'; do
727ba064abeSmrg      shift
728ba064abeSmrg    done
729ba064abeSmrg    shift
730ba064abeSmrg  fi
731ba064abeSmrg
732191cded7Smrg  IFS=" "
733191cded7Smrg  for arg
734191cded7Smrg  do
735191cded7Smrg    case "$arg" in
736ba064abeSmrg    -o)
737ba064abeSmrg      shift
738ba064abeSmrg      ;;
739ba064abeSmrg    $object)
740ba064abeSmrg      shift
741ba064abeSmrg      ;;
742191cded7Smrg    "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
743d9dcd5aeSmrg        set fnord "$@"
744d9dcd5aeSmrg        shift
745d9dcd5aeSmrg        shift
746d9dcd5aeSmrg        ;;
747191cded7Smrg    *)
748d9dcd5aeSmrg        set fnord "$@" "$arg"
749d9dcd5aeSmrg        shift
750d9dcd5aeSmrg        shift
751d9dcd5aeSmrg        ;;
752191cded7Smrg    esac
753191cded7Smrg  done
754ba064abeSmrg  "$@" -E 2>/dev/null |
755ba064abeSmrg  sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile"
756191cded7Smrg  rm -f "$depfile"
757191cded7Smrg  echo "$object : \\" > "$depfile"
758d9dcd5aeSmrg  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile"
759d9dcd5aeSmrg  echo "$tab" >> "$depfile"
760ba064abeSmrg  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile"
761191cded7Smrg  rm -f "$tmpdepfile"
762191cded7Smrg  ;;
763191cded7Smrg
764ba064abeSmrgmsvcmsys)
765ba064abeSmrg  # This case exists only to let depend.m4 do its work.  It works by
766ba064abeSmrg  # looking at the text of this script.  This case will never be run,
767ba064abeSmrg  # since it is checked for above.
768ba064abeSmrg  exit 1
769ba064abeSmrg  ;;
770ba064abeSmrg
771191cded7Smrgnone)
772191cded7Smrg  exec "$@"
773191cded7Smrg  ;;
774191cded7Smrg
775191cded7Smrg*)
776191cded7Smrg  echo "Unknown depmode $depmode" 1>&2
777191cded7Smrg  exit 1
778191cded7Smrg  ;;
779191cded7Smrgesac
780191cded7Smrg
781191cded7Smrgexit 0
782191cded7Smrg
783191cded7Smrg# Local Variables:
784191cded7Smrg# mode: shell-script
785191cded7Smrg# sh-indentation: 2
786ee3e8c14Smrg# eval: (add-hook 'before-save-hook 'time-stamp)
787191cded7Smrg# time-stamp-start: "scriptversion="
788191cded7Smrg# time-stamp-format: "%:y-%02m-%02d.%02H"
789ee3e8c14Smrg# time-stamp-time-zone: "UTC0"
790ba064abeSmrg# time-stamp-end: "; # UTC"
791191cded7Smrg# End:
792