xref: /netbsd-src/external/lgpl3/mpc/dist/build-aux/depcomp (revision 367b82799ab709709d3c3b541df56a2a14644d3e)
190a8ff21Smrg#!/bin/sh
290a8ff21Smrg# depcomp - compile a program generating dependencies as side-effects
390a8ff21Smrg
490a8ff21Smrgscriptversion=2018-03-07.03; # UTC
590a8ff21Smrg
6*367b8279Smrg# Copyright (C) 1999-2021 Free Software Foundation, Inc.
790a8ff21Smrg
890a8ff21Smrg# This program is free software; you can redistribute it and/or modify
990a8ff21Smrg# it under the terms of the GNU General Public License as published by
1090a8ff21Smrg# the Free Software Foundation; either version 2, or (at your option)
1190a8ff21Smrg# any later version.
1290a8ff21Smrg
1390a8ff21Smrg# This program is distributed in the hope that it will be useful,
1490a8ff21Smrg# but WITHOUT ANY WARRANTY; without even the implied warranty of
1590a8ff21Smrg# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1690a8ff21Smrg# GNU General Public License for more details.
1790a8ff21Smrg
1890a8ff21Smrg# You should have received a copy of the GNU General Public License
1990a8ff21Smrg# along with this program.  If not, see <https://www.gnu.org/licenses/>.
2090a8ff21Smrg
2190a8ff21Smrg# As a special exception to the GNU General Public License, if you
2290a8ff21Smrg# distribute this file as part of a program that contains a
2390a8ff21Smrg# configuration script generated by Autoconf, you may include it under
2490a8ff21Smrg# the same distribution terms that you use for the rest of that program.
2590a8ff21Smrg
2690a8ff21Smrg# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>.
2790a8ff21Smrg
2890a8ff21Smrgcase $1 in
2990a8ff21Smrg  '')
3090a8ff21Smrg    echo "$0: No command.  Try '$0 --help' for more information." 1>&2
3190a8ff21Smrg    exit 1;
3290a8ff21Smrg    ;;
3390a8ff21Smrg  -h | --h*)
3490a8ff21Smrg    cat <<\EOF
3590a8ff21SmrgUsage: depcomp [--help] [--version] PROGRAM [ARGS]
3690a8ff21Smrg
3790a8ff21SmrgRun PROGRAMS ARGS to compile a file, generating dependencies
3890a8ff21Smrgas side-effects.
3990a8ff21Smrg
4090a8ff21SmrgEnvironment variables:
4190a8ff21Smrg  depmode     Dependency tracking mode.
4290a8ff21Smrg  source      Source file read by 'PROGRAMS ARGS'.
4390a8ff21Smrg  object      Object file output by 'PROGRAMS ARGS'.
4490a8ff21Smrg  DEPDIR      directory where to store dependencies.
4590a8ff21Smrg  depfile     Dependency file to output.
4690a8ff21Smrg  tmpdepfile  Temporary file to use when outputting dependencies.
4790a8ff21Smrg  libtool     Whether libtool is used (yes/no).
4890a8ff21Smrg
4990a8ff21SmrgReport bugs to <bug-automake@gnu.org>.
5090a8ff21SmrgEOF
5190a8ff21Smrg    exit $?
5290a8ff21Smrg    ;;
5390a8ff21Smrg  -v | --v*)
5490a8ff21Smrg    echo "depcomp $scriptversion"
5590a8ff21Smrg    exit $?
5690a8ff21Smrg    ;;
5790a8ff21Smrgesac
5890a8ff21Smrg
5990a8ff21Smrg# Get the directory component of the given path, and save it in the
6090a8ff21Smrg# global variables '$dir'.  Note that this directory component will
6190a8ff21Smrg# be either empty or ending with a '/' character.  This is deliberate.
6290a8ff21Smrgset_dir_from ()
6390a8ff21Smrg{
6490a8ff21Smrg  case $1 in
6590a8ff21Smrg    */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;;
6690a8ff21Smrg      *) dir=;;
6790a8ff21Smrg  esac
6890a8ff21Smrg}
6990a8ff21Smrg
7090a8ff21Smrg# Get the suffix-stripped basename of the given path, and save it the
7190a8ff21Smrg# global variable '$base'.
7290a8ff21Smrgset_base_from ()
7390a8ff21Smrg{
7490a8ff21Smrg  base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'`
7590a8ff21Smrg}
7690a8ff21Smrg
7790a8ff21Smrg# If no dependency file was actually created by the compiler invocation,
7890a8ff21Smrg# we still have to create a dummy depfile, to avoid errors with the
7990a8ff21Smrg# Makefile "include basename.Plo" scheme.
8090a8ff21Smrgmake_dummy_depfile ()
8190a8ff21Smrg{
8290a8ff21Smrg  echo "#dummy" > "$depfile"
8390a8ff21Smrg}
8490a8ff21Smrg
8590a8ff21Smrg# Factor out some common post-processing of the generated depfile.
8690a8ff21Smrg# Requires the auxiliary global variable '$tmpdepfile' to be set.
8790a8ff21Smrgaix_post_process_depfile ()
8890a8ff21Smrg{
8990a8ff21Smrg  # If the compiler actually managed to produce a dependency file,
9090a8ff21Smrg  # post-process it.
9190a8ff21Smrg  if test -f "$tmpdepfile"; then
9290a8ff21Smrg    # Each line is of the form 'foo.o: dependency.h'.
9390a8ff21Smrg    # Do two passes, one to just change these to
9490a8ff21Smrg    #   $object: dependency.h
9590a8ff21Smrg    # and one to simply output
9690a8ff21Smrg    #   dependency.h:
9790a8ff21Smrg    # which is needed to avoid the deleted-header problem.
9890a8ff21Smrg    { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile"
9990a8ff21Smrg      sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile"
10090a8ff21Smrg    } > "$depfile"
10190a8ff21Smrg    rm -f "$tmpdepfile"
10290a8ff21Smrg  else
10390a8ff21Smrg    make_dummy_depfile
10490a8ff21Smrg  fi
10590a8ff21Smrg}
10690a8ff21Smrg
10790a8ff21Smrg# A tabulation character.
10890a8ff21Smrgtab='	'
10990a8ff21Smrg# A newline character.
11090a8ff21Smrgnl='
11190a8ff21Smrg'
11290a8ff21Smrg# Character ranges might be problematic outside the C locale.
11390a8ff21Smrg# These definitions help.
11490a8ff21Smrgupper=ABCDEFGHIJKLMNOPQRSTUVWXYZ
11590a8ff21Smrglower=abcdefghijklmnopqrstuvwxyz
11690a8ff21Smrgdigits=0123456789
11790a8ff21Smrgalpha=${upper}${lower}
11890a8ff21Smrg
11990a8ff21Smrgif test -z "$depmode" || test -z "$source" || test -z "$object"; then
12090a8ff21Smrg  echo "depcomp: Variables source, object and depmode must be set" 1>&2
12190a8ff21Smrg  exit 1
12290a8ff21Smrgfi
12390a8ff21Smrg
12490a8ff21Smrg# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.
12590a8ff21Smrgdepfile=${depfile-`echo "$object" |
12690a8ff21Smrg  sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`}
12790a8ff21Smrgtmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
12890a8ff21Smrg
12990a8ff21Smrgrm -f "$tmpdepfile"
13090a8ff21Smrg
13190a8ff21Smrg# Avoid interferences from the environment.
13290a8ff21Smrggccflag= dashmflag=
13390a8ff21Smrg
13490a8ff21Smrg# Some modes work just like other modes, but use different flags.  We
13590a8ff21Smrg# parameterize here, but still list the modes in the big case below,
13690a8ff21Smrg# to make depend.m4 easier to write.  Note that we *cannot* use a case
13790a8ff21Smrg# here, because this file can only contain one case statement.
13890a8ff21Smrgif test "$depmode" = hp; then
13990a8ff21Smrg  # HP compiler uses -M and no extra arg.
14090a8ff21Smrg  gccflag=-M
14190a8ff21Smrg  depmode=gcc
14290a8ff21Smrgfi
14390a8ff21Smrg
14490a8ff21Smrgif test "$depmode" = dashXmstdout; then
14590a8ff21Smrg  # This is just like dashmstdout with a different argument.
14690a8ff21Smrg  dashmflag=-xM
14790a8ff21Smrg  depmode=dashmstdout
14890a8ff21Smrgfi
14990a8ff21Smrg
15090a8ff21Smrgcygpath_u="cygpath -u -f -"
15190a8ff21Smrgif test "$depmode" = msvcmsys; then
15290a8ff21Smrg  # This is just like msvisualcpp but w/o cygpath translation.
15390a8ff21Smrg  # Just convert the backslash-escaped backslashes to single forward
15490a8ff21Smrg  # slashes to satisfy depend.m4
15590a8ff21Smrg  cygpath_u='sed s,\\\\,/,g'
15690a8ff21Smrg  depmode=msvisualcpp
15790a8ff21Smrgfi
15890a8ff21Smrg
15990a8ff21Smrgif test "$depmode" = msvc7msys; then
16090a8ff21Smrg  # This is just like msvc7 but w/o cygpath translation.
16190a8ff21Smrg  # Just convert the backslash-escaped backslashes to single forward
16290a8ff21Smrg  # slashes to satisfy depend.m4
16390a8ff21Smrg  cygpath_u='sed s,\\\\,/,g'
16490a8ff21Smrg  depmode=msvc7
16590a8ff21Smrgfi
16690a8ff21Smrg
16790a8ff21Smrgif test "$depmode" = xlc; then
16890a8ff21Smrg  # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information.
16990a8ff21Smrg  gccflag=-qmakedep=gcc,-MF
17090a8ff21Smrg  depmode=gcc
17190a8ff21Smrgfi
17290a8ff21Smrg
17390a8ff21Smrgcase "$depmode" in
17490a8ff21Smrggcc3)
17590a8ff21Smrg## gcc 3 implements dependency tracking that does exactly what
17690a8ff21Smrg## we want.  Yay!  Note: for some reason libtool 1.4 doesn't like
17790a8ff21Smrg## it if -MD -MP comes after the -MF stuff.  Hmm.
17890a8ff21Smrg## Unfortunately, FreeBSD c89 acceptance of flags depends upon
17990a8ff21Smrg## the command line argument order; so add the flags where they
18090a8ff21Smrg## appear in depend2.am.  Note that the slowdown incurred here
18190a8ff21Smrg## affects only configure: in makefiles, %FASTDEP% shortcuts this.
18290a8ff21Smrg  for arg
18390a8ff21Smrg  do
18490a8ff21Smrg    case $arg in
18590a8ff21Smrg    -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;;
18690a8ff21Smrg    *)  set fnord "$@" "$arg" ;;
18790a8ff21Smrg    esac
18890a8ff21Smrg    shift # fnord
18990a8ff21Smrg    shift # $arg
19090a8ff21Smrg  done
19190a8ff21Smrg  "$@"
19290a8ff21Smrg  stat=$?
19390a8ff21Smrg  if test $stat -ne 0; then
19490a8ff21Smrg    rm -f "$tmpdepfile"
19590a8ff21Smrg    exit $stat
19690a8ff21Smrg  fi
19790a8ff21Smrg  mv "$tmpdepfile" "$depfile"
19890a8ff21Smrg  ;;
19990a8ff21Smrg
20090a8ff21Smrggcc)
20190a8ff21Smrg## Note that this doesn't just cater to obsosete pre-3.x GCC compilers.
20290a8ff21Smrg## but also to in-use compilers like IMB xlc/xlC and the HP C compiler.
20390a8ff21Smrg## (see the conditional assignment to $gccflag above).
20490a8ff21Smrg## There are various ways to get dependency output from gcc.  Here's
20590a8ff21Smrg## why we pick this rather obscure method:
20690a8ff21Smrg## - Don't want to use -MD because we'd like the dependencies to end
20790a8ff21Smrg##   up in a subdir.  Having to rename by hand is ugly.
20890a8ff21Smrg##   (We might end up doing this anyway to support other compilers.)
20990a8ff21Smrg## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
21090a8ff21Smrg##   -MM, not -M (despite what the docs say).  Also, it might not be
21190a8ff21Smrg##   supported by the other compilers which use the 'gcc' depmode.
21290a8ff21Smrg## - Using -M directly means running the compiler twice (even worse
21390a8ff21Smrg##   than renaming).
21490a8ff21Smrg  if test -z "$gccflag"; then
21590a8ff21Smrg    gccflag=-MD,
21690a8ff21Smrg  fi
21790a8ff21Smrg  "$@" -Wp,"$gccflag$tmpdepfile"
21890a8ff21Smrg  stat=$?
21990a8ff21Smrg  if test $stat -ne 0; then
22090a8ff21Smrg    rm -f "$tmpdepfile"
22190a8ff21Smrg    exit $stat
22290a8ff21Smrg  fi
22390a8ff21Smrg  rm -f "$depfile"
22490a8ff21Smrg  echo "$object : \\" > "$depfile"
22590a8ff21Smrg  # The second -e expression handles DOS-style file names with drive
22690a8ff21Smrg  # letters.
22790a8ff21Smrg  sed -e 's/^[^:]*: / /' \
22890a8ff21Smrg      -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
22990a8ff21Smrg## This next piece of magic avoids the "deleted header file" problem.
23090a8ff21Smrg## The problem is that when a header file which appears in a .P file
23190a8ff21Smrg## is deleted, the dependency causes make to die (because there is
23290a8ff21Smrg## typically no way to rebuild the header).  We avoid this by adding
23390a8ff21Smrg## dummy dependencies for each header file.  Too bad gcc doesn't do
23490a8ff21Smrg## this for us directly.
23590a8ff21Smrg## Some versions of gcc put a space before the ':'.  On the theory
23690a8ff21Smrg## that the space means something, we add a space to the output as
23790a8ff21Smrg## well.  hp depmode also adds that space, but also prefixes the VPATH
23890a8ff21Smrg## to the object.  Take care to not repeat it in the output.
23990a8ff21Smrg## Some versions of the HPUX 10.20 sed can't process this invocation
24090a8ff21Smrg## correctly.  Breaking it into two sed invocations is a workaround.
24190a8ff21Smrg  tr ' ' "$nl" < "$tmpdepfile" \
24290a8ff21Smrg    | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \
24390a8ff21Smrg    | sed -e 's/$/ :/' >> "$depfile"
24490a8ff21Smrg  rm -f "$tmpdepfile"
24590a8ff21Smrg  ;;
24690a8ff21Smrg
24790a8ff21Smrghp)
24890a8ff21Smrg  # This case exists only to let depend.m4 do its work.  It works by
24990a8ff21Smrg  # looking at the text of this script.  This case will never be run,
25090a8ff21Smrg  # since it is checked for above.
25190a8ff21Smrg  exit 1
25290a8ff21Smrg  ;;
25390a8ff21Smrg
25490a8ff21Smrgsgi)
25590a8ff21Smrg  if test "$libtool" = yes; then
25690a8ff21Smrg    "$@" "-Wp,-MDupdate,$tmpdepfile"
25790a8ff21Smrg  else
25890a8ff21Smrg    "$@" -MDupdate "$tmpdepfile"
25990a8ff21Smrg  fi
26090a8ff21Smrg  stat=$?
26190a8ff21Smrg  if test $stat -ne 0; then
26290a8ff21Smrg    rm -f "$tmpdepfile"
26390a8ff21Smrg    exit $stat
26490a8ff21Smrg  fi
26590a8ff21Smrg  rm -f "$depfile"
26690a8ff21Smrg
26790a8ff21Smrg  if test -f "$tmpdepfile"; then  # yes, the sourcefile depend on other files
26890a8ff21Smrg    echo "$object : \\" > "$depfile"
26990a8ff21Smrg    # Clip off the initial element (the dependent).  Don't try to be
27090a8ff21Smrg    # clever and replace this with sed code, as IRIX sed won't handle
27190a8ff21Smrg    # lines with more than a fixed number of characters (4096 in
27290a8ff21Smrg    # IRIX 6.2 sed, 8192 in IRIX 6.5).  We also remove comment lines;
27390a8ff21Smrg    # the IRIX cc adds comments like '#:fec' to the end of the
27490a8ff21Smrg    # dependency line.
27590a8ff21Smrg    tr ' ' "$nl" < "$tmpdepfile" \
27690a8ff21Smrg      | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \
27790a8ff21Smrg      | tr "$nl" ' ' >> "$depfile"
27890a8ff21Smrg    echo >> "$depfile"
27990a8ff21Smrg    # The second pass generates a dummy entry for each header file.
28090a8ff21Smrg    tr ' ' "$nl" < "$tmpdepfile" \
28190a8ff21Smrg      | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
28290a8ff21Smrg      >> "$depfile"
28390a8ff21Smrg  else
28490a8ff21Smrg    make_dummy_depfile
28590a8ff21Smrg  fi
28690a8ff21Smrg  rm -f "$tmpdepfile"
28790a8ff21Smrg  ;;
28890a8ff21Smrg
28990a8ff21Smrgxlc)
29090a8ff21Smrg  # This case exists only to let depend.m4 do its work.  It works by
29190a8ff21Smrg  # looking at the text of this script.  This case will never be run,
29290a8ff21Smrg  # since it is checked for above.
29390a8ff21Smrg  exit 1
29490a8ff21Smrg  ;;
29590a8ff21Smrg
29690a8ff21Smrgaix)
29790a8ff21Smrg  # The C for AIX Compiler uses -M and outputs the dependencies
29890a8ff21Smrg  # in a .u file.  In older versions, this file always lives in the
29990a8ff21Smrg  # current directory.  Also, the AIX compiler puts '$object:' at the
30090a8ff21Smrg  # start of each line; $object doesn't have directory information.
30190a8ff21Smrg  # Version 6 uses the directory in both cases.
30290a8ff21Smrg  set_dir_from "$object"
30390a8ff21Smrg  set_base_from "$object"
30490a8ff21Smrg  if test "$libtool" = yes; then
30590a8ff21Smrg    tmpdepfile1=$dir$base.u
30690a8ff21Smrg    tmpdepfile2=$base.u
30790a8ff21Smrg    tmpdepfile3=$dir.libs/$base.u
30890a8ff21Smrg    "$@" -Wc,-M
30990a8ff21Smrg  else
31090a8ff21Smrg    tmpdepfile1=$dir$base.u
31190a8ff21Smrg    tmpdepfile2=$dir$base.u
31290a8ff21Smrg    tmpdepfile3=$dir$base.u
31390a8ff21Smrg    "$@" -M
31490a8ff21Smrg  fi
31590a8ff21Smrg  stat=$?
31690a8ff21Smrg  if test $stat -ne 0; then
31790a8ff21Smrg    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
31890a8ff21Smrg    exit $stat
31990a8ff21Smrg  fi
32090a8ff21Smrg
32190a8ff21Smrg  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
32290a8ff21Smrg  do
32390a8ff21Smrg    test -f "$tmpdepfile" && break
32490a8ff21Smrg  done
32590a8ff21Smrg  aix_post_process_depfile
32690a8ff21Smrg  ;;
32790a8ff21Smrg
32890a8ff21Smrgtcc)
32990a8ff21Smrg  # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26
33090a8ff21Smrg  # FIXME: That version still under development at the moment of writing.
33190a8ff21Smrg  #        Make that this statement remains true also for stable, released
33290a8ff21Smrg  #        versions.
33390a8ff21Smrg  # It will wrap lines (doesn't matter whether long or short) with a
33490a8ff21Smrg  # trailing '\', as in:
33590a8ff21Smrg  #
33690a8ff21Smrg  #   foo.o : \
33790a8ff21Smrg  #    foo.c \
33890a8ff21Smrg  #    foo.h \
33990a8ff21Smrg  #
34090a8ff21Smrg  # It will put a trailing '\' even on the last line, and will use leading
34190a8ff21Smrg  # spaces rather than leading tabs (at least since its commit 0394caf7
34290a8ff21Smrg  # "Emit spaces for -MD").
34390a8ff21Smrg  "$@" -MD -MF "$tmpdepfile"
34490a8ff21Smrg  stat=$?
34590a8ff21Smrg  if test $stat -ne 0; then
34690a8ff21Smrg    rm -f "$tmpdepfile"
34790a8ff21Smrg    exit $stat
34890a8ff21Smrg  fi
34990a8ff21Smrg  rm -f "$depfile"
35090a8ff21Smrg  # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'.
35190a8ff21Smrg  # We have to change lines of the first kind to '$object: \'.
35290a8ff21Smrg  sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile"
35390a8ff21Smrg  # And for each line of the second kind, we have to emit a 'dep.h:'
35490a8ff21Smrg  # dummy dependency, to avoid the deleted-header problem.
35590a8ff21Smrg  sed -n -e 's|^  *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile"
35690a8ff21Smrg  rm -f "$tmpdepfile"
35790a8ff21Smrg  ;;
35890a8ff21Smrg
35990a8ff21Smrg## The order of this option in the case statement is important, since the
36090a8ff21Smrg## shell code in configure will try each of these formats in the order
36190a8ff21Smrg## listed in this file.  A plain '-MD' option would be understood by many
36290a8ff21Smrg## compilers, so we must ensure this comes after the gcc and icc options.
36390a8ff21Smrgpgcc)
36490a8ff21Smrg  # Portland's C compiler understands '-MD'.
36590a8ff21Smrg  # Will always output deps to 'file.d' where file is the root name of the
36690a8ff21Smrg  # source file under compilation, even if file resides in a subdirectory.
36790a8ff21Smrg  # The object file name does not affect the name of the '.d' file.
36890a8ff21Smrg  # pgcc 10.2 will output
36990a8ff21Smrg  #    foo.o: sub/foo.c sub/foo.h
37090a8ff21Smrg  # and will wrap long lines using '\' :
37190a8ff21Smrg  #    foo.o: sub/foo.c ... \
37290a8ff21Smrg  #     sub/foo.h ... \
37390a8ff21Smrg  #     ...
37490a8ff21Smrg  set_dir_from "$object"
37590a8ff21Smrg  # Use the source, not the object, to determine the base name, since
37690a8ff21Smrg  # that's sadly what pgcc will do too.
37790a8ff21Smrg  set_base_from "$source"
37890a8ff21Smrg  tmpdepfile=$base.d
37990a8ff21Smrg
38090a8ff21Smrg  # For projects that build the same source file twice into different object
38190a8ff21Smrg  # files, the pgcc approach of using the *source* file root name can cause
38290a8ff21Smrg  # problems in parallel builds.  Use a locking strategy to avoid stomping on
38390a8ff21Smrg  # the same $tmpdepfile.
38490a8ff21Smrg  lockdir=$base.d-lock
38590a8ff21Smrg  trap "
38690a8ff21Smrg    echo '$0: caught signal, cleaning up...' >&2
38790a8ff21Smrg    rmdir '$lockdir'
38890a8ff21Smrg    exit 1
38990a8ff21Smrg  " 1 2 13 15
39090a8ff21Smrg  numtries=100
39190a8ff21Smrg  i=$numtries
39290a8ff21Smrg  while test $i -gt 0; do
39390a8ff21Smrg    # mkdir is a portable test-and-set.
39490a8ff21Smrg    if mkdir "$lockdir" 2>/dev/null; then
39590a8ff21Smrg      # This process acquired the lock.
39690a8ff21Smrg      "$@" -MD
39790a8ff21Smrg      stat=$?
39890a8ff21Smrg      # Release the lock.
39990a8ff21Smrg      rmdir "$lockdir"
40090a8ff21Smrg      break
40190a8ff21Smrg    else
40290a8ff21Smrg      # If the lock is being held by a different process, wait
40390a8ff21Smrg      # until the winning process is done or we timeout.
40490a8ff21Smrg      while test -d "$lockdir" && test $i -gt 0; do
40590a8ff21Smrg        sleep 1
40690a8ff21Smrg        i=`expr $i - 1`
40790a8ff21Smrg      done
40890a8ff21Smrg    fi
40990a8ff21Smrg    i=`expr $i - 1`
41090a8ff21Smrg  done
41190a8ff21Smrg  trap - 1 2 13 15
41290a8ff21Smrg  if test $i -le 0; then
41390a8ff21Smrg    echo "$0: failed to acquire lock after $numtries attempts" >&2
41490a8ff21Smrg    echo "$0: check lockdir '$lockdir'" >&2
41590a8ff21Smrg    exit 1
41690a8ff21Smrg  fi
41790a8ff21Smrg
41890a8ff21Smrg  if test $stat -ne 0; then
41990a8ff21Smrg    rm -f "$tmpdepfile"
42090a8ff21Smrg    exit $stat
42190a8ff21Smrg  fi
42290a8ff21Smrg  rm -f "$depfile"
42390a8ff21Smrg  # Each line is of the form `foo.o: dependent.h',
42490a8ff21Smrg  # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'.
42590a8ff21Smrg  # Do two passes, one to just change these to
42690a8ff21Smrg  # `$object: dependent.h' and one to simply `dependent.h:'.
42790a8ff21Smrg  sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
42890a8ff21Smrg  # Some versions of the HPUX 10.20 sed can't process this invocation
42990a8ff21Smrg  # correctly.  Breaking it into two sed invocations is a workaround.
43090a8ff21Smrg  sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \
43190a8ff21Smrg    | sed -e 's/$/ :/' >> "$depfile"
43290a8ff21Smrg  rm -f "$tmpdepfile"
43390a8ff21Smrg  ;;
43490a8ff21Smrg
43590a8ff21Smrghp2)
43690a8ff21Smrg  # The "hp" stanza above does not work with aCC (C++) and HP's ia64
43790a8ff21Smrg  # compilers, which have integrated preprocessors.  The correct option
43890a8ff21Smrg  # to use with these is +Maked; it writes dependencies to a file named
43990a8ff21Smrg  # 'foo.d', which lands next to the object file, wherever that
44090a8ff21Smrg  # happens to be.
44190a8ff21Smrg  # Much of this is similar to the tru64 case; see comments there.
44290a8ff21Smrg  set_dir_from  "$object"
44390a8ff21Smrg  set_base_from "$object"
44490a8ff21Smrg  if test "$libtool" = yes; then
44590a8ff21Smrg    tmpdepfile1=$dir$base.d
44690a8ff21Smrg    tmpdepfile2=$dir.libs/$base.d
44790a8ff21Smrg    "$@" -Wc,+Maked
44890a8ff21Smrg  else
44990a8ff21Smrg    tmpdepfile1=$dir$base.d
45090a8ff21Smrg    tmpdepfile2=$dir$base.d
45190a8ff21Smrg    "$@" +Maked
45290a8ff21Smrg  fi
45390a8ff21Smrg  stat=$?
45490a8ff21Smrg  if test $stat -ne 0; then
45590a8ff21Smrg     rm -f "$tmpdepfile1" "$tmpdepfile2"
45690a8ff21Smrg     exit $stat
45790a8ff21Smrg  fi
45890a8ff21Smrg
45990a8ff21Smrg  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2"
46090a8ff21Smrg  do
46190a8ff21Smrg    test -f "$tmpdepfile" && break
46290a8ff21Smrg  done
46390a8ff21Smrg  if test -f "$tmpdepfile"; then
46490a8ff21Smrg    sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile"
46590a8ff21Smrg    # Add 'dependent.h:' lines.
46690a8ff21Smrg    sed -ne '2,${
46790a8ff21Smrg               s/^ *//
46890a8ff21Smrg               s/ \\*$//
46990a8ff21Smrg               s/$/:/
47090a8ff21Smrg               p
47190a8ff21Smrg             }' "$tmpdepfile" >> "$depfile"
47290a8ff21Smrg  else
47390a8ff21Smrg    make_dummy_depfile
47490a8ff21Smrg  fi
47590a8ff21Smrg  rm -f "$tmpdepfile" "$tmpdepfile2"
47690a8ff21Smrg  ;;
47790a8ff21Smrg
47890a8ff21Smrgtru64)
47990a8ff21Smrg  # The Tru64 compiler uses -MD to generate dependencies as a side
48090a8ff21Smrg  # effect.  'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'.
48190a8ff21Smrg  # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
48290a8ff21Smrg  # dependencies in 'foo.d' instead, so we check for that too.
48390a8ff21Smrg  # Subdirectories are respected.
48490a8ff21Smrg  set_dir_from  "$object"
48590a8ff21Smrg  set_base_from "$object"
48690a8ff21Smrg
48790a8ff21Smrg  if test "$libtool" = yes; then
48890a8ff21Smrg    # Libtool generates 2 separate objects for the 2 libraries.  These
48990a8ff21Smrg    # two compilations output dependencies in $dir.libs/$base.o.d and
49090a8ff21Smrg    # in $dir$base.o.d.  We have to check for both files, because
49190a8ff21Smrg    # one of the two compilations can be disabled.  We should prefer
49290a8ff21Smrg    # $dir$base.o.d over $dir.libs/$base.o.d because the latter is
49390a8ff21Smrg    # automatically cleaned when .libs/ is deleted, while ignoring
49490a8ff21Smrg    # the former would cause a distcleancheck panic.
49590a8ff21Smrg    tmpdepfile1=$dir$base.o.d          # libtool 1.5
49690a8ff21Smrg    tmpdepfile2=$dir.libs/$base.o.d    # Likewise.
49790a8ff21Smrg    tmpdepfile3=$dir.libs/$base.d      # Compaq CCC V6.2-504
49890a8ff21Smrg    "$@" -Wc,-MD
49990a8ff21Smrg  else
50090a8ff21Smrg    tmpdepfile1=$dir$base.d
50190a8ff21Smrg    tmpdepfile2=$dir$base.d
50290a8ff21Smrg    tmpdepfile3=$dir$base.d
50390a8ff21Smrg    "$@" -MD
50490a8ff21Smrg  fi
50590a8ff21Smrg
50690a8ff21Smrg  stat=$?
50790a8ff21Smrg  if test $stat -ne 0; then
50890a8ff21Smrg    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
50990a8ff21Smrg    exit $stat
51090a8ff21Smrg  fi
51190a8ff21Smrg
51290a8ff21Smrg  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
51390a8ff21Smrg  do
51490a8ff21Smrg    test -f "$tmpdepfile" && break
51590a8ff21Smrg  done
51690a8ff21Smrg  # Same post-processing that is required for AIX mode.
51790a8ff21Smrg  aix_post_process_depfile
51890a8ff21Smrg  ;;
51990a8ff21Smrg
52090a8ff21Smrgmsvc7)
52190a8ff21Smrg  if test "$libtool" = yes; then
52290a8ff21Smrg    showIncludes=-Wc,-showIncludes
52390a8ff21Smrg  else
52490a8ff21Smrg    showIncludes=-showIncludes
52590a8ff21Smrg  fi
52690a8ff21Smrg  "$@" $showIncludes > "$tmpdepfile"
52790a8ff21Smrg  stat=$?
52890a8ff21Smrg  grep -v '^Note: including file: ' "$tmpdepfile"
52990a8ff21Smrg  if test $stat -ne 0; then
53090a8ff21Smrg    rm -f "$tmpdepfile"
53190a8ff21Smrg    exit $stat
53290a8ff21Smrg  fi
53390a8ff21Smrg  rm -f "$depfile"
53490a8ff21Smrg  echo "$object : \\" > "$depfile"
53590a8ff21Smrg  # The first sed program below extracts the file names and escapes
53690a8ff21Smrg  # backslashes for cygpath.  The second sed program outputs the file
53790a8ff21Smrg  # name when reading, but also accumulates all include files in the
53890a8ff21Smrg  # hold buffer in order to output them again at the end.  This only
53990a8ff21Smrg  # works with sed implementations that can handle large buffers.
54090a8ff21Smrg  sed < "$tmpdepfile" -n '
54190a8ff21Smrg/^Note: including file:  *\(.*\)/ {
54290a8ff21Smrg  s//\1/
54390a8ff21Smrg  s/\\/\\\\/g
54490a8ff21Smrg  p
54590a8ff21Smrg}' | $cygpath_u | sort -u | sed -n '
54690a8ff21Smrgs/ /\\ /g
54790a8ff21Smrgs/\(.*\)/'"$tab"'\1 \\/p
54890a8ff21Smrgs/.\(.*\) \\/\1:/
54990a8ff21SmrgH
55090a8ff21Smrg$ {
55190a8ff21Smrg  s/.*/'"$tab"'/
55290a8ff21Smrg  G
55390a8ff21Smrg  p
55490a8ff21Smrg}' >> "$depfile"
55590a8ff21Smrg  echo >> "$depfile" # make sure the fragment doesn't end with a backslash
55690a8ff21Smrg  rm -f "$tmpdepfile"
55790a8ff21Smrg  ;;
55890a8ff21Smrg
55990a8ff21Smrgmsvc7msys)
56090a8ff21Smrg  # This case exists only to let depend.m4 do its work.  It works by
56190a8ff21Smrg  # looking at the text of this script.  This case will never be run,
56290a8ff21Smrg  # since it is checked for above.
56390a8ff21Smrg  exit 1
56490a8ff21Smrg  ;;
56590a8ff21Smrg
56690a8ff21Smrg#nosideeffect)
56790a8ff21Smrg  # This comment above is used by automake to tell side-effect
56890a8ff21Smrg  # dependency tracking mechanisms from slower ones.
56990a8ff21Smrg
57090a8ff21Smrgdashmstdout)
57190a8ff21Smrg  # Important note: in order to support this mode, a compiler *must*
57290a8ff21Smrg  # always write the preprocessed file to stdout, regardless of -o.
57390a8ff21Smrg  "$@" || exit $?
57490a8ff21Smrg
57590a8ff21Smrg  # Remove the call to Libtool.
57690a8ff21Smrg  if test "$libtool" = yes; then
57790a8ff21Smrg    while test "X$1" != 'X--mode=compile'; do
57890a8ff21Smrg      shift
57990a8ff21Smrg    done
58090a8ff21Smrg    shift
58190a8ff21Smrg  fi
58290a8ff21Smrg
58390a8ff21Smrg  # Remove '-o $object'.
58490a8ff21Smrg  IFS=" "
58590a8ff21Smrg  for arg
58690a8ff21Smrg  do
58790a8ff21Smrg    case $arg in
58890a8ff21Smrg    -o)
58990a8ff21Smrg      shift
59090a8ff21Smrg      ;;
59190a8ff21Smrg    $object)
59290a8ff21Smrg      shift
59390a8ff21Smrg      ;;
59490a8ff21Smrg    *)
59590a8ff21Smrg      set fnord "$@" "$arg"
59690a8ff21Smrg      shift # fnord
59790a8ff21Smrg      shift # $arg
59890a8ff21Smrg      ;;
59990a8ff21Smrg    esac
60090a8ff21Smrg  done
60190a8ff21Smrg
60290a8ff21Smrg  test -z "$dashmflag" && dashmflag=-M
60390a8ff21Smrg  # Require at least two characters before searching for ':'
60490a8ff21Smrg  # in the target name.  This is to cope with DOS-style filenames:
60590a8ff21Smrg  # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise.
60690a8ff21Smrg  "$@" $dashmflag |
60790a8ff21Smrg    sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile"
60890a8ff21Smrg  rm -f "$depfile"
60990a8ff21Smrg  cat < "$tmpdepfile" > "$depfile"
61090a8ff21Smrg  # Some versions of the HPUX 10.20 sed can't process this sed invocation
61190a8ff21Smrg  # correctly.  Breaking it into two sed invocations is a workaround.
61290a8ff21Smrg  tr ' ' "$nl" < "$tmpdepfile" \
61390a8ff21Smrg    | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
61490a8ff21Smrg    | sed -e 's/$/ :/' >> "$depfile"
61590a8ff21Smrg  rm -f "$tmpdepfile"
61690a8ff21Smrg  ;;
61790a8ff21Smrg
61890a8ff21SmrgdashXmstdout)
61990a8ff21Smrg  # This case only exists to satisfy depend.m4.  It is never actually
62090a8ff21Smrg  # run, as this mode is specially recognized in the preamble.
62190a8ff21Smrg  exit 1
62290a8ff21Smrg  ;;
62390a8ff21Smrg
62490a8ff21Smrgmakedepend)
62590a8ff21Smrg  "$@" || exit $?
62690a8ff21Smrg  # Remove any Libtool call
62790a8ff21Smrg  if test "$libtool" = yes; then
62890a8ff21Smrg    while test "X$1" != 'X--mode=compile'; do
62990a8ff21Smrg      shift
63090a8ff21Smrg    done
63190a8ff21Smrg    shift
63290a8ff21Smrg  fi
63390a8ff21Smrg  # X makedepend
63490a8ff21Smrg  shift
63590a8ff21Smrg  cleared=no eat=no
63690a8ff21Smrg  for arg
63790a8ff21Smrg  do
63890a8ff21Smrg    case $cleared in
63990a8ff21Smrg    no)
64090a8ff21Smrg      set ""; shift
64190a8ff21Smrg      cleared=yes ;;
64290a8ff21Smrg    esac
64390a8ff21Smrg    if test $eat = yes; then
64490a8ff21Smrg      eat=no
64590a8ff21Smrg      continue
64690a8ff21Smrg    fi
64790a8ff21Smrg    case "$arg" in
64890a8ff21Smrg    -D*|-I*)
64990a8ff21Smrg      set fnord "$@" "$arg"; shift ;;
65090a8ff21Smrg    # Strip any option that makedepend may not understand.  Remove
65190a8ff21Smrg    # the object too, otherwise makedepend will parse it as a source file.
65290a8ff21Smrg    -arch)
65390a8ff21Smrg      eat=yes ;;
65490a8ff21Smrg    -*|$object)
65590a8ff21Smrg      ;;
65690a8ff21Smrg    *)
65790a8ff21Smrg      set fnord "$@" "$arg"; shift ;;
65890a8ff21Smrg    esac
65990a8ff21Smrg  done
66090a8ff21Smrg  obj_suffix=`echo "$object" | sed 's/^.*\././'`
66190a8ff21Smrg  touch "$tmpdepfile"
66290a8ff21Smrg  ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
66390a8ff21Smrg  rm -f "$depfile"
66490a8ff21Smrg  # makedepend may prepend the VPATH from the source file name to the object.
66590a8ff21Smrg  # No need to regex-escape $object, excess matching of '.' is harmless.
66690a8ff21Smrg  sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile"
66790a8ff21Smrg  # Some versions of the HPUX 10.20 sed can't process the last invocation
66890a8ff21Smrg  # correctly.  Breaking it into two sed invocations is a workaround.
66990a8ff21Smrg  sed '1,2d' "$tmpdepfile" \
67090a8ff21Smrg    | tr ' ' "$nl" \
67190a8ff21Smrg    | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
67290a8ff21Smrg    | sed -e 's/$/ :/' >> "$depfile"
67390a8ff21Smrg  rm -f "$tmpdepfile" "$tmpdepfile".bak
67490a8ff21Smrg  ;;
67590a8ff21Smrg
67690a8ff21Smrgcpp)
67790a8ff21Smrg  # Important note: in order to support this mode, a compiler *must*
67890a8ff21Smrg  # always write the preprocessed file to stdout.
67990a8ff21Smrg  "$@" || exit $?
68090a8ff21Smrg
68190a8ff21Smrg  # Remove the call to Libtool.
68290a8ff21Smrg  if test "$libtool" = yes; then
68390a8ff21Smrg    while test "X$1" != 'X--mode=compile'; do
68490a8ff21Smrg      shift
68590a8ff21Smrg    done
68690a8ff21Smrg    shift
68790a8ff21Smrg  fi
68890a8ff21Smrg
68990a8ff21Smrg  # Remove '-o $object'.
69090a8ff21Smrg  IFS=" "
69190a8ff21Smrg  for arg
69290a8ff21Smrg  do
69390a8ff21Smrg    case $arg in
69490a8ff21Smrg    -o)
69590a8ff21Smrg      shift
69690a8ff21Smrg      ;;
69790a8ff21Smrg    $object)
69890a8ff21Smrg      shift
69990a8ff21Smrg      ;;
70090a8ff21Smrg    *)
70190a8ff21Smrg      set fnord "$@" "$arg"
70290a8ff21Smrg      shift # fnord
70390a8ff21Smrg      shift # $arg
70490a8ff21Smrg      ;;
70590a8ff21Smrg    esac
70690a8ff21Smrg  done
70790a8ff21Smrg
70890a8ff21Smrg  "$@" -E \
70990a8ff21Smrg    | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
71090a8ff21Smrg             -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
71190a8ff21Smrg    | sed '$ s: \\$::' > "$tmpdepfile"
71290a8ff21Smrg  rm -f "$depfile"
71390a8ff21Smrg  echo "$object : \\" > "$depfile"
71490a8ff21Smrg  cat < "$tmpdepfile" >> "$depfile"
71590a8ff21Smrg  sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
71690a8ff21Smrg  rm -f "$tmpdepfile"
71790a8ff21Smrg  ;;
71890a8ff21Smrg
71990a8ff21Smrgmsvisualcpp)
72090a8ff21Smrg  # Important note: in order to support this mode, a compiler *must*
72190a8ff21Smrg  # always write the preprocessed file to stdout.
72290a8ff21Smrg  "$@" || exit $?
72390a8ff21Smrg
72490a8ff21Smrg  # Remove the call to Libtool.
72590a8ff21Smrg  if test "$libtool" = yes; then
72690a8ff21Smrg    while test "X$1" != 'X--mode=compile'; do
72790a8ff21Smrg      shift
72890a8ff21Smrg    done
72990a8ff21Smrg    shift
73090a8ff21Smrg  fi
73190a8ff21Smrg
73290a8ff21Smrg  IFS=" "
73390a8ff21Smrg  for arg
73490a8ff21Smrg  do
73590a8ff21Smrg    case "$arg" in
73690a8ff21Smrg    -o)
73790a8ff21Smrg      shift
73890a8ff21Smrg      ;;
73990a8ff21Smrg    $object)
74090a8ff21Smrg      shift
74190a8ff21Smrg      ;;
74290a8ff21Smrg    "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
74390a8ff21Smrg        set fnord "$@"
74490a8ff21Smrg        shift
74590a8ff21Smrg        shift
74690a8ff21Smrg        ;;
74790a8ff21Smrg    *)
74890a8ff21Smrg        set fnord "$@" "$arg"
74990a8ff21Smrg        shift
75090a8ff21Smrg        shift
75190a8ff21Smrg        ;;
75290a8ff21Smrg    esac
75390a8ff21Smrg  done
75490a8ff21Smrg  "$@" -E 2>/dev/null |
75590a8ff21Smrg  sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile"
75690a8ff21Smrg  rm -f "$depfile"
75790a8ff21Smrg  echo "$object : \\" > "$depfile"
75890a8ff21Smrg  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile"
75990a8ff21Smrg  echo "$tab" >> "$depfile"
76090a8ff21Smrg  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile"
76190a8ff21Smrg  rm -f "$tmpdepfile"
76290a8ff21Smrg  ;;
76390a8ff21Smrg
76490a8ff21Smrgmsvcmsys)
76590a8ff21Smrg  # This case exists only to let depend.m4 do its work.  It works by
76690a8ff21Smrg  # looking at the text of this script.  This case will never be run,
76790a8ff21Smrg  # since it is checked for above.
76890a8ff21Smrg  exit 1
76990a8ff21Smrg  ;;
77090a8ff21Smrg
77190a8ff21Smrgnone)
77290a8ff21Smrg  exec "$@"
77390a8ff21Smrg  ;;
77490a8ff21Smrg
77590a8ff21Smrg*)
77690a8ff21Smrg  echo "Unknown depmode $depmode" 1>&2
77790a8ff21Smrg  exit 1
77890a8ff21Smrg  ;;
77990a8ff21Smrgesac
78090a8ff21Smrg
78190a8ff21Smrgexit 0
78290a8ff21Smrg
78390a8ff21Smrg# Local Variables:
78490a8ff21Smrg# mode: shell-script
78590a8ff21Smrg# sh-indentation: 2
78690a8ff21Smrg# eval: (add-hook 'before-save-hook 'time-stamp)
78790a8ff21Smrg# time-stamp-start: "scriptversion="
78890a8ff21Smrg# time-stamp-format: "%:y-%02m-%02d.%02H"
78990a8ff21Smrg# time-stamp-time-zone: "UTC0"
79090a8ff21Smrg# time-stamp-end: "; # UTC"
79190a8ff21Smrg# End:
792