depcomp revision 963d66ac
17e6fb56fSmrg#! /bin/sh
27e6fb56fSmrg# depcomp - compile a program generating dependencies as side-effects
37e6fb56fSmrg
4963d66acSmrgscriptversion=2013-05-30.07; # UTC
57e6fb56fSmrg
6963d66acSmrg# Copyright (C) 1999-2014 Free Software Foundation, Inc.
77e6fb56fSmrg
87e6fb56fSmrg# This program is free software; you can redistribute it and/or modify
97e6fb56fSmrg# it under the terms of the GNU General Public License as published by
107e6fb56fSmrg# the Free Software Foundation; either version 2, or (at your option)
117e6fb56fSmrg# any later version.
127e6fb56fSmrg
137e6fb56fSmrg# This program is distributed in the hope that it will be useful,
147e6fb56fSmrg# but WITHOUT ANY WARRANTY; without even the implied warranty of
157e6fb56fSmrg# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
167e6fb56fSmrg# GNU General Public License for more details.
177e6fb56fSmrg
187e6fb56fSmrg# You should have received a copy of the GNU General Public License
197e6fb56fSmrg# along with this program.  If not, see <http://www.gnu.org/licenses/>.
207e6fb56fSmrg
217e6fb56fSmrg# As a special exception to the GNU General Public License, if you
227e6fb56fSmrg# distribute this file as part of a program that contains a
237e6fb56fSmrg# configuration script generated by Autoconf, you may include it under
247e6fb56fSmrg# the same distribution terms that you use for the rest of that program.
257e6fb56fSmrg
267e6fb56fSmrg# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>.
277e6fb56fSmrg
287e6fb56fSmrgcase $1 in
297e6fb56fSmrg  '')
30963d66acSmrg    echo "$0: No command.  Try '$0 --help' for more information." 1>&2
31963d66acSmrg    exit 1;
32963d66acSmrg    ;;
337e6fb56fSmrg  -h | --h*)
347e6fb56fSmrg    cat <<\EOF
357e6fb56fSmrgUsage: depcomp [--help] [--version] PROGRAM [ARGS]
367e6fb56fSmrg
377e6fb56fSmrgRun PROGRAMS ARGS to compile a file, generating dependencies
387e6fb56fSmrgas side-effects.
397e6fb56fSmrg
407e6fb56fSmrgEnvironment variables:
417e6fb56fSmrg  depmode     Dependency tracking mode.
4290b17f1bSmrg  source      Source file read by 'PROGRAMS ARGS'.
4390b17f1bSmrg  object      Object file output by 'PROGRAMS ARGS'.
447e6fb56fSmrg  DEPDIR      directory where to store dependencies.
457e6fb56fSmrg  depfile     Dependency file to output.
4690b17f1bSmrg  tmpdepfile  Temporary file to use when outputting dependencies.
477e6fb56fSmrg  libtool     Whether libtool is used (yes/no).
487e6fb56fSmrg
497e6fb56fSmrgReport bugs to <bug-automake@gnu.org>.
507e6fb56fSmrgEOF
517e6fb56fSmrg    exit $?
527e6fb56fSmrg    ;;
537e6fb56fSmrg  -v | --v*)
547e6fb56fSmrg    echo "depcomp $scriptversion"
557e6fb56fSmrg    exit $?
567e6fb56fSmrg    ;;
577e6fb56fSmrgesac
587e6fb56fSmrg
59963d66acSmrg# Get the directory component of the given path, and save it in the
60963d66acSmrg# global variables '$dir'.  Note that this directory component will
61963d66acSmrg# be either empty or ending with a '/' character.  This is deliberate.
62963d66acSmrgset_dir_from ()
63963d66acSmrg{
64963d66acSmrg  case $1 in
65963d66acSmrg    */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;;
66963d66acSmrg      *) dir=;;
67963d66acSmrg  esac
68963d66acSmrg}
69963d66acSmrg
70963d66acSmrg# Get the suffix-stripped basename of the given path, and save it the
71963d66acSmrg# global variable '$base'.
72963d66acSmrgset_base_from ()
73963d66acSmrg{
74963d66acSmrg  base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'`
75963d66acSmrg}
76963d66acSmrg
77963d66acSmrg# If no dependency file was actually created by the compiler invocation,
78963d66acSmrg# we still have to create a dummy depfile, to avoid errors with the
79963d66acSmrg# Makefile "include basename.Plo" scheme.
80963d66acSmrgmake_dummy_depfile ()
81963d66acSmrg{
82963d66acSmrg  echo "#dummy" > "$depfile"
83963d66acSmrg}
84963d66acSmrg
85963d66acSmrg# Factor out some common post-processing of the generated depfile.
86963d66acSmrg# Requires the auxiliary global variable '$tmpdepfile' to be set.
87963d66acSmrgaix_post_process_depfile ()
88963d66acSmrg{
89963d66acSmrg  # If the compiler actually managed to produce a dependency file,
90963d66acSmrg  # post-process it.
91963d66acSmrg  if test -f "$tmpdepfile"; then
92963d66acSmrg    # Each line is of the form 'foo.o: dependency.h'.
93963d66acSmrg    # Do two passes, one to just change these to
94963d66acSmrg    #   $object: dependency.h
95963d66acSmrg    # and one to simply output
96963d66acSmrg    #   dependency.h:
97963d66acSmrg    # which is needed to avoid the deleted-header problem.
98963d66acSmrg    { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile"
99963d66acSmrg      sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile"
100963d66acSmrg    } > "$depfile"
101963d66acSmrg    rm -f "$tmpdepfile"
102963d66acSmrg  else
103963d66acSmrg    make_dummy_depfile
104963d66acSmrg  fi
105963d66acSmrg}
106963d66acSmrg
10790b17f1bSmrg# A tabulation character.
10890b17f1bSmrgtab='	'
10990b17f1bSmrg# A newline character.
11090b17f1bSmrgnl='
11190b17f1bSmrg'
112963d66acSmrg# Character ranges might be problematic outside the C locale.
113963d66acSmrg# These definitions help.
114963d66acSmrgupper=ABCDEFGHIJKLMNOPQRSTUVWXYZ
115963d66acSmrglower=abcdefghijklmnopqrstuvwxyz
116963d66acSmrgdigits=0123456789
117963d66acSmrgalpha=${upper}${lower}
11890b17f1bSmrg
1197e6fb56fSmrgif test -z "$depmode" || test -z "$source" || test -z "$object"; then
1207e6fb56fSmrg  echo "depcomp: Variables source, object and depmode must be set" 1>&2
1217e6fb56fSmrg  exit 1
1227e6fb56fSmrgfi
1237e6fb56fSmrg
1247e6fb56fSmrg# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.
1257e6fb56fSmrgdepfile=${depfile-`echo "$object" |
1267e6fb56fSmrg  sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`}
1277e6fb56fSmrgtmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
1287e6fb56fSmrg
1297e6fb56fSmrgrm -f "$tmpdepfile"
1307e6fb56fSmrg
131963d66acSmrg# Avoid interferences from the environment.
132963d66acSmrggccflag= dashmflag=
133963d66acSmrg
1347e6fb56fSmrg# Some modes work just like other modes, but use different flags.  We
1357e6fb56fSmrg# parameterize here, but still list the modes in the big case below,
1367e6fb56fSmrg# to make depend.m4 easier to write.  Note that we *cannot* use a case
1377e6fb56fSmrg# here, because this file can only contain one case statement.
1387e6fb56fSmrgif test "$depmode" = hp; then
1397e6fb56fSmrg  # HP compiler uses -M and no extra arg.
1407e6fb56fSmrg  gccflag=-M
1417e6fb56fSmrg  depmode=gcc
1427e6fb56fSmrgfi
1437e6fb56fSmrg
1447e6fb56fSmrgif test "$depmode" = dashXmstdout; then
145963d66acSmrg  # This is just like dashmstdout with a different argument.
146963d66acSmrg  dashmflag=-xM
147963d66acSmrg  depmode=dashmstdout
1487e6fb56fSmrgfi
1497e6fb56fSmrg
1507e6fb56fSmrgcygpath_u="cygpath -u -f -"
1517e6fb56fSmrgif test "$depmode" = msvcmsys; then
152963d66acSmrg  # This is just like msvisualcpp but w/o cygpath translation.
153963d66acSmrg  # Just convert the backslash-escaped backslashes to single forward
154963d66acSmrg  # slashes to satisfy depend.m4
155963d66acSmrg  cygpath_u='sed s,\\\\,/,g'
156963d66acSmrg  depmode=msvisualcpp
1577e6fb56fSmrgfi
1587e6fb56fSmrg
15990b17f1bSmrgif test "$depmode" = msvc7msys; then
160963d66acSmrg  # This is just like msvc7 but w/o cygpath translation.
161963d66acSmrg  # Just convert the backslash-escaped backslashes to single forward
162963d66acSmrg  # slashes to satisfy depend.m4
163963d66acSmrg  cygpath_u='sed s,\\\\,/,g'
164963d66acSmrg  depmode=msvc7
16590b17f1bSmrgfi
16690b17f1bSmrg
16790b17f1bSmrgif test "$depmode" = xlc; then
168963d66acSmrg  # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information.
169963d66acSmrg  gccflag=-qmakedep=gcc,-MF
170963d66acSmrg  depmode=gcc
17190b17f1bSmrgfi
17290b17f1bSmrg
1737e6fb56fSmrgcase "$depmode" in
1747e6fb56fSmrggcc3)
1757e6fb56fSmrg## gcc 3 implements dependency tracking that does exactly what
1767e6fb56fSmrg## we want.  Yay!  Note: for some reason libtool 1.4 doesn't like
1777e6fb56fSmrg## it if -MD -MP comes after the -MF stuff.  Hmm.
1787e6fb56fSmrg## Unfortunately, FreeBSD c89 acceptance of flags depends upon
1797e6fb56fSmrg## the command line argument order; so add the flags where they
1807e6fb56fSmrg## appear in depend2.am.  Note that the slowdown incurred here
1817e6fb56fSmrg## affects only configure: in makefiles, %FASTDEP% shortcuts this.
1827e6fb56fSmrg  for arg
1837e6fb56fSmrg  do
1847e6fb56fSmrg    case $arg in
1857e6fb56fSmrg    -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;;
1867e6fb56fSmrg    *)  set fnord "$@" "$arg" ;;
1877e6fb56fSmrg    esac
1887e6fb56fSmrg    shift # fnord
1897e6fb56fSmrg    shift # $arg
1907e6fb56fSmrg  done
1917e6fb56fSmrg  "$@"
1927e6fb56fSmrg  stat=$?
193963d66acSmrg  if test $stat -ne 0; then
1947e6fb56fSmrg    rm -f "$tmpdepfile"
1957e6fb56fSmrg    exit $stat
1967e6fb56fSmrg  fi
1977e6fb56fSmrg  mv "$tmpdepfile" "$depfile"
1987e6fb56fSmrg  ;;
1997e6fb56fSmrg
2007e6fb56fSmrggcc)
201963d66acSmrg## Note that this doesn't just cater to obsosete pre-3.x GCC compilers.
202963d66acSmrg## but also to in-use compilers like IMB xlc/xlC and the HP C compiler.
203963d66acSmrg## (see the conditional assignment to $gccflag above).
2047e6fb56fSmrg## There are various ways to get dependency output from gcc.  Here's
2057e6fb56fSmrg## why we pick this rather obscure method:
2067e6fb56fSmrg## - Don't want to use -MD because we'd like the dependencies to end
2077e6fb56fSmrg##   up in a subdir.  Having to rename by hand is ugly.
2087e6fb56fSmrg##   (We might end up doing this anyway to support other compilers.)
2097e6fb56fSmrg## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
210963d66acSmrg##   -MM, not -M (despite what the docs say).  Also, it might not be
211963d66acSmrg##   supported by the other compilers which use the 'gcc' depmode.
2127e6fb56fSmrg## - Using -M directly means running the compiler twice (even worse
2137e6fb56fSmrg##   than renaming).
2147e6fb56fSmrg  if test -z "$gccflag"; then
2157e6fb56fSmrg    gccflag=-MD,
2167e6fb56fSmrg  fi
2177e6fb56fSmrg  "$@" -Wp,"$gccflag$tmpdepfile"
2187e6fb56fSmrg  stat=$?
219963d66acSmrg  if test $stat -ne 0; then
2207e6fb56fSmrg    rm -f "$tmpdepfile"
2217e6fb56fSmrg    exit $stat
2227e6fb56fSmrg  fi
2237e6fb56fSmrg  rm -f "$depfile"
2247e6fb56fSmrg  echo "$object : \\" > "$depfile"
225963d66acSmrg  # The second -e expression handles DOS-style file names with drive
226963d66acSmrg  # letters.
2277e6fb56fSmrg  sed -e 's/^[^:]*: / /' \
2287e6fb56fSmrg      -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
22990b17f1bSmrg## This next piece of magic avoids the "deleted header file" problem.
2307e6fb56fSmrg## The problem is that when a header file which appears in a .P file
2317e6fb56fSmrg## is deleted, the dependency causes make to die (because there is
2327e6fb56fSmrg## typically no way to rebuild the header).  We avoid this by adding
2337e6fb56fSmrg## dummy dependencies for each header file.  Too bad gcc doesn't do
2347e6fb56fSmrg## this for us directly.
23590b17f1bSmrg## Some versions of gcc put a space before the ':'.  On the theory
2367e6fb56fSmrg## that the space means something, we add a space to the output as
23790b17f1bSmrg## well.  hp depmode also adds that space, but also prefixes the VPATH
23890b17f1bSmrg## to the object.  Take care to not repeat it in the output.
2397e6fb56fSmrg## Some versions of the HPUX 10.20 sed can't process this invocation
2407e6fb56fSmrg## correctly.  Breaking it into two sed invocations is a workaround.
241963d66acSmrg  tr ' ' "$nl" < "$tmpdepfile" \
242963d66acSmrg    | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \
243963d66acSmrg    | sed -e 's/$/ :/' >> "$depfile"
2447e6fb56fSmrg  rm -f "$tmpdepfile"
2457e6fb56fSmrg  ;;
2467e6fb56fSmrg
2477e6fb56fSmrghp)
2487e6fb56fSmrg  # This case exists only to let depend.m4 do its work.  It works by
2497e6fb56fSmrg  # looking at the text of this script.  This case will never be run,
2507e6fb56fSmrg  # since it is checked for above.
2517e6fb56fSmrg  exit 1
2527e6fb56fSmrg  ;;
2537e6fb56fSmrg
2547e6fb56fSmrgsgi)
2557e6fb56fSmrg  if test "$libtool" = yes; then
2567e6fb56fSmrg    "$@" "-Wp,-MDupdate,$tmpdepfile"
2577e6fb56fSmrg  else
2587e6fb56fSmrg    "$@" -MDupdate "$tmpdepfile"
2597e6fb56fSmrg  fi
2607e6fb56fSmrg  stat=$?
261963d66acSmrg  if test $stat -ne 0; then
2627e6fb56fSmrg    rm -f "$tmpdepfile"
2637e6fb56fSmrg    exit $stat
2647e6fb56fSmrg  fi
2657e6fb56fSmrg  rm -f "$depfile"
2667e6fb56fSmrg
2677e6fb56fSmrg  if test -f "$tmpdepfile"; then  # yes, the sourcefile depend on other files
2687e6fb56fSmrg    echo "$object : \\" > "$depfile"
2697e6fb56fSmrg    # Clip off the initial element (the dependent).  Don't try to be
2707e6fb56fSmrg    # clever and replace this with sed code, as IRIX sed won't handle
2717e6fb56fSmrg    # lines with more than a fixed number of characters (4096 in
2727e6fb56fSmrg    # IRIX 6.2 sed, 8192 in IRIX 6.5).  We also remove comment lines;
27390b17f1bSmrg    # the IRIX cc adds comments like '#:fec' to the end of the
2747e6fb56fSmrg    # dependency line.
27590b17f1bSmrg    tr ' ' "$nl" < "$tmpdepfile" \
276963d66acSmrg      | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \
277963d66acSmrg      | tr "$nl" ' ' >> "$depfile"
2787e6fb56fSmrg    echo >> "$depfile"
2797e6fb56fSmrg    # The second pass generates a dummy entry for each header file.
28090b17f1bSmrg    tr ' ' "$nl" < "$tmpdepfile" \
281963d66acSmrg      | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
282963d66acSmrg      >> "$depfile"
2837e6fb56fSmrg  else
284963d66acSmrg    make_dummy_depfile
2857e6fb56fSmrg  fi
2867e6fb56fSmrg  rm -f "$tmpdepfile"
2877e6fb56fSmrg  ;;
2887e6fb56fSmrg
28990b17f1bSmrgxlc)
29090b17f1bSmrg  # This case exists only to let depend.m4 do its work.  It works by
29190b17f1bSmrg  # looking at the text of this script.  This case will never be run,
29290b17f1bSmrg  # since it is checked for above.
29390b17f1bSmrg  exit 1
29490b17f1bSmrg  ;;
29590b17f1bSmrg
2967e6fb56fSmrgaix)
2977e6fb56fSmrg  # The C for AIX Compiler uses -M and outputs the dependencies
2987e6fb56fSmrg  # in a .u file.  In older versions, this file always lives in the
29990b17f1bSmrg  # current directory.  Also, the AIX compiler puts '$object:' at the
3007e6fb56fSmrg  # start of each line; $object doesn't have directory information.
3017e6fb56fSmrg  # Version 6 uses the directory in both cases.
302963d66acSmrg  set_dir_from "$object"
303963d66acSmrg  set_base_from "$object"
3047e6fb56fSmrg  if test "$libtool" = yes; then
3057e6fb56fSmrg    tmpdepfile1=$dir$base.u
3067e6fb56fSmrg    tmpdepfile2=$base.u
3077e6fb56fSmrg    tmpdepfile3=$dir.libs/$base.u
3087e6fb56fSmrg    "$@" -Wc,-M
3097e6fb56fSmrg  else
3107e6fb56fSmrg    tmpdepfile1=$dir$base.u
3117e6fb56fSmrg    tmpdepfile2=$dir$base.u
3127e6fb56fSmrg    tmpdepfile3=$dir$base.u
3137e6fb56fSmrg    "$@" -M
3147e6fb56fSmrg  fi
3157e6fb56fSmrg  stat=$?
316963d66acSmrg  if test $stat -ne 0; then
3177e6fb56fSmrg    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
3187e6fb56fSmrg    exit $stat
3197e6fb56fSmrg  fi
3207e6fb56fSmrg
3217e6fb56fSmrg  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
3227e6fb56fSmrg  do
3237e6fb56fSmrg    test -f "$tmpdepfile" && break
3247e6fb56fSmrg  done
325963d66acSmrg  aix_post_process_depfile
326963d66acSmrg  ;;
327963d66acSmrg
328963d66acSmrgtcc)
329963d66acSmrg  # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26
330963d66acSmrg  # FIXME: That version still under development at the moment of writing.
331963d66acSmrg  #        Make that this statement remains true also for stable, released
332963d66acSmrg  #        versions.
333963d66acSmrg  # It will wrap lines (doesn't matter whether long or short) with a
334963d66acSmrg  # trailing '\', as in:
335963d66acSmrg  #
336963d66acSmrg  #   foo.o : \
337963d66acSmrg  #    foo.c \
338963d66acSmrg  #    foo.h \
339963d66acSmrg  #
340963d66acSmrg  # It will put a trailing '\' even on the last line, and will use leading
341963d66acSmrg  # spaces rather than leading tabs (at least since its commit 0394caf7
342963d66acSmrg  # "Emit spaces for -MD").
343963d66acSmrg  "$@" -MD -MF "$tmpdepfile"
344963d66acSmrg  stat=$?
345963d66acSmrg  if test $stat -ne 0; then
346963d66acSmrg    rm -f "$tmpdepfile"
347963d66acSmrg    exit $stat
3487e6fb56fSmrg  fi
349963d66acSmrg  rm -f "$depfile"
350963d66acSmrg  # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'.
351963d66acSmrg  # We have to change lines of the first kind to '$object: \'.
352963d66acSmrg  sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile"
353963d66acSmrg  # And for each line of the second kind, we have to emit a 'dep.h:'
354963d66acSmrg  # dummy dependency, to avoid the deleted-header problem.
355963d66acSmrg  sed -n -e 's|^  *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile"
3567e6fb56fSmrg  rm -f "$tmpdepfile"
3577e6fb56fSmrg  ;;
3587e6fb56fSmrg
359963d66acSmrg## The order of this option in the case statement is important, since the
360963d66acSmrg## shell code in configure will try each of these formats in the order
361963d66acSmrg## listed in this file.  A plain '-MD' option would be understood by many
362963d66acSmrg## compilers, so we must ensure this comes after the gcc and icc options.
363963d66acSmrgpgcc)
364963d66acSmrg  # Portland's C compiler understands '-MD'.
365963d66acSmrg  # Will always output deps to 'file.d' where file is the root name of the
366963d66acSmrg  # source file under compilation, even if file resides in a subdirectory.
367963d66acSmrg  # The object file name does not affect the name of the '.d' file.
368963d66acSmrg  # pgcc 10.2 will output
3697e6fb56fSmrg  #    foo.o: sub/foo.c sub/foo.h
370963d66acSmrg  # and will wrap long lines using '\' :
3717e6fb56fSmrg  #    foo.o: sub/foo.c ... \
3727e6fb56fSmrg  #     sub/foo.h ... \
3737e6fb56fSmrg  #     ...
374963d66acSmrg  set_dir_from "$object"
375963d66acSmrg  # Use the source, not the object, to determine the base name, since
376963d66acSmrg  # that's sadly what pgcc will do too.
377963d66acSmrg  set_base_from "$source"
378963d66acSmrg  tmpdepfile=$base.d
379963d66acSmrg
380963d66acSmrg  # For projects that build the same source file twice into different object
381963d66acSmrg  # files, the pgcc approach of using the *source* file root name can cause
382963d66acSmrg  # problems in parallel builds.  Use a locking strategy to avoid stomping on
383963d66acSmrg  # the same $tmpdepfile.
384963d66acSmrg  lockdir=$base.d-lock
385963d66acSmrg  trap "
386963d66acSmrg    echo '$0: caught signal, cleaning up...' >&2
387963d66acSmrg    rmdir '$lockdir'
388963d66acSmrg    exit 1
389963d66acSmrg  " 1 2 13 15
390963d66acSmrg  numtries=100
391963d66acSmrg  i=$numtries
392963d66acSmrg  while test $i -gt 0; do
393963d66acSmrg    # mkdir is a portable test-and-set.
394963d66acSmrg    if mkdir "$lockdir" 2>/dev/null; then
395963d66acSmrg      # This process acquired the lock.
396963d66acSmrg      "$@" -MD
397963d66acSmrg      stat=$?
398963d66acSmrg      # Release the lock.
399963d66acSmrg      rmdir "$lockdir"
400963d66acSmrg      break
401963d66acSmrg    else
402963d66acSmrg      # If the lock is being held by a different process, wait
403963d66acSmrg      # until the winning process is done or we timeout.
404963d66acSmrg      while test -d "$lockdir" && test $i -gt 0; do
405963d66acSmrg        sleep 1
406963d66acSmrg        i=`expr $i - 1`
407963d66acSmrg      done
408963d66acSmrg    fi
409963d66acSmrg    i=`expr $i - 1`
410963d66acSmrg  done
411963d66acSmrg  trap - 1 2 13 15
412963d66acSmrg  if test $i -le 0; then
413963d66acSmrg    echo "$0: failed to acquire lock after $numtries attempts" >&2
414963d66acSmrg    echo "$0: check lockdir '$lockdir'" >&2
415963d66acSmrg    exit 1
416963d66acSmrg  fi
417963d66acSmrg
418963d66acSmrg  if test $stat -ne 0; then
4197e6fb56fSmrg    rm -f "$tmpdepfile"
4207e6fb56fSmrg    exit $stat
4217e6fb56fSmrg  fi
4227e6fb56fSmrg  rm -f "$depfile"
423963d66acSmrg  # Each line is of the form `foo.o: dependent.h',
424963d66acSmrg  # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'.
4257e6fb56fSmrg  # Do two passes, one to just change these to
426963d66acSmrg  # `$object: dependent.h' and one to simply `dependent.h:'.
427963d66acSmrg  sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
428963d66acSmrg  # Some versions of the HPUX 10.20 sed can't process this invocation
429963d66acSmrg  # correctly.  Breaking it into two sed invocations is a workaround.
430963d66acSmrg  sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \
431963d66acSmrg    | sed -e 's/$/ :/' >> "$depfile"
4327e6fb56fSmrg  rm -f "$tmpdepfile"
4337e6fb56fSmrg  ;;
4347e6fb56fSmrg
4357e6fb56fSmrghp2)
4367e6fb56fSmrg  # The "hp" stanza above does not work with aCC (C++) and HP's ia64
4377e6fb56fSmrg  # compilers, which have integrated preprocessors.  The correct option
4387e6fb56fSmrg  # to use with these is +Maked; it writes dependencies to a file named
4397e6fb56fSmrg  # 'foo.d', which lands next to the object file, wherever that
4407e6fb56fSmrg  # happens to be.
4417e6fb56fSmrg  # Much of this is similar to the tru64 case; see comments there.
442963d66acSmrg  set_dir_from  "$object"
443963d66acSmrg  set_base_from "$object"
4447e6fb56fSmrg  if test "$libtool" = yes; then
4457e6fb56fSmrg    tmpdepfile1=$dir$base.d
4467e6fb56fSmrg    tmpdepfile2=$dir.libs/$base.d
4477e6fb56fSmrg    "$@" -Wc,+Maked
4487e6fb56fSmrg  else
4497e6fb56fSmrg    tmpdepfile1=$dir$base.d
4507e6fb56fSmrg    tmpdepfile2=$dir$base.d
4517e6fb56fSmrg    "$@" +Maked
4527e6fb56fSmrg  fi
4537e6fb56fSmrg  stat=$?
454963d66acSmrg  if test $stat -ne 0; then
4557e6fb56fSmrg     rm -f "$tmpdepfile1" "$tmpdepfile2"
4567e6fb56fSmrg     exit $stat
4577e6fb56fSmrg  fi
4587e6fb56fSmrg
4597e6fb56fSmrg  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2"
4607e6fb56fSmrg  do
4617e6fb56fSmrg    test -f "$tmpdepfile" && break
4627e6fb56fSmrg  done
4637e6fb56fSmrg  if test -f "$tmpdepfile"; then
464963d66acSmrg    sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile"
46590b17f1bSmrg    # Add 'dependent.h:' lines.
4667e6fb56fSmrg    sed -ne '2,${
467963d66acSmrg               s/^ *//
468963d66acSmrg               s/ \\*$//
469963d66acSmrg               s/$/:/
470963d66acSmrg               p
471963d66acSmrg             }' "$tmpdepfile" >> "$depfile"
4727e6fb56fSmrg  else
473963d66acSmrg    make_dummy_depfile
4747e6fb56fSmrg  fi
4757e6fb56fSmrg  rm -f "$tmpdepfile" "$tmpdepfile2"
4767e6fb56fSmrg  ;;
4777e6fb56fSmrg
4787e6fb56fSmrgtru64)
479963d66acSmrg  # The Tru64 compiler uses -MD to generate dependencies as a side
480963d66acSmrg  # effect.  'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'.
481963d66acSmrg  # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
482963d66acSmrg  # dependencies in 'foo.d' instead, so we check for that too.
483963d66acSmrg  # Subdirectories are respected.
484963d66acSmrg  set_dir_from  "$object"
485963d66acSmrg  set_base_from "$object"
486963d66acSmrg
487963d66acSmrg  if test "$libtool" = yes; then
488963d66acSmrg    # Libtool generates 2 separate objects for the 2 libraries.  These
489963d66acSmrg    # two compilations output dependencies in $dir.libs/$base.o.d and
490963d66acSmrg    # in $dir$base.o.d.  We have to check for both files, because
491963d66acSmrg    # one of the two compilations can be disabled.  We should prefer
492963d66acSmrg    # $dir$base.o.d over $dir.libs/$base.o.d because the latter is
493963d66acSmrg    # automatically cleaned when .libs/ is deleted, while ignoring
494963d66acSmrg    # the former would cause a distcleancheck panic.
495963d66acSmrg    tmpdepfile1=$dir$base.o.d          # libtool 1.5
496963d66acSmrg    tmpdepfile2=$dir.libs/$base.o.d    # Likewise.
497963d66acSmrg    tmpdepfile3=$dir.libs/$base.d      # Compaq CCC V6.2-504
498963d66acSmrg    "$@" -Wc,-MD
499963d66acSmrg  else
500963d66acSmrg    tmpdepfile1=$dir$base.d
501963d66acSmrg    tmpdepfile2=$dir$base.d
502963d66acSmrg    tmpdepfile3=$dir$base.d
503963d66acSmrg    "$@" -MD
504963d66acSmrg  fi
505963d66acSmrg
506963d66acSmrg  stat=$?
507963d66acSmrg  if test $stat -ne 0; then
508963d66acSmrg    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
509963d66acSmrg    exit $stat
510963d66acSmrg  fi
511963d66acSmrg
512963d66acSmrg  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
513963d66acSmrg  do
514963d66acSmrg    test -f "$tmpdepfile" && break
515963d66acSmrg  done
516963d66acSmrg  # Same post-processing that is required for AIX mode.
517963d66acSmrg  aix_post_process_depfile
518963d66acSmrg  ;;
5197e6fb56fSmrg
52090b17f1bSmrgmsvc7)
52190b17f1bSmrg  if test "$libtool" = yes; then
52290b17f1bSmrg    showIncludes=-Wc,-showIncludes
52390b17f1bSmrg  else
52490b17f1bSmrg    showIncludes=-showIncludes
52590b17f1bSmrg  fi
52690b17f1bSmrg  "$@" $showIncludes > "$tmpdepfile"
52790b17f1bSmrg  stat=$?
52890b17f1bSmrg  grep -v '^Note: including file: ' "$tmpdepfile"
529963d66acSmrg  if test $stat -ne 0; then
53090b17f1bSmrg    rm -f "$tmpdepfile"
53190b17f1bSmrg    exit $stat
53290b17f1bSmrg  fi
53390b17f1bSmrg  rm -f "$depfile"
53490b17f1bSmrg  echo "$object : \\" > "$depfile"
53590b17f1bSmrg  # The first sed program below extracts the file names and escapes
53690b17f1bSmrg  # backslashes for cygpath.  The second sed program outputs the file
53790b17f1bSmrg  # name when reading, but also accumulates all include files in the
53890b17f1bSmrg  # hold buffer in order to output them again at the end.  This only
53990b17f1bSmrg  # works with sed implementations that can handle large buffers.
54090b17f1bSmrg  sed < "$tmpdepfile" -n '
54190b17f1bSmrg/^Note: including file:  *\(.*\)/ {
54290b17f1bSmrg  s//\1/
54390b17f1bSmrg  s/\\/\\\\/g
54490b17f1bSmrg  p
54590b17f1bSmrg}' | $cygpath_u | sort -u | sed -n '
54690b17f1bSmrgs/ /\\ /g
54790b17f1bSmrgs/\(.*\)/'"$tab"'\1 \\/p
54890b17f1bSmrgs/.\(.*\) \\/\1:/
54990b17f1bSmrgH
55090b17f1bSmrg$ {
55190b17f1bSmrg  s/.*/'"$tab"'/
55290b17f1bSmrg  G
55390b17f1bSmrg  p
55490b17f1bSmrg}' >> "$depfile"
555963d66acSmrg  echo >> "$depfile" # make sure the fragment doesn't end with a backslash
55690b17f1bSmrg  rm -f "$tmpdepfile"
55790b17f1bSmrg  ;;
55890b17f1bSmrg
55990b17f1bSmrgmsvc7msys)
56090b17f1bSmrg  # This case exists only to let depend.m4 do its work.  It works by
56190b17f1bSmrg  # looking at the text of this script.  This case will never be run,
56290b17f1bSmrg  # since it is checked for above.
56390b17f1bSmrg  exit 1
56490b17f1bSmrg  ;;
56590b17f1bSmrg
5667e6fb56fSmrg#nosideeffect)
5677e6fb56fSmrg  # This comment above is used by automake to tell side-effect
5687e6fb56fSmrg  # dependency tracking mechanisms from slower ones.
5697e6fb56fSmrg
5707e6fb56fSmrgdashmstdout)
5717e6fb56fSmrg  # Important note: in order to support this mode, a compiler *must*
5727e6fb56fSmrg  # always write the preprocessed file to stdout, regardless of -o.
5737e6fb56fSmrg  "$@" || exit $?
5747e6fb56fSmrg
5757e6fb56fSmrg  # Remove the call to Libtool.
5767e6fb56fSmrg  if test "$libtool" = yes; then
5777e6fb56fSmrg    while test "X$1" != 'X--mode=compile'; do
5787e6fb56fSmrg      shift
5797e6fb56fSmrg    done
5807e6fb56fSmrg    shift
5817e6fb56fSmrg  fi
5827e6fb56fSmrg
58390b17f1bSmrg  # Remove '-o $object'.
5847e6fb56fSmrg  IFS=" "
5857e6fb56fSmrg  for arg
5867e6fb56fSmrg  do
5877e6fb56fSmrg    case $arg in
5887e6fb56fSmrg    -o)
5897e6fb56fSmrg      shift
5907e6fb56fSmrg      ;;
5917e6fb56fSmrg    $object)
5927e6fb56fSmrg      shift
5937e6fb56fSmrg      ;;
5947e6fb56fSmrg    *)
5957e6fb56fSmrg      set fnord "$@" "$arg"
5967e6fb56fSmrg      shift # fnord
5977e6fb56fSmrg      shift # $arg
5987e6fb56fSmrg      ;;
5997e6fb56fSmrg    esac
6007e6fb56fSmrg  done
6017e6fb56fSmrg
6027e6fb56fSmrg  test -z "$dashmflag" && dashmflag=-M
60390b17f1bSmrg  # Require at least two characters before searching for ':'
6047e6fb56fSmrg  # in the target name.  This is to cope with DOS-style filenames:
60590b17f1bSmrg  # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise.
6067e6fb56fSmrg  "$@" $dashmflag |
607963d66acSmrg    sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile"
6087e6fb56fSmrg  rm -f "$depfile"
6097e6fb56fSmrg  cat < "$tmpdepfile" > "$depfile"
610963d66acSmrg  # Some versions of the HPUX 10.20 sed can't process this sed invocation
611963d66acSmrg  # correctly.  Breaking it into two sed invocations is a workaround.
612963d66acSmrg  tr ' ' "$nl" < "$tmpdepfile" \
613963d66acSmrg    | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
614963d66acSmrg    | sed -e 's/$/ :/' >> "$depfile"
6157e6fb56fSmrg  rm -f "$tmpdepfile"
6167e6fb56fSmrg  ;;
6177e6fb56fSmrg
6187e6fb56fSmrgdashXmstdout)
6197e6fb56fSmrg  # This case only exists to satisfy depend.m4.  It is never actually
6207e6fb56fSmrg  # run, as this mode is specially recognized in the preamble.
6217e6fb56fSmrg  exit 1
6227e6fb56fSmrg  ;;
6237e6fb56fSmrg
6247e6fb56fSmrgmakedepend)
6257e6fb56fSmrg  "$@" || exit $?
6267e6fb56fSmrg  # Remove any Libtool call
6277e6fb56fSmrg  if test "$libtool" = yes; then
6287e6fb56fSmrg    while test "X$1" != 'X--mode=compile'; do
6297e6fb56fSmrg      shift
6307e6fb56fSmrg    done
6317e6fb56fSmrg    shift
6327e6fb56fSmrg  fi
6337e6fb56fSmrg  # X makedepend
6347e6fb56fSmrg  shift
6357e6fb56fSmrg  cleared=no eat=no
6367e6fb56fSmrg  for arg
6377e6fb56fSmrg  do
6387e6fb56fSmrg    case $cleared in
6397e6fb56fSmrg    no)
6407e6fb56fSmrg      set ""; shift
6417e6fb56fSmrg      cleared=yes ;;
6427e6fb56fSmrg    esac
6437e6fb56fSmrg    if test $eat = yes; then
6447e6fb56fSmrg      eat=no
6457e6fb56fSmrg      continue
6467e6fb56fSmrg    fi
6477e6fb56fSmrg    case "$arg" in
6487e6fb56fSmrg    -D*|-I*)
6497e6fb56fSmrg      set fnord "$@" "$arg"; shift ;;
6507e6fb56fSmrg    # Strip any option that makedepend may not understand.  Remove
6517e6fb56fSmrg    # the object too, otherwise makedepend will parse it as a source file.
6527e6fb56fSmrg    -arch)
6537e6fb56fSmrg      eat=yes ;;
6547e6fb56fSmrg    -*|$object)
6557e6fb56fSmrg      ;;
6567e6fb56fSmrg    *)
6577e6fb56fSmrg      set fnord "$@" "$arg"; shift ;;
6587e6fb56fSmrg    esac
6597e6fb56fSmrg  done
6607e6fb56fSmrg  obj_suffix=`echo "$object" | sed 's/^.*\././'`
6617e6fb56fSmrg  touch "$tmpdepfile"
6627e6fb56fSmrg  ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
6637e6fb56fSmrg  rm -f "$depfile"
66490b17f1bSmrg  # makedepend may prepend the VPATH from the source file name to the object.
66590b17f1bSmrg  # No need to regex-escape $object, excess matching of '.' is harmless.
66690b17f1bSmrg  sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile"
667963d66acSmrg  # Some versions of the HPUX 10.20 sed can't process the last invocation
668963d66acSmrg  # correctly.  Breaking it into two sed invocations is a workaround.
669963d66acSmrg  sed '1,2d' "$tmpdepfile" \
670963d66acSmrg    | tr ' ' "$nl" \
671963d66acSmrg    | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
672963d66acSmrg    | sed -e 's/$/ :/' >> "$depfile"
6737e6fb56fSmrg  rm -f "$tmpdepfile" "$tmpdepfile".bak
6747e6fb56fSmrg  ;;
6757e6fb56fSmrg
6767e6fb56fSmrgcpp)
6777e6fb56fSmrg  # Important note: in order to support this mode, a compiler *must*
6787e6fb56fSmrg  # always write the preprocessed file to stdout.
6797e6fb56fSmrg  "$@" || exit $?
6807e6fb56fSmrg
6817e6fb56fSmrg  # Remove the call to Libtool.
6827e6fb56fSmrg  if test "$libtool" = yes; then
6837e6fb56fSmrg    while test "X$1" != 'X--mode=compile'; do
6847e6fb56fSmrg      shift
6857e6fb56fSmrg    done
6867e6fb56fSmrg    shift
6877e6fb56fSmrg  fi
6887e6fb56fSmrg
68990b17f1bSmrg  # Remove '-o $object'.
6907e6fb56fSmrg  IFS=" "
6917e6fb56fSmrg  for arg
6927e6fb56fSmrg  do
6937e6fb56fSmrg    case $arg in
6947e6fb56fSmrg    -o)
6957e6fb56fSmrg      shift
6967e6fb56fSmrg      ;;
6977e6fb56fSmrg    $object)
6987e6fb56fSmrg      shift
6997e6fb56fSmrg      ;;
7007e6fb56fSmrg    *)
7017e6fb56fSmrg      set fnord "$@" "$arg"
7027e6fb56fSmrg      shift # fnord
7037e6fb56fSmrg      shift # $arg
7047e6fb56fSmrg      ;;
7057e6fb56fSmrg    esac
7067e6fb56fSmrg  done
7077e6fb56fSmrg
708963d66acSmrg  "$@" -E \
709963d66acSmrg    | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
710963d66acSmrg             -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
711963d66acSmrg    | sed '$ s: \\$::' > "$tmpdepfile"
7127e6fb56fSmrg  rm -f "$depfile"
7137e6fb56fSmrg  echo "$object : \\" > "$depfile"
7147e6fb56fSmrg  cat < "$tmpdepfile" >> "$depfile"
7157e6fb56fSmrg  sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
7167e6fb56fSmrg  rm -f "$tmpdepfile"
7177e6fb56fSmrg  ;;
7187e6fb56fSmrg
7197e6fb56fSmrgmsvisualcpp)
7207e6fb56fSmrg  # Important note: in order to support this mode, a compiler *must*
7217e6fb56fSmrg  # always write the preprocessed file to stdout.
7227e6fb56fSmrg  "$@" || exit $?
7237e6fb56fSmrg
7247e6fb56fSmrg  # Remove the call to Libtool.
7257e6fb56fSmrg  if test "$libtool" = yes; then
7267e6fb56fSmrg    while test "X$1" != 'X--mode=compile'; do
7277e6fb56fSmrg      shift
7287e6fb56fSmrg    done
7297e6fb56fSmrg    shift
7307e6fb56fSmrg  fi
7317e6fb56fSmrg
7327e6fb56fSmrg  IFS=" "
7337e6fb56fSmrg  for arg
7347e6fb56fSmrg  do
7357e6fb56fSmrg    case "$arg" in
7367e6fb56fSmrg    -o)
7377e6fb56fSmrg      shift
7387e6fb56fSmrg      ;;
7397e6fb56fSmrg    $object)
7407e6fb56fSmrg      shift
7417e6fb56fSmrg      ;;
7427e6fb56fSmrg    "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
743963d66acSmrg        set fnord "$@"
744963d66acSmrg        shift
745963d66acSmrg        shift
746963d66acSmrg        ;;
7477e6fb56fSmrg    *)
748963d66acSmrg        set fnord "$@" "$arg"
749963d66acSmrg        shift
750963d66acSmrg        shift
751963d66acSmrg        ;;
7527e6fb56fSmrg    esac
7537e6fb56fSmrg  done
7547e6fb56fSmrg  "$@" -E 2>/dev/null |
7557e6fb56fSmrg  sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile"
7567e6fb56fSmrg  rm -f "$depfile"
7577e6fb56fSmrg  echo "$object : \\" > "$depfile"
75890b17f1bSmrg  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile"
75990b17f1bSmrg  echo "$tab" >> "$depfile"
7607e6fb56fSmrg  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile"
7617e6fb56fSmrg  rm -f "$tmpdepfile"
7627e6fb56fSmrg  ;;
7637e6fb56fSmrg
7647e6fb56fSmrgmsvcmsys)
7657e6fb56fSmrg  # This case exists only to let depend.m4 do its work.  It works by
7667e6fb56fSmrg  # looking at the text of this script.  This case will never be run,
7677e6fb56fSmrg  # since it is checked for above.
7687e6fb56fSmrg  exit 1
7697e6fb56fSmrg  ;;
7707e6fb56fSmrg
7717e6fb56fSmrgnone)
7727e6fb56fSmrg  exec "$@"
7737e6fb56fSmrg  ;;
7747e6fb56fSmrg
7757e6fb56fSmrg*)
7767e6fb56fSmrg  echo "Unknown depmode $depmode" 1>&2
7777e6fb56fSmrg  exit 1
7787e6fb56fSmrg  ;;
7797e6fb56fSmrgesac
7807e6fb56fSmrg
7817e6fb56fSmrgexit 0
7827e6fb56fSmrg
7837e6fb56fSmrg# Local Variables:
7847e6fb56fSmrg# mode: shell-script
7857e6fb56fSmrg# sh-indentation: 2
7867e6fb56fSmrg# eval: (add-hook 'write-file-hooks 'time-stamp)
7877e6fb56fSmrg# time-stamp-start: "scriptversion="
7887e6fb56fSmrg# time-stamp-format: "%:y-%02m-%02d.%02H"
7897e6fb56fSmrg# time-stamp-time-zone: "UTC"
7907e6fb56fSmrg# time-stamp-end: "; # UTC"
7917e6fb56fSmrg# End:
792