12c7c4e3dSmrg#! /bin/sh
22c7c4e3dSmrg# depcomp - compile a program generating dependencies as side-effects
38650bb69Smrg
4c1e8faa6Smrgscriptversion=2024-06-19.01; # UTC
58650bb69Smrg
6c1e8faa6Smrg# Copyright (C) 1999-2024 Free Software Foundation, Inc.
72c7c4e3dSmrg
82c7c4e3dSmrg# This program is free software; you can redistribute it and/or modify
92c7c4e3dSmrg# it under the terms of the GNU General Public License as published by
102c7c4e3dSmrg# the Free Software Foundation; either version 2, or (at your option)
112c7c4e3dSmrg# any later version.
122c7c4e3dSmrg
132c7c4e3dSmrg# This program is distributed in the hope that it will be useful,
142c7c4e3dSmrg# but WITHOUT ANY WARRANTY; without even the implied warranty of
152c7c4e3dSmrg# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
162c7c4e3dSmrg# GNU General Public License for more details.
172c7c4e3dSmrg
182c7c4e3dSmrg# You should have received a copy of the GNU General Public License
193458e6c2Smrg# along with this program.  If not, see <https://www.gnu.org/licenses/>.
202c7c4e3dSmrg
212c7c4e3dSmrg# As a special exception to the GNU General Public License, if you
222c7c4e3dSmrg# distribute this file as part of a program that contains a
232c7c4e3dSmrg# configuration script generated by Autoconf, you may include it under
242c7c4e3dSmrg# the same distribution terms that you use for the rest of that program.
252c7c4e3dSmrg
262c7c4e3dSmrg# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>.
272c7c4e3dSmrg
288650bb69Smrgcase $1 in
298650bb69Smrg  '')
302becc446Smrg    echo "$0: No command.  Try '$0 --help' for more information." 1>&2
312becc446Smrg    exit 1;
322becc446Smrg    ;;
338650bb69Smrg  -h | --h*)
348650bb69Smrg    cat <<\EOF
358650bb69SmrgUsage: depcomp [--help] [--version] PROGRAM [ARGS]
368650bb69Smrg
378650bb69SmrgRun PROGRAMS ARGS to compile a file, generating dependencies
388650bb69Smrgas side-effects.
398650bb69Smrg
408650bb69SmrgEnvironment variables:
418650bb69Smrg  depmode     Dependency tracking mode.
422becc446Smrg  source      Source file read by 'PROGRAMS ARGS'.
432becc446Smrg  object      Object file output by 'PROGRAMS ARGS'.
448650bb69Smrg  DEPDIR      directory where to store dependencies.
458650bb69Smrg  depfile     Dependency file to output.
462becc446Smrg  tmpdepfile  Temporary file to use when outputting dependencies.
478650bb69Smrg  libtool     Whether libtool is used (yes/no).
488650bb69Smrg
498650bb69SmrgReport bugs to <bug-automake@gnu.org>.
50c1e8faa6SmrgGNU Automake home page: <https://www.gnu.org/software/automake/>.
51c1e8faa6SmrgGeneral help using GNU software: <https://www.gnu.org/gethelp/>.
528650bb69SmrgEOF
538650bb69Smrg    exit $?
548650bb69Smrg    ;;
558650bb69Smrg  -v | --v*)
56c1e8faa6Smrg    echo "depcomp (GNU Automake) $scriptversion"
578650bb69Smrg    exit $?
588650bb69Smrg    ;;
598650bb69Smrgesac
608650bb69Smrg
612becc446Smrg# Get the directory component of the given path, and save it in the
622becc446Smrg# global variables '$dir'.  Note that this directory component will
632becc446Smrg# be either empty or ending with a '/' character.  This is deliberate.
642becc446Smrgset_dir_from ()
652becc446Smrg{
662becc446Smrg  case $1 in
672becc446Smrg    */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;;
682becc446Smrg      *) dir=;;
692becc446Smrg  esac
702becc446Smrg}
712becc446Smrg
722becc446Smrg# Get the suffix-stripped basename of the given path, and save it the
732becc446Smrg# global variable '$base'.
742becc446Smrgset_base_from ()
752becc446Smrg{
762becc446Smrg  base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'`
772becc446Smrg}
782becc446Smrg
792becc446Smrg# If no dependency file was actually created by the compiler invocation,
802becc446Smrg# we still have to create a dummy depfile, to avoid errors with the
812becc446Smrg# Makefile "include basename.Plo" scheme.
822becc446Smrgmake_dummy_depfile ()
832becc446Smrg{
842becc446Smrg  echo "#dummy" > "$depfile"
852becc446Smrg}
862becc446Smrg
872becc446Smrg# Factor out some common post-processing of the generated depfile.
882becc446Smrg# Requires the auxiliary global variable '$tmpdepfile' to be set.
892becc446Smrgaix_post_process_depfile ()
902becc446Smrg{
912becc446Smrg  # If the compiler actually managed to produce a dependency file,
922becc446Smrg  # post-process it.
932becc446Smrg  if test -f "$tmpdepfile"; then
942becc446Smrg    # Each line is of the form 'foo.o: dependency.h'.
952becc446Smrg    # Do two passes, one to just change these to
962becc446Smrg    #   $object: dependency.h
972becc446Smrg    # and one to simply output
982becc446Smrg    #   dependency.h:
992becc446Smrg    # which is needed to avoid the deleted-header problem.
1002becc446Smrg    { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile"
1012becc446Smrg      sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile"
1022becc446Smrg    } > "$depfile"
1032becc446Smrg    rm -f "$tmpdepfile"
1042becc446Smrg  else
1052becc446Smrg    make_dummy_depfile
1062becc446Smrg  fi
1072becc446Smrg}
1082becc446Smrg
1092becc446Smrg# A tabulation character.
1102becc446Smrgtab='	'
1112becc446Smrg# A newline character.
1122becc446Smrgnl='
1132becc446Smrg'
1142becc446Smrg# Character ranges might be problematic outside the C locale.
1152becc446Smrg# These definitions help.
1162becc446Smrgupper=ABCDEFGHIJKLMNOPQRSTUVWXYZ
1172becc446Smrglower=abcdefghijklmnopqrstuvwxyz
1182becc446Smrgalpha=${upper}${lower}
1192becc446Smrg
1202c7c4e3dSmrgif test -z "$depmode" || test -z "$source" || test -z "$object"; then
1212c7c4e3dSmrg  echo "depcomp: Variables source, object and depmode must be set" 1>&2
1222c7c4e3dSmrg  exit 1
1232c7c4e3dSmrgfi
1242c7c4e3dSmrg
1258650bb69Smrg# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.
1268650bb69Smrgdepfile=${depfile-`echo "$object" |
1278650bb69Smrg  sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`}
1282c7c4e3dSmrgtmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
1292c7c4e3dSmrg
1302c7c4e3dSmrgrm -f "$tmpdepfile"
1312c7c4e3dSmrg
132c1e8faa6Smrg# Avoid interference from the environment.
1332becc446Smrggccflag= dashmflag=
1342becc446Smrg
1352c7c4e3dSmrg# Some modes work just like other modes, but use different flags.  We
1362c7c4e3dSmrg# parameterize here, but still list the modes in the big case below,
1372c7c4e3dSmrg# to make depend.m4 easier to write.  Note that we *cannot* use a case
1382c7c4e3dSmrg# here, because this file can only contain one case statement.
1392c7c4e3dSmrgif test "$depmode" = hp; then
1402c7c4e3dSmrg  # HP compiler uses -M and no extra arg.
1412c7c4e3dSmrg  gccflag=-M
1422c7c4e3dSmrg  depmode=gcc
1432c7c4e3dSmrgfi
1442c7c4e3dSmrg
1452c7c4e3dSmrgif test "$depmode" = dashXmstdout; then
1462becc446Smrg  # This is just like dashmstdout with a different argument.
1472becc446Smrg  dashmflag=-xM
1482becc446Smrg  depmode=dashmstdout
1492c7c4e3dSmrgfi
1502c7c4e3dSmrg
1518650bb69Smrgcygpath_u="cygpath -u -f -"
1528650bb69Smrgif test "$depmode" = msvcmsys; then
1532becc446Smrg  # This is just like msvisualcpp but w/o cygpath translation.
1542becc446Smrg  # Just convert the backslash-escaped backslashes to single forward
1552becc446Smrg  # slashes to satisfy depend.m4
1562becc446Smrg  cygpath_u='sed s,\\\\,/,g'
1572becc446Smrg  depmode=msvisualcpp
1582becc446Smrgfi
1592becc446Smrg
1602becc446Smrgif test "$depmode" = msvc7msys; then
1612becc446Smrg  # This is just like msvc7 but w/o cygpath translation.
1622becc446Smrg  # Just convert the backslash-escaped backslashes to single forward
1632becc446Smrg  # slashes to satisfy depend.m4
1642becc446Smrg  cygpath_u='sed s,\\\\,/,g'
1652becc446Smrg  depmode=msvc7
1662becc446Smrgfi
1672becc446Smrg
1682becc446Smrgif test "$depmode" = xlc; then
1692becc446Smrg  # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information.
1702becc446Smrg  gccflag=-qmakedep=gcc,-MF
1712becc446Smrg  depmode=gcc
1728650bb69Smrgfi
1738650bb69Smrg
1742c7c4e3dSmrgcase "$depmode" in
1752c7c4e3dSmrggcc3)
1762c7c4e3dSmrg## gcc 3 implements dependency tracking that does exactly what
1772c7c4e3dSmrg## we want.  Yay!  Note: for some reason libtool 1.4 doesn't like
1782c7c4e3dSmrg## it if -MD -MP comes after the -MF stuff.  Hmm.
1798650bb69Smrg## Unfortunately, FreeBSD c89 acceptance of flags depends upon
1808650bb69Smrg## the command line argument order; so add the flags where they
1818650bb69Smrg## appear in depend2.am.  Note that the slowdown incurred here
1828650bb69Smrg## affects only configure: in makefiles, %FASTDEP% shortcuts this.
1838650bb69Smrg  for arg
1848650bb69Smrg  do
1858650bb69Smrg    case $arg in
1868650bb69Smrg    -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;;
1878650bb69Smrg    *)  set fnord "$@" "$arg" ;;
1888650bb69Smrg    esac
1898650bb69Smrg    shift # fnord
1908650bb69Smrg    shift # $arg
1918650bb69Smrg  done
1928650bb69Smrg  "$@"
1932c7c4e3dSmrg  stat=$?
1942becc446Smrg  if test $stat -ne 0; then
1952c7c4e3dSmrg    rm -f "$tmpdepfile"
1962c7c4e3dSmrg    exit $stat
1972c7c4e3dSmrg  fi
1982c7c4e3dSmrg  mv "$tmpdepfile" "$depfile"
1992c7c4e3dSmrg  ;;
2002c7c4e3dSmrg
2012c7c4e3dSmrggcc)
202c1e8faa6Smrg## Note that this doesn't just cater to obsolete pre-3.x GCC compilers.
203c1e8faa6Smrg## but also to in-use compilers like IBM xlc/xlC and the HP C compiler.
2042becc446Smrg## (see the conditional assignment to $gccflag above).
2052c7c4e3dSmrg## There are various ways to get dependency output from gcc.  Here's
2062c7c4e3dSmrg## why we pick this rather obscure method:
2072c7c4e3dSmrg## - Don't want to use -MD because we'd like the dependencies to end
2082c7c4e3dSmrg##   up in a subdir.  Having to rename by hand is ugly.
2092c7c4e3dSmrg##   (We might end up doing this anyway to support other compilers.)
2102c7c4e3dSmrg## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
2112becc446Smrg##   -MM, not -M (despite what the docs say).  Also, it might not be
2122becc446Smrg##   supported by the other compilers which use the 'gcc' depmode.
2132c7c4e3dSmrg## - Using -M directly means running the compiler twice (even worse
2142c7c4e3dSmrg##   than renaming).
2152c7c4e3dSmrg  if test -z "$gccflag"; then
2162c7c4e3dSmrg    gccflag=-MD,
2172c7c4e3dSmrg  fi
2182c7c4e3dSmrg  "$@" -Wp,"$gccflag$tmpdepfile"
2192c7c4e3dSmrg  stat=$?
2202becc446Smrg  if test $stat -ne 0; then
2212c7c4e3dSmrg    rm -f "$tmpdepfile"
2222c7c4e3dSmrg    exit $stat
2232c7c4e3dSmrg  fi
2242c7c4e3dSmrg  rm -f "$depfile"
2252c7c4e3dSmrg  echo "$object : \\" > "$depfile"
2262becc446Smrg  # The second -e expression handles DOS-style file names with drive
2272becc446Smrg  # letters.
2282c7c4e3dSmrg  sed -e 's/^[^:]*: / /' \
2292c7c4e3dSmrg      -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
2302becc446Smrg## This next piece of magic avoids the "deleted header file" problem.
2312c7c4e3dSmrg## The problem is that when a header file which appears in a .P file
2322c7c4e3dSmrg## is deleted, the dependency causes make to die (because there is
2332c7c4e3dSmrg## typically no way to rebuild the header).  We avoid this by adding
2342c7c4e3dSmrg## dummy dependencies for each header file.  Too bad gcc doesn't do
2352c7c4e3dSmrg## this for us directly.
2362becc446Smrg## Some versions of gcc put a space before the ':'.  On the theory
2372c7c4e3dSmrg## that the space means something, we add a space to the output as
2382becc446Smrg## well.  hp depmode also adds that space, but also prefixes the VPATH
2392becc446Smrg## to the object.  Take care to not repeat it in the output.
2402c7c4e3dSmrg## Some versions of the HPUX 10.20 sed can't process this invocation
2412c7c4e3dSmrg## correctly.  Breaking it into two sed invocations is a workaround.
2422becc446Smrg  tr ' ' "$nl" < "$tmpdepfile" \
2432becc446Smrg    | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \
2442becc446Smrg    | sed -e 's/$/ :/' >> "$depfile"
2452c7c4e3dSmrg  rm -f "$tmpdepfile"
2462c7c4e3dSmrg  ;;
2472c7c4e3dSmrg
2482c7c4e3dSmrghp)
2492c7c4e3dSmrg  # This case exists only to let depend.m4 do its work.  It works by
2502c7c4e3dSmrg  # looking at the text of this script.  This case will never be run,
2512c7c4e3dSmrg  # since it is checked for above.
2522c7c4e3dSmrg  exit 1
2532c7c4e3dSmrg  ;;
2542c7c4e3dSmrg
2552c7c4e3dSmrgsgi)
2562c7c4e3dSmrg  if test "$libtool" = yes; then
2572c7c4e3dSmrg    "$@" "-Wp,-MDupdate,$tmpdepfile"
2582c7c4e3dSmrg  else
2592c7c4e3dSmrg    "$@" -MDupdate "$tmpdepfile"
2602c7c4e3dSmrg  fi
2612c7c4e3dSmrg  stat=$?
2622becc446Smrg  if test $stat -ne 0; then
2632c7c4e3dSmrg    rm -f "$tmpdepfile"
2642c7c4e3dSmrg    exit $stat
2652c7c4e3dSmrg  fi
2662c7c4e3dSmrg  rm -f "$depfile"
2672c7c4e3dSmrg
2682c7c4e3dSmrg  if test -f "$tmpdepfile"; then  # yes, the sourcefile depend on other files
2692c7c4e3dSmrg    echo "$object : \\" > "$depfile"
2702c7c4e3dSmrg    # Clip off the initial element (the dependent).  Don't try to be
2712c7c4e3dSmrg    # clever and replace this with sed code, as IRIX sed won't handle
2722c7c4e3dSmrg    # lines with more than a fixed number of characters (4096 in
2732c7c4e3dSmrg    # IRIX 6.2 sed, 8192 in IRIX 6.5).  We also remove comment lines;
2742becc446Smrg    # the IRIX cc adds comments like '#:fec' to the end of the
2752c7c4e3dSmrg    # dependency line.
2762becc446Smrg    tr ' ' "$nl" < "$tmpdepfile" \
2772becc446Smrg      | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \
2782becc446Smrg      | tr "$nl" ' ' >> "$depfile"
2798650bb69Smrg    echo >> "$depfile"
2802c7c4e3dSmrg    # The second pass generates a dummy entry for each header file.
2812becc446Smrg    tr ' ' "$nl" < "$tmpdepfile" \
2822becc446Smrg      | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
2832becc446Smrg      >> "$depfile"
2842c7c4e3dSmrg  else
2852becc446Smrg    make_dummy_depfile
2862c7c4e3dSmrg  fi
2872c7c4e3dSmrg  rm -f "$tmpdepfile"
2882c7c4e3dSmrg  ;;
2892c7c4e3dSmrg
2902becc446Smrgxlc)
2912becc446Smrg  # This case exists only to let depend.m4 do its work.  It works by
2922becc446Smrg  # looking at the text of this script.  This case will never be run,
2932becc446Smrg  # since it is checked for above.
2942becc446Smrg  exit 1
2952becc446Smrg  ;;
2962becc446Smrg
2972c7c4e3dSmrgaix)
2982c7c4e3dSmrg  # The C for AIX Compiler uses -M and outputs the dependencies
2992c7c4e3dSmrg  # in a .u file.  In older versions, this file always lives in the
3002becc446Smrg  # current directory.  Also, the AIX compiler puts '$object:' at the
3012c7c4e3dSmrg  # start of each line; $object doesn't have directory information.
3022c7c4e3dSmrg  # Version 6 uses the directory in both cases.
3032becc446Smrg  set_dir_from "$object"
3042becc446Smrg  set_base_from "$object"
3052c7c4e3dSmrg  if test "$libtool" = yes; then
3068650bb69Smrg    tmpdepfile1=$dir$base.u
3078650bb69Smrg    tmpdepfile2=$base.u
3088650bb69Smrg    tmpdepfile3=$dir.libs/$base.u
3092c7c4e3dSmrg    "$@" -Wc,-M
3102c7c4e3dSmrg  else
3118650bb69Smrg    tmpdepfile1=$dir$base.u
3128650bb69Smrg    tmpdepfile2=$dir$base.u
3138650bb69Smrg    tmpdepfile3=$dir$base.u
3142c7c4e3dSmrg    "$@" -M
3152c7c4e3dSmrg  fi
3162c7c4e3dSmrg  stat=$?
3172becc446Smrg  if test $stat -ne 0; then
3188650bb69Smrg    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
3192c7c4e3dSmrg    exit $stat
3202c7c4e3dSmrg  fi
3212c7c4e3dSmrg
3228650bb69Smrg  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
3238650bb69Smrg  do
3248650bb69Smrg    test -f "$tmpdepfile" && break
3258650bb69Smrg  done
3262becc446Smrg  aix_post_process_depfile
3272becc446Smrg  ;;
3282becc446Smrg
3292becc446Smrgtcc)
3302becc446Smrg  # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26
3312becc446Smrg  # FIXME: That version still under development at the moment of writing.
3322becc446Smrg  #        Make that this statement remains true also for stable, released
3332becc446Smrg  #        versions.
3342becc446Smrg  # It will wrap lines (doesn't matter whether long or short) with a
3352becc446Smrg  # trailing '\', as in:
3362becc446Smrg  #
3372becc446Smrg  #   foo.o : \
3382becc446Smrg  #    foo.c \
3392becc446Smrg  #    foo.h \
3402becc446Smrg  #
3412becc446Smrg  # It will put a trailing '\' even on the last line, and will use leading
3422becc446Smrg  # spaces rather than leading tabs (at least since its commit 0394caf7
3432becc446Smrg  # "Emit spaces for -MD").
3442becc446Smrg  "$@" -MD -MF "$tmpdepfile"
3452becc446Smrg  stat=$?
3462becc446Smrg  if test $stat -ne 0; then
3472becc446Smrg    rm -f "$tmpdepfile"
3482becc446Smrg    exit $stat
3492c7c4e3dSmrg  fi
3502becc446Smrg  rm -f "$depfile"
3512becc446Smrg  # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'.
3522becc446Smrg  # We have to change lines of the first kind to '$object: \'.
3532becc446Smrg  sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile"
3542becc446Smrg  # And for each line of the second kind, we have to emit a 'dep.h:'
3552becc446Smrg  # dummy dependency, to avoid the deleted-header problem.
3562becc446Smrg  sed -n -e 's|^  *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile"
3572c7c4e3dSmrg  rm -f "$tmpdepfile"
3582c7c4e3dSmrg  ;;
3592c7c4e3dSmrg
3602becc446Smrg## The order of this option in the case statement is important, since the
3612becc446Smrg## shell code in configure will try each of these formats in the order
3622becc446Smrg## listed in this file.  A plain '-MD' option would be understood by many
3632becc446Smrg## compilers, so we must ensure this comes after the gcc and icc options.
3642becc446Smrgpgcc)
3652becc446Smrg  # Portland's C compiler understands '-MD'.
3662becc446Smrg  # Will always output deps to 'file.d' where file is the root name of the
3672becc446Smrg  # source file under compilation, even if file resides in a subdirectory.
3682becc446Smrg  # The object file name does not affect the name of the '.d' file.
3692becc446Smrg  # pgcc 10.2 will output
3702c7c4e3dSmrg  #    foo.o: sub/foo.c sub/foo.h
3712becc446Smrg  # and will wrap long lines using '\' :
3722c7c4e3dSmrg  #    foo.o: sub/foo.c ... \
3732c7c4e3dSmrg  #     sub/foo.h ... \
3742c7c4e3dSmrg  #     ...
3752becc446Smrg  set_dir_from "$object"
3762becc446Smrg  # Use the source, not the object, to determine the base name, since
3772becc446Smrg  # that's sadly what pgcc will do too.
3782becc446Smrg  set_base_from "$source"
3792becc446Smrg  tmpdepfile=$base.d
3802becc446Smrg
3812becc446Smrg  # For projects that build the same source file twice into different object
3822becc446Smrg  # files, the pgcc approach of using the *source* file root name can cause
3832becc446Smrg  # problems in parallel builds.  Use a locking strategy to avoid stomping on
3842becc446Smrg  # the same $tmpdepfile.
3852becc446Smrg  lockdir=$base.d-lock
3862becc446Smrg  trap "
3872becc446Smrg    echo '$0: caught signal, cleaning up...' >&2
3882becc446Smrg    rmdir '$lockdir'
3892becc446Smrg    exit 1
3902becc446Smrg  " 1 2 13 15
3912becc446Smrg  numtries=100
3922becc446Smrg  i=$numtries
3932becc446Smrg  while test $i -gt 0; do
3942becc446Smrg    # mkdir is a portable test-and-set.
3952becc446Smrg    if mkdir "$lockdir" 2>/dev/null; then
3962becc446Smrg      # This process acquired the lock.
3972becc446Smrg      "$@" -MD
3982becc446Smrg      stat=$?
3992becc446Smrg      # Release the lock.
4002becc446Smrg      rmdir "$lockdir"
4012becc446Smrg      break
4022becc446Smrg    else
4032becc446Smrg      # If the lock is being held by a different process, wait
4042becc446Smrg      # until the winning process is done or we timeout.
4052becc446Smrg      while test -d "$lockdir" && test $i -gt 0; do
4062becc446Smrg        sleep 1
4072becc446Smrg        i=`expr $i - 1`
4082becc446Smrg      done
4092becc446Smrg    fi
4102becc446Smrg    i=`expr $i - 1`
4112becc446Smrg  done
4122becc446Smrg  trap - 1 2 13 15
4132becc446Smrg  if test $i -le 0; then
4142becc446Smrg    echo "$0: failed to acquire lock after $numtries attempts" >&2
4152becc446Smrg    echo "$0: check lockdir '$lockdir'" >&2
4162becc446Smrg    exit 1
4172becc446Smrg  fi
4182c7c4e3dSmrg
4192becc446Smrg  if test $stat -ne 0; then
4202c7c4e3dSmrg    rm -f "$tmpdepfile"
4212c7c4e3dSmrg    exit $stat
4222c7c4e3dSmrg  fi
4232c7c4e3dSmrg  rm -f "$depfile"
4242c7c4e3dSmrg  # Each line is of the form `foo.o: dependent.h',
4252c7c4e3dSmrg  # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'.
4262c7c4e3dSmrg  # Do two passes, one to just change these to
4272c7c4e3dSmrg  # `$object: dependent.h' and one to simply `dependent.h:'.
4282c7c4e3dSmrg  sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
4292c7c4e3dSmrg  # Some versions of the HPUX 10.20 sed can't process this invocation
4302c7c4e3dSmrg  # correctly.  Breaking it into two sed invocations is a workaround.
4312becc446Smrg  sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \
4322becc446Smrg    | sed -e 's/$/ :/' >> "$depfile"
4332c7c4e3dSmrg  rm -f "$tmpdepfile"
4342c7c4e3dSmrg  ;;
4352c7c4e3dSmrg
4368650bb69Smrghp2)
4378650bb69Smrg  # The "hp" stanza above does not work with aCC (C++) and HP's ia64
4388650bb69Smrg  # compilers, which have integrated preprocessors.  The correct option
4398650bb69Smrg  # to use with these is +Maked; it writes dependencies to a file named
4408650bb69Smrg  # 'foo.d', which lands next to the object file, wherever that
4418650bb69Smrg  # happens to be.
4428650bb69Smrg  # Much of this is similar to the tru64 case; see comments there.
4432becc446Smrg  set_dir_from  "$object"
4442becc446Smrg  set_base_from "$object"
4458650bb69Smrg  if test "$libtool" = yes; then
4468650bb69Smrg    tmpdepfile1=$dir$base.d
4478650bb69Smrg    tmpdepfile2=$dir.libs/$base.d
4488650bb69Smrg    "$@" -Wc,+Maked
4498650bb69Smrg  else
4508650bb69Smrg    tmpdepfile1=$dir$base.d
4518650bb69Smrg    tmpdepfile2=$dir$base.d
4528650bb69Smrg    "$@" +Maked
4538650bb69Smrg  fi
4548650bb69Smrg  stat=$?
4552becc446Smrg  if test $stat -ne 0; then
4568650bb69Smrg     rm -f "$tmpdepfile1" "$tmpdepfile2"
4578650bb69Smrg     exit $stat
4588650bb69Smrg  fi
4598650bb69Smrg
4608650bb69Smrg  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2"
4618650bb69Smrg  do
4628650bb69Smrg    test -f "$tmpdepfile" && break
4638650bb69Smrg  done
4648650bb69Smrg  if test -f "$tmpdepfile"; then
4652becc446Smrg    sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile"
4662becc446Smrg    # Add 'dependent.h:' lines.
4678650bb69Smrg    sed -ne '2,${
4682becc446Smrg               s/^ *//
4692becc446Smrg               s/ \\*$//
4702becc446Smrg               s/$/:/
4712becc446Smrg               p
4722becc446Smrg             }' "$tmpdepfile" >> "$depfile"
4738650bb69Smrg  else
4742becc446Smrg    make_dummy_depfile
4758650bb69Smrg  fi
4768650bb69Smrg  rm -f "$tmpdepfile" "$tmpdepfile2"
4778650bb69Smrg  ;;
4788650bb69Smrg
4792c7c4e3dSmrgtru64)
4802becc446Smrg  # The Tru64 compiler uses -MD to generate dependencies as a side
4812becc446Smrg  # effect.  'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'.
4822becc446Smrg  # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
4832becc446Smrg  # dependencies in 'foo.d' instead, so we check for that too.
4842becc446Smrg  # Subdirectories are respected.
4852becc446Smrg  set_dir_from  "$object"
4862becc446Smrg  set_base_from "$object"
4872becc446Smrg
4882becc446Smrg  if test "$libtool" = yes; then
4892becc446Smrg    # Libtool generates 2 separate objects for the 2 libraries.  These
4902becc446Smrg    # two compilations output dependencies in $dir.libs/$base.o.d and
4912becc446Smrg    # in $dir$base.o.d.  We have to check for both files, because
4922becc446Smrg    # one of the two compilations can be disabled.  We should prefer
4932becc446Smrg    # $dir$base.o.d over $dir.libs/$base.o.d because the latter is
4942becc446Smrg    # automatically cleaned when .libs/ is deleted, while ignoring
4952becc446Smrg    # the former would cause a distcleancheck panic.
4962becc446Smrg    tmpdepfile1=$dir$base.o.d          # libtool 1.5
4972becc446Smrg    tmpdepfile2=$dir.libs/$base.o.d    # Likewise.
4982becc446Smrg    tmpdepfile3=$dir.libs/$base.d      # Compaq CCC V6.2-504
4992becc446Smrg    "$@" -Wc,-MD
5002becc446Smrg  else
5012becc446Smrg    tmpdepfile1=$dir$base.d
5022becc446Smrg    tmpdepfile2=$dir$base.d
5032becc446Smrg    tmpdepfile3=$dir$base.d
5042becc446Smrg    "$@" -MD
5052becc446Smrg  fi
5062becc446Smrg
5072becc446Smrg  stat=$?
5082becc446Smrg  if test $stat -ne 0; then
5092becc446Smrg    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
5102becc446Smrg    exit $stat
5112becc446Smrg  fi
5122becc446Smrg
5132becc446Smrg  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
5142becc446Smrg  do
5152becc446Smrg    test -f "$tmpdepfile" && break
5162becc446Smrg  done
5172becc446Smrg  # Same post-processing that is required for AIX mode.
5182becc446Smrg  aix_post_process_depfile
5192becc446Smrg  ;;
5202becc446Smrg
5212becc446Smrgmsvc7)
5222becc446Smrg  if test "$libtool" = yes; then
5232becc446Smrg    showIncludes=-Wc,-showIncludes
5242becc446Smrg  else
5252becc446Smrg    showIncludes=-showIncludes
5262becc446Smrg  fi
5272becc446Smrg  "$@" $showIncludes > "$tmpdepfile"
5282becc446Smrg  stat=$?
5292becc446Smrg  grep -v '^Note: including file: ' "$tmpdepfile"
5302becc446Smrg  if test $stat -ne 0; then
5312becc446Smrg    rm -f "$tmpdepfile"
5322becc446Smrg    exit $stat
5332becc446Smrg  fi
5342becc446Smrg  rm -f "$depfile"
5352becc446Smrg  echo "$object : \\" > "$depfile"
5362becc446Smrg  # The first sed program below extracts the file names and escapes
5372becc446Smrg  # backslashes for cygpath.  The second sed program outputs the file
5382becc446Smrg  # name when reading, but also accumulates all include files in the
5392becc446Smrg  # hold buffer in order to output them again at the end.  This only
5402becc446Smrg  # works with sed implementations that can handle large buffers.
5412becc446Smrg  sed < "$tmpdepfile" -n '
5422becc446Smrg/^Note: including file:  *\(.*\)/ {
5432becc446Smrg  s//\1/
5442becc446Smrg  s/\\/\\\\/g
5452becc446Smrg  p
5462becc446Smrg}' | $cygpath_u | sort -u | sed -n '
5472becc446Smrgs/ /\\ /g
5482becc446Smrgs/\(.*\)/'"$tab"'\1 \\/p
5492becc446Smrgs/.\(.*\) \\/\1:/
5502becc446SmrgH
5512becc446Smrg$ {
5522becc446Smrg  s/.*/'"$tab"'/
5532becc446Smrg  G
5542becc446Smrg  p
5552becc446Smrg}' >> "$depfile"
5562becc446Smrg  echo >> "$depfile" # make sure the fragment doesn't end with a backslash
5572becc446Smrg  rm -f "$tmpdepfile"
5582becc446Smrg  ;;
5592becc446Smrg
5602becc446Smrgmsvc7msys)
5612becc446Smrg  # This case exists only to let depend.m4 do its work.  It works by
5622becc446Smrg  # looking at the text of this script.  This case will never be run,
5632becc446Smrg  # since it is checked for above.
5642becc446Smrg  exit 1
5652becc446Smrg  ;;
5662c7c4e3dSmrg
5672c7c4e3dSmrg#nosideeffect)
5682c7c4e3dSmrg  # This comment above is used by automake to tell side-effect
5692c7c4e3dSmrg  # dependency tracking mechanisms from slower ones.
5702c7c4e3dSmrg
5712c7c4e3dSmrgdashmstdout)
5722c7c4e3dSmrg  # Important note: in order to support this mode, a compiler *must*
5732c7c4e3dSmrg  # always write the preprocessed file to stdout, regardless of -o.
5742c7c4e3dSmrg  "$@" || exit $?
5752c7c4e3dSmrg
5762c7c4e3dSmrg  # Remove the call to Libtool.
5772c7c4e3dSmrg  if test "$libtool" = yes; then
5788650bb69Smrg    while test "X$1" != 'X--mode=compile'; do
5792c7c4e3dSmrg      shift
5802c7c4e3dSmrg    done
5812c7c4e3dSmrg    shift
5822c7c4e3dSmrg  fi
5832c7c4e3dSmrg
5842becc446Smrg  # Remove '-o $object'.
5852c7c4e3dSmrg  IFS=" "
5862c7c4e3dSmrg  for arg
5872c7c4e3dSmrg  do
5882c7c4e3dSmrg    case $arg in
5892c7c4e3dSmrg    -o)
5902c7c4e3dSmrg      shift
5912c7c4e3dSmrg      ;;
5922c7c4e3dSmrg    $object)
5932c7c4e3dSmrg      shift
5942c7c4e3dSmrg      ;;
5952c7c4e3dSmrg    *)
5962c7c4e3dSmrg      set fnord "$@" "$arg"
5972c7c4e3dSmrg      shift # fnord
5982c7c4e3dSmrg      shift # $arg
5992c7c4e3dSmrg      ;;
6002c7c4e3dSmrg    esac
6012c7c4e3dSmrg  done
6022c7c4e3dSmrg
6032c7c4e3dSmrg  test -z "$dashmflag" && dashmflag=-M
6042becc446Smrg  # Require at least two characters before searching for ':'
6052c7c4e3dSmrg  # in the target name.  This is to cope with DOS-style filenames:
6062becc446Smrg  # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise.
6072c7c4e3dSmrg  "$@" $dashmflag |
6082becc446Smrg    sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile"
6092c7c4e3dSmrg  rm -f "$depfile"
6102c7c4e3dSmrg  cat < "$tmpdepfile" > "$depfile"
6112becc446Smrg  # Some versions of the HPUX 10.20 sed can't process this sed invocation
6122becc446Smrg  # correctly.  Breaking it into two sed invocations is a workaround.
6132becc446Smrg  tr ' ' "$nl" < "$tmpdepfile" \
6142becc446Smrg    | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
6152becc446Smrg    | sed -e 's/$/ :/' >> "$depfile"
6162c7c4e3dSmrg  rm -f "$tmpdepfile"
6172c7c4e3dSmrg  ;;
6182c7c4e3dSmrg
6192c7c4e3dSmrgdashXmstdout)
6202c7c4e3dSmrg  # This case only exists to satisfy depend.m4.  It is never actually
6212c7c4e3dSmrg  # run, as this mode is specially recognized in the preamble.
6222c7c4e3dSmrg  exit 1
6232c7c4e3dSmrg  ;;
6242c7c4e3dSmrg
6252c7c4e3dSmrgmakedepend)
6262c7c4e3dSmrg  "$@" || exit $?
6272c7c4e3dSmrg  # Remove any Libtool call
6282c7c4e3dSmrg  if test "$libtool" = yes; then
6298650bb69Smrg    while test "X$1" != 'X--mode=compile'; do
6302c7c4e3dSmrg      shift
6312c7c4e3dSmrg    done
6322c7c4e3dSmrg    shift
6332c7c4e3dSmrg  fi
6342c7c4e3dSmrg  # X makedepend
6352c7c4e3dSmrg  shift
6368650bb69Smrg  cleared=no eat=no
6378650bb69Smrg  for arg
6388650bb69Smrg  do
6392c7c4e3dSmrg    case $cleared in
6402c7c4e3dSmrg    no)
6412c7c4e3dSmrg      set ""; shift
6422c7c4e3dSmrg      cleared=yes ;;
6432c7c4e3dSmrg    esac
6448650bb69Smrg    if test $eat = yes; then
6458650bb69Smrg      eat=no
6468650bb69Smrg      continue
6478650bb69Smrg    fi
6482c7c4e3dSmrg    case "$arg" in
6492c7c4e3dSmrg    -D*|-I*)
6502c7c4e3dSmrg      set fnord "$@" "$arg"; shift ;;
6512c7c4e3dSmrg    # Strip any option that makedepend may not understand.  Remove
6522c7c4e3dSmrg    # the object too, otherwise makedepend will parse it as a source file.
6538650bb69Smrg    -arch)
6548650bb69Smrg      eat=yes ;;
6552c7c4e3dSmrg    -*|$object)
6562c7c4e3dSmrg      ;;
6572c7c4e3dSmrg    *)
6582c7c4e3dSmrg      set fnord "$@" "$arg"; shift ;;
6592c7c4e3dSmrg    esac
6602c7c4e3dSmrg  done
6618650bb69Smrg  obj_suffix=`echo "$object" | sed 's/^.*\././'`
6622c7c4e3dSmrg  touch "$tmpdepfile"
6632c7c4e3dSmrg  ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
6642c7c4e3dSmrg  rm -f "$depfile"
6652becc446Smrg  # makedepend may prepend the VPATH from the source file name to the object.
6662becc446Smrg  # No need to regex-escape $object, excess matching of '.' is harmless.
6672becc446Smrg  sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile"
6682becc446Smrg  # Some versions of the HPUX 10.20 sed can't process the last invocation
6692becc446Smrg  # correctly.  Breaking it into two sed invocations is a workaround.
6702becc446Smrg  sed '1,2d' "$tmpdepfile" \
6712becc446Smrg    | tr ' ' "$nl" \
6722becc446Smrg    | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
6732becc446Smrg    | sed -e 's/$/ :/' >> "$depfile"
6742c7c4e3dSmrg  rm -f "$tmpdepfile" "$tmpdepfile".bak
6752c7c4e3dSmrg  ;;
6762c7c4e3dSmrg
6772c7c4e3dSmrgcpp)
6782c7c4e3dSmrg  # Important note: in order to support this mode, a compiler *must*
6792c7c4e3dSmrg  # always write the preprocessed file to stdout.
6802c7c4e3dSmrg  "$@" || exit $?
6812c7c4e3dSmrg
6822c7c4e3dSmrg  # Remove the call to Libtool.
6832c7c4e3dSmrg  if test "$libtool" = yes; then
6848650bb69Smrg    while test "X$1" != 'X--mode=compile'; do
6852c7c4e3dSmrg      shift
6862c7c4e3dSmrg    done
6872c7c4e3dSmrg    shift
6882c7c4e3dSmrg  fi
6892c7c4e3dSmrg
6902becc446Smrg  # Remove '-o $object'.
6912c7c4e3dSmrg  IFS=" "
6922c7c4e3dSmrg  for arg
6932c7c4e3dSmrg  do
6942c7c4e3dSmrg    case $arg in
6952c7c4e3dSmrg    -o)
6962c7c4e3dSmrg      shift
6972c7c4e3dSmrg      ;;
6982c7c4e3dSmrg    $object)
6992c7c4e3dSmrg      shift
7002c7c4e3dSmrg      ;;
7012c7c4e3dSmrg    *)
7022c7c4e3dSmrg      set fnord "$@" "$arg"
7032c7c4e3dSmrg      shift # fnord
7042c7c4e3dSmrg      shift # $arg
7052c7c4e3dSmrg      ;;
7062c7c4e3dSmrg    esac
7072c7c4e3dSmrg  done
7082c7c4e3dSmrg
7092becc446Smrg  "$@" -E \
7102becc446Smrg    | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
7112becc446Smrg             -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
7122becc446Smrg    | sed '$ s: \\$::' > "$tmpdepfile"
7132c7c4e3dSmrg  rm -f "$depfile"
7142c7c4e3dSmrg  echo "$object : \\" > "$depfile"
7152c7c4e3dSmrg  cat < "$tmpdepfile" >> "$depfile"
7162c7c4e3dSmrg  sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
7172c7c4e3dSmrg  rm -f "$tmpdepfile"
7182c7c4e3dSmrg  ;;
7192c7c4e3dSmrg
7202c7c4e3dSmrgmsvisualcpp)
7212c7c4e3dSmrg  # Important note: in order to support this mode, a compiler *must*
7228650bb69Smrg  # always write the preprocessed file to stdout.
7232c7c4e3dSmrg  "$@" || exit $?
7248650bb69Smrg
7258650bb69Smrg  # Remove the call to Libtool.
7268650bb69Smrg  if test "$libtool" = yes; then
7278650bb69Smrg    while test "X$1" != 'X--mode=compile'; do
7288650bb69Smrg      shift
7298650bb69Smrg    done
7308650bb69Smrg    shift
7318650bb69Smrg  fi
7328650bb69Smrg
7332c7c4e3dSmrg  IFS=" "
7342c7c4e3dSmrg  for arg
7352c7c4e3dSmrg  do
7362c7c4e3dSmrg    case "$arg" in
7378650bb69Smrg    -o)
7388650bb69Smrg      shift
7398650bb69Smrg      ;;
7408650bb69Smrg    $object)
7418650bb69Smrg      shift
7428650bb69Smrg      ;;
7432c7c4e3dSmrg    "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
7442becc446Smrg        set fnord "$@"
7452becc446Smrg        shift
7462becc446Smrg        shift
7472becc446Smrg        ;;
7482c7c4e3dSmrg    *)
7492becc446Smrg        set fnord "$@" "$arg"
7502becc446Smrg        shift
7512becc446Smrg        shift
7522becc446Smrg        ;;
7532c7c4e3dSmrg    esac
7542c7c4e3dSmrg  done
7558650bb69Smrg  "$@" -E 2>/dev/null |
7568650bb69Smrg  sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile"
7572c7c4e3dSmrg  rm -f "$depfile"
7582c7c4e3dSmrg  echo "$object : \\" > "$depfile"
7592becc446Smrg  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile"
7602becc446Smrg  echo "$tab" >> "$depfile"
7618650bb69Smrg  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile"
7622c7c4e3dSmrg  rm -f "$tmpdepfile"
7632c7c4e3dSmrg  ;;
7642c7c4e3dSmrg
7658650bb69Smrgmsvcmsys)
7668650bb69Smrg  # This case exists only to let depend.m4 do its work.  It works by
7678650bb69Smrg  # looking at the text of this script.  This case will never be run,
7688650bb69Smrg  # since it is checked for above.
7698650bb69Smrg  exit 1
7708650bb69Smrg  ;;
7718650bb69Smrg
7722c7c4e3dSmrgnone)
7732c7c4e3dSmrg  exec "$@"
7742c7c4e3dSmrg  ;;
7752c7c4e3dSmrg
7762c7c4e3dSmrg*)
7772c7c4e3dSmrg  echo "Unknown depmode $depmode" 1>&2
7782c7c4e3dSmrg  exit 1
7792c7c4e3dSmrg  ;;
7802c7c4e3dSmrgesac
7812c7c4e3dSmrg
7822c7c4e3dSmrgexit 0
7838650bb69Smrg
7848650bb69Smrg# Local Variables:
7858650bb69Smrg# mode: shell-script
7868650bb69Smrg# sh-indentation: 2
7873458e6c2Smrg# eval: (add-hook 'before-save-hook 'time-stamp)
7888650bb69Smrg# time-stamp-start: "scriptversion="
7898650bb69Smrg# time-stamp-format: "%:y-%02m-%02d.%02H"
7903458e6c2Smrg# time-stamp-time-zone: "UTC0"
7918650bb69Smrg# time-stamp-end: "; # UTC"
7928650bb69Smrg# End:
793