depcomp revision 3b4ba46c
11ab64890Smrg#! /bin/sh
21ab64890Smrg# depcomp - compile a program generating dependencies as side-effects
31ab64890Smrg
43b4ba46cSmrgscriptversion=2024-06-19.01; # UTC
51ab64890Smrg
63b4ba46cSmrg# Copyright (C) 1999-2024 Free Software Foundation, Inc.
71ab64890Smrg
81ab64890Smrg# This program is free software; you can redistribute it and/or modify
91ab64890Smrg# it under the terms of the GNU General Public License as published by
101ab64890Smrg# the Free Software Foundation; either version 2, or (at your option)
111ab64890Smrg# any later version.
121ab64890Smrg
131ab64890Smrg# This program is distributed in the hope that it will be useful,
141ab64890Smrg# but WITHOUT ANY WARRANTY; without even the implied warranty of
151ab64890Smrg# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
161ab64890Smrg# GNU General Public License for more details.
171ab64890Smrg
181ab64890Smrg# You should have received a copy of the GNU General Public License
197d2c738bSmrg# along with this program.  If not, see <https://www.gnu.org/licenses/>.
201ab64890Smrg
211ab64890Smrg# As a special exception to the GNU General Public License, if you
221ab64890Smrg# distribute this file as part of a program that contains a
231ab64890Smrg# configuration script generated by Autoconf, you may include it under
241ab64890Smrg# the same distribution terms that you use for the rest of that program.
251ab64890Smrg
261ab64890Smrg# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>.
271ab64890Smrg
281ab64890Smrgcase $1 in
291ab64890Smrg  '')
30eb411b4bSmrg    echo "$0: No command.  Try '$0 --help' for more information." 1>&2
31eb411b4bSmrg    exit 1;
32eb411b4bSmrg    ;;
331ab64890Smrg  -h | --h*)
341ab64890Smrg    cat <<\EOF
351ab64890SmrgUsage: depcomp [--help] [--version] PROGRAM [ARGS]
361ab64890Smrg
371ab64890SmrgRun PROGRAMS ARGS to compile a file, generating dependencies
381ab64890Smrgas side-effects.
391ab64890Smrg
401ab64890SmrgEnvironment variables:
411ab64890Smrg  depmode     Dependency tracking mode.
42eb411b4bSmrg  source      Source file read by 'PROGRAMS ARGS'.
43eb411b4bSmrg  object      Object file output by 'PROGRAMS ARGS'.
441ab64890Smrg  DEPDIR      directory where to store dependencies.
451ab64890Smrg  depfile     Dependency file to output.
46eb411b4bSmrg  tmpdepfile  Temporary file to use when outputting dependencies.
471ab64890Smrg  libtool     Whether libtool is used (yes/no).
481ab64890Smrg
491ab64890SmrgReport bugs to <bug-automake@gnu.org>.
503b4ba46cSmrgGNU Automake home page: <https://www.gnu.org/software/automake/>.
513b4ba46cSmrgGeneral help using GNU software: <https://www.gnu.org/gethelp/>.
521ab64890SmrgEOF
531ab64890Smrg    exit $?
541ab64890Smrg    ;;
551ab64890Smrg  -v | --v*)
563b4ba46cSmrg    echo "depcomp (GNU Automake) $scriptversion"
571ab64890Smrg    exit $?
581ab64890Smrg    ;;
591ab64890Smrgesac
601ab64890Smrg
61eb411b4bSmrg# Get the directory component of the given path, and save it in the
62eb411b4bSmrg# global variables '$dir'.  Note that this directory component will
63eb411b4bSmrg# be either empty or ending with a '/' character.  This is deliberate.
64eb411b4bSmrgset_dir_from ()
65eb411b4bSmrg{
66eb411b4bSmrg  case $1 in
67eb411b4bSmrg    */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;;
68eb411b4bSmrg      *) dir=;;
69eb411b4bSmrg  esac
70eb411b4bSmrg}
71eb411b4bSmrg
72eb411b4bSmrg# Get the suffix-stripped basename of the given path, and save it the
73eb411b4bSmrg# global variable '$base'.
74eb411b4bSmrgset_base_from ()
75eb411b4bSmrg{
76eb411b4bSmrg  base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'`
77eb411b4bSmrg}
78eb411b4bSmrg
79eb411b4bSmrg# If no dependency file was actually created by the compiler invocation,
80eb411b4bSmrg# we still have to create a dummy depfile, to avoid errors with the
81eb411b4bSmrg# Makefile "include basename.Plo" scheme.
82eb411b4bSmrgmake_dummy_depfile ()
83eb411b4bSmrg{
84eb411b4bSmrg  echo "#dummy" > "$depfile"
85eb411b4bSmrg}
86eb411b4bSmrg
87eb411b4bSmrg# Factor out some common post-processing of the generated depfile.
88eb411b4bSmrg# Requires the auxiliary global variable '$tmpdepfile' to be set.
89eb411b4bSmrgaix_post_process_depfile ()
90eb411b4bSmrg{
91eb411b4bSmrg  # If the compiler actually managed to produce a dependency file,
92eb411b4bSmrg  # post-process it.
93eb411b4bSmrg  if test -f "$tmpdepfile"; then
94eb411b4bSmrg    # Each line is of the form 'foo.o: dependency.h'.
95eb411b4bSmrg    # Do two passes, one to just change these to
96eb411b4bSmrg    #   $object: dependency.h
97eb411b4bSmrg    # and one to simply output
98eb411b4bSmrg    #   dependency.h:
99eb411b4bSmrg    # which is needed to avoid the deleted-header problem.
100eb411b4bSmrg    { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile"
101eb411b4bSmrg      sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile"
102eb411b4bSmrg    } > "$depfile"
103eb411b4bSmrg    rm -f "$tmpdepfile"
104eb411b4bSmrg  else
105eb411b4bSmrg    make_dummy_depfile
106eb411b4bSmrg  fi
107eb411b4bSmrg}
108eb411b4bSmrg
109eb411b4bSmrg# A tabulation character.
110eb411b4bSmrgtab='	'
111eb411b4bSmrg# A newline character.
112eb411b4bSmrgnl='
113eb411b4bSmrg'
114eb411b4bSmrg# Character ranges might be problematic outside the C locale.
115eb411b4bSmrg# These definitions help.
116eb411b4bSmrgupper=ABCDEFGHIJKLMNOPQRSTUVWXYZ
117eb411b4bSmrglower=abcdefghijklmnopqrstuvwxyz
118eb411b4bSmrgalpha=${upper}${lower}
119eb411b4bSmrg
1201ab64890Smrgif test -z "$depmode" || test -z "$source" || test -z "$object"; then
1211ab64890Smrg  echo "depcomp: Variables source, object and depmode must be set" 1>&2
1221ab64890Smrg  exit 1
1231ab64890Smrgfi
1241ab64890Smrg
1251ab64890Smrg# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.
1261ab64890Smrgdepfile=${depfile-`echo "$object" |
1271ab64890Smrg  sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`}
1281ab64890Smrgtmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
1291ab64890Smrg
1301ab64890Smrgrm -f "$tmpdepfile"
1311ab64890Smrg
1323b4ba46cSmrg# Avoid interference from the environment.
133eb411b4bSmrggccflag= dashmflag=
134eb411b4bSmrg
1351ab64890Smrg# Some modes work just like other modes, but use different flags.  We
1361ab64890Smrg# parameterize here, but still list the modes in the big case below,
1371ab64890Smrg# to make depend.m4 easier to write.  Note that we *cannot* use a case
1381ab64890Smrg# here, because this file can only contain one case statement.
1391ab64890Smrgif test "$depmode" = hp; then
1401ab64890Smrg  # HP compiler uses -M and no extra arg.
1411ab64890Smrg  gccflag=-M
1421ab64890Smrg  depmode=gcc
1431ab64890Smrgfi
1441ab64890Smrg
1451ab64890Smrgif test "$depmode" = dashXmstdout; then
146eb411b4bSmrg  # This is just like dashmstdout with a different argument.
147eb411b4bSmrg  dashmflag=-xM
148eb411b4bSmrg  depmode=dashmstdout
1491ab64890Smrgfi
1501ab64890Smrg
151b4ee4795Smrgcygpath_u="cygpath -u -f -"
152b4ee4795Smrgif test "$depmode" = msvcmsys; then
153eb411b4bSmrg  # This is just like msvisualcpp but w/o cygpath translation.
154eb411b4bSmrg  # Just convert the backslash-escaped backslashes to single forward
155eb411b4bSmrg  # slashes to satisfy depend.m4
156eb411b4bSmrg  cygpath_u='sed s,\\\\,/,g'
157eb411b4bSmrg  depmode=msvisualcpp
158eb411b4bSmrgfi
159eb411b4bSmrg
160eb411b4bSmrgif test "$depmode" = msvc7msys; then
161eb411b4bSmrg  # This is just like msvc7 but w/o cygpath translation.
162eb411b4bSmrg  # Just convert the backslash-escaped backslashes to single forward
163eb411b4bSmrg  # slashes to satisfy depend.m4
164eb411b4bSmrg  cygpath_u='sed s,\\\\,/,g'
165eb411b4bSmrg  depmode=msvc7
166eb411b4bSmrgfi
167eb411b4bSmrg
168eb411b4bSmrgif test "$depmode" = xlc; then
169eb411b4bSmrg  # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information.
170eb411b4bSmrg  gccflag=-qmakedep=gcc,-MF
171eb411b4bSmrg  depmode=gcc
172b4ee4795Smrgfi
173b4ee4795Smrg
1741ab64890Smrgcase "$depmode" in
1751ab64890Smrggcc3)
1761ab64890Smrg## gcc 3 implements dependency tracking that does exactly what
1771ab64890Smrg## we want.  Yay!  Note: for some reason libtool 1.4 doesn't like
1781ab64890Smrg## it if -MD -MP comes after the -MF stuff.  Hmm.
1791ab64890Smrg## Unfortunately, FreeBSD c89 acceptance of flags depends upon
1801ab64890Smrg## the command line argument order; so add the flags where they
1811ab64890Smrg## appear in depend2.am.  Note that the slowdown incurred here
1821ab64890Smrg## affects only configure: in makefiles, %FASTDEP% shortcuts this.
1831ab64890Smrg  for arg
1841ab64890Smrg  do
1851ab64890Smrg    case $arg in
1861ab64890Smrg    -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;;
1871ab64890Smrg    *)  set fnord "$@" "$arg" ;;
1881ab64890Smrg    esac
1891ab64890Smrg    shift # fnord
1901ab64890Smrg    shift # $arg
1911ab64890Smrg  done
1921ab64890Smrg  "$@"
1931ab64890Smrg  stat=$?
194eb411b4bSmrg  if test $stat -ne 0; then
1951ab64890Smrg    rm -f "$tmpdepfile"
1961ab64890Smrg    exit $stat
1971ab64890Smrg  fi
1981ab64890Smrg  mv "$tmpdepfile" "$depfile"
1991ab64890Smrg  ;;
2001ab64890Smrg
2011ab64890Smrggcc)
2023b4ba46cSmrg## Note that this doesn't just cater to obsolete pre-3.x GCC compilers.
2033b4ba46cSmrg## but also to in-use compilers like IBM xlc/xlC and the HP C compiler.
204eb411b4bSmrg## (see the conditional assignment to $gccflag above).
2051ab64890Smrg## There are various ways to get dependency output from gcc.  Here's
2061ab64890Smrg## why we pick this rather obscure method:
2071ab64890Smrg## - Don't want to use -MD because we'd like the dependencies to end
2081ab64890Smrg##   up in a subdir.  Having to rename by hand is ugly.
2091ab64890Smrg##   (We might end up doing this anyway to support other compilers.)
2101ab64890Smrg## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
211eb411b4bSmrg##   -MM, not -M (despite what the docs say).  Also, it might not be
212eb411b4bSmrg##   supported by the other compilers which use the 'gcc' depmode.
2131ab64890Smrg## - Using -M directly means running the compiler twice (even worse
2141ab64890Smrg##   than renaming).
2151ab64890Smrg  if test -z "$gccflag"; then
2161ab64890Smrg    gccflag=-MD,
2171ab64890Smrg  fi
2181ab64890Smrg  "$@" -Wp,"$gccflag$tmpdepfile"
2191ab64890Smrg  stat=$?
220eb411b4bSmrg  if test $stat -ne 0; then
2211ab64890Smrg    rm -f "$tmpdepfile"
2221ab64890Smrg    exit $stat
2231ab64890Smrg  fi
2241ab64890Smrg  rm -f "$depfile"
2251ab64890Smrg  echo "$object : \\" > "$depfile"
226eb411b4bSmrg  # The second -e expression handles DOS-style file names with drive
227eb411b4bSmrg  # letters.
2281ab64890Smrg  sed -e 's/^[^:]*: / /' \
2291ab64890Smrg      -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
230eb411b4bSmrg## This next piece of magic avoids the "deleted header file" problem.
2311ab64890Smrg## The problem is that when a header file which appears in a .P file
2321ab64890Smrg## is deleted, the dependency causes make to die (because there is
2331ab64890Smrg## typically no way to rebuild the header).  We avoid this by adding
2341ab64890Smrg## dummy dependencies for each header file.  Too bad gcc doesn't do
2351ab64890Smrg## this for us directly.
236eb411b4bSmrg## Some versions of gcc put a space before the ':'.  On the theory
2371ab64890Smrg## that the space means something, we add a space to the output as
238eb411b4bSmrg## well.  hp depmode also adds that space, but also prefixes the VPATH
239eb411b4bSmrg## to the object.  Take care to not repeat it in the output.
2401ab64890Smrg## Some versions of the HPUX 10.20 sed can't process this invocation
2411ab64890Smrg## correctly.  Breaking it into two sed invocations is a workaround.
242eb411b4bSmrg  tr ' ' "$nl" < "$tmpdepfile" \
243eb411b4bSmrg    | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \
244eb411b4bSmrg    | sed -e 's/$/ :/' >> "$depfile"
2451ab64890Smrg  rm -f "$tmpdepfile"
2461ab64890Smrg  ;;
2471ab64890Smrg
2481ab64890Smrghp)
2491ab64890Smrg  # This case exists only to let depend.m4 do its work.  It works by
2501ab64890Smrg  # looking at the text of this script.  This case will never be run,
2511ab64890Smrg  # since it is checked for above.
2521ab64890Smrg  exit 1
2531ab64890Smrg  ;;
2541ab64890Smrg
2551ab64890Smrgsgi)
2561ab64890Smrg  if test "$libtool" = yes; then
2571ab64890Smrg    "$@" "-Wp,-MDupdate,$tmpdepfile"
2581ab64890Smrg  else
2591ab64890Smrg    "$@" -MDupdate "$tmpdepfile"
2601ab64890Smrg  fi
2611ab64890Smrg  stat=$?
262eb411b4bSmrg  if test $stat -ne 0; then
2631ab64890Smrg    rm -f "$tmpdepfile"
2641ab64890Smrg    exit $stat
2651ab64890Smrg  fi
2661ab64890Smrg  rm -f "$depfile"
2671ab64890Smrg
2681ab64890Smrg  if test -f "$tmpdepfile"; then  # yes, the sourcefile depend on other files
2691ab64890Smrg    echo "$object : \\" > "$depfile"
2701ab64890Smrg    # Clip off the initial element (the dependent).  Don't try to be
2711ab64890Smrg    # clever and replace this with sed code, as IRIX sed won't handle
2721ab64890Smrg    # lines with more than a fixed number of characters (4096 in
2731ab64890Smrg    # IRIX 6.2 sed, 8192 in IRIX 6.5).  We also remove comment lines;
274eb411b4bSmrg    # the IRIX cc adds comments like '#:fec' to the end of the
2751ab64890Smrg    # dependency line.
276eb411b4bSmrg    tr ' ' "$nl" < "$tmpdepfile" \
277eb411b4bSmrg      | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \
278eb411b4bSmrg      | tr "$nl" ' ' >> "$depfile"
279b4ee4795Smrg    echo >> "$depfile"
2801ab64890Smrg    # The second pass generates a dummy entry for each header file.
281eb411b4bSmrg    tr ' ' "$nl" < "$tmpdepfile" \
282eb411b4bSmrg      | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
283eb411b4bSmrg      >> "$depfile"
2841ab64890Smrg  else
285eb411b4bSmrg    make_dummy_depfile
2861ab64890Smrg  fi
2871ab64890Smrg  rm -f "$tmpdepfile"
2881ab64890Smrg  ;;
2891ab64890Smrg
290eb411b4bSmrgxlc)
291eb411b4bSmrg  # This case exists only to let depend.m4 do its work.  It works by
292eb411b4bSmrg  # looking at the text of this script.  This case will never be run,
293eb411b4bSmrg  # since it is checked for above.
294eb411b4bSmrg  exit 1
295eb411b4bSmrg  ;;
296eb411b4bSmrg
2971ab64890Smrgaix)
2981ab64890Smrg  # The C for AIX Compiler uses -M and outputs the dependencies
2991ab64890Smrg  # in a .u file.  In older versions, this file always lives in the
300eb411b4bSmrg  # current directory.  Also, the AIX compiler puts '$object:' at the
3011ab64890Smrg  # start of each line; $object doesn't have directory information.
3021ab64890Smrg  # Version 6 uses the directory in both cases.
303eb411b4bSmrg  set_dir_from "$object"
304eb411b4bSmrg  set_base_from "$object"
3051ab64890Smrg  if test "$libtool" = yes; then
3061ab64890Smrg    tmpdepfile1=$dir$base.u
3071ab64890Smrg    tmpdepfile2=$base.u
3081ab64890Smrg    tmpdepfile3=$dir.libs/$base.u
3091ab64890Smrg    "$@" -Wc,-M
3101ab64890Smrg  else
3111ab64890Smrg    tmpdepfile1=$dir$base.u
3121ab64890Smrg    tmpdepfile2=$dir$base.u
3131ab64890Smrg    tmpdepfile3=$dir$base.u
3141ab64890Smrg    "$@" -M
3151ab64890Smrg  fi
3161ab64890Smrg  stat=$?
317eb411b4bSmrg  if test $stat -ne 0; then
3181ab64890Smrg    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
3191ab64890Smrg    exit $stat
3201ab64890Smrg  fi
3211ab64890Smrg
3221ab64890Smrg  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
3231ab64890Smrg  do
3241ab64890Smrg    test -f "$tmpdepfile" && break
3251ab64890Smrg  done
326eb411b4bSmrg  aix_post_process_depfile
327eb411b4bSmrg  ;;
328eb411b4bSmrg
329eb411b4bSmrgtcc)
330eb411b4bSmrg  # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26
331eb411b4bSmrg  # FIXME: That version still under development at the moment of writing.
332eb411b4bSmrg  #        Make that this statement remains true also for stable, released
333eb411b4bSmrg  #        versions.
334eb411b4bSmrg  # It will wrap lines (doesn't matter whether long or short) with a
335eb411b4bSmrg  # trailing '\', as in:
336eb411b4bSmrg  #
337eb411b4bSmrg  #   foo.o : \
338eb411b4bSmrg  #    foo.c \
339eb411b4bSmrg  #    foo.h \
340eb411b4bSmrg  #
341eb411b4bSmrg  # It will put a trailing '\' even on the last line, and will use leading
342eb411b4bSmrg  # spaces rather than leading tabs (at least since its commit 0394caf7
343eb411b4bSmrg  # "Emit spaces for -MD").
344eb411b4bSmrg  "$@" -MD -MF "$tmpdepfile"
345eb411b4bSmrg  stat=$?
346eb411b4bSmrg  if test $stat -ne 0; then
347eb411b4bSmrg    rm -f "$tmpdepfile"
348eb411b4bSmrg    exit $stat
3491ab64890Smrg  fi
350eb411b4bSmrg  rm -f "$depfile"
351eb411b4bSmrg  # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'.
352eb411b4bSmrg  # We have to change lines of the first kind to '$object: \'.
353eb411b4bSmrg  sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile"
354eb411b4bSmrg  # And for each line of the second kind, we have to emit a 'dep.h:'
355eb411b4bSmrg  # dummy dependency, to avoid the deleted-header problem.
356eb411b4bSmrg  sed -n -e 's|^  *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile"
3571ab64890Smrg  rm -f "$tmpdepfile"
3581ab64890Smrg  ;;
3591ab64890Smrg
360eb411b4bSmrg## The order of this option in the case statement is important, since the
361eb411b4bSmrg## shell code in configure will try each of these formats in the order
362eb411b4bSmrg## listed in this file.  A plain '-MD' option would be understood by many
363eb411b4bSmrg## compilers, so we must ensure this comes after the gcc and icc options.
364eb411b4bSmrgpgcc)
365eb411b4bSmrg  # Portland's C compiler understands '-MD'.
366eb411b4bSmrg  # Will always output deps to 'file.d' where file is the root name of the
367eb411b4bSmrg  # source file under compilation, even if file resides in a subdirectory.
368eb411b4bSmrg  # The object file name does not affect the name of the '.d' file.
369eb411b4bSmrg  # pgcc 10.2 will output
3701ab64890Smrg  #    foo.o: sub/foo.c sub/foo.h
371eb411b4bSmrg  # and will wrap long lines using '\' :
3721ab64890Smrg  #    foo.o: sub/foo.c ... \
3731ab64890Smrg  #     sub/foo.h ... \
3741ab64890Smrg  #     ...
375eb411b4bSmrg  set_dir_from "$object"
376eb411b4bSmrg  # Use the source, not the object, to determine the base name, since
377eb411b4bSmrg  # that's sadly what pgcc will do too.
378eb411b4bSmrg  set_base_from "$source"
379eb411b4bSmrg  tmpdepfile=$base.d
380eb411b4bSmrg
381eb411b4bSmrg  # For projects that build the same source file twice into different object
382eb411b4bSmrg  # files, the pgcc approach of using the *source* file root name can cause
383eb411b4bSmrg  # problems in parallel builds.  Use a locking strategy to avoid stomping on
384eb411b4bSmrg  # the same $tmpdepfile.
385eb411b4bSmrg  lockdir=$base.d-lock
386eb411b4bSmrg  trap "
387eb411b4bSmrg    echo '$0: caught signal, cleaning up...' >&2
388eb411b4bSmrg    rmdir '$lockdir'
389eb411b4bSmrg    exit 1
390eb411b4bSmrg  " 1 2 13 15
391eb411b4bSmrg  numtries=100
392eb411b4bSmrg  i=$numtries
393eb411b4bSmrg  while test $i -gt 0; do
394eb411b4bSmrg    # mkdir is a portable test-and-set.
395eb411b4bSmrg    if mkdir "$lockdir" 2>/dev/null; then
396eb411b4bSmrg      # This process acquired the lock.
397eb411b4bSmrg      "$@" -MD
398eb411b4bSmrg      stat=$?
399eb411b4bSmrg      # Release the lock.
400eb411b4bSmrg      rmdir "$lockdir"
401eb411b4bSmrg      break
402eb411b4bSmrg    else
403eb411b4bSmrg      # If the lock is being held by a different process, wait
404eb411b4bSmrg      # until the winning process is done or we timeout.
405eb411b4bSmrg      while test -d "$lockdir" && test $i -gt 0; do
406eb411b4bSmrg        sleep 1
407eb411b4bSmrg        i=`expr $i - 1`
408eb411b4bSmrg      done
409eb411b4bSmrg    fi
410eb411b4bSmrg    i=`expr $i - 1`
411eb411b4bSmrg  done
412eb411b4bSmrg  trap - 1 2 13 15
413eb411b4bSmrg  if test $i -le 0; then
414eb411b4bSmrg    echo "$0: failed to acquire lock after $numtries attempts" >&2
415eb411b4bSmrg    echo "$0: check lockdir '$lockdir'" >&2
416eb411b4bSmrg    exit 1
417eb411b4bSmrg  fi
4181ab64890Smrg
419eb411b4bSmrg  if test $stat -ne 0; then
4201ab64890Smrg    rm -f "$tmpdepfile"
4211ab64890Smrg    exit $stat
4221ab64890Smrg  fi
4231ab64890Smrg  rm -f "$depfile"
4241ab64890Smrg  # Each line is of the form `foo.o: dependent.h',
4251ab64890Smrg  # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'.
4261ab64890Smrg  # Do two passes, one to just change these to
4271ab64890Smrg  # `$object: dependent.h' and one to simply `dependent.h:'.
4281ab64890Smrg  sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
4291ab64890Smrg  # Some versions of the HPUX 10.20 sed can't process this invocation
4301ab64890Smrg  # correctly.  Breaking it into two sed invocations is a workaround.
431eb411b4bSmrg  sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \
432eb411b4bSmrg    | sed -e 's/$/ :/' >> "$depfile"
4331ab64890Smrg  rm -f "$tmpdepfile"
4341ab64890Smrg  ;;
4351ab64890Smrg
4361ab64890Smrghp2)
4371ab64890Smrg  # The "hp" stanza above does not work with aCC (C++) and HP's ia64
4381ab64890Smrg  # compilers, which have integrated preprocessors.  The correct option
4391ab64890Smrg  # to use with these is +Maked; it writes dependencies to a file named
4401ab64890Smrg  # 'foo.d', which lands next to the object file, wherever that
4411ab64890Smrg  # happens to be.
4421ab64890Smrg  # Much of this is similar to the tru64 case; see comments there.
443eb411b4bSmrg  set_dir_from  "$object"
444eb411b4bSmrg  set_base_from "$object"
4451ab64890Smrg  if test "$libtool" = yes; then
4461ab64890Smrg    tmpdepfile1=$dir$base.d
4471ab64890Smrg    tmpdepfile2=$dir.libs/$base.d
4481ab64890Smrg    "$@" -Wc,+Maked
4491ab64890Smrg  else
4501ab64890Smrg    tmpdepfile1=$dir$base.d
4511ab64890Smrg    tmpdepfile2=$dir$base.d
4521ab64890Smrg    "$@" +Maked
4531ab64890Smrg  fi
4541ab64890Smrg  stat=$?
455eb411b4bSmrg  if test $stat -ne 0; then
4561ab64890Smrg     rm -f "$tmpdepfile1" "$tmpdepfile2"
4571ab64890Smrg     exit $stat
4581ab64890Smrg  fi
4591ab64890Smrg
4601ab64890Smrg  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2"
4611ab64890Smrg  do
4621ab64890Smrg    test -f "$tmpdepfile" && break
4631ab64890Smrg  done
4641ab64890Smrg  if test -f "$tmpdepfile"; then
465eb411b4bSmrg    sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile"
466eb411b4bSmrg    # Add 'dependent.h:' lines.
467b4ee4795Smrg    sed -ne '2,${
468eb411b4bSmrg               s/^ *//
469eb411b4bSmrg               s/ \\*$//
470eb411b4bSmrg               s/$/:/
471eb411b4bSmrg               p
472eb411b4bSmrg             }' "$tmpdepfile" >> "$depfile"
4731ab64890Smrg  else
474eb411b4bSmrg    make_dummy_depfile
4751ab64890Smrg  fi
4761ab64890Smrg  rm -f "$tmpdepfile" "$tmpdepfile2"
4771ab64890Smrg  ;;
4781ab64890Smrg
4791ab64890Smrgtru64)
480eb411b4bSmrg  # The Tru64 compiler uses -MD to generate dependencies as a side
481eb411b4bSmrg  # effect.  'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'.
482eb411b4bSmrg  # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
483eb411b4bSmrg  # dependencies in 'foo.d' instead, so we check for that too.
484eb411b4bSmrg  # Subdirectories are respected.
485eb411b4bSmrg  set_dir_from  "$object"
486eb411b4bSmrg  set_base_from "$object"
487eb411b4bSmrg
488eb411b4bSmrg  if test "$libtool" = yes; then
489eb411b4bSmrg    # Libtool generates 2 separate objects for the 2 libraries.  These
490eb411b4bSmrg    # two compilations output dependencies in $dir.libs/$base.o.d and
491eb411b4bSmrg    # in $dir$base.o.d.  We have to check for both files, because
492eb411b4bSmrg    # one of the two compilations can be disabled.  We should prefer
493eb411b4bSmrg    # $dir$base.o.d over $dir.libs/$base.o.d because the latter is
494eb411b4bSmrg    # automatically cleaned when .libs/ is deleted, while ignoring
495eb411b4bSmrg    # the former would cause a distcleancheck panic.
496eb411b4bSmrg    tmpdepfile1=$dir$base.o.d          # libtool 1.5
497eb411b4bSmrg    tmpdepfile2=$dir.libs/$base.o.d    # Likewise.
498eb411b4bSmrg    tmpdepfile3=$dir.libs/$base.d      # Compaq CCC V6.2-504
499eb411b4bSmrg    "$@" -Wc,-MD
500eb411b4bSmrg  else
501eb411b4bSmrg    tmpdepfile1=$dir$base.d
502eb411b4bSmrg    tmpdepfile2=$dir$base.d
503eb411b4bSmrg    tmpdepfile3=$dir$base.d
504eb411b4bSmrg    "$@" -MD
505eb411b4bSmrg  fi
506eb411b4bSmrg
507eb411b4bSmrg  stat=$?
508eb411b4bSmrg  if test $stat -ne 0; then
509eb411b4bSmrg    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
510eb411b4bSmrg    exit $stat
511eb411b4bSmrg  fi
512eb411b4bSmrg
513eb411b4bSmrg  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
514eb411b4bSmrg  do
515eb411b4bSmrg    test -f "$tmpdepfile" && break
516eb411b4bSmrg  done
517eb411b4bSmrg  # Same post-processing that is required for AIX mode.
518eb411b4bSmrg  aix_post_process_depfile
519eb411b4bSmrg  ;;
520eb411b4bSmrg
521eb411b4bSmrgmsvc7)
522eb411b4bSmrg  if test "$libtool" = yes; then
523eb411b4bSmrg    showIncludes=-Wc,-showIncludes
524eb411b4bSmrg  else
525eb411b4bSmrg    showIncludes=-showIncludes
526eb411b4bSmrg  fi
527eb411b4bSmrg  "$@" $showIncludes > "$tmpdepfile"
528eb411b4bSmrg  stat=$?
529eb411b4bSmrg  grep -v '^Note: including file: ' "$tmpdepfile"
530eb411b4bSmrg  if test $stat -ne 0; then
531eb411b4bSmrg    rm -f "$tmpdepfile"
532eb411b4bSmrg    exit $stat
533eb411b4bSmrg  fi
534eb411b4bSmrg  rm -f "$depfile"
535eb411b4bSmrg  echo "$object : \\" > "$depfile"
536eb411b4bSmrg  # The first sed program below extracts the file names and escapes
537eb411b4bSmrg  # backslashes for cygpath.  The second sed program outputs the file
538eb411b4bSmrg  # name when reading, but also accumulates all include files in the
539eb411b4bSmrg  # hold buffer in order to output them again at the end.  This only
540eb411b4bSmrg  # works with sed implementations that can handle large buffers.
541eb411b4bSmrg  sed < "$tmpdepfile" -n '
542eb411b4bSmrg/^Note: including file:  *\(.*\)/ {
543eb411b4bSmrg  s//\1/
544eb411b4bSmrg  s/\\/\\\\/g
545eb411b4bSmrg  p
546eb411b4bSmrg}' | $cygpath_u | sort -u | sed -n '
547eb411b4bSmrgs/ /\\ /g
548eb411b4bSmrgs/\(.*\)/'"$tab"'\1 \\/p
549eb411b4bSmrgs/.\(.*\) \\/\1:/
550eb411b4bSmrgH
551eb411b4bSmrg$ {
552eb411b4bSmrg  s/.*/'"$tab"'/
553eb411b4bSmrg  G
554eb411b4bSmrg  p
555eb411b4bSmrg}' >> "$depfile"
556818534a1Smrg  echo >> "$depfile" # make sure the fragment doesn't end with a backslash
557eb411b4bSmrg  rm -f "$tmpdepfile"
558eb411b4bSmrg  ;;
559eb411b4bSmrg
560eb411b4bSmrgmsvc7msys)
561eb411b4bSmrg  # This case exists only to let depend.m4 do its work.  It works by
562eb411b4bSmrg  # looking at the text of this script.  This case will never be run,
563eb411b4bSmrg  # since it is checked for above.
564eb411b4bSmrg  exit 1
565eb411b4bSmrg  ;;
5661ab64890Smrg
5671ab64890Smrg#nosideeffect)
5681ab64890Smrg  # This comment above is used by automake to tell side-effect
5691ab64890Smrg  # dependency tracking mechanisms from slower ones.
5701ab64890Smrg
5711ab64890Smrgdashmstdout)
5721ab64890Smrg  # Important note: in order to support this mode, a compiler *must*
5731ab64890Smrg  # always write the preprocessed file to stdout, regardless of -o.
5741ab64890Smrg  "$@" || exit $?
5751ab64890Smrg
5761ab64890Smrg  # Remove the call to Libtool.
5771ab64890Smrg  if test "$libtool" = yes; then
578b4ee4795Smrg    while test "X$1" != 'X--mode=compile'; do
5791ab64890Smrg      shift
5801ab64890Smrg    done
5811ab64890Smrg    shift
5821ab64890Smrg  fi
5831ab64890Smrg
584eb411b4bSmrg  # Remove '-o $object'.
5851ab64890Smrg  IFS=" "
5861ab64890Smrg  for arg
5871ab64890Smrg  do
5881ab64890Smrg    case $arg in
5891ab64890Smrg    -o)
5901ab64890Smrg      shift
5911ab64890Smrg      ;;
5921ab64890Smrg    $object)
5931ab64890Smrg      shift
5941ab64890Smrg      ;;
5951ab64890Smrg    *)
5961ab64890Smrg      set fnord "$@" "$arg"
5971ab64890Smrg      shift # fnord
5981ab64890Smrg      shift # $arg
5991ab64890Smrg      ;;
6001ab64890Smrg    esac
6011ab64890Smrg  done
6021ab64890Smrg
6031ab64890Smrg  test -z "$dashmflag" && dashmflag=-M
604eb411b4bSmrg  # Require at least two characters before searching for ':'
6051ab64890Smrg  # in the target name.  This is to cope with DOS-style filenames:
606eb411b4bSmrg  # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise.
6071ab64890Smrg  "$@" $dashmflag |
608eb411b4bSmrg    sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile"
6091ab64890Smrg  rm -f "$depfile"
6101ab64890Smrg  cat < "$tmpdepfile" > "$depfile"
611eb411b4bSmrg  # Some versions of the HPUX 10.20 sed can't process this sed invocation
612eb411b4bSmrg  # correctly.  Breaking it into two sed invocations is a workaround.
613eb411b4bSmrg  tr ' ' "$nl" < "$tmpdepfile" \
614eb411b4bSmrg    | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
615eb411b4bSmrg    | sed -e 's/$/ :/' >> "$depfile"
6161ab64890Smrg  rm -f "$tmpdepfile"
6171ab64890Smrg  ;;
6181ab64890Smrg
6191ab64890SmrgdashXmstdout)
6201ab64890Smrg  # This case only exists to satisfy depend.m4.  It is never actually
6211ab64890Smrg  # run, as this mode is specially recognized in the preamble.
6221ab64890Smrg  exit 1
6231ab64890Smrg  ;;
6241ab64890Smrg
6251ab64890Smrgmakedepend)
6261ab64890Smrg  "$@" || exit $?
6271ab64890Smrg  # Remove any Libtool call
6281ab64890Smrg  if test "$libtool" = yes; then
629b4ee4795Smrg    while test "X$1" != 'X--mode=compile'; do
6301ab64890Smrg      shift
6311ab64890Smrg    done
6321ab64890Smrg    shift
6331ab64890Smrg  fi
6341ab64890Smrg  # X makedepend
6351ab64890Smrg  shift
636b4ee4795Smrg  cleared=no eat=no
637b4ee4795Smrg  for arg
638b4ee4795Smrg  do
6391ab64890Smrg    case $cleared in
6401ab64890Smrg    no)
6411ab64890Smrg      set ""; shift
6421ab64890Smrg      cleared=yes ;;
6431ab64890Smrg    esac
644b4ee4795Smrg    if test $eat = yes; then
645b4ee4795Smrg      eat=no
646b4ee4795Smrg      continue
647b4ee4795Smrg    fi
6481ab64890Smrg    case "$arg" in
6491ab64890Smrg    -D*|-I*)
6501ab64890Smrg      set fnord "$@" "$arg"; shift ;;
6511ab64890Smrg    # Strip any option that makedepend may not understand.  Remove
6521ab64890Smrg    # the object too, otherwise makedepend will parse it as a source file.
653b4ee4795Smrg    -arch)
654b4ee4795Smrg      eat=yes ;;
6551ab64890Smrg    -*|$object)
6561ab64890Smrg      ;;
6571ab64890Smrg    *)
6581ab64890Smrg      set fnord "$@" "$arg"; shift ;;
6591ab64890Smrg    esac
6601ab64890Smrg  done
661b4ee4795Smrg  obj_suffix=`echo "$object" | sed 's/^.*\././'`
6621ab64890Smrg  touch "$tmpdepfile"
6631ab64890Smrg  ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
6641ab64890Smrg  rm -f "$depfile"
665eb411b4bSmrg  # makedepend may prepend the VPATH from the source file name to the object.
666eb411b4bSmrg  # No need to regex-escape $object, excess matching of '.' is harmless.
667eb411b4bSmrg  sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile"
668eb411b4bSmrg  # Some versions of the HPUX 10.20 sed can't process the last invocation
669eb411b4bSmrg  # correctly.  Breaking it into two sed invocations is a workaround.
670eb411b4bSmrg  sed '1,2d' "$tmpdepfile" \
671eb411b4bSmrg    | tr ' ' "$nl" \
672eb411b4bSmrg    | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
673eb411b4bSmrg    | sed -e 's/$/ :/' >> "$depfile"
6741ab64890Smrg  rm -f "$tmpdepfile" "$tmpdepfile".bak
6751ab64890Smrg  ;;
6761ab64890Smrg
6771ab64890Smrgcpp)
6781ab64890Smrg  # Important note: in order to support this mode, a compiler *must*
6791ab64890Smrg  # always write the preprocessed file to stdout.
6801ab64890Smrg  "$@" || exit $?
6811ab64890Smrg
6821ab64890Smrg  # Remove the call to Libtool.
6831ab64890Smrg  if test "$libtool" = yes; then
684b4ee4795Smrg    while test "X$1" != 'X--mode=compile'; do
6851ab64890Smrg      shift
6861ab64890Smrg    done
6871ab64890Smrg    shift
6881ab64890Smrg  fi
6891ab64890Smrg
690eb411b4bSmrg  # Remove '-o $object'.
6911ab64890Smrg  IFS=" "
6921ab64890Smrg  for arg
6931ab64890Smrg  do
6941ab64890Smrg    case $arg in
6951ab64890Smrg    -o)
6961ab64890Smrg      shift
6971ab64890Smrg      ;;
6981ab64890Smrg    $object)
6991ab64890Smrg      shift
7001ab64890Smrg      ;;
7011ab64890Smrg    *)
7021ab64890Smrg      set fnord "$@" "$arg"
7031ab64890Smrg      shift # fnord
7041ab64890Smrg      shift # $arg
7051ab64890Smrg      ;;
7061ab64890Smrg    esac
7071ab64890Smrg  done
7081ab64890Smrg
709eb411b4bSmrg  "$@" -E \
710eb411b4bSmrg    | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
711eb411b4bSmrg             -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
712eb411b4bSmrg    | sed '$ s: \\$::' > "$tmpdepfile"
7131ab64890Smrg  rm -f "$depfile"
7141ab64890Smrg  echo "$object : \\" > "$depfile"
7151ab64890Smrg  cat < "$tmpdepfile" >> "$depfile"
7161ab64890Smrg  sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
7171ab64890Smrg  rm -f "$tmpdepfile"
7181ab64890Smrg  ;;
7191ab64890Smrg
7201ab64890Smrgmsvisualcpp)
7211ab64890Smrg  # Important note: in order to support this mode, a compiler *must*
722b4ee4795Smrg  # always write the preprocessed file to stdout.
7231ab64890Smrg  "$@" || exit $?
724b4ee4795Smrg
725b4ee4795Smrg  # Remove the call to Libtool.
726b4ee4795Smrg  if test "$libtool" = yes; then
727b4ee4795Smrg    while test "X$1" != 'X--mode=compile'; do
728b4ee4795Smrg      shift
729b4ee4795Smrg    done
730b4ee4795Smrg    shift
731b4ee4795Smrg  fi
732b4ee4795Smrg
7331ab64890Smrg  IFS=" "
7341ab64890Smrg  for arg
7351ab64890Smrg  do
7361ab64890Smrg    case "$arg" in
737b4ee4795Smrg    -o)
738b4ee4795Smrg      shift
739b4ee4795Smrg      ;;
740b4ee4795Smrg    $object)
741b4ee4795Smrg      shift
742b4ee4795Smrg      ;;
7431ab64890Smrg    "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
744eb411b4bSmrg        set fnord "$@"
745eb411b4bSmrg        shift
746eb411b4bSmrg        shift
747eb411b4bSmrg        ;;
7481ab64890Smrg    *)
749eb411b4bSmrg        set fnord "$@" "$arg"
750eb411b4bSmrg        shift
751eb411b4bSmrg        shift
752eb411b4bSmrg        ;;
7531ab64890Smrg    esac
7541ab64890Smrg  done
755b4ee4795Smrg  "$@" -E 2>/dev/null |
756b4ee4795Smrg  sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile"
7571ab64890Smrg  rm -f "$depfile"
7581ab64890Smrg  echo "$object : \\" > "$depfile"
759eb411b4bSmrg  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile"
760eb411b4bSmrg  echo "$tab" >> "$depfile"
761b4ee4795Smrg  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile"
7621ab64890Smrg  rm -f "$tmpdepfile"
7631ab64890Smrg  ;;
7641ab64890Smrg
765b4ee4795Smrgmsvcmsys)
766b4ee4795Smrg  # This case exists only to let depend.m4 do its work.  It works by
767b4ee4795Smrg  # looking at the text of this script.  This case will never be run,
768b4ee4795Smrg  # since it is checked for above.
769b4ee4795Smrg  exit 1
770b4ee4795Smrg  ;;
771b4ee4795Smrg
7721ab64890Smrgnone)
7731ab64890Smrg  exec "$@"
7741ab64890Smrg  ;;
7751ab64890Smrg
7761ab64890Smrg*)
7771ab64890Smrg  echo "Unknown depmode $depmode" 1>&2
7781ab64890Smrg  exit 1
7791ab64890Smrg  ;;
7801ab64890Smrgesac
7811ab64890Smrg
7821ab64890Smrgexit 0
7831ab64890Smrg
7841ab64890Smrg# Local Variables:
7851ab64890Smrg# mode: shell-script
7861ab64890Smrg# sh-indentation: 2
7877d2c738bSmrg# eval: (add-hook 'before-save-hook 'time-stamp)
7881ab64890Smrg# time-stamp-start: "scriptversion="
7891ab64890Smrg# time-stamp-format: "%:y-%02m-%02d.%02H"
7907d2c738bSmrg# time-stamp-time-zone: "UTC0"
791b4ee4795Smrg# time-stamp-end: "; # UTC"
7921ab64890Smrg# End:
793