depcomp revision 949d0342
19f606849Smrg#! /bin/sh
29f606849Smrg# depcomp - compile a program generating dependencies as side-effects
39f606849Smrg
4949d0342Smrgscriptversion=2018-03-07.03; # UTC
59f606849Smrg
6949d0342Smrg# Copyright (C) 1999-2021 Free Software Foundation, Inc.
79f606849Smrg
89f606849Smrg# This program is free software; you can redistribute it and/or modify
99f606849Smrg# it under the terms of the GNU General Public License as published by
109f606849Smrg# the Free Software Foundation; either version 2, or (at your option)
119f606849Smrg# any later version.
129f606849Smrg
139f606849Smrg# This program is distributed in the hope that it will be useful,
149f606849Smrg# but WITHOUT ANY WARRANTY; without even the implied warranty of
159f606849Smrg# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
169f606849Smrg# GNU General Public License for more details.
179f606849Smrg
189f606849Smrg# You should have received a copy of the GNU General Public License
19949d0342Smrg# along with this program.  If not, see <https://www.gnu.org/licenses/>.
209f606849Smrg
219f606849Smrg# As a special exception to the GNU General Public License, if you
229f606849Smrg# distribute this file as part of a program that contains a
239f606849Smrg# configuration script generated by Autoconf, you may include it under
249f606849Smrg# the same distribution terms that you use for the rest of that program.
259f606849Smrg
269f606849Smrg# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>.
279f606849Smrg
289f606849Smrgcase $1 in
299f606849Smrg  '')
30cdbfa18aSmrg    echo "$0: No command.  Try '$0 --help' for more information." 1>&2
31cdbfa18aSmrg    exit 1;
32cdbfa18aSmrg    ;;
339f606849Smrg  -h | --h*)
349f606849Smrg    cat <<\EOF
359f606849SmrgUsage: depcomp [--help] [--version] PROGRAM [ARGS]
369f606849Smrg
379f606849SmrgRun PROGRAMS ARGS to compile a file, generating dependencies
389f606849Smrgas side-effects.
399f606849Smrg
409f606849SmrgEnvironment variables:
419f606849Smrg  depmode     Dependency tracking mode.
42cdbfa18aSmrg  source      Source file read by 'PROGRAMS ARGS'.
43cdbfa18aSmrg  object      Object file output by 'PROGRAMS ARGS'.
449f606849Smrg  DEPDIR      directory where to store dependencies.
459f606849Smrg  depfile     Dependency file to output.
46cdbfa18aSmrg  tmpdepfile  Temporary file to use when outputting dependencies.
479f606849Smrg  libtool     Whether libtool is used (yes/no).
489f606849Smrg
499f606849SmrgReport bugs to <bug-automake@gnu.org>.
509f606849SmrgEOF
519f606849Smrg    exit $?
529f606849Smrg    ;;
539f606849Smrg  -v | --v*)
549f606849Smrg    echo "depcomp $scriptversion"
559f606849Smrg    exit $?
569f606849Smrg    ;;
579f606849Smrgesac
589f606849Smrg
59cdbfa18aSmrg# Get the directory component of the given path, and save it in the
60cdbfa18aSmrg# global variables '$dir'.  Note that this directory component will
61cdbfa18aSmrg# be either empty or ending with a '/' character.  This is deliberate.
62cdbfa18aSmrgset_dir_from ()
63cdbfa18aSmrg{
64cdbfa18aSmrg  case $1 in
65cdbfa18aSmrg    */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;;
66cdbfa18aSmrg      *) dir=;;
67cdbfa18aSmrg  esac
68cdbfa18aSmrg}
69cdbfa18aSmrg
70cdbfa18aSmrg# Get the suffix-stripped basename of the given path, and save it the
71cdbfa18aSmrg# global variable '$base'.
72cdbfa18aSmrgset_base_from ()
73cdbfa18aSmrg{
74cdbfa18aSmrg  base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'`
75cdbfa18aSmrg}
76cdbfa18aSmrg
77cdbfa18aSmrg# If no dependency file was actually created by the compiler invocation,
78cdbfa18aSmrg# we still have to create a dummy depfile, to avoid errors with the
79cdbfa18aSmrg# Makefile "include basename.Plo" scheme.
80cdbfa18aSmrgmake_dummy_depfile ()
81cdbfa18aSmrg{
82cdbfa18aSmrg  echo "#dummy" > "$depfile"
83cdbfa18aSmrg}
84cdbfa18aSmrg
85cdbfa18aSmrg# Factor out some common post-processing of the generated depfile.
86cdbfa18aSmrg# Requires the auxiliary global variable '$tmpdepfile' to be set.
87cdbfa18aSmrgaix_post_process_depfile ()
88cdbfa18aSmrg{
89cdbfa18aSmrg  # If the compiler actually managed to produce a dependency file,
90cdbfa18aSmrg  # post-process it.
91cdbfa18aSmrg  if test -f "$tmpdepfile"; then
92cdbfa18aSmrg    # Each line is of the form 'foo.o: dependency.h'.
93cdbfa18aSmrg    # Do two passes, one to just change these to
94cdbfa18aSmrg    #   $object: dependency.h
95cdbfa18aSmrg    # and one to simply output
96cdbfa18aSmrg    #   dependency.h:
97cdbfa18aSmrg    # which is needed to avoid the deleted-header problem.
98cdbfa18aSmrg    { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile"
99cdbfa18aSmrg      sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile"
100cdbfa18aSmrg    } > "$depfile"
101cdbfa18aSmrg    rm -f "$tmpdepfile"
102cdbfa18aSmrg  else
103cdbfa18aSmrg    make_dummy_depfile
104cdbfa18aSmrg  fi
105cdbfa18aSmrg}
106cdbfa18aSmrg
107cdbfa18aSmrg# A tabulation character.
108cdbfa18aSmrgtab='	'
109cdbfa18aSmrg# A newline character.
110cdbfa18aSmrgnl='
111cdbfa18aSmrg'
112cdbfa18aSmrg# Character ranges might be problematic outside the C locale.
113cdbfa18aSmrg# These definitions help.
114cdbfa18aSmrgupper=ABCDEFGHIJKLMNOPQRSTUVWXYZ
115cdbfa18aSmrglower=abcdefghijklmnopqrstuvwxyz
116cdbfa18aSmrgdigits=0123456789
117cdbfa18aSmrgalpha=${upper}${lower}
118cdbfa18aSmrg
1199f606849Smrgif test -z "$depmode" || test -z "$source" || test -z "$object"; then
1209f606849Smrg  echo "depcomp: Variables source, object and depmode must be set" 1>&2
1219f606849Smrg  exit 1
1229f606849Smrgfi
1239f606849Smrg
1249f606849Smrg# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.
1259f606849Smrgdepfile=${depfile-`echo "$object" |
1269f606849Smrg  sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`}
1279f606849Smrgtmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
1289f606849Smrg
1299f606849Smrgrm -f "$tmpdepfile"
1309f606849Smrg
131cdbfa18aSmrg# Avoid interferences from the environment.
132cdbfa18aSmrggccflag= dashmflag=
133cdbfa18aSmrg
1349f606849Smrg# Some modes work just like other modes, but use different flags.  We
1359f606849Smrg# parameterize here, but still list the modes in the big case below,
1369f606849Smrg# to make depend.m4 easier to write.  Note that we *cannot* use a case
1379f606849Smrg# here, because this file can only contain one case statement.
1389f606849Smrgif test "$depmode" = hp; then
1399f606849Smrg  # HP compiler uses -M and no extra arg.
1409f606849Smrg  gccflag=-M
1419f606849Smrg  depmode=gcc
1429f606849Smrgfi
1439f606849Smrg
1449f606849Smrgif test "$depmode" = dashXmstdout; then
145cdbfa18aSmrg  # This is just like dashmstdout with a different argument.
146cdbfa18aSmrg  dashmflag=-xM
147cdbfa18aSmrg  depmode=dashmstdout
1489f606849Smrgfi
1499f606849Smrg
150fba89afeSmrgcygpath_u="cygpath -u -f -"
151fba89afeSmrgif test "$depmode" = msvcmsys; then
152cdbfa18aSmrg  # This is just like msvisualcpp but w/o cygpath translation.
153cdbfa18aSmrg  # Just convert the backslash-escaped backslashes to single forward
154cdbfa18aSmrg  # slashes to satisfy depend.m4
155cdbfa18aSmrg  cygpath_u='sed s,\\\\,/,g'
156cdbfa18aSmrg  depmode=msvisualcpp
157cdbfa18aSmrgfi
158cdbfa18aSmrg
159cdbfa18aSmrgif test "$depmode" = msvc7msys; then
160cdbfa18aSmrg  # This is just like msvc7 but w/o cygpath translation.
161cdbfa18aSmrg  # Just convert the backslash-escaped backslashes to single forward
162cdbfa18aSmrg  # slashes to satisfy depend.m4
163cdbfa18aSmrg  cygpath_u='sed s,\\\\,/,g'
164cdbfa18aSmrg  depmode=msvc7
165cdbfa18aSmrgfi
166cdbfa18aSmrg
167cdbfa18aSmrgif test "$depmode" = xlc; then
168cdbfa18aSmrg  # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information.
169cdbfa18aSmrg  gccflag=-qmakedep=gcc,-MF
170cdbfa18aSmrg  depmode=gcc
171fba89afeSmrgfi
172fba89afeSmrg
1739f606849Smrgcase "$depmode" in
1749f606849Smrggcc3)
1759f606849Smrg## gcc 3 implements dependency tracking that does exactly what
1769f606849Smrg## we want.  Yay!  Note: for some reason libtool 1.4 doesn't like
1779f606849Smrg## it if -MD -MP comes after the -MF stuff.  Hmm.
1789f606849Smrg## Unfortunately, FreeBSD c89 acceptance of flags depends upon
1799f606849Smrg## the command line argument order; so add the flags where they
1809f606849Smrg## appear in depend2.am.  Note that the slowdown incurred here
1819f606849Smrg## affects only configure: in makefiles, %FASTDEP% shortcuts this.
1829f606849Smrg  for arg
1839f606849Smrg  do
1849f606849Smrg    case $arg in
1859f606849Smrg    -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;;
1869f606849Smrg    *)  set fnord "$@" "$arg" ;;
1879f606849Smrg    esac
1889f606849Smrg    shift # fnord
1899f606849Smrg    shift # $arg
1909f606849Smrg  done
1919f606849Smrg  "$@"
1929f606849Smrg  stat=$?
193cdbfa18aSmrg  if test $stat -ne 0; then
1949f606849Smrg    rm -f "$tmpdepfile"
1959f606849Smrg    exit $stat
1969f606849Smrg  fi
1979f606849Smrg  mv "$tmpdepfile" "$depfile"
1989f606849Smrg  ;;
1999f606849Smrg
2009f606849Smrggcc)
201cdbfa18aSmrg## Note that this doesn't just cater to obsosete pre-3.x GCC compilers.
202cdbfa18aSmrg## but also to in-use compilers like IMB xlc/xlC and the HP C compiler.
203cdbfa18aSmrg## (see the conditional assignment to $gccflag above).
2049f606849Smrg## There are various ways to get dependency output from gcc.  Here's
2059f606849Smrg## why we pick this rather obscure method:
2069f606849Smrg## - Don't want to use -MD because we'd like the dependencies to end
2079f606849Smrg##   up in a subdir.  Having to rename by hand is ugly.
2089f606849Smrg##   (We might end up doing this anyway to support other compilers.)
2099f606849Smrg## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
210cdbfa18aSmrg##   -MM, not -M (despite what the docs say).  Also, it might not be
211cdbfa18aSmrg##   supported by the other compilers which use the 'gcc' depmode.
2129f606849Smrg## - Using -M directly means running the compiler twice (even worse
2139f606849Smrg##   than renaming).
2149f606849Smrg  if test -z "$gccflag"; then
2159f606849Smrg    gccflag=-MD,
2169f606849Smrg  fi
2179f606849Smrg  "$@" -Wp,"$gccflag$tmpdepfile"
2189f606849Smrg  stat=$?
219cdbfa18aSmrg  if test $stat -ne 0; then
2209f606849Smrg    rm -f "$tmpdepfile"
2219f606849Smrg    exit $stat
2229f606849Smrg  fi
2239f606849Smrg  rm -f "$depfile"
2249f606849Smrg  echo "$object : \\" > "$depfile"
225cdbfa18aSmrg  # The second -e expression handles DOS-style file names with drive
226cdbfa18aSmrg  # letters.
2279f606849Smrg  sed -e 's/^[^:]*: / /' \
2289f606849Smrg      -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
229cdbfa18aSmrg## This next piece of magic avoids the "deleted header file" problem.
2309f606849Smrg## The problem is that when a header file which appears in a .P file
2319f606849Smrg## is deleted, the dependency causes make to die (because there is
2329f606849Smrg## typically no way to rebuild the header).  We avoid this by adding
2339f606849Smrg## dummy dependencies for each header file.  Too bad gcc doesn't do
2349f606849Smrg## this for us directly.
235cdbfa18aSmrg## Some versions of gcc put a space before the ':'.  On the theory
2369f606849Smrg## that the space means something, we add a space to the output as
237cdbfa18aSmrg## well.  hp depmode also adds that space, but also prefixes the VPATH
238cdbfa18aSmrg## to the object.  Take care to not repeat it in the output.
2399f606849Smrg## Some versions of the HPUX 10.20 sed can't process this invocation
2409f606849Smrg## correctly.  Breaking it into two sed invocations is a workaround.
241cdbfa18aSmrg  tr ' ' "$nl" < "$tmpdepfile" \
242cdbfa18aSmrg    | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \
243cdbfa18aSmrg    | sed -e 's/$/ :/' >> "$depfile"
2449f606849Smrg  rm -f "$tmpdepfile"
2459f606849Smrg  ;;
2469f606849Smrg
2479f606849Smrghp)
2489f606849Smrg  # This case exists only to let depend.m4 do its work.  It works by
2499f606849Smrg  # looking at the text of this script.  This case will never be run,
2509f606849Smrg  # since it is checked for above.
2519f606849Smrg  exit 1
2529f606849Smrg  ;;
2539f606849Smrg
2549f606849Smrgsgi)
2559f606849Smrg  if test "$libtool" = yes; then
2569f606849Smrg    "$@" "-Wp,-MDupdate,$tmpdepfile"
2579f606849Smrg  else
2589f606849Smrg    "$@" -MDupdate "$tmpdepfile"
2599f606849Smrg  fi
2609f606849Smrg  stat=$?
261cdbfa18aSmrg  if test $stat -ne 0; then
2629f606849Smrg    rm -f "$tmpdepfile"
2639f606849Smrg    exit $stat
2649f606849Smrg  fi
2659f606849Smrg  rm -f "$depfile"
2669f606849Smrg
2679f606849Smrg  if test -f "$tmpdepfile"; then  # yes, the sourcefile depend on other files
2689f606849Smrg    echo "$object : \\" > "$depfile"
2699f606849Smrg    # Clip off the initial element (the dependent).  Don't try to be
2709f606849Smrg    # clever and replace this with sed code, as IRIX sed won't handle
2719f606849Smrg    # lines with more than a fixed number of characters (4096 in
2729f606849Smrg    # IRIX 6.2 sed, 8192 in IRIX 6.5).  We also remove comment lines;
273cdbfa18aSmrg    # the IRIX cc adds comments like '#:fec' to the end of the
2749f606849Smrg    # dependency line.
275cdbfa18aSmrg    tr ' ' "$nl" < "$tmpdepfile" \
276cdbfa18aSmrg      | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \
277cdbfa18aSmrg      | tr "$nl" ' ' >> "$depfile"
278fba89afeSmrg    echo >> "$depfile"
2799f606849Smrg    # The second pass generates a dummy entry for each header file.
280cdbfa18aSmrg    tr ' ' "$nl" < "$tmpdepfile" \
281cdbfa18aSmrg      | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
282cdbfa18aSmrg      >> "$depfile"
2839f606849Smrg  else
284cdbfa18aSmrg    make_dummy_depfile
2859f606849Smrg  fi
2869f606849Smrg  rm -f "$tmpdepfile"
2879f606849Smrg  ;;
2889f606849Smrg
289cdbfa18aSmrgxlc)
290cdbfa18aSmrg  # This case exists only to let depend.m4 do its work.  It works by
291cdbfa18aSmrg  # looking at the text of this script.  This case will never be run,
292cdbfa18aSmrg  # since it is checked for above.
293cdbfa18aSmrg  exit 1
294cdbfa18aSmrg  ;;
295cdbfa18aSmrg
2969f606849Smrgaix)
2979f606849Smrg  # The C for AIX Compiler uses -M and outputs the dependencies
2989f606849Smrg  # in a .u file.  In older versions, this file always lives in the
299cdbfa18aSmrg  # current directory.  Also, the AIX compiler puts '$object:' at the
3009f606849Smrg  # start of each line; $object doesn't have directory information.
3019f606849Smrg  # Version 6 uses the directory in both cases.
302cdbfa18aSmrg  set_dir_from "$object"
303cdbfa18aSmrg  set_base_from "$object"
3049f606849Smrg  if test "$libtool" = yes; then
305fba89afeSmrg    tmpdepfile1=$dir$base.u
306fba89afeSmrg    tmpdepfile2=$base.u
307fba89afeSmrg    tmpdepfile3=$dir.libs/$base.u
3089f606849Smrg    "$@" -Wc,-M
3099f606849Smrg  else
310fba89afeSmrg    tmpdepfile1=$dir$base.u
311fba89afeSmrg    tmpdepfile2=$dir$base.u
312fba89afeSmrg    tmpdepfile3=$dir$base.u
3139f606849Smrg    "$@" -M
3149f606849Smrg  fi
3159f606849Smrg  stat=$?
316cdbfa18aSmrg  if test $stat -ne 0; then
317fba89afeSmrg    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
3189f606849Smrg    exit $stat
3199f606849Smrg  fi
3209f606849Smrg
321fba89afeSmrg  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
322fba89afeSmrg  do
323fba89afeSmrg    test -f "$tmpdepfile" && break
324fba89afeSmrg  done
325cdbfa18aSmrg  aix_post_process_depfile
326cdbfa18aSmrg  ;;
327cdbfa18aSmrg
328cdbfa18aSmrgtcc)
329cdbfa18aSmrg  # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26
330cdbfa18aSmrg  # FIXME: That version still under development at the moment of writing.
331cdbfa18aSmrg  #        Make that this statement remains true also for stable, released
332cdbfa18aSmrg  #        versions.
333cdbfa18aSmrg  # It will wrap lines (doesn't matter whether long or short) with a
334cdbfa18aSmrg  # trailing '\', as in:
335cdbfa18aSmrg  #
336cdbfa18aSmrg  #   foo.o : \
337cdbfa18aSmrg  #    foo.c \
338cdbfa18aSmrg  #    foo.h \
339cdbfa18aSmrg  #
340cdbfa18aSmrg  # It will put a trailing '\' even on the last line, and will use leading
341cdbfa18aSmrg  # spaces rather than leading tabs (at least since its commit 0394caf7
342cdbfa18aSmrg  # "Emit spaces for -MD").
343cdbfa18aSmrg  "$@" -MD -MF "$tmpdepfile"
344cdbfa18aSmrg  stat=$?
345cdbfa18aSmrg  if test $stat -ne 0; then
346cdbfa18aSmrg    rm -f "$tmpdepfile"
347cdbfa18aSmrg    exit $stat
3489f606849Smrg  fi
349cdbfa18aSmrg  rm -f "$depfile"
350cdbfa18aSmrg  # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'.
351cdbfa18aSmrg  # We have to change lines of the first kind to '$object: \'.
352cdbfa18aSmrg  sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile"
353cdbfa18aSmrg  # And for each line of the second kind, we have to emit a 'dep.h:'
354cdbfa18aSmrg  # dummy dependency, to avoid the deleted-header problem.
355cdbfa18aSmrg  sed -n -e 's|^  *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile"
3569f606849Smrg  rm -f "$tmpdepfile"
3579f606849Smrg  ;;
3589f606849Smrg
359cdbfa18aSmrg## The order of this option in the case statement is important, since the
360cdbfa18aSmrg## shell code in configure will try each of these formats in the order
361cdbfa18aSmrg## listed in this file.  A plain '-MD' option would be understood by many
362cdbfa18aSmrg## compilers, so we must ensure this comes after the gcc and icc options.
363cdbfa18aSmrgpgcc)
364cdbfa18aSmrg  # Portland's C compiler understands '-MD'.
365cdbfa18aSmrg  # Will always output deps to 'file.d' where file is the root name of the
366cdbfa18aSmrg  # source file under compilation, even if file resides in a subdirectory.
367cdbfa18aSmrg  # The object file name does not affect the name of the '.d' file.
368cdbfa18aSmrg  # pgcc 10.2 will output
3699f606849Smrg  #    foo.o: sub/foo.c sub/foo.h
370cdbfa18aSmrg  # and will wrap long lines using '\' :
3719f606849Smrg  #    foo.o: sub/foo.c ... \
3729f606849Smrg  #     sub/foo.h ... \
3739f606849Smrg  #     ...
374cdbfa18aSmrg  set_dir_from "$object"
375cdbfa18aSmrg  # Use the source, not the object, to determine the base name, since
376cdbfa18aSmrg  # that's sadly what pgcc will do too.
377cdbfa18aSmrg  set_base_from "$source"
378cdbfa18aSmrg  tmpdepfile=$base.d
379cdbfa18aSmrg
380cdbfa18aSmrg  # For projects that build the same source file twice into different object
381cdbfa18aSmrg  # files, the pgcc approach of using the *source* file root name can cause
382cdbfa18aSmrg  # problems in parallel builds.  Use a locking strategy to avoid stomping on
383cdbfa18aSmrg  # the same $tmpdepfile.
384cdbfa18aSmrg  lockdir=$base.d-lock
385cdbfa18aSmrg  trap "
386cdbfa18aSmrg    echo '$0: caught signal, cleaning up...' >&2
387cdbfa18aSmrg    rmdir '$lockdir'
388cdbfa18aSmrg    exit 1
389cdbfa18aSmrg  " 1 2 13 15
390cdbfa18aSmrg  numtries=100
391cdbfa18aSmrg  i=$numtries
392cdbfa18aSmrg  while test $i -gt 0; do
393cdbfa18aSmrg    # mkdir is a portable test-and-set.
394cdbfa18aSmrg    if mkdir "$lockdir" 2>/dev/null; then
395cdbfa18aSmrg      # This process acquired the lock.
396cdbfa18aSmrg      "$@" -MD
397cdbfa18aSmrg      stat=$?
398cdbfa18aSmrg      # Release the lock.
399cdbfa18aSmrg      rmdir "$lockdir"
400cdbfa18aSmrg      break
401cdbfa18aSmrg    else
402cdbfa18aSmrg      # If the lock is being held by a different process, wait
403cdbfa18aSmrg      # until the winning process is done or we timeout.
404cdbfa18aSmrg      while test -d "$lockdir" && test $i -gt 0; do
405cdbfa18aSmrg        sleep 1
406cdbfa18aSmrg        i=`expr $i - 1`
407cdbfa18aSmrg      done
408cdbfa18aSmrg    fi
409cdbfa18aSmrg    i=`expr $i - 1`
410cdbfa18aSmrg  done
411cdbfa18aSmrg  trap - 1 2 13 15
412cdbfa18aSmrg  if test $i -le 0; then
413cdbfa18aSmrg    echo "$0: failed to acquire lock after $numtries attempts" >&2
414cdbfa18aSmrg    echo "$0: check lockdir '$lockdir'" >&2
415cdbfa18aSmrg    exit 1
416cdbfa18aSmrg  fi
4179f606849Smrg
418cdbfa18aSmrg  if test $stat -ne 0; then
4199f606849Smrg    rm -f "$tmpdepfile"
4209f606849Smrg    exit $stat
4219f606849Smrg  fi
4229f606849Smrg  rm -f "$depfile"
4239f606849Smrg  # Each line is of the form `foo.o: dependent.h',
4249f606849Smrg  # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'.
4259f606849Smrg  # Do two passes, one to just change these to
4269f606849Smrg  # `$object: dependent.h' and one to simply `dependent.h:'.
4279f606849Smrg  sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
4289f606849Smrg  # Some versions of the HPUX 10.20 sed can't process this invocation
4299f606849Smrg  # correctly.  Breaking it into two sed invocations is a workaround.
430cdbfa18aSmrg  sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \
431cdbfa18aSmrg    | sed -e 's/$/ :/' >> "$depfile"
4329f606849Smrg  rm -f "$tmpdepfile"
4339f606849Smrg  ;;
4349f606849Smrg
4359f606849Smrghp2)
4369f606849Smrg  # The "hp" stanza above does not work with aCC (C++) and HP's ia64
4379f606849Smrg  # compilers, which have integrated preprocessors.  The correct option
4389f606849Smrg  # to use with these is +Maked; it writes dependencies to a file named
4399f606849Smrg  # 'foo.d', which lands next to the object file, wherever that
4409f606849Smrg  # happens to be.
4419f606849Smrg  # Much of this is similar to the tru64 case; see comments there.
442cdbfa18aSmrg  set_dir_from  "$object"
443cdbfa18aSmrg  set_base_from "$object"
4449f606849Smrg  if test "$libtool" = yes; then
4459f606849Smrg    tmpdepfile1=$dir$base.d
4469f606849Smrg    tmpdepfile2=$dir.libs/$base.d
4479f606849Smrg    "$@" -Wc,+Maked
4489f606849Smrg  else
4499f606849Smrg    tmpdepfile1=$dir$base.d
4509f606849Smrg    tmpdepfile2=$dir$base.d
4519f606849Smrg    "$@" +Maked
4529f606849Smrg  fi
4539f606849Smrg  stat=$?
454cdbfa18aSmrg  if test $stat -ne 0; then
4559f606849Smrg     rm -f "$tmpdepfile1" "$tmpdepfile2"
4569f606849Smrg     exit $stat
4579f606849Smrg  fi
4589f606849Smrg
4599f606849Smrg  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2"
4609f606849Smrg  do
4619f606849Smrg    test -f "$tmpdepfile" && break
4629f606849Smrg  done
4639f606849Smrg  if test -f "$tmpdepfile"; then
464cdbfa18aSmrg    sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile"
465cdbfa18aSmrg    # Add 'dependent.h:' lines.
466fba89afeSmrg    sed -ne '2,${
467cdbfa18aSmrg               s/^ *//
468cdbfa18aSmrg               s/ \\*$//
469cdbfa18aSmrg               s/$/:/
470cdbfa18aSmrg               p
471cdbfa18aSmrg             }' "$tmpdepfile" >> "$depfile"
4729f606849Smrg  else
473cdbfa18aSmrg    make_dummy_depfile
4749f606849Smrg  fi
4759f606849Smrg  rm -f "$tmpdepfile" "$tmpdepfile2"
4769f606849Smrg  ;;
4779f606849Smrg
4789f606849Smrgtru64)
479cdbfa18aSmrg  # The Tru64 compiler uses -MD to generate dependencies as a side
480cdbfa18aSmrg  # effect.  'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'.
481cdbfa18aSmrg  # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
482cdbfa18aSmrg  # dependencies in 'foo.d' instead, so we check for that too.
483cdbfa18aSmrg  # Subdirectories are respected.
484cdbfa18aSmrg  set_dir_from  "$object"
485cdbfa18aSmrg  set_base_from "$object"
486cdbfa18aSmrg
487cdbfa18aSmrg  if test "$libtool" = yes; then
488cdbfa18aSmrg    # Libtool generates 2 separate objects for the 2 libraries.  These
489cdbfa18aSmrg    # two compilations output dependencies in $dir.libs/$base.o.d and
490cdbfa18aSmrg    # in $dir$base.o.d.  We have to check for both files, because
491cdbfa18aSmrg    # one of the two compilations can be disabled.  We should prefer
492cdbfa18aSmrg    # $dir$base.o.d over $dir.libs/$base.o.d because the latter is
493cdbfa18aSmrg    # automatically cleaned when .libs/ is deleted, while ignoring
494cdbfa18aSmrg    # the former would cause a distcleancheck panic.
495cdbfa18aSmrg    tmpdepfile1=$dir$base.o.d          # libtool 1.5
496cdbfa18aSmrg    tmpdepfile2=$dir.libs/$base.o.d    # Likewise.
497cdbfa18aSmrg    tmpdepfile3=$dir.libs/$base.d      # Compaq CCC V6.2-504
498cdbfa18aSmrg    "$@" -Wc,-MD
499cdbfa18aSmrg  else
500cdbfa18aSmrg    tmpdepfile1=$dir$base.d
501cdbfa18aSmrg    tmpdepfile2=$dir$base.d
502cdbfa18aSmrg    tmpdepfile3=$dir$base.d
503cdbfa18aSmrg    "$@" -MD
504cdbfa18aSmrg  fi
505cdbfa18aSmrg
506cdbfa18aSmrg  stat=$?
507cdbfa18aSmrg  if test $stat -ne 0; then
508cdbfa18aSmrg    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
509cdbfa18aSmrg    exit $stat
510cdbfa18aSmrg  fi
511cdbfa18aSmrg
512cdbfa18aSmrg  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
513cdbfa18aSmrg  do
514cdbfa18aSmrg    test -f "$tmpdepfile" && break
515cdbfa18aSmrg  done
516cdbfa18aSmrg  # Same post-processing that is required for AIX mode.
517cdbfa18aSmrg  aix_post_process_depfile
518cdbfa18aSmrg  ;;
519cdbfa18aSmrg
520cdbfa18aSmrgmsvc7)
521cdbfa18aSmrg  if test "$libtool" = yes; then
522cdbfa18aSmrg    showIncludes=-Wc,-showIncludes
523cdbfa18aSmrg  else
524cdbfa18aSmrg    showIncludes=-showIncludes
525cdbfa18aSmrg  fi
526cdbfa18aSmrg  "$@" $showIncludes > "$tmpdepfile"
527cdbfa18aSmrg  stat=$?
528cdbfa18aSmrg  grep -v '^Note: including file: ' "$tmpdepfile"
529cdbfa18aSmrg  if test $stat -ne 0; then
530cdbfa18aSmrg    rm -f "$tmpdepfile"
531cdbfa18aSmrg    exit $stat
532cdbfa18aSmrg  fi
533cdbfa18aSmrg  rm -f "$depfile"
534cdbfa18aSmrg  echo "$object : \\" > "$depfile"
535cdbfa18aSmrg  # The first sed program below extracts the file names and escapes
536cdbfa18aSmrg  # backslashes for cygpath.  The second sed program outputs the file
537cdbfa18aSmrg  # name when reading, but also accumulates all include files in the
538cdbfa18aSmrg  # hold buffer in order to output them again at the end.  This only
539cdbfa18aSmrg  # works with sed implementations that can handle large buffers.
540cdbfa18aSmrg  sed < "$tmpdepfile" -n '
541cdbfa18aSmrg/^Note: including file:  *\(.*\)/ {
542cdbfa18aSmrg  s//\1/
543cdbfa18aSmrg  s/\\/\\\\/g
544cdbfa18aSmrg  p
545cdbfa18aSmrg}' | $cygpath_u | sort -u | sed -n '
546cdbfa18aSmrgs/ /\\ /g
547cdbfa18aSmrgs/\(.*\)/'"$tab"'\1 \\/p
548cdbfa18aSmrgs/.\(.*\) \\/\1:/
549cdbfa18aSmrgH
550cdbfa18aSmrg$ {
551cdbfa18aSmrg  s/.*/'"$tab"'/
552cdbfa18aSmrg  G
553cdbfa18aSmrg  p
554cdbfa18aSmrg}' >> "$depfile"
555fef5d1ffSmrg  echo >> "$depfile" # make sure the fragment doesn't end with a backslash
556cdbfa18aSmrg  rm -f "$tmpdepfile"
557cdbfa18aSmrg  ;;
558cdbfa18aSmrg
559cdbfa18aSmrgmsvc7msys)
560cdbfa18aSmrg  # This case exists only to let depend.m4 do its work.  It works by
561cdbfa18aSmrg  # looking at the text of this script.  This case will never be run,
562cdbfa18aSmrg  # since it is checked for above.
563cdbfa18aSmrg  exit 1
564cdbfa18aSmrg  ;;
5659f606849Smrg
5669f606849Smrg#nosideeffect)
5679f606849Smrg  # This comment above is used by automake to tell side-effect
5689f606849Smrg  # dependency tracking mechanisms from slower ones.
5699f606849Smrg
5709f606849Smrgdashmstdout)
5719f606849Smrg  # Important note: in order to support this mode, a compiler *must*
5729f606849Smrg  # always write the preprocessed file to stdout, regardless of -o.
5739f606849Smrg  "$@" || exit $?
5749f606849Smrg
5759f606849Smrg  # Remove the call to Libtool.
5769f606849Smrg  if test "$libtool" = yes; then
577fba89afeSmrg    while test "X$1" != 'X--mode=compile'; do
5789f606849Smrg      shift
5799f606849Smrg    done
5809f606849Smrg    shift
5819f606849Smrg  fi
5829f606849Smrg
583cdbfa18aSmrg  # Remove '-o $object'.
5849f606849Smrg  IFS=" "
5859f606849Smrg  for arg
5869f606849Smrg  do
5879f606849Smrg    case $arg in
5889f606849Smrg    -o)
5899f606849Smrg      shift
5909f606849Smrg      ;;
5919f606849Smrg    $object)
5929f606849Smrg      shift
5939f606849Smrg      ;;
5949f606849Smrg    *)
5959f606849Smrg      set fnord "$@" "$arg"
5969f606849Smrg      shift # fnord
5979f606849Smrg      shift # $arg
5989f606849Smrg      ;;
5999f606849Smrg    esac
6009f606849Smrg  done
6019f606849Smrg
6029f606849Smrg  test -z "$dashmflag" && dashmflag=-M
603cdbfa18aSmrg  # Require at least two characters before searching for ':'
6049f606849Smrg  # in the target name.  This is to cope with DOS-style filenames:
605cdbfa18aSmrg  # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise.
6069f606849Smrg  "$@" $dashmflag |
607cdbfa18aSmrg    sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile"
6089f606849Smrg  rm -f "$depfile"
6099f606849Smrg  cat < "$tmpdepfile" > "$depfile"
610cdbfa18aSmrg  # Some versions of the HPUX 10.20 sed can't process this sed invocation
611cdbfa18aSmrg  # correctly.  Breaking it into two sed invocations is a workaround.
612cdbfa18aSmrg  tr ' ' "$nl" < "$tmpdepfile" \
613cdbfa18aSmrg    | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
614cdbfa18aSmrg    | sed -e 's/$/ :/' >> "$depfile"
6159f606849Smrg  rm -f "$tmpdepfile"
6169f606849Smrg  ;;
6179f606849Smrg
6189f606849SmrgdashXmstdout)
6199f606849Smrg  # This case only exists to satisfy depend.m4.  It is never actually
6209f606849Smrg  # run, as this mode is specially recognized in the preamble.
6219f606849Smrg  exit 1
6229f606849Smrg  ;;
6239f606849Smrg
6249f606849Smrgmakedepend)
6259f606849Smrg  "$@" || exit $?
6269f606849Smrg  # Remove any Libtool call
6279f606849Smrg  if test "$libtool" = yes; then
628fba89afeSmrg    while test "X$1" != 'X--mode=compile'; do
6299f606849Smrg      shift
6309f606849Smrg    done
6319f606849Smrg    shift
6329f606849Smrg  fi
6339f606849Smrg  # X makedepend
6349f606849Smrg  shift
635fba89afeSmrg  cleared=no eat=no
636fba89afeSmrg  for arg
637fba89afeSmrg  do
6389f606849Smrg    case $cleared in
6399f606849Smrg    no)
6409f606849Smrg      set ""; shift
6419f606849Smrg      cleared=yes ;;
6429f606849Smrg    esac
643fba89afeSmrg    if test $eat = yes; then
644fba89afeSmrg      eat=no
645fba89afeSmrg      continue
646fba89afeSmrg    fi
6479f606849Smrg    case "$arg" in
6489f606849Smrg    -D*|-I*)
6499f606849Smrg      set fnord "$@" "$arg"; shift ;;
6509f606849Smrg    # Strip any option that makedepend may not understand.  Remove
6519f606849Smrg    # the object too, otherwise makedepend will parse it as a source file.
652fba89afeSmrg    -arch)
653fba89afeSmrg      eat=yes ;;
6549f606849Smrg    -*|$object)
6559f606849Smrg      ;;
6569f606849Smrg    *)
6579f606849Smrg      set fnord "$@" "$arg"; shift ;;
6589f606849Smrg    esac
6599f606849Smrg  done
660fba89afeSmrg  obj_suffix=`echo "$object" | sed 's/^.*\././'`
6619f606849Smrg  touch "$tmpdepfile"
6629f606849Smrg  ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
6639f606849Smrg  rm -f "$depfile"
664cdbfa18aSmrg  # makedepend may prepend the VPATH from the source file name to the object.
665cdbfa18aSmrg  # No need to regex-escape $object, excess matching of '.' is harmless.
666cdbfa18aSmrg  sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile"
667cdbfa18aSmrg  # Some versions of the HPUX 10.20 sed can't process the last invocation
668cdbfa18aSmrg  # correctly.  Breaking it into two sed invocations is a workaround.
669cdbfa18aSmrg  sed '1,2d' "$tmpdepfile" \
670cdbfa18aSmrg    | tr ' ' "$nl" \
671cdbfa18aSmrg    | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
672cdbfa18aSmrg    | sed -e 's/$/ :/' >> "$depfile"
6739f606849Smrg  rm -f "$tmpdepfile" "$tmpdepfile".bak
6749f606849Smrg  ;;
6759f606849Smrg
6769f606849Smrgcpp)
6779f606849Smrg  # Important note: in order to support this mode, a compiler *must*
6789f606849Smrg  # always write the preprocessed file to stdout.
6799f606849Smrg  "$@" || exit $?
6809f606849Smrg
6819f606849Smrg  # Remove the call to Libtool.
6829f606849Smrg  if test "$libtool" = yes; then
683fba89afeSmrg    while test "X$1" != 'X--mode=compile'; do
6849f606849Smrg      shift
6859f606849Smrg    done
6869f606849Smrg    shift
6879f606849Smrg  fi
6889f606849Smrg
689cdbfa18aSmrg  # Remove '-o $object'.
6909f606849Smrg  IFS=" "
6919f606849Smrg  for arg
6929f606849Smrg  do
6939f606849Smrg    case $arg in
6949f606849Smrg    -o)
6959f606849Smrg      shift
6969f606849Smrg      ;;
6979f606849Smrg    $object)
6989f606849Smrg      shift
6999f606849Smrg      ;;
7009f606849Smrg    *)
7019f606849Smrg      set fnord "$@" "$arg"
7029f606849Smrg      shift # fnord
7039f606849Smrg      shift # $arg
7049f606849Smrg      ;;
7059f606849Smrg    esac
7069f606849Smrg  done
7079f606849Smrg
708cdbfa18aSmrg  "$@" -E \
709cdbfa18aSmrg    | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
710cdbfa18aSmrg             -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
711cdbfa18aSmrg    | sed '$ s: \\$::' > "$tmpdepfile"
7129f606849Smrg  rm -f "$depfile"
7139f606849Smrg  echo "$object : \\" > "$depfile"
7149f606849Smrg  cat < "$tmpdepfile" >> "$depfile"
7159f606849Smrg  sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
7169f606849Smrg  rm -f "$tmpdepfile"
7179f606849Smrg  ;;
7189f606849Smrg
7199f606849Smrgmsvisualcpp)
7209f606849Smrg  # Important note: in order to support this mode, a compiler *must*
721fba89afeSmrg  # always write the preprocessed file to stdout.
7229f606849Smrg  "$@" || exit $?
723fba89afeSmrg
724fba89afeSmrg  # Remove the call to Libtool.
725fba89afeSmrg  if test "$libtool" = yes; then
726fba89afeSmrg    while test "X$1" != 'X--mode=compile'; do
727fba89afeSmrg      shift
728fba89afeSmrg    done
729fba89afeSmrg    shift
730fba89afeSmrg  fi
731fba89afeSmrg
7329f606849Smrg  IFS=" "
7339f606849Smrg  for arg
7349f606849Smrg  do
7359f606849Smrg    case "$arg" in
736fba89afeSmrg    -o)
737fba89afeSmrg      shift
738fba89afeSmrg      ;;
739fba89afeSmrg    $object)
740fba89afeSmrg      shift
741fba89afeSmrg      ;;
7429f606849Smrg    "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
743cdbfa18aSmrg        set fnord "$@"
744cdbfa18aSmrg        shift
745cdbfa18aSmrg        shift
746cdbfa18aSmrg        ;;
7479f606849Smrg    *)
748cdbfa18aSmrg        set fnord "$@" "$arg"
749cdbfa18aSmrg        shift
750cdbfa18aSmrg        shift
751cdbfa18aSmrg        ;;
7529f606849Smrg    esac
7539f606849Smrg  done
754fba89afeSmrg  "$@" -E 2>/dev/null |
755fba89afeSmrg  sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile"
7569f606849Smrg  rm -f "$depfile"
7579f606849Smrg  echo "$object : \\" > "$depfile"
758cdbfa18aSmrg  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile"
759cdbfa18aSmrg  echo "$tab" >> "$depfile"
760fba89afeSmrg  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile"
7619f606849Smrg  rm -f "$tmpdepfile"
7629f606849Smrg  ;;
7639f606849Smrg
764fba89afeSmrgmsvcmsys)
765fba89afeSmrg  # This case exists only to let depend.m4 do its work.  It works by
766fba89afeSmrg  # looking at the text of this script.  This case will never be run,
767fba89afeSmrg  # since it is checked for above.
768fba89afeSmrg  exit 1
769fba89afeSmrg  ;;
770fba89afeSmrg
7719f606849Smrgnone)
7729f606849Smrg  exec "$@"
7739f606849Smrg  ;;
7749f606849Smrg
7759f606849Smrg*)
7769f606849Smrg  echo "Unknown depmode $depmode" 1>&2
7779f606849Smrg  exit 1
7789f606849Smrg  ;;
7799f606849Smrgesac
7809f606849Smrg
7819f606849Smrgexit 0
7829f606849Smrg
7839f606849Smrg# Local Variables:
7849f606849Smrg# mode: shell-script
7859f606849Smrg# sh-indentation: 2
786949d0342Smrg# eval: (add-hook 'before-save-hook 'time-stamp)
7879f606849Smrg# time-stamp-start: "scriptversion="
7889f606849Smrg# time-stamp-format: "%:y-%02m-%02d.%02H"
789949d0342Smrg# time-stamp-time-zone: "UTC0"
790fba89afeSmrg# time-stamp-end: "; # UTC"
7919f606849Smrg# End:
792