1b042e37fSmrg#! /bin/sh
2b042e37fSmrg# depcomp - compile a program generating dependencies as side-effects
3b042e37fSmrg
48d0bc965Smrgscriptversion=2018-03-07.03; # UTC
5b042e37fSmrg
68d0bc965Smrg# Copyright (C) 1999-2021 Free Software Foundation, Inc.
7b042e37fSmrg
8b042e37fSmrg# This program is free software; you can redistribute it and/or modify
9b042e37fSmrg# it under the terms of the GNU General Public License as published by
10b042e37fSmrg# the Free Software Foundation; either version 2, or (at your option)
11b042e37fSmrg# any later version.
12b042e37fSmrg
13b042e37fSmrg# This program is distributed in the hope that it will be useful,
14b042e37fSmrg# but WITHOUT ANY WARRANTY; without even the implied warranty of
15b042e37fSmrg# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16b042e37fSmrg# GNU General Public License for more details.
17b042e37fSmrg
18b042e37fSmrg# You should have received a copy of the GNU General Public License
198d0bc965Smrg# along with this program.  If not, see <https://www.gnu.org/licenses/>.
20b042e37fSmrg
21b042e37fSmrg# As a special exception to the GNU General Public License, if you
22b042e37fSmrg# distribute this file as part of a program that contains a
23b042e37fSmrg# configuration script generated by Autoconf, you may include it under
24b042e37fSmrg# the same distribution terms that you use for the rest of that program.
25b042e37fSmrg
26b042e37fSmrg# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>.
27b042e37fSmrg
28b042e37fSmrgcase $1 in
29b042e37fSmrg  '')
308bd17e5fSmrg    echo "$0: No command.  Try '$0 --help' for more information." 1>&2
318bd17e5fSmrg    exit 1;
328bd17e5fSmrg    ;;
33b042e37fSmrg  -h | --h*)
34b042e37fSmrg    cat <<\EOF
35b042e37fSmrgUsage: depcomp [--help] [--version] PROGRAM [ARGS]
36b042e37fSmrg
37b042e37fSmrgRun PROGRAMS ARGS to compile a file, generating dependencies
38b042e37fSmrgas side-effects.
39b042e37fSmrg
40b042e37fSmrgEnvironment variables:
41b042e37fSmrg  depmode     Dependency tracking mode.
428bd17e5fSmrg  source      Source file read by 'PROGRAMS ARGS'.
438bd17e5fSmrg  object      Object file output by 'PROGRAMS ARGS'.
44b042e37fSmrg  DEPDIR      directory where to store dependencies.
45b042e37fSmrg  depfile     Dependency file to output.
460597fb56Smrg  tmpdepfile  Temporary file to use when outputting dependencies.
47b042e37fSmrg  libtool     Whether libtool is used (yes/no).
48b042e37fSmrg
49b042e37fSmrgReport bugs to <bug-automake@gnu.org>.
50b042e37fSmrgEOF
51b042e37fSmrg    exit $?
52b042e37fSmrg    ;;
53b042e37fSmrg  -v | --v*)
54b042e37fSmrg    echo "depcomp $scriptversion"
55b042e37fSmrg    exit $?
56b042e37fSmrg    ;;
57b042e37fSmrgesac
58b042e37fSmrg
598bd17e5fSmrg# Get the directory component of the given path, and save it in the
608bd17e5fSmrg# global variables '$dir'.  Note that this directory component will
618bd17e5fSmrg# be either empty or ending with a '/' character.  This is deliberate.
628bd17e5fSmrgset_dir_from ()
638bd17e5fSmrg{
648bd17e5fSmrg  case $1 in
658bd17e5fSmrg    */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;;
668bd17e5fSmrg      *) dir=;;
678bd17e5fSmrg  esac
688bd17e5fSmrg}
698bd17e5fSmrg
708bd17e5fSmrg# Get the suffix-stripped basename of the given path, and save it the
718bd17e5fSmrg# global variable '$base'.
728bd17e5fSmrgset_base_from ()
738bd17e5fSmrg{
748bd17e5fSmrg  base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'`
758bd17e5fSmrg}
768bd17e5fSmrg
778bd17e5fSmrg# If no dependency file was actually created by the compiler invocation,
788bd17e5fSmrg# we still have to create a dummy depfile, to avoid errors with the
798bd17e5fSmrg# Makefile "include basename.Plo" scheme.
808bd17e5fSmrgmake_dummy_depfile ()
818bd17e5fSmrg{
828bd17e5fSmrg  echo "#dummy" > "$depfile"
838bd17e5fSmrg}
848bd17e5fSmrg
858bd17e5fSmrg# Factor out some common post-processing of the generated depfile.
868bd17e5fSmrg# Requires the auxiliary global variable '$tmpdepfile' to be set.
878bd17e5fSmrgaix_post_process_depfile ()
888bd17e5fSmrg{
898bd17e5fSmrg  # If the compiler actually managed to produce a dependency file,
908bd17e5fSmrg  # post-process it.
918bd17e5fSmrg  if test -f "$tmpdepfile"; then
928bd17e5fSmrg    # Each line is of the form 'foo.o: dependency.h'.
938bd17e5fSmrg    # Do two passes, one to just change these to
948bd17e5fSmrg    #   $object: dependency.h
958bd17e5fSmrg    # and one to simply output
968bd17e5fSmrg    #   dependency.h:
978bd17e5fSmrg    # which is needed to avoid the deleted-header problem.
988bd17e5fSmrg    { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile"
998bd17e5fSmrg      sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile"
1008bd17e5fSmrg    } > "$depfile"
1018bd17e5fSmrg    rm -f "$tmpdepfile"
1028bd17e5fSmrg  else
1038bd17e5fSmrg    make_dummy_depfile
1048bd17e5fSmrg  fi
1058bd17e5fSmrg}
1068bd17e5fSmrg
1078bd17e5fSmrg# A tabulation character.
1088bd17e5fSmrgtab='	'
1098bd17e5fSmrg# A newline character.
1108bd17e5fSmrgnl='
1118bd17e5fSmrg'
1128bd17e5fSmrg# Character ranges might be problematic outside the C locale.
1138bd17e5fSmrg# These definitions help.
1148bd17e5fSmrgupper=ABCDEFGHIJKLMNOPQRSTUVWXYZ
1158bd17e5fSmrglower=abcdefghijklmnopqrstuvwxyz
1168bd17e5fSmrgdigits=0123456789
1178bd17e5fSmrgalpha=${upper}${lower}
1188bd17e5fSmrg
119b042e37fSmrgif test -z "$depmode" || test -z "$source" || test -z "$object"; then
120b042e37fSmrg  echo "depcomp: Variables source, object and depmode must be set" 1>&2
121b042e37fSmrg  exit 1
122b042e37fSmrgfi
123b042e37fSmrg
124b042e37fSmrg# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.
125b042e37fSmrgdepfile=${depfile-`echo "$object" |
126b042e37fSmrg  sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`}
127b042e37fSmrgtmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
128b042e37fSmrg
129b042e37fSmrgrm -f "$tmpdepfile"
130b042e37fSmrg
1318bd17e5fSmrg# Avoid interferences from the environment.
1328bd17e5fSmrggccflag= dashmflag=
1338bd17e5fSmrg
134b042e37fSmrg# Some modes work just like other modes, but use different flags.  We
135b042e37fSmrg# parameterize here, but still list the modes in the big case below,
136b042e37fSmrg# to make depend.m4 easier to write.  Note that we *cannot* use a case
137b042e37fSmrg# here, because this file can only contain one case statement.
138b042e37fSmrgif test "$depmode" = hp; then
139b042e37fSmrg  # HP compiler uses -M and no extra arg.
140b042e37fSmrg  gccflag=-M
141b042e37fSmrg  depmode=gcc
142b042e37fSmrgfi
143b042e37fSmrg
144b042e37fSmrgif test "$depmode" = dashXmstdout; then
1458bd17e5fSmrg  # This is just like dashmstdout with a different argument.
1468bd17e5fSmrg  dashmflag=-xM
1478bd17e5fSmrg  depmode=dashmstdout
148b042e37fSmrgfi
149b042e37fSmrg
150706b6b52Smrgcygpath_u="cygpath -u -f -"
151706b6b52Smrgif test "$depmode" = msvcmsys; then
1528bd17e5fSmrg  # This is just like msvisualcpp but w/o cygpath translation.
1538bd17e5fSmrg  # Just convert the backslash-escaped backslashes to single forward
1548bd17e5fSmrg  # slashes to satisfy depend.m4
1558bd17e5fSmrg  cygpath_u='sed s,\\\\,/,g'
1568bd17e5fSmrg  depmode=msvisualcpp
157706b6b52Smrgfi
158706b6b52Smrg
1590597fb56Smrgif test "$depmode" = msvc7msys; then
1608bd17e5fSmrg  # This is just like msvc7 but w/o cygpath translation.
1618bd17e5fSmrg  # Just convert the backslash-escaped backslashes to single forward
1628bd17e5fSmrg  # slashes to satisfy depend.m4
1638bd17e5fSmrg  cygpath_u='sed s,\\\\,/,g'
1648bd17e5fSmrg  depmode=msvc7
1658bd17e5fSmrgfi
1668bd17e5fSmrg
1678bd17e5fSmrgif test "$depmode" = xlc; then
1688bd17e5fSmrg  # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information.
1698bd17e5fSmrg  gccflag=-qmakedep=gcc,-MF
1708bd17e5fSmrg  depmode=gcc
1710597fb56Smrgfi
1720597fb56Smrg
173b042e37fSmrgcase "$depmode" in
174b042e37fSmrggcc3)
175b042e37fSmrg## gcc 3 implements dependency tracking that does exactly what
176b042e37fSmrg## we want.  Yay!  Note: for some reason libtool 1.4 doesn't like
177b042e37fSmrg## it if -MD -MP comes after the -MF stuff.  Hmm.
178b042e37fSmrg## Unfortunately, FreeBSD c89 acceptance of flags depends upon
179b042e37fSmrg## the command line argument order; so add the flags where they
180b042e37fSmrg## appear in depend2.am.  Note that the slowdown incurred here
181b042e37fSmrg## affects only configure: in makefiles, %FASTDEP% shortcuts this.
182b042e37fSmrg  for arg
183b042e37fSmrg  do
184b042e37fSmrg    case $arg in
185b042e37fSmrg    -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;;
186b042e37fSmrg    *)  set fnord "$@" "$arg" ;;
187b042e37fSmrg    esac
188b042e37fSmrg    shift # fnord
189b042e37fSmrg    shift # $arg
190b042e37fSmrg  done
191b042e37fSmrg  "$@"
192b042e37fSmrg  stat=$?
1938bd17e5fSmrg  if test $stat -ne 0; then
194b042e37fSmrg    rm -f "$tmpdepfile"
195b042e37fSmrg    exit $stat
196b042e37fSmrg  fi
197b042e37fSmrg  mv "$tmpdepfile" "$depfile"
198b042e37fSmrg  ;;
199b042e37fSmrg
200b042e37fSmrggcc)
2018bd17e5fSmrg## Note that this doesn't just cater to obsosete pre-3.x GCC compilers.
2028bd17e5fSmrg## but also to in-use compilers like IMB xlc/xlC and the HP C compiler.
2038bd17e5fSmrg## (see the conditional assignment to $gccflag above).
204b042e37fSmrg## There are various ways to get dependency output from gcc.  Here's
205b042e37fSmrg## why we pick this rather obscure method:
206b042e37fSmrg## - Don't want to use -MD because we'd like the dependencies to end
207b042e37fSmrg##   up in a subdir.  Having to rename by hand is ugly.
208b042e37fSmrg##   (We might end up doing this anyway to support other compilers.)
209b042e37fSmrg## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
2108bd17e5fSmrg##   -MM, not -M (despite what the docs say).  Also, it might not be
2118bd17e5fSmrg##   supported by the other compilers which use the 'gcc' depmode.
212b042e37fSmrg## - Using -M directly means running the compiler twice (even worse
213b042e37fSmrg##   than renaming).
214b042e37fSmrg  if test -z "$gccflag"; then
215b042e37fSmrg    gccflag=-MD,
216b042e37fSmrg  fi
217b042e37fSmrg  "$@" -Wp,"$gccflag$tmpdepfile"
218b042e37fSmrg  stat=$?
2198bd17e5fSmrg  if test $stat -ne 0; then
220b042e37fSmrg    rm -f "$tmpdepfile"
221b042e37fSmrg    exit $stat
222b042e37fSmrg  fi
223b042e37fSmrg  rm -f "$depfile"
224b042e37fSmrg  echo "$object : \\" > "$depfile"
2258bd17e5fSmrg  # The second -e expression handles DOS-style file names with drive
2268bd17e5fSmrg  # letters.
227b042e37fSmrg  sed -e 's/^[^:]*: / /' \
228b042e37fSmrg      -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
2298bd17e5fSmrg## This next piece of magic avoids the "deleted header file" problem.
230b042e37fSmrg## The problem is that when a header file which appears in a .P file
231b042e37fSmrg## is deleted, the dependency causes make to die (because there is
232b042e37fSmrg## typically no way to rebuild the header).  We avoid this by adding
233b042e37fSmrg## dummy dependencies for each header file.  Too bad gcc doesn't do
234b042e37fSmrg## this for us directly.
2358bd17e5fSmrg## Some versions of gcc put a space before the ':'.  On the theory
236b042e37fSmrg## that the space means something, we add a space to the output as
2370597fb56Smrg## well.  hp depmode also adds that space, but also prefixes the VPATH
2380597fb56Smrg## to the object.  Take care to not repeat it in the output.
239b042e37fSmrg## Some versions of the HPUX 10.20 sed can't process this invocation
240b042e37fSmrg## correctly.  Breaking it into two sed invocations is a workaround.
2418bd17e5fSmrg  tr ' ' "$nl" < "$tmpdepfile" \
2428bd17e5fSmrg    | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \
2438bd17e5fSmrg    | sed -e 's/$/ :/' >> "$depfile"
244b042e37fSmrg  rm -f "$tmpdepfile"
245b042e37fSmrg  ;;
246b042e37fSmrg
247b042e37fSmrghp)
248b042e37fSmrg  # This case exists only to let depend.m4 do its work.  It works by
249b042e37fSmrg  # looking at the text of this script.  This case will never be run,
250b042e37fSmrg  # since it is checked for above.
251b042e37fSmrg  exit 1
252b042e37fSmrg  ;;
253b042e37fSmrg
254b042e37fSmrgsgi)
255b042e37fSmrg  if test "$libtool" = yes; then
256b042e37fSmrg    "$@" "-Wp,-MDupdate,$tmpdepfile"
257b042e37fSmrg  else
258b042e37fSmrg    "$@" -MDupdate "$tmpdepfile"
259b042e37fSmrg  fi
260b042e37fSmrg  stat=$?
2618bd17e5fSmrg  if test $stat -ne 0; then
262b042e37fSmrg    rm -f "$tmpdepfile"
263b042e37fSmrg    exit $stat
264b042e37fSmrg  fi
265b042e37fSmrg  rm -f "$depfile"
266b042e37fSmrg
267b042e37fSmrg  if test -f "$tmpdepfile"; then  # yes, the sourcefile depend on other files
268b042e37fSmrg    echo "$object : \\" > "$depfile"
269b042e37fSmrg    # Clip off the initial element (the dependent).  Don't try to be
270b042e37fSmrg    # clever and replace this with sed code, as IRIX sed won't handle
271b042e37fSmrg    # lines with more than a fixed number of characters (4096 in
272b042e37fSmrg    # IRIX 6.2 sed, 8192 in IRIX 6.5).  We also remove comment lines;
2738bd17e5fSmrg    # the IRIX cc adds comments like '#:fec' to the end of the
274b042e37fSmrg    # dependency line.
2758bd17e5fSmrg    tr ' ' "$nl" < "$tmpdepfile" \
2768bd17e5fSmrg      | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \
2778bd17e5fSmrg      | tr "$nl" ' ' >> "$depfile"
278706b6b52Smrg    echo >> "$depfile"
279b042e37fSmrg    # The second pass generates a dummy entry for each header file.
2808bd17e5fSmrg    tr ' ' "$nl" < "$tmpdepfile" \
2818bd17e5fSmrg      | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
2828bd17e5fSmrg      >> "$depfile"
283b042e37fSmrg  else
2848bd17e5fSmrg    make_dummy_depfile
285b042e37fSmrg  fi
286b042e37fSmrg  rm -f "$tmpdepfile"
287b042e37fSmrg  ;;
288b042e37fSmrg
2898bd17e5fSmrgxlc)
2908bd17e5fSmrg  # This case exists only to let depend.m4 do its work.  It works by
2918bd17e5fSmrg  # looking at the text of this script.  This case will never be run,
2928bd17e5fSmrg  # since it is checked for above.
2938bd17e5fSmrg  exit 1
2948bd17e5fSmrg  ;;
2958bd17e5fSmrg
296b042e37fSmrgaix)
297b042e37fSmrg  # The C for AIX Compiler uses -M and outputs the dependencies
298b042e37fSmrg  # in a .u file.  In older versions, this file always lives in the
2998bd17e5fSmrg  # current directory.  Also, the AIX compiler puts '$object:' at the
300b042e37fSmrg  # start of each line; $object doesn't have directory information.
301b042e37fSmrg  # Version 6 uses the directory in both cases.
3028bd17e5fSmrg  set_dir_from "$object"
3038bd17e5fSmrg  set_base_from "$object"
304b042e37fSmrg  if test "$libtool" = yes; then
305706b6b52Smrg    tmpdepfile1=$dir$base.u
306706b6b52Smrg    tmpdepfile2=$base.u
307706b6b52Smrg    tmpdepfile3=$dir.libs/$base.u
308b042e37fSmrg    "$@" -Wc,-M
309b042e37fSmrg  else
310706b6b52Smrg    tmpdepfile1=$dir$base.u
311706b6b52Smrg    tmpdepfile2=$dir$base.u
312706b6b52Smrg    tmpdepfile3=$dir$base.u
313b042e37fSmrg    "$@" -M
314b042e37fSmrg  fi
315b042e37fSmrg  stat=$?
3168bd17e5fSmrg  if test $stat -ne 0; then
317706b6b52Smrg    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
318b042e37fSmrg    exit $stat
319b042e37fSmrg  fi
320b042e37fSmrg
321706b6b52Smrg  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
322706b6b52Smrg  do
323706b6b52Smrg    test -f "$tmpdepfile" && break
324706b6b52Smrg  done
3258bd17e5fSmrg  aix_post_process_depfile
3268bd17e5fSmrg  ;;
3278bd17e5fSmrg
3288bd17e5fSmrgtcc)
3298bd17e5fSmrg  # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26
3308bd17e5fSmrg  # FIXME: That version still under development at the moment of writing.
3318bd17e5fSmrg  #        Make that this statement remains true also for stable, released
3328bd17e5fSmrg  #        versions.
3338bd17e5fSmrg  # It will wrap lines (doesn't matter whether long or short) with a
3348bd17e5fSmrg  # trailing '\', as in:
3358bd17e5fSmrg  #
3368bd17e5fSmrg  #   foo.o : \
3378bd17e5fSmrg  #    foo.c \
3388bd17e5fSmrg  #    foo.h \
3398bd17e5fSmrg  #
3408bd17e5fSmrg  # It will put a trailing '\' even on the last line, and will use leading
3418bd17e5fSmrg  # spaces rather than leading tabs (at least since its commit 0394caf7
3428bd17e5fSmrg  # "Emit spaces for -MD").
3438bd17e5fSmrg  "$@" -MD -MF "$tmpdepfile"
3448bd17e5fSmrg  stat=$?
3458bd17e5fSmrg  if test $stat -ne 0; then
3468bd17e5fSmrg    rm -f "$tmpdepfile"
3478bd17e5fSmrg    exit $stat
348b042e37fSmrg  fi
3498bd17e5fSmrg  rm -f "$depfile"
3508bd17e5fSmrg  # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'.
3518bd17e5fSmrg  # We have to change lines of the first kind to '$object: \'.
3528bd17e5fSmrg  sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile"
3538bd17e5fSmrg  # And for each line of the second kind, we have to emit a 'dep.h:'
3548bd17e5fSmrg  # dummy dependency, to avoid the deleted-header problem.
3558bd17e5fSmrg  sed -n -e 's|^  *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile"
356b042e37fSmrg  rm -f "$tmpdepfile"
357b042e37fSmrg  ;;
358b042e37fSmrg
3598bd17e5fSmrg## The order of this option in the case statement is important, since the
3608bd17e5fSmrg## shell code in configure will try each of these formats in the order
3618bd17e5fSmrg## listed in this file.  A plain '-MD' option would be understood by many
3628bd17e5fSmrg## compilers, so we must ensure this comes after the gcc and icc options.
3638bd17e5fSmrgpgcc)
3648bd17e5fSmrg  # Portland's C compiler understands '-MD'.
3658bd17e5fSmrg  # Will always output deps to 'file.d' where file is the root name of the
3668bd17e5fSmrg  # source file under compilation, even if file resides in a subdirectory.
3678bd17e5fSmrg  # The object file name does not affect the name of the '.d' file.
3688bd17e5fSmrg  # pgcc 10.2 will output
369b042e37fSmrg  #    foo.o: sub/foo.c sub/foo.h
3708bd17e5fSmrg  # and will wrap long lines using '\' :
371b042e37fSmrg  #    foo.o: sub/foo.c ... \
372b042e37fSmrg  #     sub/foo.h ... \
373b042e37fSmrg  #     ...
3748bd17e5fSmrg  set_dir_from "$object"
3758bd17e5fSmrg  # Use the source, not the object, to determine the base name, since
3768bd17e5fSmrg  # that's sadly what pgcc will do too.
3778bd17e5fSmrg  set_base_from "$source"
3788bd17e5fSmrg  tmpdepfile=$base.d
3798bd17e5fSmrg
3808bd17e5fSmrg  # For projects that build the same source file twice into different object
3818bd17e5fSmrg  # files, the pgcc approach of using the *source* file root name can cause
3828bd17e5fSmrg  # problems in parallel builds.  Use a locking strategy to avoid stomping on
3838bd17e5fSmrg  # the same $tmpdepfile.
3848bd17e5fSmrg  lockdir=$base.d-lock
3858bd17e5fSmrg  trap "
3868bd17e5fSmrg    echo '$0: caught signal, cleaning up...' >&2
3878bd17e5fSmrg    rmdir '$lockdir'
3888bd17e5fSmrg    exit 1
3898bd17e5fSmrg  " 1 2 13 15
3908bd17e5fSmrg  numtries=100
3918bd17e5fSmrg  i=$numtries
3928bd17e5fSmrg  while test $i -gt 0; do
3938bd17e5fSmrg    # mkdir is a portable test-and-set.
3948bd17e5fSmrg    if mkdir "$lockdir" 2>/dev/null; then
3958bd17e5fSmrg      # This process acquired the lock.
3968bd17e5fSmrg      "$@" -MD
3978bd17e5fSmrg      stat=$?
3988bd17e5fSmrg      # Release the lock.
3998bd17e5fSmrg      rmdir "$lockdir"
4008bd17e5fSmrg      break
4018bd17e5fSmrg    else
4028bd17e5fSmrg      # If the lock is being held by a different process, wait
4038bd17e5fSmrg      # until the winning process is done or we timeout.
4048bd17e5fSmrg      while test -d "$lockdir" && test $i -gt 0; do
4058bd17e5fSmrg        sleep 1
4068bd17e5fSmrg        i=`expr $i - 1`
4078bd17e5fSmrg      done
4088bd17e5fSmrg    fi
4098bd17e5fSmrg    i=`expr $i - 1`
4108bd17e5fSmrg  done
4118bd17e5fSmrg  trap - 1 2 13 15
4128bd17e5fSmrg  if test $i -le 0; then
4138bd17e5fSmrg    echo "$0: failed to acquire lock after $numtries attempts" >&2
4148bd17e5fSmrg    echo "$0: check lockdir '$lockdir'" >&2
4158bd17e5fSmrg    exit 1
4168bd17e5fSmrg  fi
417b042e37fSmrg
4188bd17e5fSmrg  if test $stat -ne 0; then
419b042e37fSmrg    rm -f "$tmpdepfile"
420b042e37fSmrg    exit $stat
421b042e37fSmrg  fi
422b042e37fSmrg  rm -f "$depfile"
423b042e37fSmrg  # Each line is of the form `foo.o: dependent.h',
424b042e37fSmrg  # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'.
425b042e37fSmrg  # Do two passes, one to just change these to
426b042e37fSmrg  # `$object: dependent.h' and one to simply `dependent.h:'.
427b042e37fSmrg  sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
428b042e37fSmrg  # Some versions of the HPUX 10.20 sed can't process this invocation
429b042e37fSmrg  # correctly.  Breaking it into two sed invocations is a workaround.
4308bd17e5fSmrg  sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \
4318bd17e5fSmrg    | sed -e 's/$/ :/' >> "$depfile"
432b042e37fSmrg  rm -f "$tmpdepfile"
433b042e37fSmrg  ;;
434b042e37fSmrg
435b042e37fSmrghp2)
436b042e37fSmrg  # The "hp" stanza above does not work with aCC (C++) and HP's ia64
437b042e37fSmrg  # compilers, which have integrated preprocessors.  The correct option
438b042e37fSmrg  # to use with these is +Maked; it writes dependencies to a file named
439b042e37fSmrg  # 'foo.d', which lands next to the object file, wherever that
440b042e37fSmrg  # happens to be.
441b042e37fSmrg  # Much of this is similar to the tru64 case; see comments there.
4428bd17e5fSmrg  set_dir_from  "$object"
4438bd17e5fSmrg  set_base_from "$object"
444b042e37fSmrg  if test "$libtool" = yes; then
445b042e37fSmrg    tmpdepfile1=$dir$base.d
446b042e37fSmrg    tmpdepfile2=$dir.libs/$base.d
447b042e37fSmrg    "$@" -Wc,+Maked
448b042e37fSmrg  else
449b042e37fSmrg    tmpdepfile1=$dir$base.d
450b042e37fSmrg    tmpdepfile2=$dir$base.d
451b042e37fSmrg    "$@" +Maked
452b042e37fSmrg  fi
453b042e37fSmrg  stat=$?
4548bd17e5fSmrg  if test $stat -ne 0; then
455b042e37fSmrg     rm -f "$tmpdepfile1" "$tmpdepfile2"
456b042e37fSmrg     exit $stat
457b042e37fSmrg  fi
458b042e37fSmrg
459b042e37fSmrg  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2"
460b042e37fSmrg  do
461b042e37fSmrg    test -f "$tmpdepfile" && break
462b042e37fSmrg  done
463b042e37fSmrg  if test -f "$tmpdepfile"; then
4648bd17e5fSmrg    sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile"
4658bd17e5fSmrg    # Add 'dependent.h:' lines.
466706b6b52Smrg    sed -ne '2,${
4678bd17e5fSmrg               s/^ *//
4688bd17e5fSmrg               s/ \\*$//
4698bd17e5fSmrg               s/$/:/
4708bd17e5fSmrg               p
4718bd17e5fSmrg             }' "$tmpdepfile" >> "$depfile"
472b042e37fSmrg  else
4738bd17e5fSmrg    make_dummy_depfile
474b042e37fSmrg  fi
475b042e37fSmrg  rm -f "$tmpdepfile" "$tmpdepfile2"
476b042e37fSmrg  ;;
477b042e37fSmrg
478b042e37fSmrgtru64)
4798bd17e5fSmrg  # The Tru64 compiler uses -MD to generate dependencies as a side
4808bd17e5fSmrg  # effect.  'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'.
4818bd17e5fSmrg  # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
4828bd17e5fSmrg  # dependencies in 'foo.d' instead, so we check for that too.
4838bd17e5fSmrg  # Subdirectories are respected.
4848bd17e5fSmrg  set_dir_from  "$object"
4858bd17e5fSmrg  set_base_from "$object"
4868bd17e5fSmrg
4878bd17e5fSmrg  if test "$libtool" = yes; then
4888bd17e5fSmrg    # Libtool generates 2 separate objects for the 2 libraries.  These
4898bd17e5fSmrg    # two compilations output dependencies in $dir.libs/$base.o.d and
4908bd17e5fSmrg    # in $dir$base.o.d.  We have to check for both files, because
4918bd17e5fSmrg    # one of the two compilations can be disabled.  We should prefer
4928bd17e5fSmrg    # $dir$base.o.d over $dir.libs/$base.o.d because the latter is
4938bd17e5fSmrg    # automatically cleaned when .libs/ is deleted, while ignoring
4948bd17e5fSmrg    # the former would cause a distcleancheck panic.
4958bd17e5fSmrg    tmpdepfile1=$dir$base.o.d          # libtool 1.5
4968bd17e5fSmrg    tmpdepfile2=$dir.libs/$base.o.d    # Likewise.
4978bd17e5fSmrg    tmpdepfile3=$dir.libs/$base.d      # Compaq CCC V6.2-504
4988bd17e5fSmrg    "$@" -Wc,-MD
4998bd17e5fSmrg  else
5008bd17e5fSmrg    tmpdepfile1=$dir$base.d
5018bd17e5fSmrg    tmpdepfile2=$dir$base.d
5028bd17e5fSmrg    tmpdepfile3=$dir$base.d
5038bd17e5fSmrg    "$@" -MD
5048bd17e5fSmrg  fi
5058bd17e5fSmrg
5068bd17e5fSmrg  stat=$?
5078bd17e5fSmrg  if test $stat -ne 0; then
5088bd17e5fSmrg    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
5098bd17e5fSmrg    exit $stat
5108bd17e5fSmrg  fi
5118bd17e5fSmrg
5128bd17e5fSmrg  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
5138bd17e5fSmrg  do
5148bd17e5fSmrg    test -f "$tmpdepfile" && break
5158bd17e5fSmrg  done
5168bd17e5fSmrg  # Same post-processing that is required for AIX mode.
5178bd17e5fSmrg  aix_post_process_depfile
5188bd17e5fSmrg  ;;
519b042e37fSmrg
5200597fb56Smrgmsvc7)
5210597fb56Smrg  if test "$libtool" = yes; then
5220597fb56Smrg    showIncludes=-Wc,-showIncludes
5230597fb56Smrg  else
5240597fb56Smrg    showIncludes=-showIncludes
5250597fb56Smrg  fi
5260597fb56Smrg  "$@" $showIncludes > "$tmpdepfile"
5270597fb56Smrg  stat=$?
5280597fb56Smrg  grep -v '^Note: including file: ' "$tmpdepfile"
5298bd17e5fSmrg  if test $stat -ne 0; then
5300597fb56Smrg    rm -f "$tmpdepfile"
5310597fb56Smrg    exit $stat
5320597fb56Smrg  fi
5330597fb56Smrg  rm -f "$depfile"
5340597fb56Smrg  echo "$object : \\" > "$depfile"
5350597fb56Smrg  # The first sed program below extracts the file names and escapes
5360597fb56Smrg  # backslashes for cygpath.  The second sed program outputs the file
5370597fb56Smrg  # name when reading, but also accumulates all include files in the
5380597fb56Smrg  # hold buffer in order to output them again at the end.  This only
5390597fb56Smrg  # works with sed implementations that can handle large buffers.
5400597fb56Smrg  sed < "$tmpdepfile" -n '
5410597fb56Smrg/^Note: including file:  *\(.*\)/ {
5420597fb56Smrg  s//\1/
5430597fb56Smrg  s/\\/\\\\/g
5440597fb56Smrg  p
5450597fb56Smrg}' | $cygpath_u | sort -u | sed -n '
5460597fb56Smrgs/ /\\ /g
5478bd17e5fSmrgs/\(.*\)/'"$tab"'\1 \\/p
5480597fb56Smrgs/.\(.*\) \\/\1:/
5490597fb56SmrgH
5500597fb56Smrg$ {
5518bd17e5fSmrg  s/.*/'"$tab"'/
5520597fb56Smrg  G
5530597fb56Smrg  p
5540597fb56Smrg}' >> "$depfile"
555fc98c8e2Smrg  echo >> "$depfile" # make sure the fragment doesn't end with a backslash
5560597fb56Smrg  rm -f "$tmpdepfile"
5570597fb56Smrg  ;;
5580597fb56Smrg
5590597fb56Smrgmsvc7msys)
5600597fb56Smrg  # This case exists only to let depend.m4 do its work.  It works by
5610597fb56Smrg  # looking at the text of this script.  This case will never be run,
5620597fb56Smrg  # since it is checked for above.
5630597fb56Smrg  exit 1
5640597fb56Smrg  ;;
5650597fb56Smrg
566b042e37fSmrg#nosideeffect)
567b042e37fSmrg  # This comment above is used by automake to tell side-effect
568b042e37fSmrg  # dependency tracking mechanisms from slower ones.
569b042e37fSmrg
570b042e37fSmrgdashmstdout)
571b042e37fSmrg  # Important note: in order to support this mode, a compiler *must*
572b042e37fSmrg  # always write the preprocessed file to stdout, regardless of -o.
573b042e37fSmrg  "$@" || exit $?
574b042e37fSmrg
575b042e37fSmrg  # Remove the call to Libtool.
576b042e37fSmrg  if test "$libtool" = yes; then
577706b6b52Smrg    while test "X$1" != 'X--mode=compile'; do
578b042e37fSmrg      shift
579b042e37fSmrg    done
580b042e37fSmrg    shift
581b042e37fSmrg  fi
582b042e37fSmrg
5838bd17e5fSmrg  # Remove '-o $object'.
584b042e37fSmrg  IFS=" "
585b042e37fSmrg  for arg
586b042e37fSmrg  do
587b042e37fSmrg    case $arg in
588b042e37fSmrg    -o)
589b042e37fSmrg      shift
590b042e37fSmrg      ;;
591b042e37fSmrg    $object)
592b042e37fSmrg      shift
593b042e37fSmrg      ;;
594b042e37fSmrg    *)
595b042e37fSmrg      set fnord "$@" "$arg"
596b042e37fSmrg      shift # fnord
597b042e37fSmrg      shift # $arg
598b042e37fSmrg      ;;
599b042e37fSmrg    esac
600b042e37fSmrg  done
601b042e37fSmrg
602b042e37fSmrg  test -z "$dashmflag" && dashmflag=-M
6038bd17e5fSmrg  # Require at least two characters before searching for ':'
604b042e37fSmrg  # in the target name.  This is to cope with DOS-style filenames:
6058bd17e5fSmrg  # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise.
606b042e37fSmrg  "$@" $dashmflag |
6078bd17e5fSmrg    sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile"
608b042e37fSmrg  rm -f "$depfile"
609b042e37fSmrg  cat < "$tmpdepfile" > "$depfile"
6108bd17e5fSmrg  # Some versions of the HPUX 10.20 sed can't process this sed invocation
6118bd17e5fSmrg  # correctly.  Breaking it into two sed invocations is a workaround.
6128bd17e5fSmrg  tr ' ' "$nl" < "$tmpdepfile" \
6138bd17e5fSmrg    | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
6148bd17e5fSmrg    | sed -e 's/$/ :/' >> "$depfile"
615b042e37fSmrg  rm -f "$tmpdepfile"
616b042e37fSmrg  ;;
617b042e37fSmrg
618b042e37fSmrgdashXmstdout)
619b042e37fSmrg  # This case only exists to satisfy depend.m4.  It is never actually
620b042e37fSmrg  # run, as this mode is specially recognized in the preamble.
621b042e37fSmrg  exit 1
622b042e37fSmrg  ;;
623b042e37fSmrg
624b042e37fSmrgmakedepend)
625b042e37fSmrg  "$@" || exit $?
626b042e37fSmrg  # Remove any Libtool call
627b042e37fSmrg  if test "$libtool" = yes; then
628706b6b52Smrg    while test "X$1" != 'X--mode=compile'; do
629b042e37fSmrg      shift
630b042e37fSmrg    done
631b042e37fSmrg    shift
632b042e37fSmrg  fi
633b042e37fSmrg  # X makedepend
634b042e37fSmrg  shift
635706b6b52Smrg  cleared=no eat=no
636706b6b52Smrg  for arg
637706b6b52Smrg  do
638b042e37fSmrg    case $cleared in
639b042e37fSmrg    no)
640b042e37fSmrg      set ""; shift
641b042e37fSmrg      cleared=yes ;;
642b042e37fSmrg    esac
643706b6b52Smrg    if test $eat = yes; then
644706b6b52Smrg      eat=no
645706b6b52Smrg      continue
646706b6b52Smrg    fi
647b042e37fSmrg    case "$arg" in
648b042e37fSmrg    -D*|-I*)
649b042e37fSmrg      set fnord "$@" "$arg"; shift ;;
650b042e37fSmrg    # Strip any option that makedepend may not understand.  Remove
651b042e37fSmrg    # the object too, otherwise makedepend will parse it as a source file.
652706b6b52Smrg    -arch)
653706b6b52Smrg      eat=yes ;;
654b042e37fSmrg    -*|$object)
655b042e37fSmrg      ;;
656b042e37fSmrg    *)
657b042e37fSmrg      set fnord "$@" "$arg"; shift ;;
658b042e37fSmrg    esac
659b042e37fSmrg  done
660706b6b52Smrg  obj_suffix=`echo "$object" | sed 's/^.*\././'`
661b042e37fSmrg  touch "$tmpdepfile"
662b042e37fSmrg  ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
663b042e37fSmrg  rm -f "$depfile"
6640597fb56Smrg  # makedepend may prepend the VPATH from the source file name to the object.
6650597fb56Smrg  # No need to regex-escape $object, excess matching of '.' is harmless.
6660597fb56Smrg  sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile"
6678bd17e5fSmrg  # Some versions of the HPUX 10.20 sed can't process the last invocation
6688bd17e5fSmrg  # correctly.  Breaking it into two sed invocations is a workaround.
6698bd17e5fSmrg  sed '1,2d' "$tmpdepfile" \
6708bd17e5fSmrg    | tr ' ' "$nl" \
6718bd17e5fSmrg    | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
6728bd17e5fSmrg    | sed -e 's/$/ :/' >> "$depfile"
673b042e37fSmrg  rm -f "$tmpdepfile" "$tmpdepfile".bak
674b042e37fSmrg  ;;
675b042e37fSmrg
676b042e37fSmrgcpp)
677b042e37fSmrg  # Important note: in order to support this mode, a compiler *must*
678b042e37fSmrg  # always write the preprocessed file to stdout.
679b042e37fSmrg  "$@" || exit $?
680b042e37fSmrg
681b042e37fSmrg  # Remove the call to Libtool.
682b042e37fSmrg  if test "$libtool" = yes; then
683706b6b52Smrg    while test "X$1" != 'X--mode=compile'; do
684b042e37fSmrg      shift
685b042e37fSmrg    done
686b042e37fSmrg    shift
687b042e37fSmrg  fi
688b042e37fSmrg
6898bd17e5fSmrg  # Remove '-o $object'.
690b042e37fSmrg  IFS=" "
691b042e37fSmrg  for arg
692b042e37fSmrg  do
693b042e37fSmrg    case $arg in
694b042e37fSmrg    -o)
695b042e37fSmrg      shift
696b042e37fSmrg      ;;
697b042e37fSmrg    $object)
698b042e37fSmrg      shift
699b042e37fSmrg      ;;
700b042e37fSmrg    *)
701b042e37fSmrg      set fnord "$@" "$arg"
702b042e37fSmrg      shift # fnord
703b042e37fSmrg      shift # $arg
704b042e37fSmrg      ;;
705b042e37fSmrg    esac
706b042e37fSmrg  done
707b042e37fSmrg
7088bd17e5fSmrg  "$@" -E \
7098bd17e5fSmrg    | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
7108bd17e5fSmrg             -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
7118bd17e5fSmrg    | sed '$ s: \\$::' > "$tmpdepfile"
712b042e37fSmrg  rm -f "$depfile"
713b042e37fSmrg  echo "$object : \\" > "$depfile"
714b042e37fSmrg  cat < "$tmpdepfile" >> "$depfile"
715b042e37fSmrg  sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
716b042e37fSmrg  rm -f "$tmpdepfile"
717b042e37fSmrg  ;;
718b042e37fSmrg
719b042e37fSmrgmsvisualcpp)
720b042e37fSmrg  # Important note: in order to support this mode, a compiler *must*
721706b6b52Smrg  # always write the preprocessed file to stdout.
722b042e37fSmrg  "$@" || exit $?
723706b6b52Smrg
724706b6b52Smrg  # Remove the call to Libtool.
725706b6b52Smrg  if test "$libtool" = yes; then
726706b6b52Smrg    while test "X$1" != 'X--mode=compile'; do
727706b6b52Smrg      shift
728706b6b52Smrg    done
729706b6b52Smrg    shift
730706b6b52Smrg  fi
731706b6b52Smrg
732b042e37fSmrg  IFS=" "
733b042e37fSmrg  for arg
734b042e37fSmrg  do
735b042e37fSmrg    case "$arg" in
736706b6b52Smrg    -o)
737706b6b52Smrg      shift
738706b6b52Smrg      ;;
739706b6b52Smrg    $object)
740706b6b52Smrg      shift
741706b6b52Smrg      ;;
742b042e37fSmrg    "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
7438bd17e5fSmrg        set fnord "$@"
7448bd17e5fSmrg        shift
7458bd17e5fSmrg        shift
7468bd17e5fSmrg        ;;
747b042e37fSmrg    *)
7488bd17e5fSmrg        set fnord "$@" "$arg"
7498bd17e5fSmrg        shift
7508bd17e5fSmrg        shift
7518bd17e5fSmrg        ;;
752b042e37fSmrg    esac
753b042e37fSmrg  done
754706b6b52Smrg  "$@" -E 2>/dev/null |
755706b6b52Smrg  sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile"
756b042e37fSmrg  rm -f "$depfile"
757b042e37fSmrg  echo "$object : \\" > "$depfile"
7588bd17e5fSmrg  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile"
7598bd17e5fSmrg  echo "$tab" >> "$depfile"
760706b6b52Smrg  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile"
761b042e37fSmrg  rm -f "$tmpdepfile"
762b042e37fSmrg  ;;
763b042e37fSmrg
764706b6b52Smrgmsvcmsys)
765706b6b52Smrg  # This case exists only to let depend.m4 do its work.  It works by
766706b6b52Smrg  # looking at the text of this script.  This case will never be run,
767706b6b52Smrg  # since it is checked for above.
768706b6b52Smrg  exit 1
769706b6b52Smrg  ;;
770706b6b52Smrg
771b042e37fSmrgnone)
772b042e37fSmrg  exec "$@"
773b042e37fSmrg  ;;
774b042e37fSmrg
775b042e37fSmrg*)
776b042e37fSmrg  echo "Unknown depmode $depmode" 1>&2
777b042e37fSmrg  exit 1
778b042e37fSmrg  ;;
779b042e37fSmrgesac
780b042e37fSmrg
781b042e37fSmrgexit 0
782b042e37fSmrg
783b042e37fSmrg# Local Variables:
784b042e37fSmrg# mode: shell-script
785b042e37fSmrg# sh-indentation: 2
7868d0bc965Smrg# eval: (add-hook 'before-save-hook 'time-stamp)
787b042e37fSmrg# time-stamp-start: "scriptversion="
788b042e37fSmrg# time-stamp-format: "%:y-%02m-%02d.%02H"
7898d0bc965Smrg# time-stamp-time-zone: "UTC0"
790706b6b52Smrg# time-stamp-end: "; # UTC"
791b042e37fSmrg# End:
792