depcomp revision 2f167a42
10e20ee16Smrg#! /bin/sh
20e20ee16Smrg# depcomp - compile a program generating dependencies as side-effects
33e6697d4Smrg
42f167a42Smrgscriptversion=2013-05-30.07; # UTC
53e6697d4Smrg
62f167a42Smrg# Copyright (C) 1999-2014 Free Software Foundation, Inc.
70e20ee16Smrg
80e20ee16Smrg# This program is free software; you can redistribute it and/or modify
90e20ee16Smrg# it under the terms of the GNU General Public License as published by
100e20ee16Smrg# the Free Software Foundation; either version 2, or (at your option)
110e20ee16Smrg# any later version.
120e20ee16Smrg
130e20ee16Smrg# This program is distributed in the hope that it will be useful,
140e20ee16Smrg# but WITHOUT ANY WARRANTY; without even the implied warranty of
150e20ee16Smrg# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
160e20ee16Smrg# GNU General Public License for more details.
170e20ee16Smrg
180e20ee16Smrg# You should have received a copy of the GNU General Public License
193e6697d4Smrg# along with this program.  If not, see <http://www.gnu.org/licenses/>.
200e20ee16Smrg
210e20ee16Smrg# As a special exception to the GNU General Public License, if you
220e20ee16Smrg# distribute this file as part of a program that contains a
230e20ee16Smrg# configuration script generated by Autoconf, you may include it under
240e20ee16Smrg# the same distribution terms that you use for the rest of that program.
250e20ee16Smrg
260e20ee16Smrg# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>.
270e20ee16Smrg
283e6697d4Smrgcase $1 in
293e6697d4Smrg  '')
302f167a42Smrg    echo "$0: No command.  Try '$0 --help' for more information." 1>&2
312f167a42Smrg    exit 1;
322f167a42Smrg    ;;
333e6697d4Smrg  -h | --h*)
343e6697d4Smrg    cat <<\EOF
353e6697d4SmrgUsage: depcomp [--help] [--version] PROGRAM [ARGS]
363e6697d4Smrg
373e6697d4SmrgRun PROGRAMS ARGS to compile a file, generating dependencies
383e6697d4Smrgas side-effects.
393e6697d4Smrg
403e6697d4SmrgEnvironment variables:
413e6697d4Smrg  depmode     Dependency tracking mode.
422f167a42Smrg  source      Source file read by 'PROGRAMS ARGS'.
432f167a42Smrg  object      Object file output by 'PROGRAMS ARGS'.
443e6697d4Smrg  DEPDIR      directory where to store dependencies.
453e6697d4Smrg  depfile     Dependency file to output.
462f167a42Smrg  tmpdepfile  Temporary file to use when outputting dependencies.
473e6697d4Smrg  libtool     Whether libtool is used (yes/no).
483e6697d4Smrg
493e6697d4SmrgReport bugs to <bug-automake@gnu.org>.
503e6697d4SmrgEOF
513e6697d4Smrg    exit $?
523e6697d4Smrg    ;;
533e6697d4Smrg  -v | --v*)
543e6697d4Smrg    echo "depcomp $scriptversion"
553e6697d4Smrg    exit $?
563e6697d4Smrg    ;;
573e6697d4Smrgesac
583e6697d4Smrg
592f167a42Smrg# Get the directory component of the given path, and save it in the
602f167a42Smrg# global variables '$dir'.  Note that this directory component will
612f167a42Smrg# be either empty or ending with a '/' character.  This is deliberate.
622f167a42Smrgset_dir_from ()
632f167a42Smrg{
642f167a42Smrg  case $1 in
652f167a42Smrg    */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;;
662f167a42Smrg      *) dir=;;
672f167a42Smrg  esac
682f167a42Smrg}
692f167a42Smrg
702f167a42Smrg# Get the suffix-stripped basename of the given path, and save it the
712f167a42Smrg# global variable '$base'.
722f167a42Smrgset_base_from ()
732f167a42Smrg{
742f167a42Smrg  base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'`
752f167a42Smrg}
762f167a42Smrg
772f167a42Smrg# If no dependency file was actually created by the compiler invocation,
782f167a42Smrg# we still have to create a dummy depfile, to avoid errors with the
792f167a42Smrg# Makefile "include basename.Plo" scheme.
802f167a42Smrgmake_dummy_depfile ()
812f167a42Smrg{
822f167a42Smrg  echo "#dummy" > "$depfile"
832f167a42Smrg}
842f167a42Smrg
852f167a42Smrg# Factor out some common post-processing of the generated depfile.
862f167a42Smrg# Requires the auxiliary global variable '$tmpdepfile' to be set.
872f167a42Smrgaix_post_process_depfile ()
882f167a42Smrg{
892f167a42Smrg  # If the compiler actually managed to produce a dependency file,
902f167a42Smrg  # post-process it.
912f167a42Smrg  if test -f "$tmpdepfile"; then
922f167a42Smrg    # Each line is of the form 'foo.o: dependency.h'.
932f167a42Smrg    # Do two passes, one to just change these to
942f167a42Smrg    #   $object: dependency.h
952f167a42Smrg    # and one to simply output
962f167a42Smrg    #   dependency.h:
972f167a42Smrg    # which is needed to avoid the deleted-header problem.
982f167a42Smrg    { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile"
992f167a42Smrg      sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile"
1002f167a42Smrg    } > "$depfile"
1012f167a42Smrg    rm -f "$tmpdepfile"
1022f167a42Smrg  else
1032f167a42Smrg    make_dummy_depfile
1042f167a42Smrg  fi
1052f167a42Smrg}
1062f167a42Smrg
1072f167a42Smrg# A tabulation character.
1082f167a42Smrgtab='	'
1092f167a42Smrg# A newline character.
1102f167a42Smrgnl='
1112f167a42Smrg'
1122f167a42Smrg# Character ranges might be problematic outside the C locale.
1132f167a42Smrg# These definitions help.
1142f167a42Smrgupper=ABCDEFGHIJKLMNOPQRSTUVWXYZ
1152f167a42Smrglower=abcdefghijklmnopqrstuvwxyz
1162f167a42Smrgdigits=0123456789
1172f167a42Smrgalpha=${upper}${lower}
1182f167a42Smrg
1190e20ee16Smrgif test -z "$depmode" || test -z "$source" || test -z "$object"; then
1200e20ee16Smrg  echo "depcomp: Variables source, object and depmode must be set" 1>&2
1210e20ee16Smrg  exit 1
1220e20ee16Smrgfi
1230e20ee16Smrg
1243e6697d4Smrg# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.
1253e6697d4Smrgdepfile=${depfile-`echo "$object" |
1263e6697d4Smrg  sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`}
1270e20ee16Smrgtmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
1280e20ee16Smrg
1290e20ee16Smrgrm -f "$tmpdepfile"
1300e20ee16Smrg
1312f167a42Smrg# Avoid interferences from the environment.
1322f167a42Smrggccflag= dashmflag=
1332f167a42Smrg
1340e20ee16Smrg# Some modes work just like other modes, but use different flags.  We
1350e20ee16Smrg# parameterize here, but still list the modes in the big case below,
1360e20ee16Smrg# to make depend.m4 easier to write.  Note that we *cannot* use a case
1370e20ee16Smrg# here, because this file can only contain one case statement.
1380e20ee16Smrgif test "$depmode" = hp; then
1390e20ee16Smrg  # HP compiler uses -M and no extra arg.
1400e20ee16Smrg  gccflag=-M
1410e20ee16Smrg  depmode=gcc
1420e20ee16Smrgfi
1430e20ee16Smrg
1440e20ee16Smrgif test "$depmode" = dashXmstdout; then
1452f167a42Smrg  # This is just like dashmstdout with a different argument.
1462f167a42Smrg  dashmflag=-xM
1472f167a42Smrg  depmode=dashmstdout
1480e20ee16Smrgfi
1490e20ee16Smrg
1503e6697d4Smrgcygpath_u="cygpath -u -f -"
1513e6697d4Smrgif test "$depmode" = msvcmsys; then
1522f167a42Smrg  # This is just like msvisualcpp but w/o cygpath translation.
1532f167a42Smrg  # Just convert the backslash-escaped backslashes to single forward
1542f167a42Smrg  # slashes to satisfy depend.m4
1552f167a42Smrg  cygpath_u='sed s,\\\\,/,g'
1562f167a42Smrg  depmode=msvisualcpp
1572f167a42Smrgfi
1582f167a42Smrg
1592f167a42Smrgif test "$depmode" = msvc7msys; then
1602f167a42Smrg  # This is just like msvc7 but w/o cygpath translation.
1612f167a42Smrg  # Just convert the backslash-escaped backslashes to single forward
1622f167a42Smrg  # slashes to satisfy depend.m4
1632f167a42Smrg  cygpath_u='sed s,\\\\,/,g'
1642f167a42Smrg  depmode=msvc7
1652f167a42Smrgfi
1662f167a42Smrg
1672f167a42Smrgif test "$depmode" = xlc; then
1682f167a42Smrg  # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information.
1692f167a42Smrg  gccflag=-qmakedep=gcc,-MF
1702f167a42Smrg  depmode=gcc
1713e6697d4Smrgfi
1723e6697d4Smrg
1730e20ee16Smrgcase "$depmode" in
1740e20ee16Smrggcc3)
1750e20ee16Smrg## gcc 3 implements dependency tracking that does exactly what
1760e20ee16Smrg## we want.  Yay!  Note: for some reason libtool 1.4 doesn't like
1770e20ee16Smrg## it if -MD -MP comes after the -MF stuff.  Hmm.
1783e6697d4Smrg## Unfortunately, FreeBSD c89 acceptance of flags depends upon
1793e6697d4Smrg## the command line argument order; so add the flags where they
1803e6697d4Smrg## appear in depend2.am.  Note that the slowdown incurred here
1813e6697d4Smrg## affects only configure: in makefiles, %FASTDEP% shortcuts this.
1823e6697d4Smrg  for arg
1833e6697d4Smrg  do
1843e6697d4Smrg    case $arg in
1853e6697d4Smrg    -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;;
1863e6697d4Smrg    *)  set fnord "$@" "$arg" ;;
1873e6697d4Smrg    esac
1883e6697d4Smrg    shift # fnord
1893e6697d4Smrg    shift # $arg
1903e6697d4Smrg  done
1913e6697d4Smrg  "$@"
1920e20ee16Smrg  stat=$?
1932f167a42Smrg  if test $stat -ne 0; then
1940e20ee16Smrg    rm -f "$tmpdepfile"
1950e20ee16Smrg    exit $stat
1960e20ee16Smrg  fi
1970e20ee16Smrg  mv "$tmpdepfile" "$depfile"
1980e20ee16Smrg  ;;
1990e20ee16Smrg
2000e20ee16Smrggcc)
2012f167a42Smrg## Note that this doesn't just cater to obsosete pre-3.x GCC compilers.
2022f167a42Smrg## but also to in-use compilers like IMB xlc/xlC and the HP C compiler.
2032f167a42Smrg## (see the conditional assignment to $gccflag above).
2040e20ee16Smrg## There are various ways to get dependency output from gcc.  Here's
2050e20ee16Smrg## why we pick this rather obscure method:
2060e20ee16Smrg## - Don't want to use -MD because we'd like the dependencies to end
2070e20ee16Smrg##   up in a subdir.  Having to rename by hand is ugly.
2080e20ee16Smrg##   (We might end up doing this anyway to support other compilers.)
2090e20ee16Smrg## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
2102f167a42Smrg##   -MM, not -M (despite what the docs say).  Also, it might not be
2112f167a42Smrg##   supported by the other compilers which use the 'gcc' depmode.
2120e20ee16Smrg## - Using -M directly means running the compiler twice (even worse
2130e20ee16Smrg##   than renaming).
2140e20ee16Smrg  if test -z "$gccflag"; then
2150e20ee16Smrg    gccflag=-MD,
2160e20ee16Smrg  fi
2170e20ee16Smrg  "$@" -Wp,"$gccflag$tmpdepfile"
2180e20ee16Smrg  stat=$?
2192f167a42Smrg  if test $stat -ne 0; then
2200e20ee16Smrg    rm -f "$tmpdepfile"
2210e20ee16Smrg    exit $stat
2220e20ee16Smrg  fi
2230e20ee16Smrg  rm -f "$depfile"
2240e20ee16Smrg  echo "$object : \\" > "$depfile"
2252f167a42Smrg  # The second -e expression handles DOS-style file names with drive
2262f167a42Smrg  # letters.
2270e20ee16Smrg  sed -e 's/^[^:]*: / /' \
2280e20ee16Smrg      -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
2292f167a42Smrg## This next piece of magic avoids the "deleted header file" problem.
2300e20ee16Smrg## The problem is that when a header file which appears in a .P file
2310e20ee16Smrg## is deleted, the dependency causes make to die (because there is
2320e20ee16Smrg## typically no way to rebuild the header).  We avoid this by adding
2330e20ee16Smrg## dummy dependencies for each header file.  Too bad gcc doesn't do
2340e20ee16Smrg## this for us directly.
2352f167a42Smrg## Some versions of gcc put a space before the ':'.  On the theory
2360e20ee16Smrg## that the space means something, we add a space to the output as
2372f167a42Smrg## well.  hp depmode also adds that space, but also prefixes the VPATH
2382f167a42Smrg## to the object.  Take care to not repeat it in the output.
2390e20ee16Smrg## Some versions of the HPUX 10.20 sed can't process this invocation
2400e20ee16Smrg## correctly.  Breaking it into two sed invocations is a workaround.
2412f167a42Smrg  tr ' ' "$nl" < "$tmpdepfile" \
2422f167a42Smrg    | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \
2432f167a42Smrg    | sed -e 's/$/ :/' >> "$depfile"
2440e20ee16Smrg  rm -f "$tmpdepfile"
2450e20ee16Smrg  ;;
2460e20ee16Smrg
2470e20ee16Smrghp)
2480e20ee16Smrg  # This case exists only to let depend.m4 do its work.  It works by
2490e20ee16Smrg  # looking at the text of this script.  This case will never be run,
2500e20ee16Smrg  # since it is checked for above.
2510e20ee16Smrg  exit 1
2520e20ee16Smrg  ;;
2530e20ee16Smrg
2540e20ee16Smrgsgi)
2550e20ee16Smrg  if test "$libtool" = yes; then
2560e20ee16Smrg    "$@" "-Wp,-MDupdate,$tmpdepfile"
2570e20ee16Smrg  else
2580e20ee16Smrg    "$@" -MDupdate "$tmpdepfile"
2590e20ee16Smrg  fi
2600e20ee16Smrg  stat=$?
2612f167a42Smrg  if test $stat -ne 0; then
2620e20ee16Smrg    rm -f "$tmpdepfile"
2630e20ee16Smrg    exit $stat
2640e20ee16Smrg  fi
2650e20ee16Smrg  rm -f "$depfile"
2660e20ee16Smrg
2670e20ee16Smrg  if test -f "$tmpdepfile"; then  # yes, the sourcefile depend on other files
2680e20ee16Smrg    echo "$object : \\" > "$depfile"
2690e20ee16Smrg    # Clip off the initial element (the dependent).  Don't try to be
2700e20ee16Smrg    # clever and replace this with sed code, as IRIX sed won't handle
2710e20ee16Smrg    # lines with more than a fixed number of characters (4096 in
2720e20ee16Smrg    # IRIX 6.2 sed, 8192 in IRIX 6.5).  We also remove comment lines;
2732f167a42Smrg    # the IRIX cc adds comments like '#:fec' to the end of the
2740e20ee16Smrg    # dependency line.
2752f167a42Smrg    tr ' ' "$nl" < "$tmpdepfile" \
2762f167a42Smrg      | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \
2772f167a42Smrg      | tr "$nl" ' ' >> "$depfile"
2783e6697d4Smrg    echo >> "$depfile"
2790e20ee16Smrg    # The second pass generates a dummy entry for each header file.
2802f167a42Smrg    tr ' ' "$nl" < "$tmpdepfile" \
2812f167a42Smrg      | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
2822f167a42Smrg      >> "$depfile"
2830e20ee16Smrg  else
2842f167a42Smrg    make_dummy_depfile
2850e20ee16Smrg  fi
2860e20ee16Smrg  rm -f "$tmpdepfile"
2870e20ee16Smrg  ;;
2880e20ee16Smrg
2892f167a42Smrgxlc)
2902f167a42Smrg  # This case exists only to let depend.m4 do its work.  It works by
2912f167a42Smrg  # looking at the text of this script.  This case will never be run,
2922f167a42Smrg  # since it is checked for above.
2932f167a42Smrg  exit 1
2942f167a42Smrg  ;;
2952f167a42Smrg
2960e20ee16Smrgaix)
2970e20ee16Smrg  # The C for AIX Compiler uses -M and outputs the dependencies
2980e20ee16Smrg  # in a .u file.  In older versions, this file always lives in the
2992f167a42Smrg  # current directory.  Also, the AIX compiler puts '$object:' at the
3000e20ee16Smrg  # start of each line; $object doesn't have directory information.
3010e20ee16Smrg  # Version 6 uses the directory in both cases.
3022f167a42Smrg  set_dir_from "$object"
3032f167a42Smrg  set_base_from "$object"
3040e20ee16Smrg  if test "$libtool" = yes; then
3053e6697d4Smrg    tmpdepfile1=$dir$base.u
3063e6697d4Smrg    tmpdepfile2=$base.u
3073e6697d4Smrg    tmpdepfile3=$dir.libs/$base.u
3080e20ee16Smrg    "$@" -Wc,-M
3090e20ee16Smrg  else
3103e6697d4Smrg    tmpdepfile1=$dir$base.u
3113e6697d4Smrg    tmpdepfile2=$dir$base.u
3123e6697d4Smrg    tmpdepfile3=$dir$base.u
3130e20ee16Smrg    "$@" -M
3140e20ee16Smrg  fi
3150e20ee16Smrg  stat=$?
3162f167a42Smrg  if test $stat -ne 0; then
3173e6697d4Smrg    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
3180e20ee16Smrg    exit $stat
3190e20ee16Smrg  fi
3200e20ee16Smrg
3213e6697d4Smrg  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
3223e6697d4Smrg  do
3233e6697d4Smrg    test -f "$tmpdepfile" && break
3243e6697d4Smrg  done
3252f167a42Smrg  aix_post_process_depfile
3262f167a42Smrg  ;;
3272f167a42Smrg
3282f167a42Smrgtcc)
3292f167a42Smrg  # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26
3302f167a42Smrg  # FIXME: That version still under development at the moment of writing.
3312f167a42Smrg  #        Make that this statement remains true also for stable, released
3322f167a42Smrg  #        versions.
3332f167a42Smrg  # It will wrap lines (doesn't matter whether long or short) with a
3342f167a42Smrg  # trailing '\', as in:
3352f167a42Smrg  #
3362f167a42Smrg  #   foo.o : \
3372f167a42Smrg  #    foo.c \
3382f167a42Smrg  #    foo.h \
3392f167a42Smrg  #
3402f167a42Smrg  # It will put a trailing '\' even on the last line, and will use leading
3412f167a42Smrg  # spaces rather than leading tabs (at least since its commit 0394caf7
3422f167a42Smrg  # "Emit spaces for -MD").
3432f167a42Smrg  "$@" -MD -MF "$tmpdepfile"
3442f167a42Smrg  stat=$?
3452f167a42Smrg  if test $stat -ne 0; then
3462f167a42Smrg    rm -f "$tmpdepfile"
3472f167a42Smrg    exit $stat
3480e20ee16Smrg  fi
3492f167a42Smrg  rm -f "$depfile"
3502f167a42Smrg  # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'.
3512f167a42Smrg  # We have to change lines of the first kind to '$object: \'.
3522f167a42Smrg  sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile"
3532f167a42Smrg  # And for each line of the second kind, we have to emit a 'dep.h:'
3542f167a42Smrg  # dummy dependency, to avoid the deleted-header problem.
3552f167a42Smrg  sed -n -e 's|^  *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile"
3560e20ee16Smrg  rm -f "$tmpdepfile"
3570e20ee16Smrg  ;;
3580e20ee16Smrg
3592f167a42Smrg## The order of this option in the case statement is important, since the
3602f167a42Smrg## shell code in configure will try each of these formats in the order
3612f167a42Smrg## listed in this file.  A plain '-MD' option would be understood by many
3622f167a42Smrg## compilers, so we must ensure this comes after the gcc and icc options.
3632f167a42Smrgpgcc)
3642f167a42Smrg  # Portland's C compiler understands '-MD'.
3652f167a42Smrg  # Will always output deps to 'file.d' where file is the root name of the
3662f167a42Smrg  # source file under compilation, even if file resides in a subdirectory.
3672f167a42Smrg  # The object file name does not affect the name of the '.d' file.
3682f167a42Smrg  # pgcc 10.2 will output
3690e20ee16Smrg  #    foo.o: sub/foo.c sub/foo.h
3702f167a42Smrg  # and will wrap long lines using '\' :
3710e20ee16Smrg  #    foo.o: sub/foo.c ... \
3720e20ee16Smrg  #     sub/foo.h ... \
3730e20ee16Smrg  #     ...
3742f167a42Smrg  set_dir_from "$object"
3752f167a42Smrg  # Use the source, not the object, to determine the base name, since
3762f167a42Smrg  # that's sadly what pgcc will do too.
3772f167a42Smrg  set_base_from "$source"
3782f167a42Smrg  tmpdepfile=$base.d
3792f167a42Smrg
3802f167a42Smrg  # For projects that build the same source file twice into different object
3812f167a42Smrg  # files, the pgcc approach of using the *source* file root name can cause
3822f167a42Smrg  # problems in parallel builds.  Use a locking strategy to avoid stomping on
3832f167a42Smrg  # the same $tmpdepfile.
3842f167a42Smrg  lockdir=$base.d-lock
3852f167a42Smrg  trap "
3862f167a42Smrg    echo '$0: caught signal, cleaning up...' >&2
3872f167a42Smrg    rmdir '$lockdir'
3882f167a42Smrg    exit 1
3892f167a42Smrg  " 1 2 13 15
3902f167a42Smrg  numtries=100
3912f167a42Smrg  i=$numtries
3922f167a42Smrg  while test $i -gt 0; do
3932f167a42Smrg    # mkdir is a portable test-and-set.
3942f167a42Smrg    if mkdir "$lockdir" 2>/dev/null; then
3952f167a42Smrg      # This process acquired the lock.
3962f167a42Smrg      "$@" -MD
3972f167a42Smrg      stat=$?
3982f167a42Smrg      # Release the lock.
3992f167a42Smrg      rmdir "$lockdir"
4002f167a42Smrg      break
4012f167a42Smrg    else
4022f167a42Smrg      # If the lock is being held by a different process, wait
4032f167a42Smrg      # until the winning process is done or we timeout.
4042f167a42Smrg      while test -d "$lockdir" && test $i -gt 0; do
4052f167a42Smrg        sleep 1
4062f167a42Smrg        i=`expr $i - 1`
4072f167a42Smrg      done
4082f167a42Smrg    fi
4092f167a42Smrg    i=`expr $i - 1`
4102f167a42Smrg  done
4112f167a42Smrg  trap - 1 2 13 15
4122f167a42Smrg  if test $i -le 0; then
4132f167a42Smrg    echo "$0: failed to acquire lock after $numtries attempts" >&2
4142f167a42Smrg    echo "$0: check lockdir '$lockdir'" >&2
4152f167a42Smrg    exit 1
4162f167a42Smrg  fi
4170e20ee16Smrg
4182f167a42Smrg  if test $stat -ne 0; then
4190e20ee16Smrg    rm -f "$tmpdepfile"
4200e20ee16Smrg    exit $stat
4210e20ee16Smrg  fi
4220e20ee16Smrg  rm -f "$depfile"
4230e20ee16Smrg  # Each line is of the form `foo.o: dependent.h',
4240e20ee16Smrg  # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'.
4250e20ee16Smrg  # Do two passes, one to just change these to
4260e20ee16Smrg  # `$object: dependent.h' and one to simply `dependent.h:'.
4270e20ee16Smrg  sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
4280e20ee16Smrg  # Some versions of the HPUX 10.20 sed can't process this invocation
4290e20ee16Smrg  # correctly.  Breaking it into two sed invocations is a workaround.
4302f167a42Smrg  sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \
4312f167a42Smrg    | sed -e 's/$/ :/' >> "$depfile"
4320e20ee16Smrg  rm -f "$tmpdepfile"
4330e20ee16Smrg  ;;
4340e20ee16Smrg
4353e6697d4Smrghp2)
4363e6697d4Smrg  # The "hp" stanza above does not work with aCC (C++) and HP's ia64
4373e6697d4Smrg  # compilers, which have integrated preprocessors.  The correct option
4383e6697d4Smrg  # to use with these is +Maked; it writes dependencies to a file named
4393e6697d4Smrg  # 'foo.d', which lands next to the object file, wherever that
4403e6697d4Smrg  # happens to be.
4413e6697d4Smrg  # Much of this is similar to the tru64 case; see comments there.
4422f167a42Smrg  set_dir_from  "$object"
4432f167a42Smrg  set_base_from "$object"
4443e6697d4Smrg  if test "$libtool" = yes; then
4453e6697d4Smrg    tmpdepfile1=$dir$base.d
4463e6697d4Smrg    tmpdepfile2=$dir.libs/$base.d
4473e6697d4Smrg    "$@" -Wc,+Maked
4483e6697d4Smrg  else
4493e6697d4Smrg    tmpdepfile1=$dir$base.d
4503e6697d4Smrg    tmpdepfile2=$dir$base.d
4513e6697d4Smrg    "$@" +Maked
4523e6697d4Smrg  fi
4533e6697d4Smrg  stat=$?
4542f167a42Smrg  if test $stat -ne 0; then
4553e6697d4Smrg     rm -f "$tmpdepfile1" "$tmpdepfile2"
4563e6697d4Smrg     exit $stat
4573e6697d4Smrg  fi
4583e6697d4Smrg
4593e6697d4Smrg  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2"
4603e6697d4Smrg  do
4613e6697d4Smrg    test -f "$tmpdepfile" && break
4623e6697d4Smrg  done
4633e6697d4Smrg  if test -f "$tmpdepfile"; then
4642f167a42Smrg    sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile"
4652f167a42Smrg    # Add 'dependent.h:' lines.
4663e6697d4Smrg    sed -ne '2,${
4672f167a42Smrg               s/^ *//
4682f167a42Smrg               s/ \\*$//
4692f167a42Smrg               s/$/:/
4702f167a42Smrg               p
4712f167a42Smrg             }' "$tmpdepfile" >> "$depfile"
4723e6697d4Smrg  else
4732f167a42Smrg    make_dummy_depfile
4743e6697d4Smrg  fi
4753e6697d4Smrg  rm -f "$tmpdepfile" "$tmpdepfile2"
4763e6697d4Smrg  ;;
4773e6697d4Smrg
4780e20ee16Smrgtru64)
4792f167a42Smrg  # The Tru64 compiler uses -MD to generate dependencies as a side
4802f167a42Smrg  # effect.  'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'.
4812f167a42Smrg  # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
4822f167a42Smrg  # dependencies in 'foo.d' instead, so we check for that too.
4832f167a42Smrg  # Subdirectories are respected.
4842f167a42Smrg  set_dir_from  "$object"
4852f167a42Smrg  set_base_from "$object"
4862f167a42Smrg
4872f167a42Smrg  if test "$libtool" = yes; then
4882f167a42Smrg    # Libtool generates 2 separate objects for the 2 libraries.  These
4892f167a42Smrg    # two compilations output dependencies in $dir.libs/$base.o.d and
4902f167a42Smrg    # in $dir$base.o.d.  We have to check for both files, because
4912f167a42Smrg    # one of the two compilations can be disabled.  We should prefer
4922f167a42Smrg    # $dir$base.o.d over $dir.libs/$base.o.d because the latter is
4932f167a42Smrg    # automatically cleaned when .libs/ is deleted, while ignoring
4942f167a42Smrg    # the former would cause a distcleancheck panic.
4952f167a42Smrg    tmpdepfile1=$dir$base.o.d          # libtool 1.5
4962f167a42Smrg    tmpdepfile2=$dir.libs/$base.o.d    # Likewise.
4972f167a42Smrg    tmpdepfile3=$dir.libs/$base.d      # Compaq CCC V6.2-504
4982f167a42Smrg    "$@" -Wc,-MD
4992f167a42Smrg  else
5002f167a42Smrg    tmpdepfile1=$dir$base.d
5012f167a42Smrg    tmpdepfile2=$dir$base.d
5022f167a42Smrg    tmpdepfile3=$dir$base.d
5032f167a42Smrg    "$@" -MD
5042f167a42Smrg  fi
5052f167a42Smrg
5062f167a42Smrg  stat=$?
5072f167a42Smrg  if test $stat -ne 0; then
5082f167a42Smrg    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
5092f167a42Smrg    exit $stat
5102f167a42Smrg  fi
5112f167a42Smrg
5122f167a42Smrg  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
5132f167a42Smrg  do
5142f167a42Smrg    test -f "$tmpdepfile" && break
5152f167a42Smrg  done
5162f167a42Smrg  # Same post-processing that is required for AIX mode.
5172f167a42Smrg  aix_post_process_depfile
5182f167a42Smrg  ;;
5192f167a42Smrg
5202f167a42Smrgmsvc7)
5212f167a42Smrg  if test "$libtool" = yes; then
5222f167a42Smrg    showIncludes=-Wc,-showIncludes
5232f167a42Smrg  else
5242f167a42Smrg    showIncludes=-showIncludes
5252f167a42Smrg  fi
5262f167a42Smrg  "$@" $showIncludes > "$tmpdepfile"
5272f167a42Smrg  stat=$?
5282f167a42Smrg  grep -v '^Note: including file: ' "$tmpdepfile"
5292f167a42Smrg  if test $stat -ne 0; then
5302f167a42Smrg    rm -f "$tmpdepfile"
5312f167a42Smrg    exit $stat
5322f167a42Smrg  fi
5332f167a42Smrg  rm -f "$depfile"
5342f167a42Smrg  echo "$object : \\" > "$depfile"
5352f167a42Smrg  # The first sed program below extracts the file names and escapes
5362f167a42Smrg  # backslashes for cygpath.  The second sed program outputs the file
5372f167a42Smrg  # name when reading, but also accumulates all include files in the
5382f167a42Smrg  # hold buffer in order to output them again at the end.  This only
5392f167a42Smrg  # works with sed implementations that can handle large buffers.
5402f167a42Smrg  sed < "$tmpdepfile" -n '
5412f167a42Smrg/^Note: including file:  *\(.*\)/ {
5422f167a42Smrg  s//\1/
5432f167a42Smrg  s/\\/\\\\/g
5442f167a42Smrg  p
5452f167a42Smrg}' | $cygpath_u | sort -u | sed -n '
5462f167a42Smrgs/ /\\ /g
5472f167a42Smrgs/\(.*\)/'"$tab"'\1 \\/p
5482f167a42Smrgs/.\(.*\) \\/\1:/
5492f167a42SmrgH
5502f167a42Smrg$ {
5512f167a42Smrg  s/.*/'"$tab"'/
5522f167a42Smrg  G
5532f167a42Smrg  p
5542f167a42Smrg}' >> "$depfile"
5552f167a42Smrg  echo >> "$depfile" # make sure the fragment doesn't end with a backslash
5562f167a42Smrg  rm -f "$tmpdepfile"
5572f167a42Smrg  ;;
5582f167a42Smrg
5592f167a42Smrgmsvc7msys)
5602f167a42Smrg  # This case exists only to let depend.m4 do its work.  It works by
5612f167a42Smrg  # looking at the text of this script.  This case will never be run,
5622f167a42Smrg  # since it is checked for above.
5632f167a42Smrg  exit 1
5642f167a42Smrg  ;;
5650e20ee16Smrg
5660e20ee16Smrg#nosideeffect)
5670e20ee16Smrg  # This comment above is used by automake to tell side-effect
5680e20ee16Smrg  # dependency tracking mechanisms from slower ones.
5690e20ee16Smrg
5700e20ee16Smrgdashmstdout)
5710e20ee16Smrg  # Important note: in order to support this mode, a compiler *must*
5720e20ee16Smrg  # always write the preprocessed file to stdout, regardless of -o.
5730e20ee16Smrg  "$@" || exit $?
5740e20ee16Smrg
5750e20ee16Smrg  # Remove the call to Libtool.
5760e20ee16Smrg  if test "$libtool" = yes; then
5773e6697d4Smrg    while test "X$1" != 'X--mode=compile'; do
5780e20ee16Smrg      shift
5790e20ee16Smrg    done
5800e20ee16Smrg    shift
5810e20ee16Smrg  fi
5820e20ee16Smrg
5832f167a42Smrg  # Remove '-o $object'.
5840e20ee16Smrg  IFS=" "
5850e20ee16Smrg  for arg
5860e20ee16Smrg  do
5870e20ee16Smrg    case $arg in
5880e20ee16Smrg    -o)
5890e20ee16Smrg      shift
5900e20ee16Smrg      ;;
5910e20ee16Smrg    $object)
5920e20ee16Smrg      shift
5930e20ee16Smrg      ;;
5940e20ee16Smrg    *)
5950e20ee16Smrg      set fnord "$@" "$arg"
5960e20ee16Smrg      shift # fnord
5970e20ee16Smrg      shift # $arg
5980e20ee16Smrg      ;;
5990e20ee16Smrg    esac
6000e20ee16Smrg  done
6010e20ee16Smrg
6020e20ee16Smrg  test -z "$dashmflag" && dashmflag=-M
6032f167a42Smrg  # Require at least two characters before searching for ':'
6040e20ee16Smrg  # in the target name.  This is to cope with DOS-style filenames:
6052f167a42Smrg  # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise.
6060e20ee16Smrg  "$@" $dashmflag |
6072f167a42Smrg    sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile"
6080e20ee16Smrg  rm -f "$depfile"
6090e20ee16Smrg  cat < "$tmpdepfile" > "$depfile"
6102f167a42Smrg  # Some versions of the HPUX 10.20 sed can't process this sed invocation
6112f167a42Smrg  # correctly.  Breaking it into two sed invocations is a workaround.
6122f167a42Smrg  tr ' ' "$nl" < "$tmpdepfile" \
6132f167a42Smrg    | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
6142f167a42Smrg    | sed -e 's/$/ :/' >> "$depfile"
6150e20ee16Smrg  rm -f "$tmpdepfile"
6160e20ee16Smrg  ;;
6170e20ee16Smrg
6180e20ee16SmrgdashXmstdout)
6190e20ee16Smrg  # This case only exists to satisfy depend.m4.  It is never actually
6200e20ee16Smrg  # run, as this mode is specially recognized in the preamble.
6210e20ee16Smrg  exit 1
6220e20ee16Smrg  ;;
6230e20ee16Smrg
6240e20ee16Smrgmakedepend)
6250e20ee16Smrg  "$@" || exit $?
6260e20ee16Smrg  # Remove any Libtool call
6270e20ee16Smrg  if test "$libtool" = yes; then
6283e6697d4Smrg    while test "X$1" != 'X--mode=compile'; do
6290e20ee16Smrg      shift
6300e20ee16Smrg    done
6310e20ee16Smrg    shift
6320e20ee16Smrg  fi
6330e20ee16Smrg  # X makedepend
6340e20ee16Smrg  shift
6353e6697d4Smrg  cleared=no eat=no
6363e6697d4Smrg  for arg
6373e6697d4Smrg  do
6380e20ee16Smrg    case $cleared in
6390e20ee16Smrg    no)
6400e20ee16Smrg      set ""; shift
6410e20ee16Smrg      cleared=yes ;;
6420e20ee16Smrg    esac
6433e6697d4Smrg    if test $eat = yes; then
6443e6697d4Smrg      eat=no
6453e6697d4Smrg      continue
6463e6697d4Smrg    fi
6470e20ee16Smrg    case "$arg" in
6480e20ee16Smrg    -D*|-I*)
6490e20ee16Smrg      set fnord "$@" "$arg"; shift ;;
6500e20ee16Smrg    # Strip any option that makedepend may not understand.  Remove
6510e20ee16Smrg    # the object too, otherwise makedepend will parse it as a source file.
6523e6697d4Smrg    -arch)
6533e6697d4Smrg      eat=yes ;;
6540e20ee16Smrg    -*|$object)
6550e20ee16Smrg      ;;
6560e20ee16Smrg    *)
6570e20ee16Smrg      set fnord "$@" "$arg"; shift ;;
6580e20ee16Smrg    esac
6590e20ee16Smrg  done
6603e6697d4Smrg  obj_suffix=`echo "$object" | sed 's/^.*\././'`
6610e20ee16Smrg  touch "$tmpdepfile"
6620e20ee16Smrg  ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
6630e20ee16Smrg  rm -f "$depfile"
6642f167a42Smrg  # makedepend may prepend the VPATH from the source file name to the object.
6652f167a42Smrg  # No need to regex-escape $object, excess matching of '.' is harmless.
6662f167a42Smrg  sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile"
6672f167a42Smrg  # Some versions of the HPUX 10.20 sed can't process the last invocation
6682f167a42Smrg  # correctly.  Breaking it into two sed invocations is a workaround.
6692f167a42Smrg  sed '1,2d' "$tmpdepfile" \
6702f167a42Smrg    | tr ' ' "$nl" \
6712f167a42Smrg    | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
6722f167a42Smrg    | sed -e 's/$/ :/' >> "$depfile"
6730e20ee16Smrg  rm -f "$tmpdepfile" "$tmpdepfile".bak
6740e20ee16Smrg  ;;
6750e20ee16Smrg
6760e20ee16Smrgcpp)
6770e20ee16Smrg  # Important note: in order to support this mode, a compiler *must*
6780e20ee16Smrg  # always write the preprocessed file to stdout.
6790e20ee16Smrg  "$@" || exit $?
6800e20ee16Smrg
6810e20ee16Smrg  # Remove the call to Libtool.
6820e20ee16Smrg  if test "$libtool" = yes; then
6833e6697d4Smrg    while test "X$1" != 'X--mode=compile'; do
6840e20ee16Smrg      shift
6850e20ee16Smrg    done
6860e20ee16Smrg    shift
6870e20ee16Smrg  fi
6880e20ee16Smrg
6892f167a42Smrg  # Remove '-o $object'.
6900e20ee16Smrg  IFS=" "
6910e20ee16Smrg  for arg
6920e20ee16Smrg  do
6930e20ee16Smrg    case $arg in
6940e20ee16Smrg    -o)
6950e20ee16Smrg      shift
6960e20ee16Smrg      ;;
6970e20ee16Smrg    $object)
6980e20ee16Smrg      shift
6990e20ee16Smrg      ;;
7000e20ee16Smrg    *)
7010e20ee16Smrg      set fnord "$@" "$arg"
7020e20ee16Smrg      shift # fnord
7030e20ee16Smrg      shift # $arg
7040e20ee16Smrg      ;;
7050e20ee16Smrg    esac
7060e20ee16Smrg  done
7070e20ee16Smrg
7082f167a42Smrg  "$@" -E \
7092f167a42Smrg    | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
7102f167a42Smrg             -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
7112f167a42Smrg    | sed '$ s: \\$::' > "$tmpdepfile"
7120e20ee16Smrg  rm -f "$depfile"
7130e20ee16Smrg  echo "$object : \\" > "$depfile"
7140e20ee16Smrg  cat < "$tmpdepfile" >> "$depfile"
7150e20ee16Smrg  sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
7160e20ee16Smrg  rm -f "$tmpdepfile"
7170e20ee16Smrg  ;;
7180e20ee16Smrg
7190e20ee16Smrgmsvisualcpp)
7200e20ee16Smrg  # Important note: in order to support this mode, a compiler *must*
7213e6697d4Smrg  # always write the preprocessed file to stdout.
7220e20ee16Smrg  "$@" || exit $?
7233e6697d4Smrg
7243e6697d4Smrg  # Remove the call to Libtool.
7253e6697d4Smrg  if test "$libtool" = yes; then
7263e6697d4Smrg    while test "X$1" != 'X--mode=compile'; do
7273e6697d4Smrg      shift
7283e6697d4Smrg    done
7293e6697d4Smrg    shift
7303e6697d4Smrg  fi
7313e6697d4Smrg
7320e20ee16Smrg  IFS=" "
7330e20ee16Smrg  for arg
7340e20ee16Smrg  do
7350e20ee16Smrg    case "$arg" in
7363e6697d4Smrg    -o)
7373e6697d4Smrg      shift
7383e6697d4Smrg      ;;
7393e6697d4Smrg    $object)
7403e6697d4Smrg      shift
7413e6697d4Smrg      ;;
7420e20ee16Smrg    "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
7432f167a42Smrg        set fnord "$@"
7442f167a42Smrg        shift
7452f167a42Smrg        shift
7462f167a42Smrg        ;;
7470e20ee16Smrg    *)
7482f167a42Smrg        set fnord "$@" "$arg"
7492f167a42Smrg        shift
7502f167a42Smrg        shift
7512f167a42Smrg        ;;
7520e20ee16Smrg    esac
7530e20ee16Smrg  done
7543e6697d4Smrg  "$@" -E 2>/dev/null |
7553e6697d4Smrg  sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile"
7560e20ee16Smrg  rm -f "$depfile"
7570e20ee16Smrg  echo "$object : \\" > "$depfile"
7582f167a42Smrg  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile"
7592f167a42Smrg  echo "$tab" >> "$depfile"
7603e6697d4Smrg  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile"
7610e20ee16Smrg  rm -f "$tmpdepfile"
7620e20ee16Smrg  ;;
7630e20ee16Smrg
7643e6697d4Smrgmsvcmsys)
7653e6697d4Smrg  # This case exists only to let depend.m4 do its work.  It works by
7663e6697d4Smrg  # looking at the text of this script.  This case will never be run,
7673e6697d4Smrg  # since it is checked for above.
7683e6697d4Smrg  exit 1
7693e6697d4Smrg  ;;
7703e6697d4Smrg
7710e20ee16Smrgnone)
7720e20ee16Smrg  exec "$@"
7730e20ee16Smrg  ;;
7740e20ee16Smrg
7750e20ee16Smrg*)
7760e20ee16Smrg  echo "Unknown depmode $depmode" 1>&2
7770e20ee16Smrg  exit 1
7780e20ee16Smrg  ;;
7790e20ee16Smrgesac
7800e20ee16Smrg
7810e20ee16Smrgexit 0
7823e6697d4Smrg
7833e6697d4Smrg# Local Variables:
7843e6697d4Smrg# mode: shell-script
7853e6697d4Smrg# sh-indentation: 2
7863e6697d4Smrg# eval: (add-hook 'write-file-hooks 'time-stamp)
7873e6697d4Smrg# time-stamp-start: "scriptversion="
7883e6697d4Smrg# time-stamp-format: "%:y-%02m-%02d.%02H"
7893e6697d4Smrg# time-stamp-time-zone: "UTC"
7903e6697d4Smrg# time-stamp-end: "; # UTC"
7913e6697d4Smrg# End:
792