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