depcomp revision 1a9c160a
13eed67faSmbalmer#! /bin/sh
23eed67faSmbalmer# depcomp - compile a program generating dependencies as side-effects
33eed67faSmbalmer
41a9c160aSmrgscriptversion=2018-03-07.03; # UTC
53eed67faSmbalmer
61a9c160aSmrg# Copyright (C) 1999-2018 Free Software Foundation, Inc.
73eed67faSmbalmer
83eed67faSmbalmer# This program is free software; you can redistribute it and/or modify
93eed67faSmbalmer# it under the terms of the GNU General Public License as published by
103eed67faSmbalmer# the Free Software Foundation; either version 2, or (at your option)
113eed67faSmbalmer# any later version.
123eed67faSmbalmer
133eed67faSmbalmer# This program is distributed in the hope that it will be useful,
143eed67faSmbalmer# but WITHOUT ANY WARRANTY; without even the implied warranty of
153eed67faSmbalmer# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
163eed67faSmbalmer# GNU General Public License for more details.
173eed67faSmbalmer
183eed67faSmbalmer# You should have received a copy of the GNU General Public License
191a9c160aSmrg# along with this program.  If not, see <https://www.gnu.org/licenses/>.
203eed67faSmbalmer
213eed67faSmbalmer# As a special exception to the GNU General Public License, if you
223eed67faSmbalmer# distribute this file as part of a program that contains a
233eed67faSmbalmer# configuration script generated by Autoconf, you may include it under
243eed67faSmbalmer# the same distribution terms that you use for the rest of that program.
253eed67faSmbalmer
263eed67faSmbalmer# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>.
273eed67faSmbalmer
283eed67faSmbalmercase $1 in
293eed67faSmbalmer  '')
301a9c160aSmrg    echo "$0: No command.  Try '$0 --help' for more information." 1>&2
311a9c160aSmrg    exit 1;
321a9c160aSmrg    ;;
333eed67faSmbalmer  -h | --h*)
343eed67faSmbalmer    cat <<\EOF
353eed67faSmbalmerUsage: depcomp [--help] [--version] PROGRAM [ARGS]
363eed67faSmbalmer
373eed67faSmbalmerRun PROGRAMS ARGS to compile a file, generating dependencies
383eed67faSmbalmeras side-effects.
393eed67faSmbalmer
403eed67faSmbalmerEnvironment variables:
413eed67faSmbalmer  depmode     Dependency tracking mode.
421a9c160aSmrg  source      Source file read by 'PROGRAMS ARGS'.
431a9c160aSmrg  object      Object file output by 'PROGRAMS ARGS'.
443eed67faSmbalmer  DEPDIR      directory where to store dependencies.
453eed67faSmbalmer  depfile     Dependency file to output.
4675cbef56Smrg  tmpdepfile  Temporary file to use when outputting dependencies.
473eed67faSmbalmer  libtool     Whether libtool is used (yes/no).
483eed67faSmbalmer
493eed67faSmbalmerReport bugs to <bug-automake@gnu.org>.
503eed67faSmbalmerEOF
513eed67faSmbalmer    exit $?
523eed67faSmbalmer    ;;
533eed67faSmbalmer  -v | --v*)
543eed67faSmbalmer    echo "depcomp $scriptversion"
553eed67faSmbalmer    exit $?
563eed67faSmbalmer    ;;
573eed67faSmbalmeresac
583eed67faSmbalmer
591a9c160aSmrg# Get the directory component of the given path, and save it in the
601a9c160aSmrg# global variables '$dir'.  Note that this directory component will
611a9c160aSmrg# be either empty or ending with a '/' character.  This is deliberate.
621a9c160aSmrgset_dir_from ()
631a9c160aSmrg{
641a9c160aSmrg  case $1 in
651a9c160aSmrg    */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;;
661a9c160aSmrg      *) dir=;;
671a9c160aSmrg  esac
681a9c160aSmrg}
691a9c160aSmrg
701a9c160aSmrg# Get the suffix-stripped basename of the given path, and save it the
711a9c160aSmrg# global variable '$base'.
721a9c160aSmrgset_base_from ()
731a9c160aSmrg{
741a9c160aSmrg  base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'`
751a9c160aSmrg}
761a9c160aSmrg
771a9c160aSmrg# If no dependency file was actually created by the compiler invocation,
781a9c160aSmrg# we still have to create a dummy depfile, to avoid errors with the
791a9c160aSmrg# Makefile "include basename.Plo" scheme.
801a9c160aSmrgmake_dummy_depfile ()
811a9c160aSmrg{
821a9c160aSmrg  echo "#dummy" > "$depfile"
831a9c160aSmrg}
841a9c160aSmrg
851a9c160aSmrg# Factor out some common post-processing of the generated depfile.
861a9c160aSmrg# Requires the auxiliary global variable '$tmpdepfile' to be set.
871a9c160aSmrgaix_post_process_depfile ()
881a9c160aSmrg{
891a9c160aSmrg  # If the compiler actually managed to produce a dependency file,
901a9c160aSmrg  # post-process it.
911a9c160aSmrg  if test -f "$tmpdepfile"; then
921a9c160aSmrg    # Each line is of the form 'foo.o: dependency.h'.
931a9c160aSmrg    # Do two passes, one to just change these to
941a9c160aSmrg    #   $object: dependency.h
951a9c160aSmrg    # and one to simply output
961a9c160aSmrg    #   dependency.h:
971a9c160aSmrg    # which is needed to avoid the deleted-header problem.
981a9c160aSmrg    { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile"
991a9c160aSmrg      sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile"
1001a9c160aSmrg    } > "$depfile"
1011a9c160aSmrg    rm -f "$tmpdepfile"
1021a9c160aSmrg  else
1031a9c160aSmrg    make_dummy_depfile
1041a9c160aSmrg  fi
1051a9c160aSmrg}
1061a9c160aSmrg
1071a9c160aSmrg# A tabulation character.
1081a9c160aSmrgtab='	'
1091a9c160aSmrg# A newline character.
1101a9c160aSmrgnl='
1111a9c160aSmrg'
1121a9c160aSmrg# Character ranges might be problematic outside the C locale.
1131a9c160aSmrg# These definitions help.
1141a9c160aSmrgupper=ABCDEFGHIJKLMNOPQRSTUVWXYZ
1151a9c160aSmrglower=abcdefghijklmnopqrstuvwxyz
1161a9c160aSmrgdigits=0123456789
1171a9c160aSmrgalpha=${upper}${lower}
1181a9c160aSmrg
1193eed67faSmbalmerif test -z "$depmode" || test -z "$source" || test -z "$object"; then
1203eed67faSmbalmer  echo "depcomp: Variables source, object and depmode must be set" 1>&2
1213eed67faSmbalmer  exit 1
1223eed67faSmbalmerfi
1233eed67faSmbalmer
1243eed67faSmbalmer# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.
1253eed67faSmbalmerdepfile=${depfile-`echo "$object" |
1263eed67faSmbalmer  sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`}
1273eed67faSmbalmertmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
1283eed67faSmbalmer
1293eed67faSmbalmerrm -f "$tmpdepfile"
1303eed67faSmbalmer
1311a9c160aSmrg# Avoid interferences from the environment.
1321a9c160aSmrggccflag= dashmflag=
1331a9c160aSmrg
1343eed67faSmbalmer# Some modes work just like other modes, but use different flags.  We
1353eed67faSmbalmer# parameterize here, but still list the modes in the big case below,
1363eed67faSmbalmer# to make depend.m4 easier to write.  Note that we *cannot* use a case
1373eed67faSmbalmer# here, because this file can only contain one case statement.
1383eed67faSmbalmerif test "$depmode" = hp; then
1393eed67faSmbalmer  # HP compiler uses -M and no extra arg.
1403eed67faSmbalmer  gccflag=-M
1413eed67faSmbalmer  depmode=gcc
1423eed67faSmbalmerfi
1433eed67faSmbalmer
1443eed67faSmbalmerif test "$depmode" = dashXmstdout; then
1451a9c160aSmrg  # This is just like dashmstdout with a different argument.
1461a9c160aSmrg  dashmflag=-xM
1471a9c160aSmrg  depmode=dashmstdout
1483eed67faSmbalmerfi
1493eed67faSmbalmer
150dc407927Smrgcygpath_u="cygpath -u -f -"
151dc407927Smrgif test "$depmode" = msvcmsys; then
1521a9c160aSmrg  # This is just like msvisualcpp but w/o cygpath translation.
1531a9c160aSmrg  # Just convert the backslash-escaped backslashes to single forward
1541a9c160aSmrg  # slashes to satisfy depend.m4
1551a9c160aSmrg  cygpath_u='sed s,\\\\,/,g'
1561a9c160aSmrg  depmode=msvisualcpp
157dc407927Smrgfi
158dc407927Smrg
15975cbef56Smrgif test "$depmode" = msvc7msys; then
1601a9c160aSmrg  # This is just like msvc7 but w/o cygpath translation.
1611a9c160aSmrg  # Just convert the backslash-escaped backslashes to single forward
1621a9c160aSmrg  # slashes to satisfy depend.m4
1631a9c160aSmrg  cygpath_u='sed s,\\\\,/,g'
1641a9c160aSmrg  depmode=msvc7
1651a9c160aSmrgfi
1661a9c160aSmrg
1671a9c160aSmrgif test "$depmode" = xlc; then
1681a9c160aSmrg  # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information.
1691a9c160aSmrg  gccflag=-qmakedep=gcc,-MF
1701a9c160aSmrg  depmode=gcc
17175cbef56Smrgfi
17275cbef56Smrg
1733eed67faSmbalmercase "$depmode" in
1743eed67faSmbalmergcc3)
1753eed67faSmbalmer## gcc 3 implements dependency tracking that does exactly what
1763eed67faSmbalmer## we want.  Yay!  Note: for some reason libtool 1.4 doesn't like
1773eed67faSmbalmer## it if -MD -MP comes after the -MF stuff.  Hmm.
178dc407927Smrg## Unfortunately, FreeBSD c89 acceptance of flags depends upon
179dc407927Smrg## the command line argument order; so add the flags where they
180dc407927Smrg## appear in depend2.am.  Note that the slowdown incurred here
181dc407927Smrg## affects only configure: in makefiles, %FASTDEP% shortcuts this.
182dc407927Smrg  for arg
183dc407927Smrg  do
184dc407927Smrg    case $arg in
185dc407927Smrg    -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;;
186dc407927Smrg    *)  set fnord "$@" "$arg" ;;
187dc407927Smrg    esac
188dc407927Smrg    shift # fnord
189dc407927Smrg    shift # $arg
190dc407927Smrg  done
191dc407927Smrg  "$@"
1923eed67faSmbalmer  stat=$?
1931a9c160aSmrg  if test $stat -ne 0; then
1943eed67faSmbalmer    rm -f "$tmpdepfile"
1953eed67faSmbalmer    exit $stat
1963eed67faSmbalmer  fi
1973eed67faSmbalmer  mv "$tmpdepfile" "$depfile"
1983eed67faSmbalmer  ;;
1993eed67faSmbalmer
2003eed67faSmbalmergcc)
2011a9c160aSmrg## Note that this doesn't just cater to obsosete pre-3.x GCC compilers.
2021a9c160aSmrg## but also to in-use compilers like IMB xlc/xlC and the HP C compiler.
2031a9c160aSmrg## (see the conditional assignment to $gccflag above).
2043eed67faSmbalmer## There are various ways to get dependency output from gcc.  Here's
2053eed67faSmbalmer## why we pick this rather obscure method:
2063eed67faSmbalmer## - Don't want to use -MD because we'd like the dependencies to end
2073eed67faSmbalmer##   up in a subdir.  Having to rename by hand is ugly.
2083eed67faSmbalmer##   (We might end up doing this anyway to support other compilers.)
2093eed67faSmbalmer## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
2101a9c160aSmrg##   -MM, not -M (despite what the docs say).  Also, it might not be
2111a9c160aSmrg##   supported by the other compilers which use the 'gcc' depmode.
2123eed67faSmbalmer## - Using -M directly means running the compiler twice (even worse
2133eed67faSmbalmer##   than renaming).
2143eed67faSmbalmer  if test -z "$gccflag"; then
2153eed67faSmbalmer    gccflag=-MD,
2163eed67faSmbalmer  fi
2173eed67faSmbalmer  "$@" -Wp,"$gccflag$tmpdepfile"
2183eed67faSmbalmer  stat=$?
2191a9c160aSmrg  if test $stat -ne 0; then
2203eed67faSmbalmer    rm -f "$tmpdepfile"
2213eed67faSmbalmer    exit $stat
2223eed67faSmbalmer  fi
2233eed67faSmbalmer  rm -f "$depfile"
2243eed67faSmbalmer  echo "$object : \\" > "$depfile"
2251a9c160aSmrg  # The second -e expression handles DOS-style file names with drive
2261a9c160aSmrg  # letters.
2273eed67faSmbalmer  sed -e 's/^[^:]*: / /' \
2283eed67faSmbalmer      -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
2291a9c160aSmrg## This next piece of magic avoids the "deleted header file" problem.
2303eed67faSmbalmer## The problem is that when a header file which appears in a .P file
2313eed67faSmbalmer## is deleted, the dependency causes make to die (because there is
2323eed67faSmbalmer## typically no way to rebuild the header).  We avoid this by adding
2333eed67faSmbalmer## dummy dependencies for each header file.  Too bad gcc doesn't do
2343eed67faSmbalmer## this for us directly.
2351a9c160aSmrg## Some versions of gcc put a space before the ':'.  On the theory
2363eed67faSmbalmer## that the space means something, we add a space to the output as
23775cbef56Smrg## well.  hp depmode also adds that space, but also prefixes the VPATH
23875cbef56Smrg## to the object.  Take care to not repeat it in the output.
2393eed67faSmbalmer## Some versions of the HPUX 10.20 sed can't process this invocation
2403eed67faSmbalmer## correctly.  Breaking it into two sed invocations is a workaround.
2411a9c160aSmrg  tr ' ' "$nl" < "$tmpdepfile" \
2421a9c160aSmrg    | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \
2431a9c160aSmrg    | sed -e 's/$/ :/' >> "$depfile"
2443eed67faSmbalmer  rm -f "$tmpdepfile"
2453eed67faSmbalmer  ;;
2463eed67faSmbalmer
2473eed67faSmbalmerhp)
2483eed67faSmbalmer  # This case exists only to let depend.m4 do its work.  It works by
2493eed67faSmbalmer  # looking at the text of this script.  This case will never be run,
2503eed67faSmbalmer  # since it is checked for above.
2513eed67faSmbalmer  exit 1
2523eed67faSmbalmer  ;;
2533eed67faSmbalmer
2543eed67faSmbalmersgi)
2553eed67faSmbalmer  if test "$libtool" = yes; then
2563eed67faSmbalmer    "$@" "-Wp,-MDupdate,$tmpdepfile"
2573eed67faSmbalmer  else
2583eed67faSmbalmer    "$@" -MDupdate "$tmpdepfile"
2593eed67faSmbalmer  fi
2603eed67faSmbalmer  stat=$?
2611a9c160aSmrg  if test $stat -ne 0; then
2623eed67faSmbalmer    rm -f "$tmpdepfile"
2633eed67faSmbalmer    exit $stat
2643eed67faSmbalmer  fi
2653eed67faSmbalmer  rm -f "$depfile"
2663eed67faSmbalmer
2673eed67faSmbalmer  if test -f "$tmpdepfile"; then  # yes, the sourcefile depend on other files
2683eed67faSmbalmer    echo "$object : \\" > "$depfile"
2693eed67faSmbalmer    # Clip off the initial element (the dependent).  Don't try to be
2703eed67faSmbalmer    # clever and replace this with sed code, as IRIX sed won't handle
2713eed67faSmbalmer    # lines with more than a fixed number of characters (4096 in
2723eed67faSmbalmer    # IRIX 6.2 sed, 8192 in IRIX 6.5).  We also remove comment lines;
2731a9c160aSmrg    # the IRIX cc adds comments like '#:fec' to the end of the
2743eed67faSmbalmer    # dependency line.
2751a9c160aSmrg    tr ' ' "$nl" < "$tmpdepfile" \
2761a9c160aSmrg      | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \
2771a9c160aSmrg      | tr "$nl" ' ' >> "$depfile"
278dc407927Smrg    echo >> "$depfile"
2793eed67faSmbalmer    # The second pass generates a dummy entry for each header file.
2801a9c160aSmrg    tr ' ' "$nl" < "$tmpdepfile" \
2811a9c160aSmrg      | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
2821a9c160aSmrg      >> "$depfile"
2833eed67faSmbalmer  else
2841a9c160aSmrg    make_dummy_depfile
2853eed67faSmbalmer  fi
2863eed67faSmbalmer  rm -f "$tmpdepfile"
2873eed67faSmbalmer  ;;
2883eed67faSmbalmer
2891a9c160aSmrgxlc)
2901a9c160aSmrg  # This case exists only to let depend.m4 do its work.  It works by
2911a9c160aSmrg  # looking at the text of this script.  This case will never be run,
2921a9c160aSmrg  # since it is checked for above.
2931a9c160aSmrg  exit 1
2941a9c160aSmrg  ;;
2951a9c160aSmrg
2963eed67faSmbalmeraix)
2973eed67faSmbalmer  # The C for AIX Compiler uses -M and outputs the dependencies
2983eed67faSmbalmer  # in a .u file.  In older versions, this file always lives in the
2991a9c160aSmrg  # current directory.  Also, the AIX compiler puts '$object:' at the
3003eed67faSmbalmer  # start of each line; $object doesn't have directory information.
3013eed67faSmbalmer  # Version 6 uses the directory in both cases.
3021a9c160aSmrg  set_dir_from "$object"
3031a9c160aSmrg  set_base_from "$object"
3043eed67faSmbalmer  if test "$libtool" = yes; then
305dc407927Smrg    tmpdepfile1=$dir$base.u
306dc407927Smrg    tmpdepfile2=$base.u
307dc407927Smrg    tmpdepfile3=$dir.libs/$base.u
3083eed67faSmbalmer    "$@" -Wc,-M
3093eed67faSmbalmer  else
310dc407927Smrg    tmpdepfile1=$dir$base.u
311dc407927Smrg    tmpdepfile2=$dir$base.u
312dc407927Smrg    tmpdepfile3=$dir$base.u
3133eed67faSmbalmer    "$@" -M
3143eed67faSmbalmer  fi
3153eed67faSmbalmer  stat=$?
3161a9c160aSmrg  if test $stat -ne 0; then
317dc407927Smrg    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
3183eed67faSmbalmer    exit $stat
3193eed67faSmbalmer  fi
3203eed67faSmbalmer
321dc407927Smrg  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
322dc407927Smrg  do
323dc407927Smrg    test -f "$tmpdepfile" && break
324dc407927Smrg  done
3251a9c160aSmrg  aix_post_process_depfile
3261a9c160aSmrg  ;;
3271a9c160aSmrg
3281a9c160aSmrgtcc)
3291a9c160aSmrg  # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26
3301a9c160aSmrg  # FIXME: That version still under development at the moment of writing.
3311a9c160aSmrg  #        Make that this statement remains true also for stable, released
3321a9c160aSmrg  #        versions.
3331a9c160aSmrg  # It will wrap lines (doesn't matter whether long or short) with a
3341a9c160aSmrg  # trailing '\', as in:
3351a9c160aSmrg  #
3361a9c160aSmrg  #   foo.o : \
3371a9c160aSmrg  #    foo.c \
3381a9c160aSmrg  #    foo.h \
3391a9c160aSmrg  #
3401a9c160aSmrg  # It will put a trailing '\' even on the last line, and will use leading
3411a9c160aSmrg  # spaces rather than leading tabs (at least since its commit 0394caf7
3421a9c160aSmrg  # "Emit spaces for -MD").
3431a9c160aSmrg  "$@" -MD -MF "$tmpdepfile"
3441a9c160aSmrg  stat=$?
3451a9c160aSmrg  if test $stat -ne 0; then
3461a9c160aSmrg    rm -f "$tmpdepfile"
3471a9c160aSmrg    exit $stat
3483eed67faSmbalmer  fi
3491a9c160aSmrg  rm -f "$depfile"
3501a9c160aSmrg  # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'.
3511a9c160aSmrg  # We have to change lines of the first kind to '$object: \'.
3521a9c160aSmrg  sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile"
3531a9c160aSmrg  # And for each line of the second kind, we have to emit a 'dep.h:'
3541a9c160aSmrg  # dummy dependency, to avoid the deleted-header problem.
3551a9c160aSmrg  sed -n -e 's|^  *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile"
3563eed67faSmbalmer  rm -f "$tmpdepfile"
3573eed67faSmbalmer  ;;
3583eed67faSmbalmer
3591a9c160aSmrg## The order of this option in the case statement is important, since the
3601a9c160aSmrg## shell code in configure will try each of these formats in the order
3611a9c160aSmrg## listed in this file.  A plain '-MD' option would be understood by many
3621a9c160aSmrg## compilers, so we must ensure this comes after the gcc and icc options.
3631a9c160aSmrgpgcc)
3641a9c160aSmrg  # Portland's C compiler understands '-MD'.
3651a9c160aSmrg  # Will always output deps to 'file.d' where file is the root name of the
3661a9c160aSmrg  # source file under compilation, even if file resides in a subdirectory.
3671a9c160aSmrg  # The object file name does not affect the name of the '.d' file.
3681a9c160aSmrg  # pgcc 10.2 will output
3693eed67faSmbalmer  #    foo.o: sub/foo.c sub/foo.h
3701a9c160aSmrg  # and will wrap long lines using '\' :
3713eed67faSmbalmer  #    foo.o: sub/foo.c ... \
3723eed67faSmbalmer  #     sub/foo.h ... \
3733eed67faSmbalmer  #     ...
3741a9c160aSmrg  set_dir_from "$object"
3751a9c160aSmrg  # Use the source, not the object, to determine the base name, since
3761a9c160aSmrg  # that's sadly what pgcc will do too.
3771a9c160aSmrg  set_base_from "$source"
3781a9c160aSmrg  tmpdepfile=$base.d
3791a9c160aSmrg
3801a9c160aSmrg  # For projects that build the same source file twice into different object
3811a9c160aSmrg  # files, the pgcc approach of using the *source* file root name can cause
3821a9c160aSmrg  # problems in parallel builds.  Use a locking strategy to avoid stomping on
3831a9c160aSmrg  # the same $tmpdepfile.
3841a9c160aSmrg  lockdir=$base.d-lock
3851a9c160aSmrg  trap "
3861a9c160aSmrg    echo '$0: caught signal, cleaning up...' >&2
3871a9c160aSmrg    rmdir '$lockdir'
3881a9c160aSmrg    exit 1
3891a9c160aSmrg  " 1 2 13 15
3901a9c160aSmrg  numtries=100
3911a9c160aSmrg  i=$numtries
3921a9c160aSmrg  while test $i -gt 0; do
3931a9c160aSmrg    # mkdir is a portable test-and-set.
3941a9c160aSmrg    if mkdir "$lockdir" 2>/dev/null; then
3951a9c160aSmrg      # This process acquired the lock.
3961a9c160aSmrg      "$@" -MD
3971a9c160aSmrg      stat=$?
3981a9c160aSmrg      # Release the lock.
3991a9c160aSmrg      rmdir "$lockdir"
4001a9c160aSmrg      break
4011a9c160aSmrg    else
4021a9c160aSmrg      # If the lock is being held by a different process, wait
4031a9c160aSmrg      # until the winning process is done or we timeout.
4041a9c160aSmrg      while test -d "$lockdir" && test $i -gt 0; do
4051a9c160aSmrg        sleep 1
4061a9c160aSmrg        i=`expr $i - 1`
4071a9c160aSmrg      done
4081a9c160aSmrg    fi
4091a9c160aSmrg    i=`expr $i - 1`
4101a9c160aSmrg  done
4111a9c160aSmrg  trap - 1 2 13 15
4121a9c160aSmrg  if test $i -le 0; then
4131a9c160aSmrg    echo "$0: failed to acquire lock after $numtries attempts" >&2
4141a9c160aSmrg    echo "$0: check lockdir '$lockdir'" >&2
4151a9c160aSmrg    exit 1
4161a9c160aSmrg  fi
4173eed67faSmbalmer
4181a9c160aSmrg  if test $stat -ne 0; then
4193eed67faSmbalmer    rm -f "$tmpdepfile"
4203eed67faSmbalmer    exit $stat
4213eed67faSmbalmer  fi
4223eed67faSmbalmer  rm -f "$depfile"
4233eed67faSmbalmer  # Each line is of the form `foo.o: dependent.h',
4243eed67faSmbalmer  # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'.
4253eed67faSmbalmer  # Do two passes, one to just change these to
4263eed67faSmbalmer  # `$object: dependent.h' and one to simply `dependent.h:'.
4273eed67faSmbalmer  sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
4283eed67faSmbalmer  # Some versions of the HPUX 10.20 sed can't process this invocation
4293eed67faSmbalmer  # correctly.  Breaking it into two sed invocations is a workaround.
4301a9c160aSmrg  sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \
4311a9c160aSmrg    | sed -e 's/$/ :/' >> "$depfile"
4323eed67faSmbalmer  rm -f "$tmpdepfile"
4333eed67faSmbalmer  ;;
4343eed67faSmbalmer
435dc407927Smrghp2)
436dc407927Smrg  # The "hp" stanza above does not work with aCC (C++) and HP's ia64
437dc407927Smrg  # compilers, which have integrated preprocessors.  The correct option
438dc407927Smrg  # to use with these is +Maked; it writes dependencies to a file named
439dc407927Smrg  # 'foo.d', which lands next to the object file, wherever that
440dc407927Smrg  # happens to be.
441dc407927Smrg  # Much of this is similar to the tru64 case; see comments there.
4421a9c160aSmrg  set_dir_from  "$object"
4431a9c160aSmrg  set_base_from "$object"
444dc407927Smrg  if test "$libtool" = yes; then
445dc407927Smrg    tmpdepfile1=$dir$base.d
446dc407927Smrg    tmpdepfile2=$dir.libs/$base.d
447dc407927Smrg    "$@" -Wc,+Maked
448dc407927Smrg  else
449dc407927Smrg    tmpdepfile1=$dir$base.d
450dc407927Smrg    tmpdepfile2=$dir$base.d
451dc407927Smrg    "$@" +Maked
452dc407927Smrg  fi
453dc407927Smrg  stat=$?
4541a9c160aSmrg  if test $stat -ne 0; then
455dc407927Smrg     rm -f "$tmpdepfile1" "$tmpdepfile2"
456dc407927Smrg     exit $stat
457dc407927Smrg  fi
458dc407927Smrg
459dc407927Smrg  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2"
460dc407927Smrg  do
461dc407927Smrg    test -f "$tmpdepfile" && break
462dc407927Smrg  done
463dc407927Smrg  if test -f "$tmpdepfile"; then
4641a9c160aSmrg    sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile"
4651a9c160aSmrg    # Add 'dependent.h:' lines.
466dc407927Smrg    sed -ne '2,${
4671a9c160aSmrg               s/^ *//
4681a9c160aSmrg               s/ \\*$//
4691a9c160aSmrg               s/$/:/
4701a9c160aSmrg               p
4711a9c160aSmrg             }' "$tmpdepfile" >> "$depfile"
472dc407927Smrg  else
4731a9c160aSmrg    make_dummy_depfile
474dc407927Smrg  fi
475dc407927Smrg  rm -f "$tmpdepfile" "$tmpdepfile2"
476dc407927Smrg  ;;
477dc407927Smrg
4783eed67faSmbalmertru64)
4791a9c160aSmrg  # The Tru64 compiler uses -MD to generate dependencies as a side
4801a9c160aSmrg  # effect.  'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'.
4811a9c160aSmrg  # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
4821a9c160aSmrg  # dependencies in 'foo.d' instead, so we check for that too.
4831a9c160aSmrg  # Subdirectories are respected.
4841a9c160aSmrg  set_dir_from  "$object"
4851a9c160aSmrg  set_base_from "$object"
4861a9c160aSmrg
4871a9c160aSmrg  if test "$libtool" = yes; then
4881a9c160aSmrg    # Libtool generates 2 separate objects for the 2 libraries.  These
4891a9c160aSmrg    # two compilations output dependencies in $dir.libs/$base.o.d and
4901a9c160aSmrg    # in $dir$base.o.d.  We have to check for both files, because
4911a9c160aSmrg    # one of the two compilations can be disabled.  We should prefer
4921a9c160aSmrg    # $dir$base.o.d over $dir.libs/$base.o.d because the latter is
4931a9c160aSmrg    # automatically cleaned when .libs/ is deleted, while ignoring
4941a9c160aSmrg    # the former would cause a distcleancheck panic.
4951a9c160aSmrg    tmpdepfile1=$dir$base.o.d          # libtool 1.5
4961a9c160aSmrg    tmpdepfile2=$dir.libs/$base.o.d    # Likewise.
4971a9c160aSmrg    tmpdepfile3=$dir.libs/$base.d      # Compaq CCC V6.2-504
4981a9c160aSmrg    "$@" -Wc,-MD
4991a9c160aSmrg  else
5001a9c160aSmrg    tmpdepfile1=$dir$base.d
5011a9c160aSmrg    tmpdepfile2=$dir$base.d
5021a9c160aSmrg    tmpdepfile3=$dir$base.d
5031a9c160aSmrg    "$@" -MD
5041a9c160aSmrg  fi
5051a9c160aSmrg
5061a9c160aSmrg  stat=$?
5071a9c160aSmrg  if test $stat -ne 0; then
5081a9c160aSmrg    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
5091a9c160aSmrg    exit $stat
5101a9c160aSmrg  fi
5111a9c160aSmrg
5121a9c160aSmrg  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
5131a9c160aSmrg  do
5141a9c160aSmrg    test -f "$tmpdepfile" && break
5151a9c160aSmrg  done
5161a9c160aSmrg  # Same post-processing that is required for AIX mode.
5171a9c160aSmrg  aix_post_process_depfile
5181a9c160aSmrg  ;;
5193eed67faSmbalmer
52075cbef56Smrgmsvc7)
52175cbef56Smrg  if test "$libtool" = yes; then
52275cbef56Smrg    showIncludes=-Wc,-showIncludes
52375cbef56Smrg  else
52475cbef56Smrg    showIncludes=-showIncludes
52575cbef56Smrg  fi
52675cbef56Smrg  "$@" $showIncludes > "$tmpdepfile"
52775cbef56Smrg  stat=$?
52875cbef56Smrg  grep -v '^Note: including file: ' "$tmpdepfile"
5291a9c160aSmrg  if test $stat -ne 0; then
53075cbef56Smrg    rm -f "$tmpdepfile"
53175cbef56Smrg    exit $stat
53275cbef56Smrg  fi
53375cbef56Smrg  rm -f "$depfile"
53475cbef56Smrg  echo "$object : \\" > "$depfile"
53575cbef56Smrg  # The first sed program below extracts the file names and escapes
53675cbef56Smrg  # backslashes for cygpath.  The second sed program outputs the file
53775cbef56Smrg  # name when reading, but also accumulates all include files in the
53875cbef56Smrg  # hold buffer in order to output them again at the end.  This only
53975cbef56Smrg  # works with sed implementations that can handle large buffers.
54075cbef56Smrg  sed < "$tmpdepfile" -n '
54175cbef56Smrg/^Note: including file:  *\(.*\)/ {
54275cbef56Smrg  s//\1/
54375cbef56Smrg  s/\\/\\\\/g
54475cbef56Smrg  p
54575cbef56Smrg}' | $cygpath_u | sort -u | sed -n '
54675cbef56Smrgs/ /\\ /g
5471a9c160aSmrgs/\(.*\)/'"$tab"'\1 \\/p
54875cbef56Smrgs/.\(.*\) \\/\1:/
54975cbef56SmrgH
55075cbef56Smrg$ {
5511a9c160aSmrg  s/.*/'"$tab"'/
55275cbef56Smrg  G
55375cbef56Smrg  p
55475cbef56Smrg}' >> "$depfile"
5551a9c160aSmrg  echo >> "$depfile" # make sure the fragment doesn't end with a backslash
55675cbef56Smrg  rm -f "$tmpdepfile"
55775cbef56Smrg  ;;
55875cbef56Smrg
55975cbef56Smrgmsvc7msys)
56075cbef56Smrg  # This case exists only to let depend.m4 do its work.  It works by
56175cbef56Smrg  # looking at the text of this script.  This case will never be run,
56275cbef56Smrg  # since it is checked for above.
56375cbef56Smrg  exit 1
56475cbef56Smrg  ;;
56575cbef56Smrg
5663eed67faSmbalmer#nosideeffect)
5673eed67faSmbalmer  # This comment above is used by automake to tell side-effect
5683eed67faSmbalmer  # dependency tracking mechanisms from slower ones.
5693eed67faSmbalmer
5703eed67faSmbalmerdashmstdout)
5713eed67faSmbalmer  # Important note: in order to support this mode, a compiler *must*
5723eed67faSmbalmer  # always write the preprocessed file to stdout, regardless of -o.
5733eed67faSmbalmer  "$@" || exit $?
5743eed67faSmbalmer
5753eed67faSmbalmer  # Remove the call to Libtool.
5763eed67faSmbalmer  if test "$libtool" = yes; then
577dc407927Smrg    while test "X$1" != 'X--mode=compile'; do
5783eed67faSmbalmer      shift
5793eed67faSmbalmer    done
5803eed67faSmbalmer    shift
5813eed67faSmbalmer  fi
5823eed67faSmbalmer
5831a9c160aSmrg  # Remove '-o $object'.
5843eed67faSmbalmer  IFS=" "
5853eed67faSmbalmer  for arg
5863eed67faSmbalmer  do
5873eed67faSmbalmer    case $arg in
5883eed67faSmbalmer    -o)
5893eed67faSmbalmer      shift
5903eed67faSmbalmer      ;;
5913eed67faSmbalmer    $object)
5923eed67faSmbalmer      shift
5933eed67faSmbalmer      ;;
5943eed67faSmbalmer    *)
5953eed67faSmbalmer      set fnord "$@" "$arg"
5963eed67faSmbalmer      shift # fnord
5973eed67faSmbalmer      shift # $arg
5983eed67faSmbalmer      ;;
5993eed67faSmbalmer    esac
6003eed67faSmbalmer  done
6013eed67faSmbalmer
6023eed67faSmbalmer  test -z "$dashmflag" && dashmflag=-M
6031a9c160aSmrg  # Require at least two characters before searching for ':'
6043eed67faSmbalmer  # in the target name.  This is to cope with DOS-style filenames:
6051a9c160aSmrg  # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise.
6063eed67faSmbalmer  "$@" $dashmflag |
6071a9c160aSmrg    sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile"
6083eed67faSmbalmer  rm -f "$depfile"
6093eed67faSmbalmer  cat < "$tmpdepfile" > "$depfile"
6101a9c160aSmrg  # Some versions of the HPUX 10.20 sed can't process this sed invocation
6111a9c160aSmrg  # correctly.  Breaking it into two sed invocations is a workaround.
6121a9c160aSmrg  tr ' ' "$nl" < "$tmpdepfile" \
6131a9c160aSmrg    | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
6141a9c160aSmrg    | sed -e 's/$/ :/' >> "$depfile"
6153eed67faSmbalmer  rm -f "$tmpdepfile"
6163eed67faSmbalmer  ;;
6173eed67faSmbalmer
6183eed67faSmbalmerdashXmstdout)
6193eed67faSmbalmer  # This case only exists to satisfy depend.m4.  It is never actually
6203eed67faSmbalmer  # run, as this mode is specially recognized in the preamble.
6213eed67faSmbalmer  exit 1
6223eed67faSmbalmer  ;;
6233eed67faSmbalmer
6243eed67faSmbalmermakedepend)
6253eed67faSmbalmer  "$@" || exit $?
6263eed67faSmbalmer  # Remove any Libtool call
6273eed67faSmbalmer  if test "$libtool" = yes; then
628dc407927Smrg    while test "X$1" != 'X--mode=compile'; do
6293eed67faSmbalmer      shift
6303eed67faSmbalmer    done
6313eed67faSmbalmer    shift
6323eed67faSmbalmer  fi
6333eed67faSmbalmer  # X makedepend
6343eed67faSmbalmer  shift
635dc407927Smrg  cleared=no eat=no
636dc407927Smrg  for arg
637dc407927Smrg  do
6383eed67faSmbalmer    case $cleared in
6393eed67faSmbalmer    no)
6403eed67faSmbalmer      set ""; shift
6413eed67faSmbalmer      cleared=yes ;;
6423eed67faSmbalmer    esac
643dc407927Smrg    if test $eat = yes; then
644dc407927Smrg      eat=no
645dc407927Smrg      continue
646dc407927Smrg    fi
6473eed67faSmbalmer    case "$arg" in
6483eed67faSmbalmer    -D*|-I*)
6493eed67faSmbalmer      set fnord "$@" "$arg"; shift ;;
6503eed67faSmbalmer    # Strip any option that makedepend may not understand.  Remove
6513eed67faSmbalmer    # the object too, otherwise makedepend will parse it as a source file.
652dc407927Smrg    -arch)
653dc407927Smrg      eat=yes ;;
6543eed67faSmbalmer    -*|$object)
6553eed67faSmbalmer      ;;
6563eed67faSmbalmer    *)
6573eed67faSmbalmer      set fnord "$@" "$arg"; shift ;;
6583eed67faSmbalmer    esac
6593eed67faSmbalmer  done
660dc407927Smrg  obj_suffix=`echo "$object" | sed 's/^.*\././'`
6613eed67faSmbalmer  touch "$tmpdepfile"
6623eed67faSmbalmer  ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
6633eed67faSmbalmer  rm -f "$depfile"
66475cbef56Smrg  # makedepend may prepend the VPATH from the source file name to the object.
66575cbef56Smrg  # No need to regex-escape $object, excess matching of '.' is harmless.
66675cbef56Smrg  sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile"
6671a9c160aSmrg  # Some versions of the HPUX 10.20 sed can't process the last invocation
6681a9c160aSmrg  # correctly.  Breaking it into two sed invocations is a workaround.
6691a9c160aSmrg  sed '1,2d' "$tmpdepfile" \
6701a9c160aSmrg    | tr ' ' "$nl" \
6711a9c160aSmrg    | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
6721a9c160aSmrg    | sed -e 's/$/ :/' >> "$depfile"
6733eed67faSmbalmer  rm -f "$tmpdepfile" "$tmpdepfile".bak
6743eed67faSmbalmer  ;;
6753eed67faSmbalmer
6763eed67faSmbalmercpp)
6773eed67faSmbalmer  # Important note: in order to support this mode, a compiler *must*
6783eed67faSmbalmer  # always write the preprocessed file to stdout.
6793eed67faSmbalmer  "$@" || exit $?
6803eed67faSmbalmer
6813eed67faSmbalmer  # Remove the call to Libtool.
6823eed67faSmbalmer  if test "$libtool" = yes; then
683dc407927Smrg    while test "X$1" != 'X--mode=compile'; do
6843eed67faSmbalmer      shift
6853eed67faSmbalmer    done
6863eed67faSmbalmer    shift
6873eed67faSmbalmer  fi
6883eed67faSmbalmer
6891a9c160aSmrg  # Remove '-o $object'.
6903eed67faSmbalmer  IFS=" "
6913eed67faSmbalmer  for arg
6923eed67faSmbalmer  do
6933eed67faSmbalmer    case $arg in
6943eed67faSmbalmer    -o)
6953eed67faSmbalmer      shift
6963eed67faSmbalmer      ;;
6973eed67faSmbalmer    $object)
6983eed67faSmbalmer      shift
6993eed67faSmbalmer      ;;
7003eed67faSmbalmer    *)
7013eed67faSmbalmer      set fnord "$@" "$arg"
7023eed67faSmbalmer      shift # fnord
7033eed67faSmbalmer      shift # $arg
7043eed67faSmbalmer      ;;
7053eed67faSmbalmer    esac
7063eed67faSmbalmer  done
7073eed67faSmbalmer
7081a9c160aSmrg  "$@" -E \
7091a9c160aSmrg    | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
7101a9c160aSmrg             -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
7111a9c160aSmrg    | sed '$ s: \\$::' > "$tmpdepfile"
7123eed67faSmbalmer  rm -f "$depfile"
7133eed67faSmbalmer  echo "$object : \\" > "$depfile"
7143eed67faSmbalmer  cat < "$tmpdepfile" >> "$depfile"
7153eed67faSmbalmer  sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
7163eed67faSmbalmer  rm -f "$tmpdepfile"
7173eed67faSmbalmer  ;;
7183eed67faSmbalmer
7193eed67faSmbalmermsvisualcpp)
7203eed67faSmbalmer  # Important note: in order to support this mode, a compiler *must*
721dc407927Smrg  # always write the preprocessed file to stdout.
7223eed67faSmbalmer  "$@" || exit $?
723dc407927Smrg
724dc407927Smrg  # Remove the call to Libtool.
725dc407927Smrg  if test "$libtool" = yes; then
726dc407927Smrg    while test "X$1" != 'X--mode=compile'; do
727dc407927Smrg      shift
728dc407927Smrg    done
729dc407927Smrg    shift
730dc407927Smrg  fi
731dc407927Smrg
7323eed67faSmbalmer  IFS=" "
7333eed67faSmbalmer  for arg
7343eed67faSmbalmer  do
7353eed67faSmbalmer    case "$arg" in
736dc407927Smrg    -o)
737dc407927Smrg      shift
738dc407927Smrg      ;;
739dc407927Smrg    $object)
740dc407927Smrg      shift
741dc407927Smrg      ;;
7423eed67faSmbalmer    "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
7431a9c160aSmrg        set fnord "$@"
7441a9c160aSmrg        shift
7451a9c160aSmrg        shift
7461a9c160aSmrg        ;;
7473eed67faSmbalmer    *)
7481a9c160aSmrg        set fnord "$@" "$arg"
7491a9c160aSmrg        shift
7501a9c160aSmrg        shift
7511a9c160aSmrg        ;;
7523eed67faSmbalmer    esac
7533eed67faSmbalmer  done
754dc407927Smrg  "$@" -E 2>/dev/null |
755dc407927Smrg  sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile"
7563eed67faSmbalmer  rm -f "$depfile"
7573eed67faSmbalmer  echo "$object : \\" > "$depfile"
7581a9c160aSmrg  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile"
7591a9c160aSmrg  echo "$tab" >> "$depfile"
760dc407927Smrg  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile"
7613eed67faSmbalmer  rm -f "$tmpdepfile"
7623eed67faSmbalmer  ;;
7633eed67faSmbalmer
764dc407927Smrgmsvcmsys)
765dc407927Smrg  # This case exists only to let depend.m4 do its work.  It works by
766dc407927Smrg  # looking at the text of this script.  This case will never be run,
767dc407927Smrg  # since it is checked for above.
768dc407927Smrg  exit 1
769dc407927Smrg  ;;
770dc407927Smrg
7713eed67faSmbalmernone)
7723eed67faSmbalmer  exec "$@"
7733eed67faSmbalmer  ;;
7743eed67faSmbalmer
7753eed67faSmbalmer*)
7763eed67faSmbalmer  echo "Unknown depmode $depmode" 1>&2
7773eed67faSmbalmer  exit 1
7783eed67faSmbalmer  ;;
7793eed67faSmbalmeresac
7803eed67faSmbalmer
7813eed67faSmbalmerexit 0
7823eed67faSmbalmer
7833eed67faSmbalmer# Local Variables:
7843eed67faSmbalmer# mode: shell-script
7853eed67faSmbalmer# sh-indentation: 2
7861a9c160aSmrg# eval: (add-hook 'before-save-hook 'time-stamp)
7873eed67faSmbalmer# time-stamp-start: "scriptversion="
7883eed67faSmbalmer# time-stamp-format: "%:y-%02m-%02d.%02H"
7891a9c160aSmrg# time-stamp-time-zone: "UTC0"
790dc407927Smrg# time-stamp-end: "; # UTC"
7913eed67faSmbalmer# End:
792