depcomp revision 1b5d61b8
11b5d61b8Smrg#!/bin/sh
205b261ecSmrg# depcomp - compile a program generating dependencies as side-effects
305b261ecSmrg
41b5d61b8Smrgscriptversion=2016-01-11.22; # UTC
505b261ecSmrg
61b5d61b8Smrg# Copyright (C) 1999-2017 Free Software Foundation, Inc.
705b261ecSmrg
805b261ecSmrg# This program is free software; you can redistribute it and/or modify
905b261ecSmrg# it under the terms of the GNU General Public License as published by
1005b261ecSmrg# the Free Software Foundation; either version 2, or (at your option)
1105b261ecSmrg# any later version.
1205b261ecSmrg
1305b261ecSmrg# This program is distributed in the hope that it will be useful,
1405b261ecSmrg# but WITHOUT ANY WARRANTY; without even the implied warranty of
1505b261ecSmrg# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1605b261ecSmrg# GNU General Public License for more details.
1705b261ecSmrg
1805b261ecSmrg# You should have received a copy of the GNU General Public License
1935c4bbdfSmrg# along with this program.  If not, see <http://www.gnu.org/licenses/>.
2005b261ecSmrg
2105b261ecSmrg# As a special exception to the GNU General Public License, if you
2205b261ecSmrg# distribute this file as part of a program that contains a
2305b261ecSmrg# configuration script generated by Autoconf, you may include it under
2405b261ecSmrg# the same distribution terms that you use for the rest of that program.
2505b261ecSmrg
2605b261ecSmrg# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>.
2705b261ecSmrg
2805b261ecSmrgcase $1 in
2905b261ecSmrg  '')
3035c4bbdfSmrg    echo "$0: No command.  Try '$0 --help' for more information." 1>&2
3135c4bbdfSmrg    exit 1;
3235c4bbdfSmrg    ;;
3305b261ecSmrg  -h | --h*)
3405b261ecSmrg    cat <<\EOF
3505b261ecSmrgUsage: depcomp [--help] [--version] PROGRAM [ARGS]
3605b261ecSmrg
3705b261ecSmrgRun PROGRAMS ARGS to compile a file, generating dependencies
3805b261ecSmrgas side-effects.
3905b261ecSmrg
4005b261ecSmrgEnvironment variables:
4105b261ecSmrg  depmode     Dependency tracking mode.
4235c4bbdfSmrg  source      Source file read by 'PROGRAMS ARGS'.
4335c4bbdfSmrg  object      Object file output by 'PROGRAMS ARGS'.
4405b261ecSmrg  DEPDIR      directory where to store dependencies.
4505b261ecSmrg  depfile     Dependency file to output.
4635c4bbdfSmrg  tmpdepfile  Temporary file to use when outputting dependencies.
4705b261ecSmrg  libtool     Whether libtool is used (yes/no).
4805b261ecSmrg
4905b261ecSmrgReport bugs to <bug-automake@gnu.org>.
5005b261ecSmrgEOF
5105b261ecSmrg    exit $?
5205b261ecSmrg    ;;
5305b261ecSmrg  -v | --v*)
5405b261ecSmrg    echo "depcomp $scriptversion"
5505b261ecSmrg    exit $?
5605b261ecSmrg    ;;
5705b261ecSmrgesac
5805b261ecSmrg
5935c4bbdfSmrg# Get the directory component of the given path, and save it in the
6035c4bbdfSmrg# global variables '$dir'.  Note that this directory component will
6135c4bbdfSmrg# be either empty or ending with a '/' character.  This is deliberate.
6235c4bbdfSmrgset_dir_from ()
6335c4bbdfSmrg{
6435c4bbdfSmrg  case $1 in
6535c4bbdfSmrg    */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;;
6635c4bbdfSmrg      *) dir=;;
6735c4bbdfSmrg  esac
6835c4bbdfSmrg}
6935c4bbdfSmrg
7035c4bbdfSmrg# Get the suffix-stripped basename of the given path, and save it the
7135c4bbdfSmrg# global variable '$base'.
7235c4bbdfSmrgset_base_from ()
7335c4bbdfSmrg{
7435c4bbdfSmrg  base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'`
7535c4bbdfSmrg}
7635c4bbdfSmrg
7735c4bbdfSmrg# If no dependency file was actually created by the compiler invocation,
7835c4bbdfSmrg# we still have to create a dummy depfile, to avoid errors with the
7935c4bbdfSmrg# Makefile "include basename.Plo" scheme.
8035c4bbdfSmrgmake_dummy_depfile ()
8135c4bbdfSmrg{
8235c4bbdfSmrg  echo "#dummy" > "$depfile"
8335c4bbdfSmrg}
8435c4bbdfSmrg
8535c4bbdfSmrg# Factor out some common post-processing of the generated depfile.
8635c4bbdfSmrg# Requires the auxiliary global variable '$tmpdepfile' to be set.
8735c4bbdfSmrgaix_post_process_depfile ()
8835c4bbdfSmrg{
8935c4bbdfSmrg  # If the compiler actually managed to produce a dependency file,
9035c4bbdfSmrg  # post-process it.
9135c4bbdfSmrg  if test -f "$tmpdepfile"; then
9235c4bbdfSmrg    # Each line is of the form 'foo.o: dependency.h'.
9335c4bbdfSmrg    # Do two passes, one to just change these to
9435c4bbdfSmrg    #   $object: dependency.h
9535c4bbdfSmrg    # and one to simply output
9635c4bbdfSmrg    #   dependency.h:
9735c4bbdfSmrg    # which is needed to avoid the deleted-header problem.
9835c4bbdfSmrg    { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile"
9935c4bbdfSmrg      sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile"
10035c4bbdfSmrg    } > "$depfile"
10135c4bbdfSmrg    rm -f "$tmpdepfile"
10235c4bbdfSmrg  else
10335c4bbdfSmrg    make_dummy_depfile
10435c4bbdfSmrg  fi
10535c4bbdfSmrg}
10635c4bbdfSmrg
10735c4bbdfSmrg# A tabulation character.
10835c4bbdfSmrgtab='	'
10935c4bbdfSmrg# A newline character.
11035c4bbdfSmrgnl='
11135c4bbdfSmrg'
11235c4bbdfSmrg# Character ranges might be problematic outside the C locale.
11335c4bbdfSmrg# These definitions help.
11435c4bbdfSmrgupper=ABCDEFGHIJKLMNOPQRSTUVWXYZ
11535c4bbdfSmrglower=abcdefghijklmnopqrstuvwxyz
11635c4bbdfSmrgdigits=0123456789
11735c4bbdfSmrgalpha=${upper}${lower}
11835c4bbdfSmrg
11905b261ecSmrgif test -z "$depmode" || test -z "$source" || test -z "$object"; then
12005b261ecSmrg  echo "depcomp: Variables source, object and depmode must be set" 1>&2
12105b261ecSmrg  exit 1
12205b261ecSmrgfi
12305b261ecSmrg
12405b261ecSmrg# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.
12505b261ecSmrgdepfile=${depfile-`echo "$object" |
12605b261ecSmrg  sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`}
12705b261ecSmrgtmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
12805b261ecSmrg
12905b261ecSmrgrm -f "$tmpdepfile"
13005b261ecSmrg
13135c4bbdfSmrg# Avoid interferences from the environment.
13235c4bbdfSmrggccflag= dashmflag=
13335c4bbdfSmrg
13405b261ecSmrg# Some modes work just like other modes, but use different flags.  We
13505b261ecSmrg# parameterize here, but still list the modes in the big case below,
13605b261ecSmrg# to make depend.m4 easier to write.  Note that we *cannot* use a case
13705b261ecSmrg# here, because this file can only contain one case statement.
13805b261ecSmrgif test "$depmode" = hp; then
13905b261ecSmrg  # HP compiler uses -M and no extra arg.
14005b261ecSmrg  gccflag=-M
14105b261ecSmrg  depmode=gcc
14205b261ecSmrgfi
14305b261ecSmrg
14405b261ecSmrgif test "$depmode" = dashXmstdout; then
14535c4bbdfSmrg  # This is just like dashmstdout with a different argument.
14635c4bbdfSmrg  dashmflag=-xM
14735c4bbdfSmrg  depmode=dashmstdout
14835c4bbdfSmrgfi
14935c4bbdfSmrg
15035c4bbdfSmrgcygpath_u="cygpath -u -f -"
15135c4bbdfSmrgif test "$depmode" = msvcmsys; then
15235c4bbdfSmrg  # This is just like msvisualcpp but w/o cygpath translation.
15335c4bbdfSmrg  # Just convert the backslash-escaped backslashes to single forward
15435c4bbdfSmrg  # slashes to satisfy depend.m4
15535c4bbdfSmrg  cygpath_u='sed s,\\\\,/,g'
15635c4bbdfSmrg  depmode=msvisualcpp
15735c4bbdfSmrgfi
15835c4bbdfSmrg
15935c4bbdfSmrgif test "$depmode" = msvc7msys; then
16035c4bbdfSmrg  # This is just like msvc7 but w/o cygpath translation.
16135c4bbdfSmrg  # Just convert the backslash-escaped backslashes to single forward
16235c4bbdfSmrg  # slashes to satisfy depend.m4
16335c4bbdfSmrg  cygpath_u='sed s,\\\\,/,g'
16435c4bbdfSmrg  depmode=msvc7
16535c4bbdfSmrgfi
16635c4bbdfSmrg
16735c4bbdfSmrgif test "$depmode" = xlc; then
16835c4bbdfSmrg  # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information.
16935c4bbdfSmrg  gccflag=-qmakedep=gcc,-MF
17035c4bbdfSmrg  depmode=gcc
17105b261ecSmrgfi
17205b261ecSmrg
17305b261ecSmrgcase "$depmode" in
17405b261ecSmrggcc3)
17505b261ecSmrg## gcc 3 implements dependency tracking that does exactly what
17605b261ecSmrg## we want.  Yay!  Note: for some reason libtool 1.4 doesn't like
17705b261ecSmrg## it if -MD -MP comes after the -MF stuff.  Hmm.
17805b261ecSmrg## Unfortunately, FreeBSD c89 acceptance of flags depends upon
17905b261ecSmrg## the command line argument order; so add the flags where they
18005b261ecSmrg## appear in depend2.am.  Note that the slowdown incurred here
18105b261ecSmrg## affects only configure: in makefiles, %FASTDEP% shortcuts this.
18205b261ecSmrg  for arg
18305b261ecSmrg  do
18405b261ecSmrg    case $arg in
18505b261ecSmrg    -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;;
18605b261ecSmrg    *)  set fnord "$@" "$arg" ;;
18705b261ecSmrg    esac
18805b261ecSmrg    shift # fnord
18905b261ecSmrg    shift # $arg
19005b261ecSmrg  done
19105b261ecSmrg  "$@"
19205b261ecSmrg  stat=$?
19335c4bbdfSmrg  if test $stat -ne 0; then
19405b261ecSmrg    rm -f "$tmpdepfile"
19505b261ecSmrg    exit $stat
19605b261ecSmrg  fi
19705b261ecSmrg  mv "$tmpdepfile" "$depfile"
19805b261ecSmrg  ;;
19905b261ecSmrg
20005b261ecSmrggcc)
20135c4bbdfSmrg## Note that this doesn't just cater to obsosete pre-3.x GCC compilers.
20235c4bbdfSmrg## but also to in-use compilers like IMB xlc/xlC and the HP C compiler.
20335c4bbdfSmrg## (see the conditional assignment to $gccflag above).
20405b261ecSmrg## There are various ways to get dependency output from gcc.  Here's
20505b261ecSmrg## why we pick this rather obscure method:
20605b261ecSmrg## - Don't want to use -MD because we'd like the dependencies to end
20705b261ecSmrg##   up in a subdir.  Having to rename by hand is ugly.
20805b261ecSmrg##   (We might end up doing this anyway to support other compilers.)
20905b261ecSmrg## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
21035c4bbdfSmrg##   -MM, not -M (despite what the docs say).  Also, it might not be
21135c4bbdfSmrg##   supported by the other compilers which use the 'gcc' depmode.
21205b261ecSmrg## - Using -M directly means running the compiler twice (even worse
21305b261ecSmrg##   than renaming).
21405b261ecSmrg  if test -z "$gccflag"; then
21505b261ecSmrg    gccflag=-MD,
21605b261ecSmrg  fi
21705b261ecSmrg  "$@" -Wp,"$gccflag$tmpdepfile"
21805b261ecSmrg  stat=$?
21935c4bbdfSmrg  if test $stat -ne 0; then
22005b261ecSmrg    rm -f "$tmpdepfile"
22105b261ecSmrg    exit $stat
22205b261ecSmrg  fi
22305b261ecSmrg  rm -f "$depfile"
22405b261ecSmrg  echo "$object : \\" > "$depfile"
22535c4bbdfSmrg  # The second -e expression handles DOS-style file names with drive
22635c4bbdfSmrg  # letters.
22705b261ecSmrg  sed -e 's/^[^:]*: / /' \
22805b261ecSmrg      -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
22935c4bbdfSmrg## This next piece of magic avoids the "deleted header file" problem.
23005b261ecSmrg## The problem is that when a header file which appears in a .P file
23105b261ecSmrg## is deleted, the dependency causes make to die (because there is
23205b261ecSmrg## typically no way to rebuild the header).  We avoid this by adding
23305b261ecSmrg## dummy dependencies for each header file.  Too bad gcc doesn't do
23405b261ecSmrg## this for us directly.
23535c4bbdfSmrg## Some versions of gcc put a space before the ':'.  On the theory
23605b261ecSmrg## that the space means something, we add a space to the output as
23735c4bbdfSmrg## well.  hp depmode also adds that space, but also prefixes the VPATH
23835c4bbdfSmrg## to the object.  Take care to not repeat it in the output.
23905b261ecSmrg## Some versions of the HPUX 10.20 sed can't process this invocation
24005b261ecSmrg## correctly.  Breaking it into two sed invocations is a workaround.
24135c4bbdfSmrg  tr ' ' "$nl" < "$tmpdepfile" \
24235c4bbdfSmrg    | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \
24335c4bbdfSmrg    | sed -e 's/$/ :/' >> "$depfile"
24405b261ecSmrg  rm -f "$tmpdepfile"
24505b261ecSmrg  ;;
24605b261ecSmrg
24705b261ecSmrghp)
24805b261ecSmrg  # This case exists only to let depend.m4 do its work.  It works by
24905b261ecSmrg  # looking at the text of this script.  This case will never be run,
25005b261ecSmrg  # since it is checked for above.
25105b261ecSmrg  exit 1
25205b261ecSmrg  ;;
25305b261ecSmrg
25405b261ecSmrgsgi)
25505b261ecSmrg  if test "$libtool" = yes; then
25605b261ecSmrg    "$@" "-Wp,-MDupdate,$tmpdepfile"
25705b261ecSmrg  else
25805b261ecSmrg    "$@" -MDupdate "$tmpdepfile"
25905b261ecSmrg  fi
26005b261ecSmrg  stat=$?
26135c4bbdfSmrg  if test $stat -ne 0; then
26205b261ecSmrg    rm -f "$tmpdepfile"
26305b261ecSmrg    exit $stat
26405b261ecSmrg  fi
26505b261ecSmrg  rm -f "$depfile"
26605b261ecSmrg
26705b261ecSmrg  if test -f "$tmpdepfile"; then  # yes, the sourcefile depend on other files
26805b261ecSmrg    echo "$object : \\" > "$depfile"
26905b261ecSmrg    # Clip off the initial element (the dependent).  Don't try to be
27005b261ecSmrg    # clever and replace this with sed code, as IRIX sed won't handle
27105b261ecSmrg    # lines with more than a fixed number of characters (4096 in
27205b261ecSmrg    # IRIX 6.2 sed, 8192 in IRIX 6.5).  We also remove comment lines;
27335c4bbdfSmrg    # the IRIX cc adds comments like '#:fec' to the end of the
27405b261ecSmrg    # dependency line.
27535c4bbdfSmrg    tr ' ' "$nl" < "$tmpdepfile" \
27635c4bbdfSmrg      | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \
27735c4bbdfSmrg      | tr "$nl" ' ' >> "$depfile"
27835c4bbdfSmrg    echo >> "$depfile"
27905b261ecSmrg    # The second pass generates a dummy entry for each header file.
28035c4bbdfSmrg    tr ' ' "$nl" < "$tmpdepfile" \
28135c4bbdfSmrg      | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
28235c4bbdfSmrg      >> "$depfile"
28305b261ecSmrg  else
28435c4bbdfSmrg    make_dummy_depfile
28505b261ecSmrg  fi
28605b261ecSmrg  rm -f "$tmpdepfile"
28705b261ecSmrg  ;;
28805b261ecSmrg
28935c4bbdfSmrgxlc)
29035c4bbdfSmrg  # This case exists only to let depend.m4 do its work.  It works by
29135c4bbdfSmrg  # looking at the text of this script.  This case will never be run,
29235c4bbdfSmrg  # since it is checked for above.
29335c4bbdfSmrg  exit 1
29435c4bbdfSmrg  ;;
29535c4bbdfSmrg
29605b261ecSmrgaix)
29705b261ecSmrg  # The C for AIX Compiler uses -M and outputs the dependencies
29805b261ecSmrg  # in a .u file.  In older versions, this file always lives in the
29935c4bbdfSmrg  # current directory.  Also, the AIX compiler puts '$object:' at the
30005b261ecSmrg  # start of each line; $object doesn't have directory information.
30105b261ecSmrg  # Version 6 uses the directory in both cases.
30235c4bbdfSmrg  set_dir_from "$object"
30335c4bbdfSmrg  set_base_from "$object"
30405b261ecSmrg  if test "$libtool" = yes; then
30535c4bbdfSmrg    tmpdepfile1=$dir$base.u
30635c4bbdfSmrg    tmpdepfile2=$base.u
30735c4bbdfSmrg    tmpdepfile3=$dir.libs/$base.u
30805b261ecSmrg    "$@" -Wc,-M
30905b261ecSmrg  else
31035c4bbdfSmrg    tmpdepfile1=$dir$base.u
31135c4bbdfSmrg    tmpdepfile2=$dir$base.u
31235c4bbdfSmrg    tmpdepfile3=$dir$base.u
31305b261ecSmrg    "$@" -M
31405b261ecSmrg  fi
31505b261ecSmrg  stat=$?
31635c4bbdfSmrg  if test $stat -ne 0; then
31735c4bbdfSmrg    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
31835c4bbdfSmrg    exit $stat
319475c125cSmrg  fi
320475c125cSmrg
32135c4bbdfSmrg  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
32235c4bbdfSmrg  do
32335c4bbdfSmrg    test -f "$tmpdepfile" && break
32435c4bbdfSmrg  done
32535c4bbdfSmrg  aix_post_process_depfile
32635c4bbdfSmrg  ;;
32735c4bbdfSmrg
32835c4bbdfSmrgtcc)
32935c4bbdfSmrg  # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26
33035c4bbdfSmrg  # FIXME: That version still under development at the moment of writing.
33135c4bbdfSmrg  #        Make that this statement remains true also for stable, released
33235c4bbdfSmrg  #        versions.
33335c4bbdfSmrg  # It will wrap lines (doesn't matter whether long or short) with a
33435c4bbdfSmrg  # trailing '\', as in:
33535c4bbdfSmrg  #
33635c4bbdfSmrg  #   foo.o : \
33735c4bbdfSmrg  #    foo.c \
33835c4bbdfSmrg  #    foo.h \
33935c4bbdfSmrg  #
34035c4bbdfSmrg  # It will put a trailing '\' even on the last line, and will use leading
34135c4bbdfSmrg  # spaces rather than leading tabs (at least since its commit 0394caf7
34235c4bbdfSmrg  # "Emit spaces for -MD").
34335c4bbdfSmrg  "$@" -MD -MF "$tmpdepfile"
34435c4bbdfSmrg  stat=$?
34535c4bbdfSmrg  if test $stat -ne 0; then
346475c125cSmrg    rm -f "$tmpdepfile"
34705b261ecSmrg    exit $stat
34805b261ecSmrg  fi
34935c4bbdfSmrg  rm -f "$depfile"
35035c4bbdfSmrg  # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'.
35135c4bbdfSmrg  # We have to change lines of the first kind to '$object: \'.
35235c4bbdfSmrg  sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile"
35335c4bbdfSmrg  # And for each line of the second kind, we have to emit a 'dep.h:'
35435c4bbdfSmrg  # dummy dependency, to avoid the deleted-header problem.
35535c4bbdfSmrg  sed -n -e 's|^  *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile"
35605b261ecSmrg  rm -f "$tmpdepfile"
35705b261ecSmrg  ;;
35805b261ecSmrg
35935c4bbdfSmrg## The order of this option in the case statement is important, since the
36035c4bbdfSmrg## shell code in configure will try each of these formats in the order
36135c4bbdfSmrg## listed in this file.  A plain '-MD' option would be understood by many
36235c4bbdfSmrg## compilers, so we must ensure this comes after the gcc and icc options.
36335c4bbdfSmrgpgcc)
36435c4bbdfSmrg  # Portland's C compiler understands '-MD'.
36535c4bbdfSmrg  # Will always output deps to 'file.d' where file is the root name of the
36635c4bbdfSmrg  # source file under compilation, even if file resides in a subdirectory.
36735c4bbdfSmrg  # The object file name does not affect the name of the '.d' file.
36835c4bbdfSmrg  # pgcc 10.2 will output
36905b261ecSmrg  #    foo.o: sub/foo.c sub/foo.h
37035c4bbdfSmrg  # and will wrap long lines using '\' :
37105b261ecSmrg  #    foo.o: sub/foo.c ... \
37205b261ecSmrg  #     sub/foo.h ... \
37305b261ecSmrg  #     ...
37435c4bbdfSmrg  set_dir_from "$object"
37535c4bbdfSmrg  # Use the source, not the object, to determine the base name, since
37635c4bbdfSmrg  # that's sadly what pgcc will do too.
37735c4bbdfSmrg  set_base_from "$source"
37835c4bbdfSmrg  tmpdepfile=$base.d
37935c4bbdfSmrg
38035c4bbdfSmrg  # For projects that build the same source file twice into different object
38135c4bbdfSmrg  # files, the pgcc approach of using the *source* file root name can cause
38235c4bbdfSmrg  # problems in parallel builds.  Use a locking strategy to avoid stomping on
38335c4bbdfSmrg  # the same $tmpdepfile.
38435c4bbdfSmrg  lockdir=$base.d-lock
38535c4bbdfSmrg  trap "
38635c4bbdfSmrg    echo '$0: caught signal, cleaning up...' >&2
38735c4bbdfSmrg    rmdir '$lockdir'
38835c4bbdfSmrg    exit 1
38935c4bbdfSmrg  " 1 2 13 15
39035c4bbdfSmrg  numtries=100
39135c4bbdfSmrg  i=$numtries
39235c4bbdfSmrg  while test $i -gt 0; do
39335c4bbdfSmrg    # mkdir is a portable test-and-set.
39435c4bbdfSmrg    if mkdir "$lockdir" 2>/dev/null; then
39535c4bbdfSmrg      # This process acquired the lock.
39635c4bbdfSmrg      "$@" -MD
39735c4bbdfSmrg      stat=$?
39835c4bbdfSmrg      # Release the lock.
39935c4bbdfSmrg      rmdir "$lockdir"
40035c4bbdfSmrg      break
40135c4bbdfSmrg    else
40235c4bbdfSmrg      # If the lock is being held by a different process, wait
40335c4bbdfSmrg      # until the winning process is done or we timeout.
40435c4bbdfSmrg      while test -d "$lockdir" && test $i -gt 0; do
40535c4bbdfSmrg        sleep 1
40635c4bbdfSmrg        i=`expr $i - 1`
40735c4bbdfSmrg      done
40835c4bbdfSmrg    fi
40935c4bbdfSmrg    i=`expr $i - 1`
41035c4bbdfSmrg  done
41135c4bbdfSmrg  trap - 1 2 13 15
41235c4bbdfSmrg  if test $i -le 0; then
41335c4bbdfSmrg    echo "$0: failed to acquire lock after $numtries attempts" >&2
41435c4bbdfSmrg    echo "$0: check lockdir '$lockdir'" >&2
41535c4bbdfSmrg    exit 1
41635c4bbdfSmrg  fi
41705b261ecSmrg
41835c4bbdfSmrg  if test $stat -ne 0; then
41905b261ecSmrg    rm -f "$tmpdepfile"
42005b261ecSmrg    exit $stat
42105b261ecSmrg  fi
42205b261ecSmrg  rm -f "$depfile"
42305b261ecSmrg  # Each line is of the form `foo.o: dependent.h',
42405b261ecSmrg  # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'.
42505b261ecSmrg  # Do two passes, one to just change these to
42605b261ecSmrg  # `$object: dependent.h' and one to simply `dependent.h:'.
42705b261ecSmrg  sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
42805b261ecSmrg  # Some versions of the HPUX 10.20 sed can't process this invocation
42905b261ecSmrg  # correctly.  Breaking it into two sed invocations is a workaround.
43035c4bbdfSmrg  sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \
43135c4bbdfSmrg    | sed -e 's/$/ :/' >> "$depfile"
43205b261ecSmrg  rm -f "$tmpdepfile"
43305b261ecSmrg  ;;
43405b261ecSmrg
43505b261ecSmrghp2)
43605b261ecSmrg  # The "hp" stanza above does not work with aCC (C++) and HP's ia64
43705b261ecSmrg  # compilers, which have integrated preprocessors.  The correct option
43805b261ecSmrg  # to use with these is +Maked; it writes dependencies to a file named
43905b261ecSmrg  # 'foo.d', which lands next to the object file, wherever that
44005b261ecSmrg  # happens to be.
44105b261ecSmrg  # Much of this is similar to the tru64 case; see comments there.
44235c4bbdfSmrg  set_dir_from  "$object"
44335c4bbdfSmrg  set_base_from "$object"
44405b261ecSmrg  if test "$libtool" = yes; then
44505b261ecSmrg    tmpdepfile1=$dir$base.d
44605b261ecSmrg    tmpdepfile2=$dir.libs/$base.d
44705b261ecSmrg    "$@" -Wc,+Maked
44805b261ecSmrg  else
44905b261ecSmrg    tmpdepfile1=$dir$base.d
45005b261ecSmrg    tmpdepfile2=$dir$base.d
45105b261ecSmrg    "$@" +Maked
45205b261ecSmrg  fi
45305b261ecSmrg  stat=$?
45435c4bbdfSmrg  if test $stat -ne 0; then
45505b261ecSmrg     rm -f "$tmpdepfile1" "$tmpdepfile2"
45605b261ecSmrg     exit $stat
45705b261ecSmrg  fi
45805b261ecSmrg
45905b261ecSmrg  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2"
46005b261ecSmrg  do
46105b261ecSmrg    test -f "$tmpdepfile" && break
46205b261ecSmrg  done
46305b261ecSmrg  if test -f "$tmpdepfile"; then
46435c4bbdfSmrg    sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile"
46535c4bbdfSmrg    # Add 'dependent.h:' lines.
46635c4bbdfSmrg    sed -ne '2,${
46735c4bbdfSmrg               s/^ *//
46835c4bbdfSmrg               s/ \\*$//
46935c4bbdfSmrg               s/$/:/
47035c4bbdfSmrg               p
47135c4bbdfSmrg             }' "$tmpdepfile" >> "$depfile"
47205b261ecSmrg  else
47335c4bbdfSmrg    make_dummy_depfile
47405b261ecSmrg  fi
47505b261ecSmrg  rm -f "$tmpdepfile" "$tmpdepfile2"
47605b261ecSmrg  ;;
47705b261ecSmrg
47805b261ecSmrgtru64)
47935c4bbdfSmrg  # The Tru64 compiler uses -MD to generate dependencies as a side
48035c4bbdfSmrg  # effect.  'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'.
48135c4bbdfSmrg  # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
48235c4bbdfSmrg  # dependencies in 'foo.d' instead, so we check for that too.
48335c4bbdfSmrg  # Subdirectories are respected.
48435c4bbdfSmrg  set_dir_from  "$object"
48535c4bbdfSmrg  set_base_from "$object"
48635c4bbdfSmrg
48735c4bbdfSmrg  if test "$libtool" = yes; then
48835c4bbdfSmrg    # Libtool generates 2 separate objects for the 2 libraries.  These
48935c4bbdfSmrg    # two compilations output dependencies in $dir.libs/$base.o.d and
49035c4bbdfSmrg    # in $dir$base.o.d.  We have to check for both files, because
49135c4bbdfSmrg    # one of the two compilations can be disabled.  We should prefer
49235c4bbdfSmrg    # $dir$base.o.d over $dir.libs/$base.o.d because the latter is
49335c4bbdfSmrg    # automatically cleaned when .libs/ is deleted, while ignoring
49435c4bbdfSmrg    # the former would cause a distcleancheck panic.
49535c4bbdfSmrg    tmpdepfile1=$dir$base.o.d          # libtool 1.5
49635c4bbdfSmrg    tmpdepfile2=$dir.libs/$base.o.d    # Likewise.
49735c4bbdfSmrg    tmpdepfile3=$dir.libs/$base.d      # Compaq CCC V6.2-504
49835c4bbdfSmrg    "$@" -Wc,-MD
49935c4bbdfSmrg  else
50035c4bbdfSmrg    tmpdepfile1=$dir$base.d
50135c4bbdfSmrg    tmpdepfile2=$dir$base.d
50235c4bbdfSmrg    tmpdepfile3=$dir$base.d
50335c4bbdfSmrg    "$@" -MD
50435c4bbdfSmrg  fi
50535c4bbdfSmrg
50635c4bbdfSmrg  stat=$?
50735c4bbdfSmrg  if test $stat -ne 0; then
50835c4bbdfSmrg    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
50935c4bbdfSmrg    exit $stat
51035c4bbdfSmrg  fi
51135c4bbdfSmrg
51235c4bbdfSmrg  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
51335c4bbdfSmrg  do
51435c4bbdfSmrg    test -f "$tmpdepfile" && break
51535c4bbdfSmrg  done
51635c4bbdfSmrg  # Same post-processing that is required for AIX mode.
51735c4bbdfSmrg  aix_post_process_depfile
51835c4bbdfSmrg  ;;
51935c4bbdfSmrg
52035c4bbdfSmrgmsvc7)
52135c4bbdfSmrg  if test "$libtool" = yes; then
52235c4bbdfSmrg    showIncludes=-Wc,-showIncludes
52335c4bbdfSmrg  else
52435c4bbdfSmrg    showIncludes=-showIncludes
52535c4bbdfSmrg  fi
52635c4bbdfSmrg  "$@" $showIncludes > "$tmpdepfile"
52735c4bbdfSmrg  stat=$?
52835c4bbdfSmrg  grep -v '^Note: including file: ' "$tmpdepfile"
52935c4bbdfSmrg  if test $stat -ne 0; then
53035c4bbdfSmrg    rm -f "$tmpdepfile"
53135c4bbdfSmrg    exit $stat
53235c4bbdfSmrg  fi
53335c4bbdfSmrg  rm -f "$depfile"
53435c4bbdfSmrg  echo "$object : \\" > "$depfile"
53535c4bbdfSmrg  # The first sed program below extracts the file names and escapes
53635c4bbdfSmrg  # backslashes for cygpath.  The second sed program outputs the file
53735c4bbdfSmrg  # name when reading, but also accumulates all include files in the
53835c4bbdfSmrg  # hold buffer in order to output them again at the end.  This only
53935c4bbdfSmrg  # works with sed implementations that can handle large buffers.
54035c4bbdfSmrg  sed < "$tmpdepfile" -n '
54135c4bbdfSmrg/^Note: including file:  *\(.*\)/ {
54235c4bbdfSmrg  s//\1/
54335c4bbdfSmrg  s/\\/\\\\/g
54435c4bbdfSmrg  p
54535c4bbdfSmrg}' | $cygpath_u | sort -u | sed -n '
54635c4bbdfSmrgs/ /\\ /g
54735c4bbdfSmrgs/\(.*\)/'"$tab"'\1 \\/p
54835c4bbdfSmrgs/.\(.*\) \\/\1:/
54935c4bbdfSmrgH
55035c4bbdfSmrg$ {
55135c4bbdfSmrg  s/.*/'"$tab"'/
55235c4bbdfSmrg  G
55335c4bbdfSmrg  p
55435c4bbdfSmrg}' >> "$depfile"
55535c4bbdfSmrg  echo >> "$depfile" # make sure the fragment doesn't end with a backslash
55635c4bbdfSmrg  rm -f "$tmpdepfile"
55735c4bbdfSmrg  ;;
55835c4bbdfSmrg
55935c4bbdfSmrgmsvc7msys)
56035c4bbdfSmrg  # This case exists only to let depend.m4 do its work.  It works by
56135c4bbdfSmrg  # looking at the text of this script.  This case will never be run,
56235c4bbdfSmrg  # since it is checked for above.
56335c4bbdfSmrg  exit 1
56435c4bbdfSmrg  ;;
56505b261ecSmrg
56605b261ecSmrg#nosideeffect)
56705b261ecSmrg  # This comment above is used by automake to tell side-effect
56805b261ecSmrg  # dependency tracking mechanisms from slower ones.
56905b261ecSmrg
57005b261ecSmrgdashmstdout)
57105b261ecSmrg  # Important note: in order to support this mode, a compiler *must*
57205b261ecSmrg  # always write the preprocessed file to stdout, regardless of -o.
57305b261ecSmrg  "$@" || exit $?
57405b261ecSmrg
57505b261ecSmrg  # Remove the call to Libtool.
57605b261ecSmrg  if test "$libtool" = yes; then
57735c4bbdfSmrg    while test "X$1" != 'X--mode=compile'; do
57805b261ecSmrg      shift
57905b261ecSmrg    done
58005b261ecSmrg    shift
58105b261ecSmrg  fi
58205b261ecSmrg
58335c4bbdfSmrg  # Remove '-o $object'.
58405b261ecSmrg  IFS=" "
58505b261ecSmrg  for arg
58605b261ecSmrg  do
58705b261ecSmrg    case $arg in
58805b261ecSmrg    -o)
58905b261ecSmrg      shift
59005b261ecSmrg      ;;
59105b261ecSmrg    $object)
59205b261ecSmrg      shift
59305b261ecSmrg      ;;
59405b261ecSmrg    *)
59505b261ecSmrg      set fnord "$@" "$arg"
59605b261ecSmrg      shift # fnord
59705b261ecSmrg      shift # $arg
59805b261ecSmrg      ;;
59905b261ecSmrg    esac
60005b261ecSmrg  done
60105b261ecSmrg
60205b261ecSmrg  test -z "$dashmflag" && dashmflag=-M
60335c4bbdfSmrg  # Require at least two characters before searching for ':'
60405b261ecSmrg  # in the target name.  This is to cope with DOS-style filenames:
60535c4bbdfSmrg  # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise.
60605b261ecSmrg  "$@" $dashmflag |
60735c4bbdfSmrg    sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile"
60805b261ecSmrg  rm -f "$depfile"
60905b261ecSmrg  cat < "$tmpdepfile" > "$depfile"
61035c4bbdfSmrg  # Some versions of the HPUX 10.20 sed can't process this sed invocation
61135c4bbdfSmrg  # correctly.  Breaking it into two sed invocations is a workaround.
61235c4bbdfSmrg  tr ' ' "$nl" < "$tmpdepfile" \
61335c4bbdfSmrg    | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
61435c4bbdfSmrg    | sed -e 's/$/ :/' >> "$depfile"
61505b261ecSmrg  rm -f "$tmpdepfile"
61605b261ecSmrg  ;;
61705b261ecSmrg
61805b261ecSmrgdashXmstdout)
61905b261ecSmrg  # This case only exists to satisfy depend.m4.  It is never actually
62005b261ecSmrg  # run, as this mode is specially recognized in the preamble.
62105b261ecSmrg  exit 1
62205b261ecSmrg  ;;
62305b261ecSmrg
62405b261ecSmrgmakedepend)
62505b261ecSmrg  "$@" || exit $?
62605b261ecSmrg  # Remove any Libtool call
62705b261ecSmrg  if test "$libtool" = yes; then
62835c4bbdfSmrg    while test "X$1" != 'X--mode=compile'; do
62905b261ecSmrg      shift
63005b261ecSmrg    done
63105b261ecSmrg    shift
63205b261ecSmrg  fi
63305b261ecSmrg  # X makedepend
63405b261ecSmrg  shift
63535c4bbdfSmrg  cleared=no eat=no
63635c4bbdfSmrg  for arg
63735c4bbdfSmrg  do
63805b261ecSmrg    case $cleared in
63905b261ecSmrg    no)
64005b261ecSmrg      set ""; shift
64105b261ecSmrg      cleared=yes ;;
64205b261ecSmrg    esac
64335c4bbdfSmrg    if test $eat = yes; then
64435c4bbdfSmrg      eat=no
64535c4bbdfSmrg      continue
64635c4bbdfSmrg    fi
64705b261ecSmrg    case "$arg" in
64805b261ecSmrg    -D*|-I*)
64905b261ecSmrg      set fnord "$@" "$arg"; shift ;;
65005b261ecSmrg    # Strip any option that makedepend may not understand.  Remove
65105b261ecSmrg    # the object too, otherwise makedepend will parse it as a source file.
65235c4bbdfSmrg    -arch)
65335c4bbdfSmrg      eat=yes ;;
65405b261ecSmrg    -*|$object)
65505b261ecSmrg      ;;
65605b261ecSmrg    *)
65705b261ecSmrg      set fnord "$@" "$arg"; shift ;;
65805b261ecSmrg    esac
65905b261ecSmrg  done
66035c4bbdfSmrg  obj_suffix=`echo "$object" | sed 's/^.*\././'`
66105b261ecSmrg  touch "$tmpdepfile"
66205b261ecSmrg  ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
66305b261ecSmrg  rm -f "$depfile"
66435c4bbdfSmrg  # makedepend may prepend the VPATH from the source file name to the object.
66535c4bbdfSmrg  # No need to regex-escape $object, excess matching of '.' is harmless.
66635c4bbdfSmrg  sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile"
66735c4bbdfSmrg  # Some versions of the HPUX 10.20 sed can't process the last invocation
66835c4bbdfSmrg  # correctly.  Breaking it into two sed invocations is a workaround.
66935c4bbdfSmrg  sed '1,2d' "$tmpdepfile" \
67035c4bbdfSmrg    | tr ' ' "$nl" \
67135c4bbdfSmrg    | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
67235c4bbdfSmrg    | sed -e 's/$/ :/' >> "$depfile"
67305b261ecSmrg  rm -f "$tmpdepfile" "$tmpdepfile".bak
67405b261ecSmrg  ;;
67505b261ecSmrg
67605b261ecSmrgcpp)
67705b261ecSmrg  # Important note: in order to support this mode, a compiler *must*
67805b261ecSmrg  # always write the preprocessed file to stdout.
67905b261ecSmrg  "$@" || exit $?
68005b261ecSmrg
68105b261ecSmrg  # Remove the call to Libtool.
68205b261ecSmrg  if test "$libtool" = yes; then
68335c4bbdfSmrg    while test "X$1" != 'X--mode=compile'; do
68405b261ecSmrg      shift
68505b261ecSmrg    done
68605b261ecSmrg    shift
68705b261ecSmrg  fi
68805b261ecSmrg
68935c4bbdfSmrg  # Remove '-o $object'.
69005b261ecSmrg  IFS=" "
69105b261ecSmrg  for arg
69205b261ecSmrg  do
69305b261ecSmrg    case $arg in
69405b261ecSmrg    -o)
69505b261ecSmrg      shift
69605b261ecSmrg      ;;
69705b261ecSmrg    $object)
69805b261ecSmrg      shift
69905b261ecSmrg      ;;
70005b261ecSmrg    *)
70105b261ecSmrg      set fnord "$@" "$arg"
70205b261ecSmrg      shift # fnord
70305b261ecSmrg      shift # $arg
70405b261ecSmrg      ;;
70505b261ecSmrg    esac
70605b261ecSmrg  done
70705b261ecSmrg
70835c4bbdfSmrg  "$@" -E \
70935c4bbdfSmrg    | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
71035c4bbdfSmrg             -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
71135c4bbdfSmrg    | sed '$ s: \\$::' > "$tmpdepfile"
71205b261ecSmrg  rm -f "$depfile"
71305b261ecSmrg  echo "$object : \\" > "$depfile"
71405b261ecSmrg  cat < "$tmpdepfile" >> "$depfile"
71505b261ecSmrg  sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
71605b261ecSmrg  rm -f "$tmpdepfile"
71705b261ecSmrg  ;;
71805b261ecSmrg
71905b261ecSmrgmsvisualcpp)
72005b261ecSmrg  # Important note: in order to support this mode, a compiler *must*
72135c4bbdfSmrg  # always write the preprocessed file to stdout.
72205b261ecSmrg  "$@" || exit $?
72335c4bbdfSmrg
72435c4bbdfSmrg  # Remove the call to Libtool.
72535c4bbdfSmrg  if test "$libtool" = yes; then
72635c4bbdfSmrg    while test "X$1" != 'X--mode=compile'; do
72735c4bbdfSmrg      shift
72835c4bbdfSmrg    done
72935c4bbdfSmrg    shift
73035c4bbdfSmrg  fi
73135c4bbdfSmrg
73205b261ecSmrg  IFS=" "
73305b261ecSmrg  for arg
73405b261ecSmrg  do
73505b261ecSmrg    case "$arg" in
73635c4bbdfSmrg    -o)
73735c4bbdfSmrg      shift
73835c4bbdfSmrg      ;;
73935c4bbdfSmrg    $object)
74035c4bbdfSmrg      shift
74135c4bbdfSmrg      ;;
74205b261ecSmrg    "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
74335c4bbdfSmrg        set fnord "$@"
74435c4bbdfSmrg        shift
74535c4bbdfSmrg        shift
74635c4bbdfSmrg        ;;
74705b261ecSmrg    *)
74835c4bbdfSmrg        set fnord "$@" "$arg"
74935c4bbdfSmrg        shift
75035c4bbdfSmrg        shift
75135c4bbdfSmrg        ;;
75205b261ecSmrg    esac
75305b261ecSmrg  done
75435c4bbdfSmrg  "$@" -E 2>/dev/null |
75535c4bbdfSmrg  sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile"
75605b261ecSmrg  rm -f "$depfile"
75705b261ecSmrg  echo "$object : \\" > "$depfile"
75835c4bbdfSmrg  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile"
75935c4bbdfSmrg  echo "$tab" >> "$depfile"
76035c4bbdfSmrg  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile"
76105b261ecSmrg  rm -f "$tmpdepfile"
76205b261ecSmrg  ;;
76305b261ecSmrg
76435c4bbdfSmrgmsvcmsys)
76535c4bbdfSmrg  # This case exists only to let depend.m4 do its work.  It works by
76635c4bbdfSmrg  # looking at the text of this script.  This case will never be run,
76735c4bbdfSmrg  # since it is checked for above.
76835c4bbdfSmrg  exit 1
76935c4bbdfSmrg  ;;
77035c4bbdfSmrg
77105b261ecSmrgnone)
77205b261ecSmrg  exec "$@"
77305b261ecSmrg  ;;
77405b261ecSmrg
77505b261ecSmrg*)
77605b261ecSmrg  echo "Unknown depmode $depmode" 1>&2
77705b261ecSmrg  exit 1
77805b261ecSmrg  ;;
77905b261ecSmrgesac
78005b261ecSmrg
78105b261ecSmrgexit 0
78205b261ecSmrg
78305b261ecSmrg# Local Variables:
78405b261ecSmrg# mode: shell-script
78505b261ecSmrg# sh-indentation: 2
78605b261ecSmrg# eval: (add-hook 'write-file-hooks 'time-stamp)
78705b261ecSmrg# time-stamp-start: "scriptversion="
78805b261ecSmrg# time-stamp-format: "%:y-%02m-%02d.%02H"
7891b5d61b8Smrg# time-stamp-time-zone: "UTC0"
79035c4bbdfSmrg# time-stamp-end: "; # UTC"
79105b261ecSmrg# End:
792