1ba6a1819Smrg#! /bin/sh
2ba6a1819Smrg# depcomp - compile a program generating dependencies as side-effects
3ba6a1819Smrg
400ca1914Smrgscriptversion=2024-06-19.01; # UTC
5ba6a1819Smrg
600ca1914Smrg# Copyright (C) 1999-2024 Free Software Foundation, Inc.
7ba6a1819Smrg
8ba6a1819Smrg# This program is free software; you can redistribute it and/or modify
9ba6a1819Smrg# it under the terms of the GNU General Public License as published by
10ba6a1819Smrg# the Free Software Foundation; either version 2, or (at your option)
11ba6a1819Smrg# any later version.
12ba6a1819Smrg
13ba6a1819Smrg# This program is distributed in the hope that it will be useful,
14ba6a1819Smrg# but WITHOUT ANY WARRANTY; without even the implied warranty of
15ba6a1819Smrg# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16ba6a1819Smrg# GNU General Public License for more details.
17ba6a1819Smrg
18ba6a1819Smrg# You should have received a copy of the GNU General Public License
19da1f2d5dSmrg# along with this program.  If not, see <https://www.gnu.org/licenses/>.
20ba6a1819Smrg
21ba6a1819Smrg# As a special exception to the GNU General Public License, if you
22ba6a1819Smrg# distribute this file as part of a program that contains a
23ba6a1819Smrg# configuration script generated by Autoconf, you may include it under
24ba6a1819Smrg# the same distribution terms that you use for the rest of that program.
25ba6a1819Smrg
26ba6a1819Smrg# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>.
27ba6a1819Smrg
28ba6a1819Smrgcase $1 in
29ba6a1819Smrg  '')
301bedbe3fSmrg    echo "$0: No command.  Try '$0 --help' for more information." 1>&2
311bedbe3fSmrg    exit 1;
321bedbe3fSmrg    ;;
33ba6a1819Smrg  -h | --h*)
34ba6a1819Smrg    cat <<\EOF
35ba6a1819SmrgUsage: depcomp [--help] [--version] PROGRAM [ARGS]
36ba6a1819Smrg
37ba6a1819SmrgRun PROGRAMS ARGS to compile a file, generating dependencies
38ba6a1819Smrgas side-effects.
39ba6a1819Smrg
40ba6a1819SmrgEnvironment variables:
41ba6a1819Smrg  depmode     Dependency tracking mode.
421bedbe3fSmrg  source      Source file read by 'PROGRAMS ARGS'.
431bedbe3fSmrg  object      Object file output by 'PROGRAMS ARGS'.
44ba6a1819Smrg  DEPDIR      directory where to store dependencies.
45ba6a1819Smrg  depfile     Dependency file to output.
461bedbe3fSmrg  tmpdepfile  Temporary file to use when outputting dependencies.
47ba6a1819Smrg  libtool     Whether libtool is used (yes/no).
48ba6a1819Smrg
49ba6a1819SmrgReport bugs to <bug-automake@gnu.org>.
5000ca1914SmrgGNU Automake home page: <https://www.gnu.org/software/automake/>.
5100ca1914SmrgGeneral help using GNU software: <https://www.gnu.org/gethelp/>.
52ba6a1819SmrgEOF
53ba6a1819Smrg    exit $?
54ba6a1819Smrg    ;;
55ba6a1819Smrg  -v | --v*)
5600ca1914Smrg    echo "depcomp (GNU Automake) $scriptversion"
57ba6a1819Smrg    exit $?
58ba6a1819Smrg    ;;
59ba6a1819Smrgesac
60ba6a1819Smrg
611bedbe3fSmrg# Get the directory component of the given path, and save it in the
621bedbe3fSmrg# global variables '$dir'.  Note that this directory component will
631bedbe3fSmrg# be either empty or ending with a '/' character.  This is deliberate.
641bedbe3fSmrgset_dir_from ()
651bedbe3fSmrg{
661bedbe3fSmrg  case $1 in
671bedbe3fSmrg    */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;;
681bedbe3fSmrg      *) dir=;;
691bedbe3fSmrg  esac
701bedbe3fSmrg}
711bedbe3fSmrg
721bedbe3fSmrg# Get the suffix-stripped basename of the given path, and save it the
731bedbe3fSmrg# global variable '$base'.
741bedbe3fSmrgset_base_from ()
751bedbe3fSmrg{
761bedbe3fSmrg  base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'`
771bedbe3fSmrg}
781bedbe3fSmrg
791bedbe3fSmrg# If no dependency file was actually created by the compiler invocation,
801bedbe3fSmrg# we still have to create a dummy depfile, to avoid errors with the
811bedbe3fSmrg# Makefile "include basename.Plo" scheme.
821bedbe3fSmrgmake_dummy_depfile ()
831bedbe3fSmrg{
841bedbe3fSmrg  echo "#dummy" > "$depfile"
851bedbe3fSmrg}
861bedbe3fSmrg
871bedbe3fSmrg# Factor out some common post-processing of the generated depfile.
881bedbe3fSmrg# Requires the auxiliary global variable '$tmpdepfile' to be set.
891bedbe3fSmrgaix_post_process_depfile ()
901bedbe3fSmrg{
911bedbe3fSmrg  # If the compiler actually managed to produce a dependency file,
921bedbe3fSmrg  # post-process it.
931bedbe3fSmrg  if test -f "$tmpdepfile"; then
941bedbe3fSmrg    # Each line is of the form 'foo.o: dependency.h'.
951bedbe3fSmrg    # Do two passes, one to just change these to
961bedbe3fSmrg    #   $object: dependency.h
971bedbe3fSmrg    # and one to simply output
981bedbe3fSmrg    #   dependency.h:
991bedbe3fSmrg    # which is needed to avoid the deleted-header problem.
1001bedbe3fSmrg    { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile"
1011bedbe3fSmrg      sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile"
1021bedbe3fSmrg    } > "$depfile"
1031bedbe3fSmrg    rm -f "$tmpdepfile"
1041bedbe3fSmrg  else
1051bedbe3fSmrg    make_dummy_depfile
1061bedbe3fSmrg  fi
1071bedbe3fSmrg}
1081bedbe3fSmrg
1091bedbe3fSmrg# A tabulation character.
1101bedbe3fSmrgtab='	'
1111bedbe3fSmrg# A newline character.
1121bedbe3fSmrgnl='
1131bedbe3fSmrg'
1141bedbe3fSmrg# Character ranges might be problematic outside the C locale.
1151bedbe3fSmrg# These definitions help.
1161bedbe3fSmrgupper=ABCDEFGHIJKLMNOPQRSTUVWXYZ
1171bedbe3fSmrglower=abcdefghijklmnopqrstuvwxyz
1181bedbe3fSmrgalpha=${upper}${lower}
1191bedbe3fSmrg
120ba6a1819Smrgif test -z "$depmode" || test -z "$source" || test -z "$object"; then
121ba6a1819Smrg  echo "depcomp: Variables source, object and depmode must be set" 1>&2
122ba6a1819Smrg  exit 1
123ba6a1819Smrgfi
124ba6a1819Smrg
125ba6a1819Smrg# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.
126ba6a1819Smrgdepfile=${depfile-`echo "$object" |
127ba6a1819Smrg  sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`}
128ba6a1819Smrgtmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
129ba6a1819Smrg
130ba6a1819Smrgrm -f "$tmpdepfile"
131ba6a1819Smrg
13200ca1914Smrg# Avoid interference from the environment.
1331bedbe3fSmrggccflag= dashmflag=
1341bedbe3fSmrg
135ba6a1819Smrg# Some modes work just like other modes, but use different flags.  We
136ba6a1819Smrg# parameterize here, but still list the modes in the big case below,
137ba6a1819Smrg# to make depend.m4 easier to write.  Note that we *cannot* use a case
138ba6a1819Smrg# here, because this file can only contain one case statement.
139ba6a1819Smrgif test "$depmode" = hp; then
140ba6a1819Smrg  # HP compiler uses -M and no extra arg.
141ba6a1819Smrg  gccflag=-M
142ba6a1819Smrg  depmode=gcc
143ba6a1819Smrgfi
144ba6a1819Smrg
145ba6a1819Smrgif test "$depmode" = dashXmstdout; then
1461bedbe3fSmrg  # This is just like dashmstdout with a different argument.
1471bedbe3fSmrg  dashmflag=-xM
1481bedbe3fSmrg  depmode=dashmstdout
149ba6a1819Smrgfi
150ba6a1819Smrg
151549e21daSmrgcygpath_u="cygpath -u -f -"
152549e21daSmrgif test "$depmode" = msvcmsys; then
1531bedbe3fSmrg  # This is just like msvisualcpp but w/o cygpath translation.
1541bedbe3fSmrg  # Just convert the backslash-escaped backslashes to single forward
1551bedbe3fSmrg  # slashes to satisfy depend.m4
1561bedbe3fSmrg  cygpath_u='sed s,\\\\,/,g'
1571bedbe3fSmrg  depmode=msvisualcpp
1581bedbe3fSmrgfi
1591bedbe3fSmrg
1601bedbe3fSmrgif test "$depmode" = msvc7msys; then
1611bedbe3fSmrg  # This is just like msvc7 but w/o cygpath translation.
1621bedbe3fSmrg  # Just convert the backslash-escaped backslashes to single forward
1631bedbe3fSmrg  # slashes to satisfy depend.m4
1641bedbe3fSmrg  cygpath_u='sed s,\\\\,/,g'
1651bedbe3fSmrg  depmode=msvc7
1661bedbe3fSmrgfi
1671bedbe3fSmrg
1681bedbe3fSmrgif test "$depmode" = xlc; then
1691bedbe3fSmrg  # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information.
1701bedbe3fSmrg  gccflag=-qmakedep=gcc,-MF
1711bedbe3fSmrg  depmode=gcc
172549e21daSmrgfi
173549e21daSmrg
174ba6a1819Smrgcase "$depmode" in
175ba6a1819Smrggcc3)
176ba6a1819Smrg## gcc 3 implements dependency tracking that does exactly what
177ba6a1819Smrg## we want.  Yay!  Note: for some reason libtool 1.4 doesn't like
178ba6a1819Smrg## it if -MD -MP comes after the -MF stuff.  Hmm.
179ba6a1819Smrg## Unfortunately, FreeBSD c89 acceptance of flags depends upon
180ba6a1819Smrg## the command line argument order; so add the flags where they
181ba6a1819Smrg## appear in depend2.am.  Note that the slowdown incurred here
182ba6a1819Smrg## affects only configure: in makefiles, %FASTDEP% shortcuts this.
183ba6a1819Smrg  for arg
184ba6a1819Smrg  do
185ba6a1819Smrg    case $arg in
186ba6a1819Smrg    -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;;
187ba6a1819Smrg    *)  set fnord "$@" "$arg" ;;
188ba6a1819Smrg    esac
189ba6a1819Smrg    shift # fnord
190ba6a1819Smrg    shift # $arg
191ba6a1819Smrg  done
192ba6a1819Smrg  "$@"
193ba6a1819Smrg  stat=$?
1941bedbe3fSmrg  if test $stat -ne 0; then
195ba6a1819Smrg    rm -f "$tmpdepfile"
196ba6a1819Smrg    exit $stat
197ba6a1819Smrg  fi
198ba6a1819Smrg  mv "$tmpdepfile" "$depfile"
199ba6a1819Smrg  ;;
200ba6a1819Smrg
201ba6a1819Smrggcc)
20200ca1914Smrg## Note that this doesn't just cater to obsolete pre-3.x GCC compilers.
20300ca1914Smrg## but also to in-use compilers like IBM xlc/xlC and the HP C compiler.
2041bedbe3fSmrg## (see the conditional assignment to $gccflag above).
205ba6a1819Smrg## There are various ways to get dependency output from gcc.  Here's
206ba6a1819Smrg## why we pick this rather obscure method:
207ba6a1819Smrg## - Don't want to use -MD because we'd like the dependencies to end
208ba6a1819Smrg##   up in a subdir.  Having to rename by hand is ugly.
209ba6a1819Smrg##   (We might end up doing this anyway to support other compilers.)
210ba6a1819Smrg## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
2111bedbe3fSmrg##   -MM, not -M (despite what the docs say).  Also, it might not be
2121bedbe3fSmrg##   supported by the other compilers which use the 'gcc' depmode.
213ba6a1819Smrg## - Using -M directly means running the compiler twice (even worse
214ba6a1819Smrg##   than renaming).
215ba6a1819Smrg  if test -z "$gccflag"; then
216ba6a1819Smrg    gccflag=-MD,
217ba6a1819Smrg  fi
218ba6a1819Smrg  "$@" -Wp,"$gccflag$tmpdepfile"
219ba6a1819Smrg  stat=$?
2201bedbe3fSmrg  if test $stat -ne 0; then
221ba6a1819Smrg    rm -f "$tmpdepfile"
222ba6a1819Smrg    exit $stat
223ba6a1819Smrg  fi
224ba6a1819Smrg  rm -f "$depfile"
225ba6a1819Smrg  echo "$object : \\" > "$depfile"
2261bedbe3fSmrg  # The second -e expression handles DOS-style file names with drive
2271bedbe3fSmrg  # letters.
228ba6a1819Smrg  sed -e 's/^[^:]*: / /' \
229ba6a1819Smrg      -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
2301bedbe3fSmrg## This next piece of magic avoids the "deleted header file" problem.
231ba6a1819Smrg## The problem is that when a header file which appears in a .P file
232ba6a1819Smrg## is deleted, the dependency causes make to die (because there is
233ba6a1819Smrg## typically no way to rebuild the header).  We avoid this by adding
234ba6a1819Smrg## dummy dependencies for each header file.  Too bad gcc doesn't do
235ba6a1819Smrg## this for us directly.
2361bedbe3fSmrg## Some versions of gcc put a space before the ':'.  On the theory
237ba6a1819Smrg## that the space means something, we add a space to the output as
2381bedbe3fSmrg## well.  hp depmode also adds that space, but also prefixes the VPATH
2391bedbe3fSmrg## to the object.  Take care to not repeat it in the output.
240ba6a1819Smrg## Some versions of the HPUX 10.20 sed can't process this invocation
241ba6a1819Smrg## correctly.  Breaking it into two sed invocations is a workaround.
2421bedbe3fSmrg  tr ' ' "$nl" < "$tmpdepfile" \
2431bedbe3fSmrg    | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \
2441bedbe3fSmrg    | sed -e 's/$/ :/' >> "$depfile"
245ba6a1819Smrg  rm -f "$tmpdepfile"
246ba6a1819Smrg  ;;
247ba6a1819Smrg
248ba6a1819Smrghp)
249ba6a1819Smrg  # This case exists only to let depend.m4 do its work.  It works by
250ba6a1819Smrg  # looking at the text of this script.  This case will never be run,
251ba6a1819Smrg  # since it is checked for above.
252ba6a1819Smrg  exit 1
253ba6a1819Smrg  ;;
254ba6a1819Smrg
255ba6a1819Smrgsgi)
256ba6a1819Smrg  if test "$libtool" = yes; then
257ba6a1819Smrg    "$@" "-Wp,-MDupdate,$tmpdepfile"
258ba6a1819Smrg  else
259ba6a1819Smrg    "$@" -MDupdate "$tmpdepfile"
260ba6a1819Smrg  fi
261ba6a1819Smrg  stat=$?
2621bedbe3fSmrg  if test $stat -ne 0; then
263ba6a1819Smrg    rm -f "$tmpdepfile"
264ba6a1819Smrg    exit $stat
265ba6a1819Smrg  fi
266ba6a1819Smrg  rm -f "$depfile"
267ba6a1819Smrg
268ba6a1819Smrg  if test -f "$tmpdepfile"; then  # yes, the sourcefile depend on other files
269ba6a1819Smrg    echo "$object : \\" > "$depfile"
270ba6a1819Smrg    # Clip off the initial element (the dependent).  Don't try to be
271ba6a1819Smrg    # clever and replace this with sed code, as IRIX sed won't handle
272ba6a1819Smrg    # lines with more than a fixed number of characters (4096 in
273ba6a1819Smrg    # IRIX 6.2 sed, 8192 in IRIX 6.5).  We also remove comment lines;
2741bedbe3fSmrg    # the IRIX cc adds comments like '#:fec' to the end of the
275ba6a1819Smrg    # dependency line.
2761bedbe3fSmrg    tr ' ' "$nl" < "$tmpdepfile" \
2771bedbe3fSmrg      | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \
2781bedbe3fSmrg      | tr "$nl" ' ' >> "$depfile"
279549e21daSmrg    echo >> "$depfile"
280ba6a1819Smrg    # The second pass generates a dummy entry for each header file.
2811bedbe3fSmrg    tr ' ' "$nl" < "$tmpdepfile" \
2821bedbe3fSmrg      | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
2831bedbe3fSmrg      >> "$depfile"
284ba6a1819Smrg  else
2851bedbe3fSmrg    make_dummy_depfile
286ba6a1819Smrg  fi
287ba6a1819Smrg  rm -f "$tmpdepfile"
288ba6a1819Smrg  ;;
289ba6a1819Smrg
2901bedbe3fSmrgxlc)
2911bedbe3fSmrg  # This case exists only to let depend.m4 do its work.  It works by
2921bedbe3fSmrg  # looking at the text of this script.  This case will never be run,
2931bedbe3fSmrg  # since it is checked for above.
2941bedbe3fSmrg  exit 1
2951bedbe3fSmrg  ;;
2961bedbe3fSmrg
297ba6a1819Smrgaix)
298ba6a1819Smrg  # The C for AIX Compiler uses -M and outputs the dependencies
299ba6a1819Smrg  # in a .u file.  In older versions, this file always lives in the
3001bedbe3fSmrg  # current directory.  Also, the AIX compiler puts '$object:' at the
301ba6a1819Smrg  # start of each line; $object doesn't have directory information.
302ba6a1819Smrg  # Version 6 uses the directory in both cases.
3031bedbe3fSmrg  set_dir_from "$object"
3041bedbe3fSmrg  set_base_from "$object"
305ba6a1819Smrg  if test "$libtool" = yes; then
306549e21daSmrg    tmpdepfile1=$dir$base.u
307549e21daSmrg    tmpdepfile2=$base.u
308549e21daSmrg    tmpdepfile3=$dir.libs/$base.u
309ba6a1819Smrg    "$@" -Wc,-M
310ba6a1819Smrg  else
311549e21daSmrg    tmpdepfile1=$dir$base.u
312549e21daSmrg    tmpdepfile2=$dir$base.u
313549e21daSmrg    tmpdepfile3=$dir$base.u
314ba6a1819Smrg    "$@" -M
315ba6a1819Smrg  fi
316ba6a1819Smrg  stat=$?
3171bedbe3fSmrg  if test $stat -ne 0; then
318549e21daSmrg    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
319ba6a1819Smrg    exit $stat
320ba6a1819Smrg  fi
321ba6a1819Smrg
322549e21daSmrg  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
323549e21daSmrg  do
324549e21daSmrg    test -f "$tmpdepfile" && break
325549e21daSmrg  done
3261bedbe3fSmrg  aix_post_process_depfile
3271bedbe3fSmrg  ;;
3281bedbe3fSmrg
3291bedbe3fSmrgtcc)
3301bedbe3fSmrg  # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26
3311bedbe3fSmrg  # FIXME: That version still under development at the moment of writing.
3321bedbe3fSmrg  #        Make that this statement remains true also for stable, released
3331bedbe3fSmrg  #        versions.
3341bedbe3fSmrg  # It will wrap lines (doesn't matter whether long or short) with a
3351bedbe3fSmrg  # trailing '\', as in:
3361bedbe3fSmrg  #
3371bedbe3fSmrg  #   foo.o : \
3381bedbe3fSmrg  #    foo.c \
3391bedbe3fSmrg  #    foo.h \
3401bedbe3fSmrg  #
3411bedbe3fSmrg  # It will put a trailing '\' even on the last line, and will use leading
3421bedbe3fSmrg  # spaces rather than leading tabs (at least since its commit 0394caf7
3431bedbe3fSmrg  # "Emit spaces for -MD").
3441bedbe3fSmrg  "$@" -MD -MF "$tmpdepfile"
3451bedbe3fSmrg  stat=$?
3461bedbe3fSmrg  if test $stat -ne 0; then
3471bedbe3fSmrg    rm -f "$tmpdepfile"
3481bedbe3fSmrg    exit $stat
349ba6a1819Smrg  fi
3501bedbe3fSmrg  rm -f "$depfile"
3511bedbe3fSmrg  # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'.
3521bedbe3fSmrg  # We have to change lines of the first kind to '$object: \'.
3531bedbe3fSmrg  sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile"
3541bedbe3fSmrg  # And for each line of the second kind, we have to emit a 'dep.h:'
3551bedbe3fSmrg  # dummy dependency, to avoid the deleted-header problem.
3561bedbe3fSmrg  sed -n -e 's|^  *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile"
357ba6a1819Smrg  rm -f "$tmpdepfile"
358ba6a1819Smrg  ;;
359ba6a1819Smrg
3601bedbe3fSmrg## The order of this option in the case statement is important, since the
3611bedbe3fSmrg## shell code in configure will try each of these formats in the order
3621bedbe3fSmrg## listed in this file.  A plain '-MD' option would be understood by many
3631bedbe3fSmrg## compilers, so we must ensure this comes after the gcc and icc options.
3641bedbe3fSmrgpgcc)
3651bedbe3fSmrg  # Portland's C compiler understands '-MD'.
3661bedbe3fSmrg  # Will always output deps to 'file.d' where file is the root name of the
3671bedbe3fSmrg  # source file under compilation, even if file resides in a subdirectory.
3681bedbe3fSmrg  # The object file name does not affect the name of the '.d' file.
3691bedbe3fSmrg  # pgcc 10.2 will output
370ba6a1819Smrg  #    foo.o: sub/foo.c sub/foo.h
3711bedbe3fSmrg  # and will wrap long lines using '\' :
372ba6a1819Smrg  #    foo.o: sub/foo.c ... \
373ba6a1819Smrg  #     sub/foo.h ... \
374ba6a1819Smrg  #     ...
3751bedbe3fSmrg  set_dir_from "$object"
3761bedbe3fSmrg  # Use the source, not the object, to determine the base name, since
3771bedbe3fSmrg  # that's sadly what pgcc will do too.
3781bedbe3fSmrg  set_base_from "$source"
3791bedbe3fSmrg  tmpdepfile=$base.d
3801bedbe3fSmrg
3811bedbe3fSmrg  # For projects that build the same source file twice into different object
3821bedbe3fSmrg  # files, the pgcc approach of using the *source* file root name can cause
3831bedbe3fSmrg  # problems in parallel builds.  Use a locking strategy to avoid stomping on
3841bedbe3fSmrg  # the same $tmpdepfile.
3851bedbe3fSmrg  lockdir=$base.d-lock
3861bedbe3fSmrg  trap "
3871bedbe3fSmrg    echo '$0: caught signal, cleaning up...' >&2
3881bedbe3fSmrg    rmdir '$lockdir'
3891bedbe3fSmrg    exit 1
3901bedbe3fSmrg  " 1 2 13 15
3911bedbe3fSmrg  numtries=100
3921bedbe3fSmrg  i=$numtries
3931bedbe3fSmrg  while test $i -gt 0; do
3941bedbe3fSmrg    # mkdir is a portable test-and-set.
3951bedbe3fSmrg    if mkdir "$lockdir" 2>/dev/null; then
3961bedbe3fSmrg      # This process acquired the lock.
3971bedbe3fSmrg      "$@" -MD
3981bedbe3fSmrg      stat=$?
3991bedbe3fSmrg      # Release the lock.
4001bedbe3fSmrg      rmdir "$lockdir"
4011bedbe3fSmrg      break
4021bedbe3fSmrg    else
4031bedbe3fSmrg      # If the lock is being held by a different process, wait
4041bedbe3fSmrg      # until the winning process is done or we timeout.
4051bedbe3fSmrg      while test -d "$lockdir" && test $i -gt 0; do
4061bedbe3fSmrg        sleep 1
4071bedbe3fSmrg        i=`expr $i - 1`
4081bedbe3fSmrg      done
4091bedbe3fSmrg    fi
4101bedbe3fSmrg    i=`expr $i - 1`
4111bedbe3fSmrg  done
4121bedbe3fSmrg  trap - 1 2 13 15
4131bedbe3fSmrg  if test $i -le 0; then
4141bedbe3fSmrg    echo "$0: failed to acquire lock after $numtries attempts" >&2
4151bedbe3fSmrg    echo "$0: check lockdir '$lockdir'" >&2
4161bedbe3fSmrg    exit 1
4171bedbe3fSmrg  fi
418ba6a1819Smrg
4191bedbe3fSmrg  if test $stat -ne 0; then
420ba6a1819Smrg    rm -f "$tmpdepfile"
421ba6a1819Smrg    exit $stat
422ba6a1819Smrg  fi
423ba6a1819Smrg  rm -f "$depfile"
424ba6a1819Smrg  # Each line is of the form `foo.o: dependent.h',
425ba6a1819Smrg  # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'.
426ba6a1819Smrg  # Do two passes, one to just change these to
427ba6a1819Smrg  # `$object: dependent.h' and one to simply `dependent.h:'.
428ba6a1819Smrg  sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
429ba6a1819Smrg  # Some versions of the HPUX 10.20 sed can't process this invocation
430ba6a1819Smrg  # correctly.  Breaking it into two sed invocations is a workaround.
4311bedbe3fSmrg  sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \
4321bedbe3fSmrg    | sed -e 's/$/ :/' >> "$depfile"
433ba6a1819Smrg  rm -f "$tmpdepfile"
434ba6a1819Smrg  ;;
435ba6a1819Smrg
436ba6a1819Smrghp2)
437ba6a1819Smrg  # The "hp" stanza above does not work with aCC (C++) and HP's ia64
438ba6a1819Smrg  # compilers, which have integrated preprocessors.  The correct option
439ba6a1819Smrg  # to use with these is +Maked; it writes dependencies to a file named
440ba6a1819Smrg  # 'foo.d', which lands next to the object file, wherever that
441ba6a1819Smrg  # happens to be.
442ba6a1819Smrg  # Much of this is similar to the tru64 case; see comments there.
4431bedbe3fSmrg  set_dir_from  "$object"
4441bedbe3fSmrg  set_base_from "$object"
445ba6a1819Smrg  if test "$libtool" = yes; then
446ba6a1819Smrg    tmpdepfile1=$dir$base.d
447ba6a1819Smrg    tmpdepfile2=$dir.libs/$base.d
448ba6a1819Smrg    "$@" -Wc,+Maked
449ba6a1819Smrg  else
450ba6a1819Smrg    tmpdepfile1=$dir$base.d
451ba6a1819Smrg    tmpdepfile2=$dir$base.d
452ba6a1819Smrg    "$@" +Maked
453ba6a1819Smrg  fi
454ba6a1819Smrg  stat=$?
4551bedbe3fSmrg  if test $stat -ne 0; then
456ba6a1819Smrg     rm -f "$tmpdepfile1" "$tmpdepfile2"
457ba6a1819Smrg     exit $stat
458ba6a1819Smrg  fi
459ba6a1819Smrg
460ba6a1819Smrg  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2"
461ba6a1819Smrg  do
462ba6a1819Smrg    test -f "$tmpdepfile" && break
463ba6a1819Smrg  done
464ba6a1819Smrg  if test -f "$tmpdepfile"; then
4651bedbe3fSmrg    sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile"
4661bedbe3fSmrg    # Add 'dependent.h:' lines.
467549e21daSmrg    sed -ne '2,${
4681bedbe3fSmrg               s/^ *//
4691bedbe3fSmrg               s/ \\*$//
4701bedbe3fSmrg               s/$/:/
4711bedbe3fSmrg               p
4721bedbe3fSmrg             }' "$tmpdepfile" >> "$depfile"
473ba6a1819Smrg  else
4741bedbe3fSmrg    make_dummy_depfile
475ba6a1819Smrg  fi
476ba6a1819Smrg  rm -f "$tmpdepfile" "$tmpdepfile2"
477ba6a1819Smrg  ;;
478ba6a1819Smrg
479ba6a1819Smrgtru64)
4801bedbe3fSmrg  # The Tru64 compiler uses -MD to generate dependencies as a side
4811bedbe3fSmrg  # effect.  'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'.
4821bedbe3fSmrg  # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
4831bedbe3fSmrg  # dependencies in 'foo.d' instead, so we check for that too.
4841bedbe3fSmrg  # Subdirectories are respected.
4851bedbe3fSmrg  set_dir_from  "$object"
4861bedbe3fSmrg  set_base_from "$object"
4871bedbe3fSmrg
4881bedbe3fSmrg  if test "$libtool" = yes; then
4891bedbe3fSmrg    # Libtool generates 2 separate objects for the 2 libraries.  These
4901bedbe3fSmrg    # two compilations output dependencies in $dir.libs/$base.o.d and
4911bedbe3fSmrg    # in $dir$base.o.d.  We have to check for both files, because
4921bedbe3fSmrg    # one of the two compilations can be disabled.  We should prefer
4931bedbe3fSmrg    # $dir$base.o.d over $dir.libs/$base.o.d because the latter is
4941bedbe3fSmrg    # automatically cleaned when .libs/ is deleted, while ignoring
4951bedbe3fSmrg    # the former would cause a distcleancheck panic.
4961bedbe3fSmrg    tmpdepfile1=$dir$base.o.d          # libtool 1.5
4971bedbe3fSmrg    tmpdepfile2=$dir.libs/$base.o.d    # Likewise.
4981bedbe3fSmrg    tmpdepfile3=$dir.libs/$base.d      # Compaq CCC V6.2-504
4991bedbe3fSmrg    "$@" -Wc,-MD
5001bedbe3fSmrg  else
5011bedbe3fSmrg    tmpdepfile1=$dir$base.d
5021bedbe3fSmrg    tmpdepfile2=$dir$base.d
5031bedbe3fSmrg    tmpdepfile3=$dir$base.d
5041bedbe3fSmrg    "$@" -MD
5051bedbe3fSmrg  fi
5061bedbe3fSmrg
5071bedbe3fSmrg  stat=$?
5081bedbe3fSmrg  if test $stat -ne 0; then
5091bedbe3fSmrg    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
5101bedbe3fSmrg    exit $stat
5111bedbe3fSmrg  fi
5121bedbe3fSmrg
5131bedbe3fSmrg  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
5141bedbe3fSmrg  do
5151bedbe3fSmrg    test -f "$tmpdepfile" && break
5161bedbe3fSmrg  done
5171bedbe3fSmrg  # Same post-processing that is required for AIX mode.
5181bedbe3fSmrg  aix_post_process_depfile
5191bedbe3fSmrg  ;;
5201bedbe3fSmrg
5211bedbe3fSmrgmsvc7)
5221bedbe3fSmrg  if test "$libtool" = yes; then
5231bedbe3fSmrg    showIncludes=-Wc,-showIncludes
5241bedbe3fSmrg  else
5251bedbe3fSmrg    showIncludes=-showIncludes
5261bedbe3fSmrg  fi
5271bedbe3fSmrg  "$@" $showIncludes > "$tmpdepfile"
5281bedbe3fSmrg  stat=$?
5291bedbe3fSmrg  grep -v '^Note: including file: ' "$tmpdepfile"
5301bedbe3fSmrg  if test $stat -ne 0; then
5311bedbe3fSmrg    rm -f "$tmpdepfile"
5321bedbe3fSmrg    exit $stat
5331bedbe3fSmrg  fi
5341bedbe3fSmrg  rm -f "$depfile"
5351bedbe3fSmrg  echo "$object : \\" > "$depfile"
5361bedbe3fSmrg  # The first sed program below extracts the file names and escapes
5371bedbe3fSmrg  # backslashes for cygpath.  The second sed program outputs the file
5381bedbe3fSmrg  # name when reading, but also accumulates all include files in the
5391bedbe3fSmrg  # hold buffer in order to output them again at the end.  This only
5401bedbe3fSmrg  # works with sed implementations that can handle large buffers.
5411bedbe3fSmrg  sed < "$tmpdepfile" -n '
5421bedbe3fSmrg/^Note: including file:  *\(.*\)/ {
5431bedbe3fSmrg  s//\1/
5441bedbe3fSmrg  s/\\/\\\\/g
5451bedbe3fSmrg  p
5461bedbe3fSmrg}' | $cygpath_u | sort -u | sed -n '
5471bedbe3fSmrgs/ /\\ /g
5481bedbe3fSmrgs/\(.*\)/'"$tab"'\1 \\/p
5491bedbe3fSmrgs/.\(.*\) \\/\1:/
5501bedbe3fSmrgH
5511bedbe3fSmrg$ {
5521bedbe3fSmrg  s/.*/'"$tab"'/
5531bedbe3fSmrg  G
5541bedbe3fSmrg  p
5551bedbe3fSmrg}' >> "$depfile"
5566af7124fSmrg  echo >> "$depfile" # make sure the fragment doesn't end with a backslash
5571bedbe3fSmrg  rm -f "$tmpdepfile"
5581bedbe3fSmrg  ;;
5591bedbe3fSmrg
5601bedbe3fSmrgmsvc7msys)
5611bedbe3fSmrg  # This case exists only to let depend.m4 do its work.  It works by
5621bedbe3fSmrg  # looking at the text of this script.  This case will never be run,
5631bedbe3fSmrg  # since it is checked for above.
5641bedbe3fSmrg  exit 1
5651bedbe3fSmrg  ;;
566ba6a1819Smrg
567ba6a1819Smrg#nosideeffect)
568ba6a1819Smrg  # This comment above is used by automake to tell side-effect
569ba6a1819Smrg  # dependency tracking mechanisms from slower ones.
570ba6a1819Smrg
571ba6a1819Smrgdashmstdout)
572ba6a1819Smrg  # Important note: in order to support this mode, a compiler *must*
573ba6a1819Smrg  # always write the preprocessed file to stdout, regardless of -o.
574ba6a1819Smrg  "$@" || exit $?
575ba6a1819Smrg
576ba6a1819Smrg  # Remove the call to Libtool.
577ba6a1819Smrg  if test "$libtool" = yes; then
578549e21daSmrg    while test "X$1" != 'X--mode=compile'; do
579ba6a1819Smrg      shift
580ba6a1819Smrg    done
581ba6a1819Smrg    shift
582ba6a1819Smrg  fi
583ba6a1819Smrg
5841bedbe3fSmrg  # Remove '-o $object'.
585ba6a1819Smrg  IFS=" "
586ba6a1819Smrg  for arg
587ba6a1819Smrg  do
588ba6a1819Smrg    case $arg in
589ba6a1819Smrg    -o)
590ba6a1819Smrg      shift
591ba6a1819Smrg      ;;
592ba6a1819Smrg    $object)
593ba6a1819Smrg      shift
594ba6a1819Smrg      ;;
595ba6a1819Smrg    *)
596ba6a1819Smrg      set fnord "$@" "$arg"
597ba6a1819Smrg      shift # fnord
598ba6a1819Smrg      shift # $arg
599ba6a1819Smrg      ;;
600ba6a1819Smrg    esac
601ba6a1819Smrg  done
602ba6a1819Smrg
603ba6a1819Smrg  test -z "$dashmflag" && dashmflag=-M
6041bedbe3fSmrg  # Require at least two characters before searching for ':'
605ba6a1819Smrg  # in the target name.  This is to cope with DOS-style filenames:
6061bedbe3fSmrg  # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise.
607ba6a1819Smrg  "$@" $dashmflag |
6081bedbe3fSmrg    sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile"
609ba6a1819Smrg  rm -f "$depfile"
610ba6a1819Smrg  cat < "$tmpdepfile" > "$depfile"
6111bedbe3fSmrg  # Some versions of the HPUX 10.20 sed can't process this sed invocation
6121bedbe3fSmrg  # correctly.  Breaking it into two sed invocations is a workaround.
6131bedbe3fSmrg  tr ' ' "$nl" < "$tmpdepfile" \
6141bedbe3fSmrg    | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
6151bedbe3fSmrg    | sed -e 's/$/ :/' >> "$depfile"
616ba6a1819Smrg  rm -f "$tmpdepfile"
617ba6a1819Smrg  ;;
618ba6a1819Smrg
619ba6a1819SmrgdashXmstdout)
620ba6a1819Smrg  # This case only exists to satisfy depend.m4.  It is never actually
621ba6a1819Smrg  # run, as this mode is specially recognized in the preamble.
622ba6a1819Smrg  exit 1
623ba6a1819Smrg  ;;
624ba6a1819Smrg
625ba6a1819Smrgmakedepend)
626ba6a1819Smrg  "$@" || exit $?
627ba6a1819Smrg  # Remove any Libtool call
628ba6a1819Smrg  if test "$libtool" = yes; then
629549e21daSmrg    while test "X$1" != 'X--mode=compile'; do
630ba6a1819Smrg      shift
631ba6a1819Smrg    done
632ba6a1819Smrg    shift
633ba6a1819Smrg  fi
634ba6a1819Smrg  # X makedepend
635ba6a1819Smrg  shift
636549e21daSmrg  cleared=no eat=no
637549e21daSmrg  for arg
638549e21daSmrg  do
639ba6a1819Smrg    case $cleared in
640ba6a1819Smrg    no)
641ba6a1819Smrg      set ""; shift
642ba6a1819Smrg      cleared=yes ;;
643ba6a1819Smrg    esac
644549e21daSmrg    if test $eat = yes; then
645549e21daSmrg      eat=no
646549e21daSmrg      continue
647549e21daSmrg    fi
648ba6a1819Smrg    case "$arg" in
649ba6a1819Smrg    -D*|-I*)
650ba6a1819Smrg      set fnord "$@" "$arg"; shift ;;
651ba6a1819Smrg    # Strip any option that makedepend may not understand.  Remove
652ba6a1819Smrg    # the object too, otherwise makedepend will parse it as a source file.
653549e21daSmrg    -arch)
654549e21daSmrg      eat=yes ;;
655ba6a1819Smrg    -*|$object)
656ba6a1819Smrg      ;;
657ba6a1819Smrg    *)
658ba6a1819Smrg      set fnord "$@" "$arg"; shift ;;
659ba6a1819Smrg    esac
660ba6a1819Smrg  done
661549e21daSmrg  obj_suffix=`echo "$object" | sed 's/^.*\././'`
662ba6a1819Smrg  touch "$tmpdepfile"
663ba6a1819Smrg  ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
664ba6a1819Smrg  rm -f "$depfile"
6651bedbe3fSmrg  # makedepend may prepend the VPATH from the source file name to the object.
6661bedbe3fSmrg  # No need to regex-escape $object, excess matching of '.' is harmless.
6671bedbe3fSmrg  sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile"
6681bedbe3fSmrg  # Some versions of the HPUX 10.20 sed can't process the last invocation
6691bedbe3fSmrg  # correctly.  Breaking it into two sed invocations is a workaround.
6701bedbe3fSmrg  sed '1,2d' "$tmpdepfile" \
6711bedbe3fSmrg    | tr ' ' "$nl" \
6721bedbe3fSmrg    | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
6731bedbe3fSmrg    | sed -e 's/$/ :/' >> "$depfile"
674ba6a1819Smrg  rm -f "$tmpdepfile" "$tmpdepfile".bak
675ba6a1819Smrg  ;;
676ba6a1819Smrg
677ba6a1819Smrgcpp)
678ba6a1819Smrg  # Important note: in order to support this mode, a compiler *must*
679ba6a1819Smrg  # always write the preprocessed file to stdout.
680ba6a1819Smrg  "$@" || exit $?
681ba6a1819Smrg
682ba6a1819Smrg  # Remove the call to Libtool.
683ba6a1819Smrg  if test "$libtool" = yes; then
684549e21daSmrg    while test "X$1" != 'X--mode=compile'; do
685ba6a1819Smrg      shift
686ba6a1819Smrg    done
687ba6a1819Smrg    shift
688ba6a1819Smrg  fi
689ba6a1819Smrg
6901bedbe3fSmrg  # Remove '-o $object'.
691ba6a1819Smrg  IFS=" "
692ba6a1819Smrg  for arg
693ba6a1819Smrg  do
694ba6a1819Smrg    case $arg in
695ba6a1819Smrg    -o)
696ba6a1819Smrg      shift
697ba6a1819Smrg      ;;
698ba6a1819Smrg    $object)
699ba6a1819Smrg      shift
700ba6a1819Smrg      ;;
701ba6a1819Smrg    *)
702ba6a1819Smrg      set fnord "$@" "$arg"
703ba6a1819Smrg      shift # fnord
704ba6a1819Smrg      shift # $arg
705ba6a1819Smrg      ;;
706ba6a1819Smrg    esac
707ba6a1819Smrg  done
708ba6a1819Smrg
7091bedbe3fSmrg  "$@" -E \
7101bedbe3fSmrg    | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
7111bedbe3fSmrg             -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
7121bedbe3fSmrg    | sed '$ s: \\$::' > "$tmpdepfile"
713ba6a1819Smrg  rm -f "$depfile"
714ba6a1819Smrg  echo "$object : \\" > "$depfile"
715ba6a1819Smrg  cat < "$tmpdepfile" >> "$depfile"
716ba6a1819Smrg  sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
717ba6a1819Smrg  rm -f "$tmpdepfile"
718ba6a1819Smrg  ;;
719ba6a1819Smrg
720ba6a1819Smrgmsvisualcpp)
721ba6a1819Smrg  # Important note: in order to support this mode, a compiler *must*
722549e21daSmrg  # always write the preprocessed file to stdout.
723ba6a1819Smrg  "$@" || exit $?
724549e21daSmrg
725549e21daSmrg  # Remove the call to Libtool.
726549e21daSmrg  if test "$libtool" = yes; then
727549e21daSmrg    while test "X$1" != 'X--mode=compile'; do
728549e21daSmrg      shift
729549e21daSmrg    done
730549e21daSmrg    shift
731549e21daSmrg  fi
732549e21daSmrg
733ba6a1819Smrg  IFS=" "
734ba6a1819Smrg  for arg
735ba6a1819Smrg  do
736ba6a1819Smrg    case "$arg" in
737549e21daSmrg    -o)
738549e21daSmrg      shift
739549e21daSmrg      ;;
740549e21daSmrg    $object)
741549e21daSmrg      shift
742549e21daSmrg      ;;
743ba6a1819Smrg    "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
7441bedbe3fSmrg        set fnord "$@"
7451bedbe3fSmrg        shift
7461bedbe3fSmrg        shift
7471bedbe3fSmrg        ;;
748ba6a1819Smrg    *)
7491bedbe3fSmrg        set fnord "$@" "$arg"
7501bedbe3fSmrg        shift
7511bedbe3fSmrg        shift
7521bedbe3fSmrg        ;;
753ba6a1819Smrg    esac
754ba6a1819Smrg  done
755549e21daSmrg  "$@" -E 2>/dev/null |
756549e21daSmrg  sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile"
757ba6a1819Smrg  rm -f "$depfile"
758ba6a1819Smrg  echo "$object : \\" > "$depfile"
7591bedbe3fSmrg  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile"
7601bedbe3fSmrg  echo "$tab" >> "$depfile"
761549e21daSmrg  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile"
762ba6a1819Smrg  rm -f "$tmpdepfile"
763ba6a1819Smrg  ;;
764ba6a1819Smrg
765549e21daSmrgmsvcmsys)
766549e21daSmrg  # This case exists only to let depend.m4 do its work.  It works by
767549e21daSmrg  # looking at the text of this script.  This case will never be run,
768549e21daSmrg  # since it is checked for above.
769549e21daSmrg  exit 1
770549e21daSmrg  ;;
771549e21daSmrg
772ba6a1819Smrgnone)
773ba6a1819Smrg  exec "$@"
774ba6a1819Smrg  ;;
775ba6a1819Smrg
776ba6a1819Smrg*)
777ba6a1819Smrg  echo "Unknown depmode $depmode" 1>&2
778ba6a1819Smrg  exit 1
779ba6a1819Smrg  ;;
780ba6a1819Smrgesac
781ba6a1819Smrg
782ba6a1819Smrgexit 0
783ba6a1819Smrg
784ba6a1819Smrg# Local Variables:
785ba6a1819Smrg# mode: shell-script
786ba6a1819Smrg# sh-indentation: 2
787da1f2d5dSmrg# eval: (add-hook 'before-save-hook 'time-stamp)
788ba6a1819Smrg# time-stamp-start: "scriptversion="
789ba6a1819Smrg# time-stamp-format: "%:y-%02m-%02d.%02H"
790da1f2d5dSmrg# time-stamp-time-zone: "UTC0"
791549e21daSmrg# time-stamp-end: "; # UTC"
792ba6a1819Smrg# End:
793