depcomp revision d04472e1
1d1333322Smrg#! /bin/sh
2d1333322Smrg# depcomp - compile a program generating dependencies as side-effects
3d1333322Smrg
4d04472e1Smrgscriptversion=2018-03-07.03; # UTC
5d1333322Smrg
6d04472e1Smrg# Copyright (C) 1999-2021 Free Software Foundation, Inc.
7d1333322Smrg
8d1333322Smrg# This program is free software; you can redistribute it and/or modify
9d1333322Smrg# it under the terms of the GNU General Public License as published by
10d1333322Smrg# the Free Software Foundation; either version 2, or (at your option)
11d1333322Smrg# any later version.
12d1333322Smrg
13d1333322Smrg# This program is distributed in the hope that it will be useful,
14d1333322Smrg# but WITHOUT ANY WARRANTY; without even the implied warranty of
15d1333322Smrg# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16d1333322Smrg# GNU General Public License for more details.
17d1333322Smrg
18d1333322Smrg# You should have received a copy of the GNU General Public License
19d04472e1Smrg# along with this program.  If not, see <https://www.gnu.org/licenses/>.
20d1333322Smrg
21d1333322Smrg# As a special exception to the GNU General Public License, if you
22d1333322Smrg# distribute this file as part of a program that contains a
23d1333322Smrg# configuration script generated by Autoconf, you may include it under
24d1333322Smrg# the same distribution terms that you use for the rest of that program.
25d1333322Smrg
26d1333322Smrg# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>.
27d1333322Smrg
28d1333322Smrgcase $1 in
29d1333322Smrg  '')
3069ef5f27Smrg    echo "$0: No command.  Try '$0 --help' for more information." 1>&2
3169ef5f27Smrg    exit 1;
3269ef5f27Smrg    ;;
33d1333322Smrg  -h | --h*)
34d1333322Smrg    cat <<\EOF
35d1333322SmrgUsage: depcomp [--help] [--version] PROGRAM [ARGS]
36d1333322Smrg
37d1333322SmrgRun PROGRAMS ARGS to compile a file, generating dependencies
38d1333322Smrgas side-effects.
39d1333322Smrg
40d1333322SmrgEnvironment variables:
41d1333322Smrg  depmode     Dependency tracking mode.
4269ef5f27Smrg  source      Source file read by 'PROGRAMS ARGS'.
4369ef5f27Smrg  object      Object file output by 'PROGRAMS ARGS'.
44d1333322Smrg  DEPDIR      directory where to store dependencies.
45d1333322Smrg  depfile     Dependency file to output.
46c27291ebSmrg  tmpdepfile  Temporary file to use when outputting dependencies.
47d1333322Smrg  libtool     Whether libtool is used (yes/no).
48d1333322Smrg
49d1333322SmrgReport bugs to <bug-automake@gnu.org>.
50d1333322SmrgEOF
51d1333322Smrg    exit $?
52d1333322Smrg    ;;
53d1333322Smrg  -v | --v*)
54d1333322Smrg    echo "depcomp $scriptversion"
55d1333322Smrg    exit $?
56d1333322Smrg    ;;
57d1333322Smrgesac
58d1333322Smrg
5969ef5f27Smrg# Get the directory component of the given path, and save it in the
6069ef5f27Smrg# global variables '$dir'.  Note that this directory component will
6169ef5f27Smrg# be either empty or ending with a '/' character.  This is deliberate.
6269ef5f27Smrgset_dir_from ()
6369ef5f27Smrg{
6469ef5f27Smrg  case $1 in
6569ef5f27Smrg    */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;;
6669ef5f27Smrg      *) dir=;;
6769ef5f27Smrg  esac
6869ef5f27Smrg}
6969ef5f27Smrg
7069ef5f27Smrg# Get the suffix-stripped basename of the given path, and save it the
7169ef5f27Smrg# global variable '$base'.
7269ef5f27Smrgset_base_from ()
7369ef5f27Smrg{
7469ef5f27Smrg  base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'`
7569ef5f27Smrg}
7669ef5f27Smrg
7769ef5f27Smrg# If no dependency file was actually created by the compiler invocation,
7869ef5f27Smrg# we still have to create a dummy depfile, to avoid errors with the
7969ef5f27Smrg# Makefile "include basename.Plo" scheme.
8069ef5f27Smrgmake_dummy_depfile ()
8169ef5f27Smrg{
8269ef5f27Smrg  echo "#dummy" > "$depfile"
8369ef5f27Smrg}
8469ef5f27Smrg
8569ef5f27Smrg# Factor out some common post-processing of the generated depfile.
8669ef5f27Smrg# Requires the auxiliary global variable '$tmpdepfile' to be set.
8769ef5f27Smrgaix_post_process_depfile ()
8869ef5f27Smrg{
8969ef5f27Smrg  # If the compiler actually managed to produce a dependency file,
9069ef5f27Smrg  # post-process it.
9169ef5f27Smrg  if test -f "$tmpdepfile"; then
9269ef5f27Smrg    # Each line is of the form 'foo.o: dependency.h'.
9369ef5f27Smrg    # Do two passes, one to just change these to
9469ef5f27Smrg    #   $object: dependency.h
9569ef5f27Smrg    # and one to simply output
9669ef5f27Smrg    #   dependency.h:
9769ef5f27Smrg    # which is needed to avoid the deleted-header problem.
9869ef5f27Smrg    { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile"
9969ef5f27Smrg      sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile"
10069ef5f27Smrg    } > "$depfile"
10169ef5f27Smrg    rm -f "$tmpdepfile"
10269ef5f27Smrg  else
10369ef5f27Smrg    make_dummy_depfile
10469ef5f27Smrg  fi
10569ef5f27Smrg}
10669ef5f27Smrg
10769ef5f27Smrg# A tabulation character.
10869ef5f27Smrgtab='	'
10969ef5f27Smrg# A newline character.
11069ef5f27Smrgnl='
11169ef5f27Smrg'
11269ef5f27Smrg# Character ranges might be problematic outside the C locale.
11369ef5f27Smrg# These definitions help.
11469ef5f27Smrgupper=ABCDEFGHIJKLMNOPQRSTUVWXYZ
11569ef5f27Smrglower=abcdefghijklmnopqrstuvwxyz
11669ef5f27Smrgdigits=0123456789
11769ef5f27Smrgalpha=${upper}${lower}
11869ef5f27Smrg
119d1333322Smrgif test -z "$depmode" || test -z "$source" || test -z "$object"; then
120d1333322Smrg  echo "depcomp: Variables source, object and depmode must be set" 1>&2
121d1333322Smrg  exit 1
122d1333322Smrgfi
123d1333322Smrg
124d1333322Smrg# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.
125d1333322Smrgdepfile=${depfile-`echo "$object" |
126d1333322Smrg  sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`}
127d1333322Smrgtmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
128d1333322Smrg
129d1333322Smrgrm -f "$tmpdepfile"
130d1333322Smrg
13169ef5f27Smrg# Avoid interferences from the environment.
13269ef5f27Smrggccflag= dashmflag=
13369ef5f27Smrg
134d1333322Smrg# Some modes work just like other modes, but use different flags.  We
135d1333322Smrg# parameterize here, but still list the modes in the big case below,
136d1333322Smrg# to make depend.m4 easier to write.  Note that we *cannot* use a case
137d1333322Smrg# here, because this file can only contain one case statement.
138d1333322Smrgif test "$depmode" = hp; then
139d1333322Smrg  # HP compiler uses -M and no extra arg.
140d1333322Smrg  gccflag=-M
141d1333322Smrg  depmode=gcc
142d1333322Smrgfi
143d1333322Smrg
144d1333322Smrgif test "$depmode" = dashXmstdout; then
14569ef5f27Smrg  # This is just like dashmstdout with a different argument.
14669ef5f27Smrg  dashmflag=-xM
14769ef5f27Smrg  depmode=dashmstdout
148d1333322Smrgfi
149d1333322Smrg
1504f9ac78aSmrgcygpath_u="cygpath -u -f -"
1514f9ac78aSmrgif test "$depmode" = msvcmsys; then
15269ef5f27Smrg  # This is just like msvisualcpp but w/o cygpath translation.
15369ef5f27Smrg  # Just convert the backslash-escaped backslashes to single forward
15469ef5f27Smrg  # slashes to satisfy depend.m4
15569ef5f27Smrg  cygpath_u='sed s,\\\\,/,g'
15669ef5f27Smrg  depmode=msvisualcpp
1574f9ac78aSmrgfi
1584f9ac78aSmrg
159c27291ebSmrgif test "$depmode" = msvc7msys; then
16069ef5f27Smrg  # This is just like msvc7 but w/o cygpath translation.
16169ef5f27Smrg  # Just convert the backslash-escaped backslashes to single forward
16269ef5f27Smrg  # slashes to satisfy depend.m4
16369ef5f27Smrg  cygpath_u='sed s,\\\\,/,g'
16469ef5f27Smrg  depmode=msvc7
16569ef5f27Smrgfi
16669ef5f27Smrg
16769ef5f27Smrgif test "$depmode" = xlc; then
16869ef5f27Smrg  # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information.
16969ef5f27Smrg  gccflag=-qmakedep=gcc,-MF
17069ef5f27Smrg  depmode=gcc
171c27291ebSmrgfi
172c27291ebSmrg
173d1333322Smrgcase "$depmode" in
174d1333322Smrggcc3)
175d1333322Smrg## gcc 3 implements dependency tracking that does exactly what
176d1333322Smrg## we want.  Yay!  Note: for some reason libtool 1.4 doesn't like
177d1333322Smrg## it if -MD -MP comes after the -MF stuff.  Hmm.
178d1333322Smrg## Unfortunately, FreeBSD c89 acceptance of flags depends upon
179d1333322Smrg## the command line argument order; so add the flags where they
180d1333322Smrg## appear in depend2.am.  Note that the slowdown incurred here
181d1333322Smrg## affects only configure: in makefiles, %FASTDEP% shortcuts this.
182d1333322Smrg  for arg
183d1333322Smrg  do
184d1333322Smrg    case $arg in
185d1333322Smrg    -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;;
186d1333322Smrg    *)  set fnord "$@" "$arg" ;;
187d1333322Smrg    esac
188d1333322Smrg    shift # fnord
189d1333322Smrg    shift # $arg
190d1333322Smrg  done
191d1333322Smrg  "$@"
192d1333322Smrg  stat=$?
19369ef5f27Smrg  if test $stat -ne 0; then
194d1333322Smrg    rm -f "$tmpdepfile"
195d1333322Smrg    exit $stat
196d1333322Smrg  fi
197d1333322Smrg  mv "$tmpdepfile" "$depfile"
198d1333322Smrg  ;;
199d1333322Smrg
200d1333322Smrggcc)
20169ef5f27Smrg## Note that this doesn't just cater to obsosete pre-3.x GCC compilers.
20269ef5f27Smrg## but also to in-use compilers like IMB xlc/xlC and the HP C compiler.
20369ef5f27Smrg## (see the conditional assignment to $gccflag above).
204d1333322Smrg## There are various ways to get dependency output from gcc.  Here's
205d1333322Smrg## why we pick this rather obscure method:
206d1333322Smrg## - Don't want to use -MD because we'd like the dependencies to end
207d1333322Smrg##   up in a subdir.  Having to rename by hand is ugly.
208d1333322Smrg##   (We might end up doing this anyway to support other compilers.)
209d1333322Smrg## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
21069ef5f27Smrg##   -MM, not -M (despite what the docs say).  Also, it might not be
21169ef5f27Smrg##   supported by the other compilers which use the 'gcc' depmode.
212d1333322Smrg## - Using -M directly means running the compiler twice (even worse
213d1333322Smrg##   than renaming).
214d1333322Smrg  if test -z "$gccflag"; then
215d1333322Smrg    gccflag=-MD,
216d1333322Smrg  fi
217d1333322Smrg  "$@" -Wp,"$gccflag$tmpdepfile"
218d1333322Smrg  stat=$?
21969ef5f27Smrg  if test $stat -ne 0; then
220d1333322Smrg    rm -f "$tmpdepfile"
221d1333322Smrg    exit $stat
222d1333322Smrg  fi
223d1333322Smrg  rm -f "$depfile"
224d1333322Smrg  echo "$object : \\" > "$depfile"
22569ef5f27Smrg  # The second -e expression handles DOS-style file names with drive
22669ef5f27Smrg  # letters.
227d1333322Smrg  sed -e 's/^[^:]*: / /' \
228d1333322Smrg      -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
22969ef5f27Smrg## This next piece of magic avoids the "deleted header file" problem.
230d1333322Smrg## The problem is that when a header file which appears in a .P file
231d1333322Smrg## is deleted, the dependency causes make to die (because there is
232d1333322Smrg## typically no way to rebuild the header).  We avoid this by adding
233d1333322Smrg## dummy dependencies for each header file.  Too bad gcc doesn't do
234d1333322Smrg## this for us directly.
23569ef5f27Smrg## Some versions of gcc put a space before the ':'.  On the theory
236d1333322Smrg## that the space means something, we add a space to the output as
237c27291ebSmrg## well.  hp depmode also adds that space, but also prefixes the VPATH
238c27291ebSmrg## to the object.  Take care to not repeat it in the output.
239d1333322Smrg## Some versions of the HPUX 10.20 sed can't process this invocation
240d1333322Smrg## correctly.  Breaking it into two sed invocations is a workaround.
24169ef5f27Smrg  tr ' ' "$nl" < "$tmpdepfile" \
24269ef5f27Smrg    | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \
24369ef5f27Smrg    | sed -e 's/$/ :/' >> "$depfile"
244d1333322Smrg  rm -f "$tmpdepfile"
245d1333322Smrg  ;;
246d1333322Smrg
247d1333322Smrghp)
248d1333322Smrg  # This case exists only to let depend.m4 do its work.  It works by
249d1333322Smrg  # looking at the text of this script.  This case will never be run,
250d1333322Smrg  # since it is checked for above.
251d1333322Smrg  exit 1
252d1333322Smrg  ;;
253d1333322Smrg
254d1333322Smrgsgi)
255d1333322Smrg  if test "$libtool" = yes; then
256d1333322Smrg    "$@" "-Wp,-MDupdate,$tmpdepfile"
257d1333322Smrg  else
258d1333322Smrg    "$@" -MDupdate "$tmpdepfile"
259d1333322Smrg  fi
260d1333322Smrg  stat=$?
26169ef5f27Smrg  if test $stat -ne 0; then
262d1333322Smrg    rm -f "$tmpdepfile"
263d1333322Smrg    exit $stat
264d1333322Smrg  fi
265d1333322Smrg  rm -f "$depfile"
266d1333322Smrg
267d1333322Smrg  if test -f "$tmpdepfile"; then  # yes, the sourcefile depend on other files
268d1333322Smrg    echo "$object : \\" > "$depfile"
269d1333322Smrg    # Clip off the initial element (the dependent).  Don't try to be
270d1333322Smrg    # clever and replace this with sed code, as IRIX sed won't handle
271d1333322Smrg    # lines with more than a fixed number of characters (4096 in
272d1333322Smrg    # IRIX 6.2 sed, 8192 in IRIX 6.5).  We also remove comment lines;
27369ef5f27Smrg    # the IRIX cc adds comments like '#:fec' to the end of the
274d1333322Smrg    # dependency line.
27569ef5f27Smrg    tr ' ' "$nl" < "$tmpdepfile" \
27669ef5f27Smrg      | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \
27769ef5f27Smrg      | tr "$nl" ' ' >> "$depfile"
2784f9ac78aSmrg    echo >> "$depfile"
279d1333322Smrg    # The second pass generates a dummy entry for each header file.
28069ef5f27Smrg    tr ' ' "$nl" < "$tmpdepfile" \
28169ef5f27Smrg      | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
28269ef5f27Smrg      >> "$depfile"
283d1333322Smrg  else
28469ef5f27Smrg    make_dummy_depfile
285d1333322Smrg  fi
286d1333322Smrg  rm -f "$tmpdepfile"
287d1333322Smrg  ;;
288d1333322Smrg
28969ef5f27Smrgxlc)
29069ef5f27Smrg  # This case exists only to let depend.m4 do its work.  It works by
29169ef5f27Smrg  # looking at the text of this script.  This case will never be run,
29269ef5f27Smrg  # since it is checked for above.
29369ef5f27Smrg  exit 1
29469ef5f27Smrg  ;;
29569ef5f27Smrg
296d1333322Smrgaix)
297d1333322Smrg  # The C for AIX Compiler uses -M and outputs the dependencies
298d1333322Smrg  # in a .u file.  In older versions, this file always lives in the
29969ef5f27Smrg  # current directory.  Also, the AIX compiler puts '$object:' at the
300d1333322Smrg  # start of each line; $object doesn't have directory information.
301d1333322Smrg  # Version 6 uses the directory in both cases.
30269ef5f27Smrg  set_dir_from "$object"
30369ef5f27Smrg  set_base_from "$object"
304d1333322Smrg  if test "$libtool" = yes; then
3054f9ac78aSmrg    tmpdepfile1=$dir$base.u
3064f9ac78aSmrg    tmpdepfile2=$base.u
3074f9ac78aSmrg    tmpdepfile3=$dir.libs/$base.u
308d1333322Smrg    "$@" -Wc,-M
309d1333322Smrg  else
3104f9ac78aSmrg    tmpdepfile1=$dir$base.u
3114f9ac78aSmrg    tmpdepfile2=$dir$base.u
3124f9ac78aSmrg    tmpdepfile3=$dir$base.u
313d1333322Smrg    "$@" -M
314d1333322Smrg  fi
315d1333322Smrg  stat=$?
31669ef5f27Smrg  if test $stat -ne 0; then
3174f9ac78aSmrg    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
318d1333322Smrg    exit $stat
319d1333322Smrg  fi
320d1333322Smrg
3214f9ac78aSmrg  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
3224f9ac78aSmrg  do
3234f9ac78aSmrg    test -f "$tmpdepfile" && break
3244f9ac78aSmrg  done
32569ef5f27Smrg  aix_post_process_depfile
32669ef5f27Smrg  ;;
32769ef5f27Smrg
32869ef5f27Smrgtcc)
32969ef5f27Smrg  # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26
33069ef5f27Smrg  # FIXME: That version still under development at the moment of writing.
33169ef5f27Smrg  #        Make that this statement remains true also for stable, released
33269ef5f27Smrg  #        versions.
33369ef5f27Smrg  # It will wrap lines (doesn't matter whether long or short) with a
33469ef5f27Smrg  # trailing '\', as in:
33569ef5f27Smrg  #
33669ef5f27Smrg  #   foo.o : \
33769ef5f27Smrg  #    foo.c \
33869ef5f27Smrg  #    foo.h \
33969ef5f27Smrg  #
34069ef5f27Smrg  # It will put a trailing '\' even on the last line, and will use leading
34169ef5f27Smrg  # spaces rather than leading tabs (at least since its commit 0394caf7
34269ef5f27Smrg  # "Emit spaces for -MD").
34369ef5f27Smrg  "$@" -MD -MF "$tmpdepfile"
34469ef5f27Smrg  stat=$?
34569ef5f27Smrg  if test $stat -ne 0; then
34669ef5f27Smrg    rm -f "$tmpdepfile"
34769ef5f27Smrg    exit $stat
348d1333322Smrg  fi
34969ef5f27Smrg  rm -f "$depfile"
35069ef5f27Smrg  # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'.
35169ef5f27Smrg  # We have to change lines of the first kind to '$object: \'.
35269ef5f27Smrg  sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile"
35369ef5f27Smrg  # And for each line of the second kind, we have to emit a 'dep.h:'
35469ef5f27Smrg  # dummy dependency, to avoid the deleted-header problem.
35569ef5f27Smrg  sed -n -e 's|^  *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile"
356d1333322Smrg  rm -f "$tmpdepfile"
357d1333322Smrg  ;;
358d1333322Smrg
35969ef5f27Smrg## The order of this option in the case statement is important, since the
36069ef5f27Smrg## shell code in configure will try each of these formats in the order
36169ef5f27Smrg## listed in this file.  A plain '-MD' option would be understood by many
36269ef5f27Smrg## compilers, so we must ensure this comes after the gcc and icc options.
36369ef5f27Smrgpgcc)
36469ef5f27Smrg  # Portland's C compiler understands '-MD'.
36569ef5f27Smrg  # Will always output deps to 'file.d' where file is the root name of the
36669ef5f27Smrg  # source file under compilation, even if file resides in a subdirectory.
36769ef5f27Smrg  # The object file name does not affect the name of the '.d' file.
36869ef5f27Smrg  # pgcc 10.2 will output
369d1333322Smrg  #    foo.o: sub/foo.c sub/foo.h
37069ef5f27Smrg  # and will wrap long lines using '\' :
371d1333322Smrg  #    foo.o: sub/foo.c ... \
372d1333322Smrg  #     sub/foo.h ... \
373d1333322Smrg  #     ...
37469ef5f27Smrg  set_dir_from "$object"
37569ef5f27Smrg  # Use the source, not the object, to determine the base name, since
37669ef5f27Smrg  # that's sadly what pgcc will do too.
37769ef5f27Smrg  set_base_from "$source"
37869ef5f27Smrg  tmpdepfile=$base.d
37969ef5f27Smrg
38069ef5f27Smrg  # For projects that build the same source file twice into different object
38169ef5f27Smrg  # files, the pgcc approach of using the *source* file root name can cause
38269ef5f27Smrg  # problems in parallel builds.  Use a locking strategy to avoid stomping on
38369ef5f27Smrg  # the same $tmpdepfile.
38469ef5f27Smrg  lockdir=$base.d-lock
38569ef5f27Smrg  trap "
38669ef5f27Smrg    echo '$0: caught signal, cleaning up...' >&2
38769ef5f27Smrg    rmdir '$lockdir'
38869ef5f27Smrg    exit 1
38969ef5f27Smrg  " 1 2 13 15
39069ef5f27Smrg  numtries=100
39169ef5f27Smrg  i=$numtries
39269ef5f27Smrg  while test $i -gt 0; do
39369ef5f27Smrg    # mkdir is a portable test-and-set.
39469ef5f27Smrg    if mkdir "$lockdir" 2>/dev/null; then
39569ef5f27Smrg      # This process acquired the lock.
39669ef5f27Smrg      "$@" -MD
39769ef5f27Smrg      stat=$?
39869ef5f27Smrg      # Release the lock.
39969ef5f27Smrg      rmdir "$lockdir"
40069ef5f27Smrg      break
40169ef5f27Smrg    else
40269ef5f27Smrg      # If the lock is being held by a different process, wait
40369ef5f27Smrg      # until the winning process is done or we timeout.
40469ef5f27Smrg      while test -d "$lockdir" && test $i -gt 0; do
40569ef5f27Smrg        sleep 1
40669ef5f27Smrg        i=`expr $i - 1`
40769ef5f27Smrg      done
40869ef5f27Smrg    fi
40969ef5f27Smrg    i=`expr $i - 1`
41069ef5f27Smrg  done
41169ef5f27Smrg  trap - 1 2 13 15
41269ef5f27Smrg  if test $i -le 0; then
41369ef5f27Smrg    echo "$0: failed to acquire lock after $numtries attempts" >&2
41469ef5f27Smrg    echo "$0: check lockdir '$lockdir'" >&2
41569ef5f27Smrg    exit 1
41669ef5f27Smrg  fi
417d1333322Smrg
41869ef5f27Smrg  if test $stat -ne 0; then
419d1333322Smrg    rm -f "$tmpdepfile"
420d1333322Smrg    exit $stat
421d1333322Smrg  fi
422d1333322Smrg  rm -f "$depfile"
423d1333322Smrg  # Each line is of the form `foo.o: dependent.h',
424d1333322Smrg  # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'.
425d1333322Smrg  # Do two passes, one to just change these to
426d1333322Smrg  # `$object: dependent.h' and one to simply `dependent.h:'.
427d1333322Smrg  sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
428d1333322Smrg  # Some versions of the HPUX 10.20 sed can't process this invocation
429d1333322Smrg  # correctly.  Breaking it into two sed invocations is a workaround.
43069ef5f27Smrg  sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \
43169ef5f27Smrg    | sed -e 's/$/ :/' >> "$depfile"
432d1333322Smrg  rm -f "$tmpdepfile"
433d1333322Smrg  ;;
434d1333322Smrg
435d1333322Smrghp2)
436d1333322Smrg  # The "hp" stanza above does not work with aCC (C++) and HP's ia64
437d1333322Smrg  # compilers, which have integrated preprocessors.  The correct option
438d1333322Smrg  # to use with these is +Maked; it writes dependencies to a file named
439d1333322Smrg  # 'foo.d', which lands next to the object file, wherever that
440d1333322Smrg  # happens to be.
441d1333322Smrg  # Much of this is similar to the tru64 case; see comments there.
44269ef5f27Smrg  set_dir_from  "$object"
44369ef5f27Smrg  set_base_from "$object"
444d1333322Smrg  if test "$libtool" = yes; then
445d1333322Smrg    tmpdepfile1=$dir$base.d
446d1333322Smrg    tmpdepfile2=$dir.libs/$base.d
447d1333322Smrg    "$@" -Wc,+Maked
448d1333322Smrg  else
449d1333322Smrg    tmpdepfile1=$dir$base.d
450d1333322Smrg    tmpdepfile2=$dir$base.d
451d1333322Smrg    "$@" +Maked
452d1333322Smrg  fi
453d1333322Smrg  stat=$?
45469ef5f27Smrg  if test $stat -ne 0; then
455d1333322Smrg     rm -f "$tmpdepfile1" "$tmpdepfile2"
456d1333322Smrg     exit $stat
457d1333322Smrg  fi
458d1333322Smrg
459d1333322Smrg  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2"
460d1333322Smrg  do
461d1333322Smrg    test -f "$tmpdepfile" && break
462d1333322Smrg  done
463d1333322Smrg  if test -f "$tmpdepfile"; then
46469ef5f27Smrg    sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile"
46569ef5f27Smrg    # Add 'dependent.h:' lines.
4664f9ac78aSmrg    sed -ne '2,${
46769ef5f27Smrg               s/^ *//
46869ef5f27Smrg               s/ \\*$//
46969ef5f27Smrg               s/$/:/
47069ef5f27Smrg               p
47169ef5f27Smrg             }' "$tmpdepfile" >> "$depfile"
472d1333322Smrg  else
47369ef5f27Smrg    make_dummy_depfile
474d1333322Smrg  fi
475d1333322Smrg  rm -f "$tmpdepfile" "$tmpdepfile2"
476d1333322Smrg  ;;
477d1333322Smrg
478d1333322Smrgtru64)
47969ef5f27Smrg  # The Tru64 compiler uses -MD to generate dependencies as a side
48069ef5f27Smrg  # effect.  'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'.
48169ef5f27Smrg  # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
48269ef5f27Smrg  # dependencies in 'foo.d' instead, so we check for that too.
48369ef5f27Smrg  # Subdirectories are respected.
48469ef5f27Smrg  set_dir_from  "$object"
48569ef5f27Smrg  set_base_from "$object"
48669ef5f27Smrg
48769ef5f27Smrg  if test "$libtool" = yes; then
48869ef5f27Smrg    # Libtool generates 2 separate objects for the 2 libraries.  These
48969ef5f27Smrg    # two compilations output dependencies in $dir.libs/$base.o.d and
49069ef5f27Smrg    # in $dir$base.o.d.  We have to check for both files, because
49169ef5f27Smrg    # one of the two compilations can be disabled.  We should prefer
49269ef5f27Smrg    # $dir$base.o.d over $dir.libs/$base.o.d because the latter is
49369ef5f27Smrg    # automatically cleaned when .libs/ is deleted, while ignoring
49469ef5f27Smrg    # the former would cause a distcleancheck panic.
49569ef5f27Smrg    tmpdepfile1=$dir$base.o.d          # libtool 1.5
49669ef5f27Smrg    tmpdepfile2=$dir.libs/$base.o.d    # Likewise.
49769ef5f27Smrg    tmpdepfile3=$dir.libs/$base.d      # Compaq CCC V6.2-504
49869ef5f27Smrg    "$@" -Wc,-MD
49969ef5f27Smrg  else
50069ef5f27Smrg    tmpdepfile1=$dir$base.d
50169ef5f27Smrg    tmpdepfile2=$dir$base.d
50269ef5f27Smrg    tmpdepfile3=$dir$base.d
50369ef5f27Smrg    "$@" -MD
50469ef5f27Smrg  fi
50569ef5f27Smrg
50669ef5f27Smrg  stat=$?
50769ef5f27Smrg  if test $stat -ne 0; then
50869ef5f27Smrg    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
50969ef5f27Smrg    exit $stat
51069ef5f27Smrg  fi
51169ef5f27Smrg
51269ef5f27Smrg  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
51369ef5f27Smrg  do
51469ef5f27Smrg    test -f "$tmpdepfile" && break
51569ef5f27Smrg  done
51669ef5f27Smrg  # Same post-processing that is required for AIX mode.
51769ef5f27Smrg  aix_post_process_depfile
51869ef5f27Smrg  ;;
519d1333322Smrg
520c27291ebSmrgmsvc7)
521c27291ebSmrg  if test "$libtool" = yes; then
522c27291ebSmrg    showIncludes=-Wc,-showIncludes
523c27291ebSmrg  else
524c27291ebSmrg    showIncludes=-showIncludes
525c27291ebSmrg  fi
526c27291ebSmrg  "$@" $showIncludes > "$tmpdepfile"
527c27291ebSmrg  stat=$?
528c27291ebSmrg  grep -v '^Note: including file: ' "$tmpdepfile"
52969ef5f27Smrg  if test $stat -ne 0; then
530c27291ebSmrg    rm -f "$tmpdepfile"
531c27291ebSmrg    exit $stat
532c27291ebSmrg  fi
533c27291ebSmrg  rm -f "$depfile"
534c27291ebSmrg  echo "$object : \\" > "$depfile"
535c27291ebSmrg  # The first sed program below extracts the file names and escapes
536c27291ebSmrg  # backslashes for cygpath.  The second sed program outputs the file
537c27291ebSmrg  # name when reading, but also accumulates all include files in the
538c27291ebSmrg  # hold buffer in order to output them again at the end.  This only
539c27291ebSmrg  # works with sed implementations that can handle large buffers.
540c27291ebSmrg  sed < "$tmpdepfile" -n '
541c27291ebSmrg/^Note: including file:  *\(.*\)/ {
542c27291ebSmrg  s//\1/
543c27291ebSmrg  s/\\/\\\\/g
544c27291ebSmrg  p
545c27291ebSmrg}' | $cygpath_u | sort -u | sed -n '
546c27291ebSmrgs/ /\\ /g
54769ef5f27Smrgs/\(.*\)/'"$tab"'\1 \\/p
548c27291ebSmrgs/.\(.*\) \\/\1:/
549c27291ebSmrgH
550c27291ebSmrg$ {
55169ef5f27Smrg  s/.*/'"$tab"'/
552c27291ebSmrg  G
553c27291ebSmrg  p
554c27291ebSmrg}' >> "$depfile"
55569ef5f27Smrg  echo >> "$depfile" # make sure the fragment doesn't end with a backslash
556c27291ebSmrg  rm -f "$tmpdepfile"
557c27291ebSmrg  ;;
558c27291ebSmrg
559c27291ebSmrgmsvc7msys)
560c27291ebSmrg  # This case exists only to let depend.m4 do its work.  It works by
561c27291ebSmrg  # looking at the text of this script.  This case will never be run,
562c27291ebSmrg  # since it is checked for above.
563c27291ebSmrg  exit 1
564c27291ebSmrg  ;;
565c27291ebSmrg
566d1333322Smrg#nosideeffect)
567d1333322Smrg  # This comment above is used by automake to tell side-effect
568d1333322Smrg  # dependency tracking mechanisms from slower ones.
569d1333322Smrg
570d1333322Smrgdashmstdout)
571d1333322Smrg  # Important note: in order to support this mode, a compiler *must*
572d1333322Smrg  # always write the preprocessed file to stdout, regardless of -o.
573d1333322Smrg  "$@" || exit $?
574d1333322Smrg
575d1333322Smrg  # Remove the call to Libtool.
576d1333322Smrg  if test "$libtool" = yes; then
5774f9ac78aSmrg    while test "X$1" != 'X--mode=compile'; do
578d1333322Smrg      shift
579d1333322Smrg    done
580d1333322Smrg    shift
581d1333322Smrg  fi
582d1333322Smrg
58369ef5f27Smrg  # Remove '-o $object'.
584d1333322Smrg  IFS=" "
585d1333322Smrg  for arg
586d1333322Smrg  do
587d1333322Smrg    case $arg in
588d1333322Smrg    -o)
589d1333322Smrg      shift
590d1333322Smrg      ;;
591d1333322Smrg    $object)
592d1333322Smrg      shift
593d1333322Smrg      ;;
594d1333322Smrg    *)
595d1333322Smrg      set fnord "$@" "$arg"
596d1333322Smrg      shift # fnord
597d1333322Smrg      shift # $arg
598d1333322Smrg      ;;
599d1333322Smrg    esac
600d1333322Smrg  done
601d1333322Smrg
602d1333322Smrg  test -z "$dashmflag" && dashmflag=-M
60369ef5f27Smrg  # Require at least two characters before searching for ':'
604d1333322Smrg  # in the target name.  This is to cope with DOS-style filenames:
60569ef5f27Smrg  # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise.
606d1333322Smrg  "$@" $dashmflag |
60769ef5f27Smrg    sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile"
608d1333322Smrg  rm -f "$depfile"
609d1333322Smrg  cat < "$tmpdepfile" > "$depfile"
61069ef5f27Smrg  # Some versions of the HPUX 10.20 sed can't process this sed invocation
61169ef5f27Smrg  # correctly.  Breaking it into two sed invocations is a workaround.
61269ef5f27Smrg  tr ' ' "$nl" < "$tmpdepfile" \
61369ef5f27Smrg    | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
61469ef5f27Smrg    | sed -e 's/$/ :/' >> "$depfile"
615d1333322Smrg  rm -f "$tmpdepfile"
616d1333322Smrg  ;;
617d1333322Smrg
618d1333322SmrgdashXmstdout)
619d1333322Smrg  # This case only exists to satisfy depend.m4.  It is never actually
620d1333322Smrg  # run, as this mode is specially recognized in the preamble.
621d1333322Smrg  exit 1
622d1333322Smrg  ;;
623d1333322Smrg
624d1333322Smrgmakedepend)
625d1333322Smrg  "$@" || exit $?
626d1333322Smrg  # Remove any Libtool call
627d1333322Smrg  if test "$libtool" = yes; then
6284f9ac78aSmrg    while test "X$1" != 'X--mode=compile'; do
629d1333322Smrg      shift
630d1333322Smrg    done
631d1333322Smrg    shift
632d1333322Smrg  fi
633d1333322Smrg  # X makedepend
634d1333322Smrg  shift
6354f9ac78aSmrg  cleared=no eat=no
6364f9ac78aSmrg  for arg
6374f9ac78aSmrg  do
638d1333322Smrg    case $cleared in
639d1333322Smrg    no)
640d1333322Smrg      set ""; shift
641d1333322Smrg      cleared=yes ;;
642d1333322Smrg    esac
6434f9ac78aSmrg    if test $eat = yes; then
6444f9ac78aSmrg      eat=no
6454f9ac78aSmrg      continue
6464f9ac78aSmrg    fi
647d1333322Smrg    case "$arg" in
648d1333322Smrg    -D*|-I*)
649d1333322Smrg      set fnord "$@" "$arg"; shift ;;
650d1333322Smrg    # Strip any option that makedepend may not understand.  Remove
651d1333322Smrg    # the object too, otherwise makedepend will parse it as a source file.
6524f9ac78aSmrg    -arch)
6534f9ac78aSmrg      eat=yes ;;
654d1333322Smrg    -*|$object)
655d1333322Smrg      ;;
656d1333322Smrg    *)
657d1333322Smrg      set fnord "$@" "$arg"; shift ;;
658d1333322Smrg    esac
659d1333322Smrg  done
6604f9ac78aSmrg  obj_suffix=`echo "$object" | sed 's/^.*\././'`
661d1333322Smrg  touch "$tmpdepfile"
662d1333322Smrg  ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
663d1333322Smrg  rm -f "$depfile"
664c27291ebSmrg  # makedepend may prepend the VPATH from the source file name to the object.
665c27291ebSmrg  # No need to regex-escape $object, excess matching of '.' is harmless.
666c27291ebSmrg  sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile"
66769ef5f27Smrg  # Some versions of the HPUX 10.20 sed can't process the last invocation
66869ef5f27Smrg  # correctly.  Breaking it into two sed invocations is a workaround.
66969ef5f27Smrg  sed '1,2d' "$tmpdepfile" \
67069ef5f27Smrg    | tr ' ' "$nl" \
67169ef5f27Smrg    | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
67269ef5f27Smrg    | sed -e 's/$/ :/' >> "$depfile"
673d1333322Smrg  rm -f "$tmpdepfile" "$tmpdepfile".bak
674d1333322Smrg  ;;
675d1333322Smrg
676d1333322Smrgcpp)
677d1333322Smrg  # Important note: in order to support this mode, a compiler *must*
678d1333322Smrg  # always write the preprocessed file to stdout.
679d1333322Smrg  "$@" || exit $?
680d1333322Smrg
681d1333322Smrg  # Remove the call to Libtool.
682d1333322Smrg  if test "$libtool" = yes; then
6834f9ac78aSmrg    while test "X$1" != 'X--mode=compile'; do
684d1333322Smrg      shift
685d1333322Smrg    done
686d1333322Smrg    shift
687d1333322Smrg  fi
688d1333322Smrg
68969ef5f27Smrg  # Remove '-o $object'.
690d1333322Smrg  IFS=" "
691d1333322Smrg  for arg
692d1333322Smrg  do
693d1333322Smrg    case $arg in
694d1333322Smrg    -o)
695d1333322Smrg      shift
696d1333322Smrg      ;;
697d1333322Smrg    $object)
698d1333322Smrg      shift
699d1333322Smrg      ;;
700d1333322Smrg    *)
701d1333322Smrg      set fnord "$@" "$arg"
702d1333322Smrg      shift # fnord
703d1333322Smrg      shift # $arg
704d1333322Smrg      ;;
705d1333322Smrg    esac
706d1333322Smrg  done
707d1333322Smrg
70869ef5f27Smrg  "$@" -E \
70969ef5f27Smrg    | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
71069ef5f27Smrg             -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
71169ef5f27Smrg    | sed '$ s: \\$::' > "$tmpdepfile"
712d1333322Smrg  rm -f "$depfile"
713d1333322Smrg  echo "$object : \\" > "$depfile"
714d1333322Smrg  cat < "$tmpdepfile" >> "$depfile"
715d1333322Smrg  sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
716d1333322Smrg  rm -f "$tmpdepfile"
717d1333322Smrg  ;;
718d1333322Smrg
719d1333322Smrgmsvisualcpp)
720d1333322Smrg  # Important note: in order to support this mode, a compiler *must*
7214f9ac78aSmrg  # always write the preprocessed file to stdout.
722d1333322Smrg  "$@" || exit $?
7234f9ac78aSmrg
7244f9ac78aSmrg  # Remove the call to Libtool.
7254f9ac78aSmrg  if test "$libtool" = yes; then
7264f9ac78aSmrg    while test "X$1" != 'X--mode=compile'; do
7274f9ac78aSmrg      shift
7284f9ac78aSmrg    done
7294f9ac78aSmrg    shift
7304f9ac78aSmrg  fi
7314f9ac78aSmrg
732d1333322Smrg  IFS=" "
733d1333322Smrg  for arg
734d1333322Smrg  do
735d1333322Smrg    case "$arg" in
7364f9ac78aSmrg    -o)
7374f9ac78aSmrg      shift
7384f9ac78aSmrg      ;;
7394f9ac78aSmrg    $object)
7404f9ac78aSmrg      shift
7414f9ac78aSmrg      ;;
742d1333322Smrg    "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
74369ef5f27Smrg        set fnord "$@"
74469ef5f27Smrg        shift
74569ef5f27Smrg        shift
74669ef5f27Smrg        ;;
747d1333322Smrg    *)
74869ef5f27Smrg        set fnord "$@" "$arg"
74969ef5f27Smrg        shift
75069ef5f27Smrg        shift
75169ef5f27Smrg        ;;
752d1333322Smrg    esac
753d1333322Smrg  done
7544f9ac78aSmrg  "$@" -E 2>/dev/null |
7554f9ac78aSmrg  sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile"
756d1333322Smrg  rm -f "$depfile"
757d1333322Smrg  echo "$object : \\" > "$depfile"
75869ef5f27Smrg  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile"
75969ef5f27Smrg  echo "$tab" >> "$depfile"
7604f9ac78aSmrg  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile"
761d1333322Smrg  rm -f "$tmpdepfile"
762d1333322Smrg  ;;
763d1333322Smrg
7644f9ac78aSmrgmsvcmsys)
7654f9ac78aSmrg  # This case exists only to let depend.m4 do its work.  It works by
7664f9ac78aSmrg  # looking at the text of this script.  This case will never be run,
7674f9ac78aSmrg  # since it is checked for above.
7684f9ac78aSmrg  exit 1
7694f9ac78aSmrg  ;;
7704f9ac78aSmrg
771d1333322Smrgnone)
772d1333322Smrg  exec "$@"
773d1333322Smrg  ;;
774d1333322Smrg
775d1333322Smrg*)
776d1333322Smrg  echo "Unknown depmode $depmode" 1>&2
777d1333322Smrg  exit 1
778d1333322Smrg  ;;
779d1333322Smrgesac
780d1333322Smrg
781d1333322Smrgexit 0
782d1333322Smrg
783d1333322Smrg# Local Variables:
784d1333322Smrg# mode: shell-script
785d1333322Smrg# sh-indentation: 2
786d04472e1Smrg# eval: (add-hook 'before-save-hook 'time-stamp)
787d1333322Smrg# time-stamp-start: "scriptversion="
788d1333322Smrg# time-stamp-format: "%:y-%02m-%02d.%02H"
789d04472e1Smrg# time-stamp-time-zone: "UTC0"
7904f9ac78aSmrg# time-stamp-end: "; # UTC"
791d1333322Smrg# End:
792