1ff7e0accSmrg#! /bin/sh
2ff7e0accSmrg# depcomp - compile a program generating dependencies as side-effects
3ff7e0accSmrg
42163f7f8Smrgscriptversion=2018-03-07.03; # UTC
5ff7e0accSmrg
62163f7f8Smrg# Copyright (C) 1999-2021 Free Software Foundation, Inc.
7ff7e0accSmrg
8ff7e0accSmrg# This program is free software; you can redistribute it and/or modify
9ff7e0accSmrg# it under the terms of the GNU General Public License as published by
10ff7e0accSmrg# the Free Software Foundation; either version 2, or (at your option)
11ff7e0accSmrg# any later version.
12ff7e0accSmrg
13ff7e0accSmrg# This program is distributed in the hope that it will be useful,
14ff7e0accSmrg# but WITHOUT ANY WARRANTY; without even the implied warranty of
15ff7e0accSmrg# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16ff7e0accSmrg# GNU General Public License for more details.
17ff7e0accSmrg
18ff7e0accSmrg# You should have received a copy of the GNU General Public License
192163f7f8Smrg# along with this program.  If not, see <https://www.gnu.org/licenses/>.
20ff7e0accSmrg
21ff7e0accSmrg# As a special exception to the GNU General Public License, if you
22ff7e0accSmrg# distribute this file as part of a program that contains a
23ff7e0accSmrg# configuration script generated by Autoconf, you may include it under
24ff7e0accSmrg# the same distribution terms that you use for the rest of that program.
25ff7e0accSmrg
26ff7e0accSmrg# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>.
27ff7e0accSmrg
28ff7e0accSmrgcase $1 in
29ff7e0accSmrg  '')
3005bee9bcSmrg    echo "$0: No command.  Try '$0 --help' for more information." 1>&2
3105bee9bcSmrg    exit 1;
3205bee9bcSmrg    ;;
33ff7e0accSmrg  -h | --h*)
34ff7e0accSmrg    cat <<\EOF
35ff7e0accSmrgUsage: depcomp [--help] [--version] PROGRAM [ARGS]
36ff7e0accSmrg
37ff7e0accSmrgRun PROGRAMS ARGS to compile a file, generating dependencies
38ff7e0accSmrgas side-effects.
39ff7e0accSmrg
40ff7e0accSmrgEnvironment variables:
41ff7e0accSmrg  depmode     Dependency tracking mode.
4205bee9bcSmrg  source      Source file read by 'PROGRAMS ARGS'.
4305bee9bcSmrg  object      Object file output by 'PROGRAMS ARGS'.
44ff7e0accSmrg  DEPDIR      directory where to store dependencies.
45ff7e0accSmrg  depfile     Dependency file to output.
4605bee9bcSmrg  tmpdepfile  Temporary file to use when outputting dependencies.
47ff7e0accSmrg  libtool     Whether libtool is used (yes/no).
48ff7e0accSmrg
49ff7e0accSmrgReport bugs to <bug-automake@gnu.org>.
50ff7e0accSmrgEOF
51ff7e0accSmrg    exit $?
52ff7e0accSmrg    ;;
53ff7e0accSmrg  -v | --v*)
54ff7e0accSmrg    echo "depcomp $scriptversion"
55ff7e0accSmrg    exit $?
56ff7e0accSmrg    ;;
57ff7e0accSmrgesac
58ff7e0accSmrg
5905bee9bcSmrg# Get the directory component of the given path, and save it in the
6005bee9bcSmrg# global variables '$dir'.  Note that this directory component will
6105bee9bcSmrg# be either empty or ending with a '/' character.  This is deliberate.
6205bee9bcSmrgset_dir_from ()
6305bee9bcSmrg{
6405bee9bcSmrg  case $1 in
6505bee9bcSmrg    */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;;
6605bee9bcSmrg      *) dir=;;
6705bee9bcSmrg  esac
6805bee9bcSmrg}
6905bee9bcSmrg
7005bee9bcSmrg# Get the suffix-stripped basename of the given path, and save it the
7105bee9bcSmrg# global variable '$base'.
7205bee9bcSmrgset_base_from ()
7305bee9bcSmrg{
7405bee9bcSmrg  base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'`
7505bee9bcSmrg}
7605bee9bcSmrg
7705bee9bcSmrg# If no dependency file was actually created by the compiler invocation,
7805bee9bcSmrg# we still have to create a dummy depfile, to avoid errors with the
7905bee9bcSmrg# Makefile "include basename.Plo" scheme.
8005bee9bcSmrgmake_dummy_depfile ()
8105bee9bcSmrg{
8205bee9bcSmrg  echo "#dummy" > "$depfile"
8305bee9bcSmrg}
8405bee9bcSmrg
8505bee9bcSmrg# Factor out some common post-processing of the generated depfile.
8605bee9bcSmrg# Requires the auxiliary global variable '$tmpdepfile' to be set.
8705bee9bcSmrgaix_post_process_depfile ()
8805bee9bcSmrg{
8905bee9bcSmrg  # If the compiler actually managed to produce a dependency file,
9005bee9bcSmrg  # post-process it.
9105bee9bcSmrg  if test -f "$tmpdepfile"; then
9205bee9bcSmrg    # Each line is of the form 'foo.o: dependency.h'.
9305bee9bcSmrg    # Do two passes, one to just change these to
9405bee9bcSmrg    #   $object: dependency.h
9505bee9bcSmrg    # and one to simply output
9605bee9bcSmrg    #   dependency.h:
9705bee9bcSmrg    # which is needed to avoid the deleted-header problem.
9805bee9bcSmrg    { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile"
9905bee9bcSmrg      sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile"
10005bee9bcSmrg    } > "$depfile"
10105bee9bcSmrg    rm -f "$tmpdepfile"
10205bee9bcSmrg  else
10305bee9bcSmrg    make_dummy_depfile
10405bee9bcSmrg  fi
10505bee9bcSmrg}
10605bee9bcSmrg
10705bee9bcSmrg# A tabulation character.
10805bee9bcSmrgtab='	'
10905bee9bcSmrg# A newline character.
11005bee9bcSmrgnl='
11105bee9bcSmrg'
11205bee9bcSmrg# Character ranges might be problematic outside the C locale.
11305bee9bcSmrg# These definitions help.
11405bee9bcSmrgupper=ABCDEFGHIJKLMNOPQRSTUVWXYZ
11505bee9bcSmrglower=abcdefghijklmnopqrstuvwxyz
11605bee9bcSmrgdigits=0123456789
11705bee9bcSmrgalpha=${upper}${lower}
11805bee9bcSmrg
119ff7e0accSmrgif test -z "$depmode" || test -z "$source" || test -z "$object"; then
120ff7e0accSmrg  echo "depcomp: Variables source, object and depmode must be set" 1>&2
121ff7e0accSmrg  exit 1
122ff7e0accSmrgfi
123ff7e0accSmrg
124ff7e0accSmrg# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.
125ff7e0accSmrgdepfile=${depfile-`echo "$object" |
126ff7e0accSmrg  sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`}
127ff7e0accSmrgtmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
128ff7e0accSmrg
129ff7e0accSmrgrm -f "$tmpdepfile"
130ff7e0accSmrg
13105bee9bcSmrg# Avoid interferences from the environment.
13205bee9bcSmrggccflag= dashmflag=
13305bee9bcSmrg
134ff7e0accSmrg# Some modes work just like other modes, but use different flags.  We
135ff7e0accSmrg# parameterize here, but still list the modes in the big case below,
136ff7e0accSmrg# to make depend.m4 easier to write.  Note that we *cannot* use a case
137ff7e0accSmrg# here, because this file can only contain one case statement.
138ff7e0accSmrgif test "$depmode" = hp; then
139ff7e0accSmrg  # HP compiler uses -M and no extra arg.
140ff7e0accSmrg  gccflag=-M
141ff7e0accSmrg  depmode=gcc
142ff7e0accSmrgfi
143ff7e0accSmrg
144ff7e0accSmrgif test "$depmode" = dashXmstdout; then
14505bee9bcSmrg  # This is just like dashmstdout with a different argument.
14605bee9bcSmrg  dashmflag=-xM
14705bee9bcSmrg  depmode=dashmstdout
148ff7e0accSmrgfi
149ff7e0accSmrg
15010998002Smrgcygpath_u="cygpath -u -f -"
15110998002Smrgif test "$depmode" = msvcmsys; then
15205bee9bcSmrg  # This is just like msvisualcpp but w/o cygpath translation.
15305bee9bcSmrg  # Just convert the backslash-escaped backslashes to single forward
15405bee9bcSmrg  # slashes to satisfy depend.m4
15505bee9bcSmrg  cygpath_u='sed s,\\\\,/,g'
15605bee9bcSmrg  depmode=msvisualcpp
15705bee9bcSmrgfi
15805bee9bcSmrg
15905bee9bcSmrgif test "$depmode" = msvc7msys; then
16005bee9bcSmrg  # This is just like msvc7 but w/o cygpath translation.
16105bee9bcSmrg  # Just convert the backslash-escaped backslashes to single forward
16205bee9bcSmrg  # slashes to satisfy depend.m4
16305bee9bcSmrg  cygpath_u='sed s,\\\\,/,g'
16405bee9bcSmrg  depmode=msvc7
16505bee9bcSmrgfi
16605bee9bcSmrg
16705bee9bcSmrgif test "$depmode" = xlc; then
16805bee9bcSmrg  # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information.
16905bee9bcSmrg  gccflag=-qmakedep=gcc,-MF
17005bee9bcSmrg  depmode=gcc
17110998002Smrgfi
17210998002Smrg
173ff7e0accSmrgcase "$depmode" in
174ff7e0accSmrggcc3)
175ff7e0accSmrg## gcc 3 implements dependency tracking that does exactly what
176ff7e0accSmrg## we want.  Yay!  Note: for some reason libtool 1.4 doesn't like
177ff7e0accSmrg## it if -MD -MP comes after the -MF stuff.  Hmm.
178ff7e0accSmrg## Unfortunately, FreeBSD c89 acceptance of flags depends upon
179ff7e0accSmrg## the command line argument order; so add the flags where they
180ff7e0accSmrg## appear in depend2.am.  Note that the slowdown incurred here
181ff7e0accSmrg## affects only configure: in makefiles, %FASTDEP% shortcuts this.
182ff7e0accSmrg  for arg
183ff7e0accSmrg  do
184ff7e0accSmrg    case $arg in
185ff7e0accSmrg    -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;;
186ff7e0accSmrg    *)  set fnord "$@" "$arg" ;;
187ff7e0accSmrg    esac
188ff7e0accSmrg    shift # fnord
189ff7e0accSmrg    shift # $arg
190ff7e0accSmrg  done
191ff7e0accSmrg  "$@"
192ff7e0accSmrg  stat=$?
19305bee9bcSmrg  if test $stat -ne 0; then
194ff7e0accSmrg    rm -f "$tmpdepfile"
195ff7e0accSmrg    exit $stat
196ff7e0accSmrg  fi
197ff7e0accSmrg  mv "$tmpdepfile" "$depfile"
198ff7e0accSmrg  ;;
199ff7e0accSmrg
200ff7e0accSmrggcc)
20105bee9bcSmrg## Note that this doesn't just cater to obsosete pre-3.x GCC compilers.
20205bee9bcSmrg## but also to in-use compilers like IMB xlc/xlC and the HP C compiler.
20305bee9bcSmrg## (see the conditional assignment to $gccflag above).
204ff7e0accSmrg## There are various ways to get dependency output from gcc.  Here's
205ff7e0accSmrg## why we pick this rather obscure method:
206ff7e0accSmrg## - Don't want to use -MD because we'd like the dependencies to end
207ff7e0accSmrg##   up in a subdir.  Having to rename by hand is ugly.
208ff7e0accSmrg##   (We might end up doing this anyway to support other compilers.)
209ff7e0accSmrg## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
21005bee9bcSmrg##   -MM, not -M (despite what the docs say).  Also, it might not be
21105bee9bcSmrg##   supported by the other compilers which use the 'gcc' depmode.
212ff7e0accSmrg## - Using -M directly means running the compiler twice (even worse
213ff7e0accSmrg##   than renaming).
214ff7e0accSmrg  if test -z "$gccflag"; then
215ff7e0accSmrg    gccflag=-MD,
216ff7e0accSmrg  fi
217ff7e0accSmrg  "$@" -Wp,"$gccflag$tmpdepfile"
218ff7e0accSmrg  stat=$?
21905bee9bcSmrg  if test $stat -ne 0; then
220ff7e0accSmrg    rm -f "$tmpdepfile"
221ff7e0accSmrg    exit $stat
222ff7e0accSmrg  fi
223ff7e0accSmrg  rm -f "$depfile"
224ff7e0accSmrg  echo "$object : \\" > "$depfile"
22505bee9bcSmrg  # The second -e expression handles DOS-style file names with drive
22605bee9bcSmrg  # letters.
227ff7e0accSmrg  sed -e 's/^[^:]*: / /' \
228ff7e0accSmrg      -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
22905bee9bcSmrg## This next piece of magic avoids the "deleted header file" problem.
230ff7e0accSmrg## The problem is that when a header file which appears in a .P file
231ff7e0accSmrg## is deleted, the dependency causes make to die (because there is
232ff7e0accSmrg## typically no way to rebuild the header).  We avoid this by adding
233ff7e0accSmrg## dummy dependencies for each header file.  Too bad gcc doesn't do
234ff7e0accSmrg## this for us directly.
23505bee9bcSmrg## Some versions of gcc put a space before the ':'.  On the theory
236ff7e0accSmrg## that the space means something, we add a space to the output as
23705bee9bcSmrg## well.  hp depmode also adds that space, but also prefixes the VPATH
23805bee9bcSmrg## to the object.  Take care to not repeat it in the output.
239ff7e0accSmrg## Some versions of the HPUX 10.20 sed can't process this invocation
240ff7e0accSmrg## correctly.  Breaking it into two sed invocations is a workaround.
24105bee9bcSmrg  tr ' ' "$nl" < "$tmpdepfile" \
24205bee9bcSmrg    | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \
24305bee9bcSmrg    | sed -e 's/$/ :/' >> "$depfile"
244ff7e0accSmrg  rm -f "$tmpdepfile"
245ff7e0accSmrg  ;;
246ff7e0accSmrg
247ff7e0accSmrghp)
248ff7e0accSmrg  # This case exists only to let depend.m4 do its work.  It works by
249ff7e0accSmrg  # looking at the text of this script.  This case will never be run,
250ff7e0accSmrg  # since it is checked for above.
251ff7e0accSmrg  exit 1
252ff7e0accSmrg  ;;
253ff7e0accSmrg
254ff7e0accSmrgsgi)
255ff7e0accSmrg  if test "$libtool" = yes; then
256ff7e0accSmrg    "$@" "-Wp,-MDupdate,$tmpdepfile"
257ff7e0accSmrg  else
258ff7e0accSmrg    "$@" -MDupdate "$tmpdepfile"
259ff7e0accSmrg  fi
260ff7e0accSmrg  stat=$?
26105bee9bcSmrg  if test $stat -ne 0; then
262ff7e0accSmrg    rm -f "$tmpdepfile"
263ff7e0accSmrg    exit $stat
264ff7e0accSmrg  fi
265ff7e0accSmrg  rm -f "$depfile"
266ff7e0accSmrg
267ff7e0accSmrg  if test -f "$tmpdepfile"; then  # yes, the sourcefile depend on other files
268ff7e0accSmrg    echo "$object : \\" > "$depfile"
269ff7e0accSmrg    # Clip off the initial element (the dependent).  Don't try to be
270ff7e0accSmrg    # clever and replace this with sed code, as IRIX sed won't handle
271ff7e0accSmrg    # lines with more than a fixed number of characters (4096 in
272ff7e0accSmrg    # IRIX 6.2 sed, 8192 in IRIX 6.5).  We also remove comment lines;
27305bee9bcSmrg    # the IRIX cc adds comments like '#:fec' to the end of the
274ff7e0accSmrg    # dependency line.
27505bee9bcSmrg    tr ' ' "$nl" < "$tmpdepfile" \
27605bee9bcSmrg      | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \
27705bee9bcSmrg      | tr "$nl" ' ' >> "$depfile"
27810998002Smrg    echo >> "$depfile"
279ff7e0accSmrg    # The second pass generates a dummy entry for each header file.
28005bee9bcSmrg    tr ' ' "$nl" < "$tmpdepfile" \
28105bee9bcSmrg      | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
28205bee9bcSmrg      >> "$depfile"
283ff7e0accSmrg  else
28405bee9bcSmrg    make_dummy_depfile
285ff7e0accSmrg  fi
286ff7e0accSmrg  rm -f "$tmpdepfile"
287ff7e0accSmrg  ;;
288ff7e0accSmrg
28905bee9bcSmrgxlc)
29005bee9bcSmrg  # This case exists only to let depend.m4 do its work.  It works by
29105bee9bcSmrg  # looking at the text of this script.  This case will never be run,
29205bee9bcSmrg  # since it is checked for above.
29305bee9bcSmrg  exit 1
29405bee9bcSmrg  ;;
29505bee9bcSmrg
296ff7e0accSmrgaix)
297ff7e0accSmrg  # The C for AIX Compiler uses -M and outputs the dependencies
298ff7e0accSmrg  # in a .u file.  In older versions, this file always lives in the
29905bee9bcSmrg  # current directory.  Also, the AIX compiler puts '$object:' at the
300ff7e0accSmrg  # start of each line; $object doesn't have directory information.
301ff7e0accSmrg  # Version 6 uses the directory in both cases.
30205bee9bcSmrg  set_dir_from "$object"
30305bee9bcSmrg  set_base_from "$object"
304ff7e0accSmrg  if test "$libtool" = yes; then
305a005d216Smrg    tmpdepfile1=$dir$base.u
306a005d216Smrg    tmpdepfile2=$base.u
307a005d216Smrg    tmpdepfile3=$dir.libs/$base.u
308ff7e0accSmrg    "$@" -Wc,-M
309ff7e0accSmrg  else
310a005d216Smrg    tmpdepfile1=$dir$base.u
311a005d216Smrg    tmpdepfile2=$dir$base.u
312a005d216Smrg    tmpdepfile3=$dir$base.u
313ff7e0accSmrg    "$@" -M
314ff7e0accSmrg  fi
315ff7e0accSmrg  stat=$?
31605bee9bcSmrg  if test $stat -ne 0; then
317a005d216Smrg    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
318ff7e0accSmrg    exit $stat
319ff7e0accSmrg  fi
320ff7e0accSmrg
321a005d216Smrg  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
322a005d216Smrg  do
323a005d216Smrg    test -f "$tmpdepfile" && break
324a005d216Smrg  done
32505bee9bcSmrg  aix_post_process_depfile
32605bee9bcSmrg  ;;
32705bee9bcSmrg
32805bee9bcSmrgtcc)
32905bee9bcSmrg  # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26
33005bee9bcSmrg  # FIXME: That version still under development at the moment of writing.
33105bee9bcSmrg  #        Make that this statement remains true also for stable, released
33205bee9bcSmrg  #        versions.
33305bee9bcSmrg  # It will wrap lines (doesn't matter whether long or short) with a
33405bee9bcSmrg  # trailing '\', as in:
33505bee9bcSmrg  #
33605bee9bcSmrg  #   foo.o : \
33705bee9bcSmrg  #    foo.c \
33805bee9bcSmrg  #    foo.h \
33905bee9bcSmrg  #
34005bee9bcSmrg  # It will put a trailing '\' even on the last line, and will use leading
34105bee9bcSmrg  # spaces rather than leading tabs (at least since its commit 0394caf7
34205bee9bcSmrg  # "Emit spaces for -MD").
34305bee9bcSmrg  "$@" -MD -MF "$tmpdepfile"
34405bee9bcSmrg  stat=$?
34505bee9bcSmrg  if test $stat -ne 0; then
34605bee9bcSmrg    rm -f "$tmpdepfile"
34705bee9bcSmrg    exit $stat
348ff7e0accSmrg  fi
34905bee9bcSmrg  rm -f "$depfile"
35005bee9bcSmrg  # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'.
35105bee9bcSmrg  # We have to change lines of the first kind to '$object: \'.
35205bee9bcSmrg  sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile"
35305bee9bcSmrg  # And for each line of the second kind, we have to emit a 'dep.h:'
35405bee9bcSmrg  # dummy dependency, to avoid the deleted-header problem.
35505bee9bcSmrg  sed -n -e 's|^  *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile"
356ff7e0accSmrg  rm -f "$tmpdepfile"
357ff7e0accSmrg  ;;
358ff7e0accSmrg
35905bee9bcSmrg## The order of this option in the case statement is important, since the
36005bee9bcSmrg## shell code in configure will try each of these formats in the order
36105bee9bcSmrg## listed in this file.  A plain '-MD' option would be understood by many
36205bee9bcSmrg## compilers, so we must ensure this comes after the gcc and icc options.
36305bee9bcSmrgpgcc)
36405bee9bcSmrg  # Portland's C compiler understands '-MD'.
36505bee9bcSmrg  # Will always output deps to 'file.d' where file is the root name of the
36605bee9bcSmrg  # source file under compilation, even if file resides in a subdirectory.
36705bee9bcSmrg  # The object file name does not affect the name of the '.d' file.
36805bee9bcSmrg  # pgcc 10.2 will output
369ff7e0accSmrg  #    foo.o: sub/foo.c sub/foo.h
37005bee9bcSmrg  # and will wrap long lines using '\' :
371ff7e0accSmrg  #    foo.o: sub/foo.c ... \
372ff7e0accSmrg  #     sub/foo.h ... \
373ff7e0accSmrg  #     ...
37405bee9bcSmrg  set_dir_from "$object"
37505bee9bcSmrg  # Use the source, not the object, to determine the base name, since
37605bee9bcSmrg  # that's sadly what pgcc will do too.
37705bee9bcSmrg  set_base_from "$source"
37805bee9bcSmrg  tmpdepfile=$base.d
37905bee9bcSmrg
38005bee9bcSmrg  # For projects that build the same source file twice into different object
38105bee9bcSmrg  # files, the pgcc approach of using the *source* file root name can cause
38205bee9bcSmrg  # problems in parallel builds.  Use a locking strategy to avoid stomping on
38305bee9bcSmrg  # the same $tmpdepfile.
38405bee9bcSmrg  lockdir=$base.d-lock
38505bee9bcSmrg  trap "
38605bee9bcSmrg    echo '$0: caught signal, cleaning up...' >&2
38705bee9bcSmrg    rmdir '$lockdir'
38805bee9bcSmrg    exit 1
38905bee9bcSmrg  " 1 2 13 15
39005bee9bcSmrg  numtries=100
39105bee9bcSmrg  i=$numtries
39205bee9bcSmrg  while test $i -gt 0; do
39305bee9bcSmrg    # mkdir is a portable test-and-set.
39405bee9bcSmrg    if mkdir "$lockdir" 2>/dev/null; then
39505bee9bcSmrg      # This process acquired the lock.
39605bee9bcSmrg      "$@" -MD
39705bee9bcSmrg      stat=$?
39805bee9bcSmrg      # Release the lock.
39905bee9bcSmrg      rmdir "$lockdir"
40005bee9bcSmrg      break
40105bee9bcSmrg    else
40205bee9bcSmrg      # If the lock is being held by a different process, wait
40305bee9bcSmrg      # until the winning process is done or we timeout.
40405bee9bcSmrg      while test -d "$lockdir" && test $i -gt 0; do
40505bee9bcSmrg        sleep 1
40605bee9bcSmrg        i=`expr $i - 1`
40705bee9bcSmrg      done
40805bee9bcSmrg    fi
40905bee9bcSmrg    i=`expr $i - 1`
41005bee9bcSmrg  done
41105bee9bcSmrg  trap - 1 2 13 15
41205bee9bcSmrg  if test $i -le 0; then
41305bee9bcSmrg    echo "$0: failed to acquire lock after $numtries attempts" >&2
41405bee9bcSmrg    echo "$0: check lockdir '$lockdir'" >&2
41505bee9bcSmrg    exit 1
41605bee9bcSmrg  fi
417ff7e0accSmrg
41805bee9bcSmrg  if test $stat -ne 0; then
419ff7e0accSmrg    rm -f "$tmpdepfile"
420ff7e0accSmrg    exit $stat
421ff7e0accSmrg  fi
422ff7e0accSmrg  rm -f "$depfile"
423ff7e0accSmrg  # Each line is of the form `foo.o: dependent.h',
424ff7e0accSmrg  # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'.
425ff7e0accSmrg  # Do two passes, one to just change these to
426ff7e0accSmrg  # `$object: dependent.h' and one to simply `dependent.h:'.
427ff7e0accSmrg  sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
428ff7e0accSmrg  # Some versions of the HPUX 10.20 sed can't process this invocation
429ff7e0accSmrg  # correctly.  Breaking it into two sed invocations is a workaround.
43005bee9bcSmrg  sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \
43105bee9bcSmrg    | sed -e 's/$/ :/' >> "$depfile"
432ff7e0accSmrg  rm -f "$tmpdepfile"
433ff7e0accSmrg  ;;
434ff7e0accSmrg
435ff7e0accSmrghp2)
436ff7e0accSmrg  # The "hp" stanza above does not work with aCC (C++) and HP's ia64
437ff7e0accSmrg  # compilers, which have integrated preprocessors.  The correct option
438ff7e0accSmrg  # to use with these is +Maked; it writes dependencies to a file named
439ff7e0accSmrg  # 'foo.d', which lands next to the object file, wherever that
440ff7e0accSmrg  # happens to be.
441ff7e0accSmrg  # Much of this is similar to the tru64 case; see comments there.
44205bee9bcSmrg  set_dir_from  "$object"
44305bee9bcSmrg  set_base_from "$object"
444ff7e0accSmrg  if test "$libtool" = yes; then
445ff7e0accSmrg    tmpdepfile1=$dir$base.d
446ff7e0accSmrg    tmpdepfile2=$dir.libs/$base.d
447ff7e0accSmrg    "$@" -Wc,+Maked
448ff7e0accSmrg  else
449ff7e0accSmrg    tmpdepfile1=$dir$base.d
450ff7e0accSmrg    tmpdepfile2=$dir$base.d
451ff7e0accSmrg    "$@" +Maked
452ff7e0accSmrg  fi
453ff7e0accSmrg  stat=$?
45405bee9bcSmrg  if test $stat -ne 0; then
455ff7e0accSmrg     rm -f "$tmpdepfile1" "$tmpdepfile2"
456ff7e0accSmrg     exit $stat
457ff7e0accSmrg  fi
458ff7e0accSmrg
459ff7e0accSmrg  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2"
460ff7e0accSmrg  do
461ff7e0accSmrg    test -f "$tmpdepfile" && break
462ff7e0accSmrg  done
463ff7e0accSmrg  if test -f "$tmpdepfile"; then
46405bee9bcSmrg    sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile"
46505bee9bcSmrg    # Add 'dependent.h:' lines.
46610998002Smrg    sed -ne '2,${
46705bee9bcSmrg               s/^ *//
46805bee9bcSmrg               s/ \\*$//
46905bee9bcSmrg               s/$/:/
47005bee9bcSmrg               p
47105bee9bcSmrg             }' "$tmpdepfile" >> "$depfile"
472ff7e0accSmrg  else
47305bee9bcSmrg    make_dummy_depfile
474ff7e0accSmrg  fi
475ff7e0accSmrg  rm -f "$tmpdepfile" "$tmpdepfile2"
476ff7e0accSmrg  ;;
477ff7e0accSmrg
478ff7e0accSmrgtru64)
47905bee9bcSmrg  # The Tru64 compiler uses -MD to generate dependencies as a side
48005bee9bcSmrg  # effect.  'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'.
48105bee9bcSmrg  # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
48205bee9bcSmrg  # dependencies in 'foo.d' instead, so we check for that too.
48305bee9bcSmrg  # Subdirectories are respected.
48405bee9bcSmrg  set_dir_from  "$object"
48505bee9bcSmrg  set_base_from "$object"
48605bee9bcSmrg
48705bee9bcSmrg  if test "$libtool" = yes; then
48805bee9bcSmrg    # Libtool generates 2 separate objects for the 2 libraries.  These
48905bee9bcSmrg    # two compilations output dependencies in $dir.libs/$base.o.d and
49005bee9bcSmrg    # in $dir$base.o.d.  We have to check for both files, because
49105bee9bcSmrg    # one of the two compilations can be disabled.  We should prefer
49205bee9bcSmrg    # $dir$base.o.d over $dir.libs/$base.o.d because the latter is
49305bee9bcSmrg    # automatically cleaned when .libs/ is deleted, while ignoring
49405bee9bcSmrg    # the former would cause a distcleancheck panic.
49505bee9bcSmrg    tmpdepfile1=$dir$base.o.d          # libtool 1.5
49605bee9bcSmrg    tmpdepfile2=$dir.libs/$base.o.d    # Likewise.
49705bee9bcSmrg    tmpdepfile3=$dir.libs/$base.d      # Compaq CCC V6.2-504
49805bee9bcSmrg    "$@" -Wc,-MD
49905bee9bcSmrg  else
50005bee9bcSmrg    tmpdepfile1=$dir$base.d
50105bee9bcSmrg    tmpdepfile2=$dir$base.d
50205bee9bcSmrg    tmpdepfile3=$dir$base.d
50305bee9bcSmrg    "$@" -MD
50405bee9bcSmrg  fi
50505bee9bcSmrg
50605bee9bcSmrg  stat=$?
50705bee9bcSmrg  if test $stat -ne 0; then
50805bee9bcSmrg    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
50905bee9bcSmrg    exit $stat
51005bee9bcSmrg  fi
51105bee9bcSmrg
51205bee9bcSmrg  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
51305bee9bcSmrg  do
51405bee9bcSmrg    test -f "$tmpdepfile" && break
51505bee9bcSmrg  done
51605bee9bcSmrg  # Same post-processing that is required for AIX mode.
51705bee9bcSmrg  aix_post_process_depfile
51805bee9bcSmrg  ;;
51905bee9bcSmrg
52005bee9bcSmrgmsvc7)
52105bee9bcSmrg  if test "$libtool" = yes; then
52205bee9bcSmrg    showIncludes=-Wc,-showIncludes
52305bee9bcSmrg  else
52405bee9bcSmrg    showIncludes=-showIncludes
52505bee9bcSmrg  fi
52605bee9bcSmrg  "$@" $showIncludes > "$tmpdepfile"
52705bee9bcSmrg  stat=$?
52805bee9bcSmrg  grep -v '^Note: including file: ' "$tmpdepfile"
52905bee9bcSmrg  if test $stat -ne 0; then
53005bee9bcSmrg    rm -f "$tmpdepfile"
53105bee9bcSmrg    exit $stat
53205bee9bcSmrg  fi
53305bee9bcSmrg  rm -f "$depfile"
53405bee9bcSmrg  echo "$object : \\" > "$depfile"
53505bee9bcSmrg  # The first sed program below extracts the file names and escapes
53605bee9bcSmrg  # backslashes for cygpath.  The second sed program outputs the file
53705bee9bcSmrg  # name when reading, but also accumulates all include files in the
53805bee9bcSmrg  # hold buffer in order to output them again at the end.  This only
53905bee9bcSmrg  # works with sed implementations that can handle large buffers.
54005bee9bcSmrg  sed < "$tmpdepfile" -n '
54105bee9bcSmrg/^Note: including file:  *\(.*\)/ {
54205bee9bcSmrg  s//\1/
54305bee9bcSmrg  s/\\/\\\\/g
54405bee9bcSmrg  p
54505bee9bcSmrg}' | $cygpath_u | sort -u | sed -n '
54605bee9bcSmrgs/ /\\ /g
54705bee9bcSmrgs/\(.*\)/'"$tab"'\1 \\/p
54805bee9bcSmrgs/.\(.*\) \\/\1:/
54905bee9bcSmrgH
55005bee9bcSmrg$ {
55105bee9bcSmrg  s/.*/'"$tab"'/
55205bee9bcSmrg  G
55305bee9bcSmrg  p
55405bee9bcSmrg}' >> "$depfile"
5550c91c449Smrg  echo >> "$depfile" # make sure the fragment doesn't end with a backslash
55605bee9bcSmrg  rm -f "$tmpdepfile"
55705bee9bcSmrg  ;;
55805bee9bcSmrg
55905bee9bcSmrgmsvc7msys)
56005bee9bcSmrg  # This case exists only to let depend.m4 do its work.  It works by
56105bee9bcSmrg  # looking at the text of this script.  This case will never be run,
56205bee9bcSmrg  # since it is checked for above.
56305bee9bcSmrg  exit 1
56405bee9bcSmrg  ;;
565ff7e0accSmrg
566ff7e0accSmrg#nosideeffect)
567ff7e0accSmrg  # This comment above is used by automake to tell side-effect
568ff7e0accSmrg  # dependency tracking mechanisms from slower ones.
569ff7e0accSmrg
570ff7e0accSmrgdashmstdout)
571ff7e0accSmrg  # Important note: in order to support this mode, a compiler *must*
572ff7e0accSmrg  # always write the preprocessed file to stdout, regardless of -o.
573ff7e0accSmrg  "$@" || exit $?
574ff7e0accSmrg
575ff7e0accSmrg  # Remove the call to Libtool.
576ff7e0accSmrg  if test "$libtool" = yes; then
57710998002Smrg    while test "X$1" != 'X--mode=compile'; do
578ff7e0accSmrg      shift
579ff7e0accSmrg    done
580ff7e0accSmrg    shift
581ff7e0accSmrg  fi
582ff7e0accSmrg
58305bee9bcSmrg  # Remove '-o $object'.
584ff7e0accSmrg  IFS=" "
585ff7e0accSmrg  for arg
586ff7e0accSmrg  do
587ff7e0accSmrg    case $arg in
588ff7e0accSmrg    -o)
589ff7e0accSmrg      shift
590ff7e0accSmrg      ;;
591ff7e0accSmrg    $object)
592ff7e0accSmrg      shift
593ff7e0accSmrg      ;;
594ff7e0accSmrg    *)
595ff7e0accSmrg      set fnord "$@" "$arg"
596ff7e0accSmrg      shift # fnord
597ff7e0accSmrg      shift # $arg
598ff7e0accSmrg      ;;
599ff7e0accSmrg    esac
600ff7e0accSmrg  done
601ff7e0accSmrg
602ff7e0accSmrg  test -z "$dashmflag" && dashmflag=-M
60305bee9bcSmrg  # Require at least two characters before searching for ':'
604ff7e0accSmrg  # in the target name.  This is to cope with DOS-style filenames:
60505bee9bcSmrg  # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise.
606ff7e0accSmrg  "$@" $dashmflag |
60705bee9bcSmrg    sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile"
608ff7e0accSmrg  rm -f "$depfile"
609ff7e0accSmrg  cat < "$tmpdepfile" > "$depfile"
61005bee9bcSmrg  # Some versions of the HPUX 10.20 sed can't process this sed invocation
61105bee9bcSmrg  # correctly.  Breaking it into two sed invocations is a workaround.
61205bee9bcSmrg  tr ' ' "$nl" < "$tmpdepfile" \
61305bee9bcSmrg    | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
61405bee9bcSmrg    | sed -e 's/$/ :/' >> "$depfile"
615ff7e0accSmrg  rm -f "$tmpdepfile"
616ff7e0accSmrg  ;;
617ff7e0accSmrg
618ff7e0accSmrgdashXmstdout)
619ff7e0accSmrg  # This case only exists to satisfy depend.m4.  It is never actually
620ff7e0accSmrg  # run, as this mode is specially recognized in the preamble.
621ff7e0accSmrg  exit 1
622ff7e0accSmrg  ;;
623ff7e0accSmrg
624ff7e0accSmrgmakedepend)
625ff7e0accSmrg  "$@" || exit $?
626ff7e0accSmrg  # Remove any Libtool call
627ff7e0accSmrg  if test "$libtool" = yes; then
62810998002Smrg    while test "X$1" != 'X--mode=compile'; do
629ff7e0accSmrg      shift
630ff7e0accSmrg    done
631ff7e0accSmrg    shift
632ff7e0accSmrg  fi
633ff7e0accSmrg  # X makedepend
634ff7e0accSmrg  shift
63510998002Smrg  cleared=no eat=no
63610998002Smrg  for arg
63710998002Smrg  do
638ff7e0accSmrg    case $cleared in
639ff7e0accSmrg    no)
640ff7e0accSmrg      set ""; shift
641ff7e0accSmrg      cleared=yes ;;
642ff7e0accSmrg    esac
64310998002Smrg    if test $eat = yes; then
64410998002Smrg      eat=no
64510998002Smrg      continue
64610998002Smrg    fi
647ff7e0accSmrg    case "$arg" in
648ff7e0accSmrg    -D*|-I*)
649ff7e0accSmrg      set fnord "$@" "$arg"; shift ;;
650ff7e0accSmrg    # Strip any option that makedepend may not understand.  Remove
651ff7e0accSmrg    # the object too, otherwise makedepend will parse it as a source file.
65210998002Smrg    -arch)
65310998002Smrg      eat=yes ;;
654ff7e0accSmrg    -*|$object)
655ff7e0accSmrg      ;;
656ff7e0accSmrg    *)
657ff7e0accSmrg      set fnord "$@" "$arg"; shift ;;
658ff7e0accSmrg    esac
659ff7e0accSmrg  done
66010998002Smrg  obj_suffix=`echo "$object" | sed 's/^.*\././'`
661ff7e0accSmrg  touch "$tmpdepfile"
662ff7e0accSmrg  ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
663ff7e0accSmrg  rm -f "$depfile"
66405bee9bcSmrg  # makedepend may prepend the VPATH from the source file name to the object.
66505bee9bcSmrg  # No need to regex-escape $object, excess matching of '.' is harmless.
66605bee9bcSmrg  sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile"
66705bee9bcSmrg  # Some versions of the HPUX 10.20 sed can't process the last invocation
66805bee9bcSmrg  # correctly.  Breaking it into two sed invocations is a workaround.
66905bee9bcSmrg  sed '1,2d' "$tmpdepfile" \
67005bee9bcSmrg    | tr ' ' "$nl" \
67105bee9bcSmrg    | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
67205bee9bcSmrg    | sed -e 's/$/ :/' >> "$depfile"
673ff7e0accSmrg  rm -f "$tmpdepfile" "$tmpdepfile".bak
674ff7e0accSmrg  ;;
675ff7e0accSmrg
676ff7e0accSmrgcpp)
677ff7e0accSmrg  # Important note: in order to support this mode, a compiler *must*
678ff7e0accSmrg  # always write the preprocessed file to stdout.
679ff7e0accSmrg  "$@" || exit $?
680ff7e0accSmrg
681ff7e0accSmrg  # Remove the call to Libtool.
682ff7e0accSmrg  if test "$libtool" = yes; then
68310998002Smrg    while test "X$1" != 'X--mode=compile'; do
684ff7e0accSmrg      shift
685ff7e0accSmrg    done
686ff7e0accSmrg    shift
687ff7e0accSmrg  fi
688ff7e0accSmrg
68905bee9bcSmrg  # Remove '-o $object'.
690ff7e0accSmrg  IFS=" "
691ff7e0accSmrg  for arg
692ff7e0accSmrg  do
693ff7e0accSmrg    case $arg in
694ff7e0accSmrg    -o)
695ff7e0accSmrg      shift
696ff7e0accSmrg      ;;
697ff7e0accSmrg    $object)
698ff7e0accSmrg      shift
699ff7e0accSmrg      ;;
700ff7e0accSmrg    *)
701ff7e0accSmrg      set fnord "$@" "$arg"
702ff7e0accSmrg      shift # fnord
703ff7e0accSmrg      shift # $arg
704ff7e0accSmrg      ;;
705ff7e0accSmrg    esac
706ff7e0accSmrg  done
707ff7e0accSmrg
70805bee9bcSmrg  "$@" -E \
70905bee9bcSmrg    | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
71005bee9bcSmrg             -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
71105bee9bcSmrg    | sed '$ s: \\$::' > "$tmpdepfile"
712ff7e0accSmrg  rm -f "$depfile"
713ff7e0accSmrg  echo "$object : \\" > "$depfile"
714ff7e0accSmrg  cat < "$tmpdepfile" >> "$depfile"
715ff7e0accSmrg  sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
716ff7e0accSmrg  rm -f "$tmpdepfile"
717ff7e0accSmrg  ;;
718ff7e0accSmrg
719ff7e0accSmrgmsvisualcpp)
720ff7e0accSmrg  # Important note: in order to support this mode, a compiler *must*
72110998002Smrg  # always write the preprocessed file to stdout.
722ff7e0accSmrg  "$@" || exit $?
72310998002Smrg
72410998002Smrg  # Remove the call to Libtool.
72510998002Smrg  if test "$libtool" = yes; then
72610998002Smrg    while test "X$1" != 'X--mode=compile'; do
72710998002Smrg      shift
72810998002Smrg    done
72910998002Smrg    shift
73010998002Smrg  fi
73110998002Smrg
732ff7e0accSmrg  IFS=" "
733ff7e0accSmrg  for arg
734ff7e0accSmrg  do
735ff7e0accSmrg    case "$arg" in
73610998002Smrg    -o)
73710998002Smrg      shift
73810998002Smrg      ;;
73910998002Smrg    $object)
74010998002Smrg      shift
74110998002Smrg      ;;
742ff7e0accSmrg    "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
74305bee9bcSmrg        set fnord "$@"
74405bee9bcSmrg        shift
74505bee9bcSmrg        shift
74605bee9bcSmrg        ;;
747ff7e0accSmrg    *)
74805bee9bcSmrg        set fnord "$@" "$arg"
74905bee9bcSmrg        shift
75005bee9bcSmrg        shift
75105bee9bcSmrg        ;;
752ff7e0accSmrg    esac
753ff7e0accSmrg  done
75410998002Smrg  "$@" -E 2>/dev/null |
75510998002Smrg  sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile"
756ff7e0accSmrg  rm -f "$depfile"
757ff7e0accSmrg  echo "$object : \\" > "$depfile"
75805bee9bcSmrg  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile"
75905bee9bcSmrg  echo "$tab" >> "$depfile"
76010998002Smrg  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile"
761ff7e0accSmrg  rm -f "$tmpdepfile"
762ff7e0accSmrg  ;;
763ff7e0accSmrg
76410998002Smrgmsvcmsys)
76510998002Smrg  # This case exists only to let depend.m4 do its work.  It works by
76610998002Smrg  # looking at the text of this script.  This case will never be run,
76710998002Smrg  # since it is checked for above.
76810998002Smrg  exit 1
76910998002Smrg  ;;
77010998002Smrg
771ff7e0accSmrgnone)
772ff7e0accSmrg  exec "$@"
773ff7e0accSmrg  ;;
774ff7e0accSmrg
775ff7e0accSmrg*)
776ff7e0accSmrg  echo "Unknown depmode $depmode" 1>&2
777ff7e0accSmrg  exit 1
778ff7e0accSmrg  ;;
779ff7e0accSmrgesac
780ff7e0accSmrg
781ff7e0accSmrgexit 0
782ff7e0accSmrg
783ff7e0accSmrg# Local Variables:
784ff7e0accSmrg# mode: shell-script
785ff7e0accSmrg# sh-indentation: 2
7862163f7f8Smrg# eval: (add-hook 'before-save-hook 'time-stamp)
787ff7e0accSmrg# time-stamp-start: "scriptversion="
788ff7e0accSmrg# time-stamp-format: "%:y-%02m-%02d.%02H"
7892163f7f8Smrg# time-stamp-time-zone: "UTC0"
79010998002Smrg# time-stamp-end: "; # UTC"
791ff7e0accSmrg# End:
792