depcomp revision 9d0ccd10
17914d74bSmrg#! /bin/sh
27914d74bSmrg# depcomp - compile a program generating dependencies as side-effects
37914d74bSmrg
49d0ccd10Smrgscriptversion=2013-05-30.07; # UTC
57914d74bSmrg
69d0ccd10Smrg# Copyright (C) 1999-2014 Free Software Foundation, Inc.
77914d74bSmrg
87914d74bSmrg# This program is free software; you can redistribute it and/or modify
97914d74bSmrg# it under the terms of the GNU General Public License as published by
107914d74bSmrg# the Free Software Foundation; either version 2, or (at your option)
117914d74bSmrg# any later version.
127914d74bSmrg
137914d74bSmrg# This program is distributed in the hope that it will be useful,
147914d74bSmrg# but WITHOUT ANY WARRANTY; without even the implied warranty of
157914d74bSmrg# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
167914d74bSmrg# GNU General Public License for more details.
177914d74bSmrg
187914d74bSmrg# You should have received a copy of the GNU General Public License
19e8ead290Smrg# along with this program.  If not, see <http://www.gnu.org/licenses/>.
207914d74bSmrg
217914d74bSmrg# As a special exception to the GNU General Public License, if you
227914d74bSmrg# distribute this file as part of a program that contains a
237914d74bSmrg# configuration script generated by Autoconf, you may include it under
247914d74bSmrg# the same distribution terms that you use for the rest of that program.
257914d74bSmrg
267914d74bSmrg# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>.
277914d74bSmrg
287914d74bSmrgcase $1 in
297914d74bSmrg  '')
30e6d5e4e0Smrg    echo "$0: No command.  Try '$0 --help' for more information." 1>&2
31e6d5e4e0Smrg    exit 1;
32e6d5e4e0Smrg    ;;
337914d74bSmrg  -h | --h*)
347914d74bSmrg    cat <<\EOF
357914d74bSmrgUsage: depcomp [--help] [--version] PROGRAM [ARGS]
367914d74bSmrg
377914d74bSmrgRun PROGRAMS ARGS to compile a file, generating dependencies
387914d74bSmrgas side-effects.
397914d74bSmrg
407914d74bSmrgEnvironment variables:
417914d74bSmrg  depmode     Dependency tracking mode.
42e6d5e4e0Smrg  source      Source file read by 'PROGRAMS ARGS'.
43e6d5e4e0Smrg  object      Object file output by 'PROGRAMS ARGS'.
447914d74bSmrg  DEPDIR      directory where to store dependencies.
457914d74bSmrg  depfile     Dependency file to output.
46e6d5e4e0Smrg  tmpdepfile  Temporary file to use when outputting dependencies.
477914d74bSmrg  libtool     Whether libtool is used (yes/no).
487914d74bSmrg
497914d74bSmrgReport bugs to <bug-automake@gnu.org>.
507914d74bSmrgEOF
517914d74bSmrg    exit $?
527914d74bSmrg    ;;
537914d74bSmrg  -v | --v*)
547914d74bSmrg    echo "depcomp $scriptversion"
557914d74bSmrg    exit $?
567914d74bSmrg    ;;
577914d74bSmrgesac
587914d74bSmrg
59e6d5e4e0Smrg# Get the directory component of the given path, and save it in the
60e6d5e4e0Smrg# global variables '$dir'.  Note that this directory component will
61e6d5e4e0Smrg# be either empty or ending with a '/' character.  This is deliberate.
62e6d5e4e0Smrgset_dir_from ()
63e6d5e4e0Smrg{
64e6d5e4e0Smrg  case $1 in
65e6d5e4e0Smrg    */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;;
66e6d5e4e0Smrg      *) dir=;;
67e6d5e4e0Smrg  esac
68e6d5e4e0Smrg}
69e6d5e4e0Smrg
70e6d5e4e0Smrg# Get the suffix-stripped basename of the given path, and save it the
71e6d5e4e0Smrg# global variable '$base'.
72e6d5e4e0Smrgset_base_from ()
73e6d5e4e0Smrg{
74e6d5e4e0Smrg  base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'`
75e6d5e4e0Smrg}
76e6d5e4e0Smrg
77e6d5e4e0Smrg# If no dependency file was actually created by the compiler invocation,
78e6d5e4e0Smrg# we still have to create a dummy depfile, to avoid errors with the
79e6d5e4e0Smrg# Makefile "include basename.Plo" scheme.
80e6d5e4e0Smrgmake_dummy_depfile ()
81e6d5e4e0Smrg{
82e6d5e4e0Smrg  echo "#dummy" > "$depfile"
83e6d5e4e0Smrg}
84e6d5e4e0Smrg
85e6d5e4e0Smrg# Factor out some common post-processing of the generated depfile.
86e6d5e4e0Smrg# Requires the auxiliary global variable '$tmpdepfile' to be set.
87e6d5e4e0Smrgaix_post_process_depfile ()
88e6d5e4e0Smrg{
89e6d5e4e0Smrg  # If the compiler actually managed to produce a dependency file,
90e6d5e4e0Smrg  # post-process it.
91e6d5e4e0Smrg  if test -f "$tmpdepfile"; then
92e6d5e4e0Smrg    # Each line is of the form 'foo.o: dependency.h'.
93e6d5e4e0Smrg    # Do two passes, one to just change these to
94e6d5e4e0Smrg    #   $object: dependency.h
95e6d5e4e0Smrg    # and one to simply output
96e6d5e4e0Smrg    #   dependency.h:
97e6d5e4e0Smrg    # which is needed to avoid the deleted-header problem.
98e6d5e4e0Smrg    { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile"
99e6d5e4e0Smrg      sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile"
100e6d5e4e0Smrg    } > "$depfile"
101e6d5e4e0Smrg    rm -f "$tmpdepfile"
102e6d5e4e0Smrg  else
103e6d5e4e0Smrg    make_dummy_depfile
104e6d5e4e0Smrg  fi
105e6d5e4e0Smrg}
106e6d5e4e0Smrg
107e6d5e4e0Smrg# A tabulation character.
108e6d5e4e0Smrgtab='	'
109e6d5e4e0Smrg# A newline character.
110e6d5e4e0Smrgnl='
111e6d5e4e0Smrg'
112e6d5e4e0Smrg# Character ranges might be problematic outside the C locale.
113e6d5e4e0Smrg# These definitions help.
114e6d5e4e0Smrgupper=ABCDEFGHIJKLMNOPQRSTUVWXYZ
115e6d5e4e0Smrglower=abcdefghijklmnopqrstuvwxyz
116e6d5e4e0Smrgdigits=0123456789
117e6d5e4e0Smrgalpha=${upper}${lower}
118e6d5e4e0Smrg
1197914d74bSmrgif test -z "$depmode" || test -z "$source" || test -z "$object"; then
1207914d74bSmrg  echo "depcomp: Variables source, object and depmode must be set" 1>&2
1217914d74bSmrg  exit 1
1227914d74bSmrgfi
1237914d74bSmrg
1247914d74bSmrg# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.
1257914d74bSmrgdepfile=${depfile-`echo "$object" |
1267914d74bSmrg  sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`}
1277914d74bSmrgtmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
1287914d74bSmrg
1297914d74bSmrgrm -f "$tmpdepfile"
1307914d74bSmrg
131e6d5e4e0Smrg# Avoid interferences from the environment.
132e6d5e4e0Smrggccflag= dashmflag=
133e6d5e4e0Smrg
1347914d74bSmrg# Some modes work just like other modes, but use different flags.  We
1357914d74bSmrg# parameterize here, but still list the modes in the big case below,
1367914d74bSmrg# to make depend.m4 easier to write.  Note that we *cannot* use a case
1377914d74bSmrg# here, because this file can only contain one case statement.
1387914d74bSmrgif test "$depmode" = hp; then
1397914d74bSmrg  # HP compiler uses -M and no extra arg.
1407914d74bSmrg  gccflag=-M
1417914d74bSmrg  depmode=gcc
1427914d74bSmrgfi
1437914d74bSmrg
1447914d74bSmrgif test "$depmode" = dashXmstdout; then
145e6d5e4e0Smrg  # This is just like dashmstdout with a different argument.
146e6d5e4e0Smrg  dashmflag=-xM
147e6d5e4e0Smrg  depmode=dashmstdout
1487914d74bSmrgfi
1497914d74bSmrg
150e8ead290Smrgcygpath_u="cygpath -u -f -"
151e8ead290Smrgif test "$depmode" = msvcmsys; then
152e6d5e4e0Smrg  # This is just like msvisualcpp but w/o cygpath translation.
153e6d5e4e0Smrg  # Just convert the backslash-escaped backslashes to single forward
154e6d5e4e0Smrg  # slashes to satisfy depend.m4
155e6d5e4e0Smrg  cygpath_u='sed s,\\\\,/,g'
156e6d5e4e0Smrg  depmode=msvisualcpp
157e6d5e4e0Smrgfi
158e6d5e4e0Smrg
159e6d5e4e0Smrgif test "$depmode" = msvc7msys; then
160e6d5e4e0Smrg  # This is just like msvc7 but w/o cygpath translation.
161e6d5e4e0Smrg  # Just convert the backslash-escaped backslashes to single forward
162e6d5e4e0Smrg  # slashes to satisfy depend.m4
163e6d5e4e0Smrg  cygpath_u='sed s,\\\\,/,g'
164e6d5e4e0Smrg  depmode=msvc7
165e6d5e4e0Smrgfi
166e6d5e4e0Smrg
167e6d5e4e0Smrgif test "$depmode" = xlc; then
168e6d5e4e0Smrg  # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information.
169e6d5e4e0Smrg  gccflag=-qmakedep=gcc,-MF
170e6d5e4e0Smrg  depmode=gcc
171e8ead290Smrgfi
172e8ead290Smrg
1737914d74bSmrgcase "$depmode" in
1747914d74bSmrggcc3)
1757914d74bSmrg## gcc 3 implements dependency tracking that does exactly what
1767914d74bSmrg## we want.  Yay!  Note: for some reason libtool 1.4 doesn't like
1777914d74bSmrg## it if -MD -MP comes after the -MF stuff.  Hmm.
1787914d74bSmrg## Unfortunately, FreeBSD c89 acceptance of flags depends upon
1797914d74bSmrg## the command line argument order; so add the flags where they
1807914d74bSmrg## appear in depend2.am.  Note that the slowdown incurred here
1817914d74bSmrg## affects only configure: in makefiles, %FASTDEP% shortcuts this.
1827914d74bSmrg  for arg
1837914d74bSmrg  do
1847914d74bSmrg    case $arg in
1857914d74bSmrg    -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;;
1867914d74bSmrg    *)  set fnord "$@" "$arg" ;;
1877914d74bSmrg    esac
1887914d74bSmrg    shift # fnord
1897914d74bSmrg    shift # $arg
1907914d74bSmrg  done
1917914d74bSmrg  "$@"
1927914d74bSmrg  stat=$?
193e6d5e4e0Smrg  if test $stat -ne 0; then
1947914d74bSmrg    rm -f "$tmpdepfile"
1957914d74bSmrg    exit $stat
1967914d74bSmrg  fi
1977914d74bSmrg  mv "$tmpdepfile" "$depfile"
1987914d74bSmrg  ;;
1997914d74bSmrg
2007914d74bSmrggcc)
201e6d5e4e0Smrg## Note that this doesn't just cater to obsosete pre-3.x GCC compilers.
202e6d5e4e0Smrg## but also to in-use compilers like IMB xlc/xlC and the HP C compiler.
203e6d5e4e0Smrg## (see the conditional assignment to $gccflag above).
2047914d74bSmrg## There are various ways to get dependency output from gcc.  Here's
2057914d74bSmrg## why we pick this rather obscure method:
2067914d74bSmrg## - Don't want to use -MD because we'd like the dependencies to end
2077914d74bSmrg##   up in a subdir.  Having to rename by hand is ugly.
2087914d74bSmrg##   (We might end up doing this anyway to support other compilers.)
2097914d74bSmrg## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
210e6d5e4e0Smrg##   -MM, not -M (despite what the docs say).  Also, it might not be
211e6d5e4e0Smrg##   supported by the other compilers which use the 'gcc' depmode.
2127914d74bSmrg## - Using -M directly means running the compiler twice (even worse
2137914d74bSmrg##   than renaming).
2147914d74bSmrg  if test -z "$gccflag"; then
2157914d74bSmrg    gccflag=-MD,
2167914d74bSmrg  fi
2177914d74bSmrg  "$@" -Wp,"$gccflag$tmpdepfile"
2187914d74bSmrg  stat=$?
219e6d5e4e0Smrg  if test $stat -ne 0; then
2207914d74bSmrg    rm -f "$tmpdepfile"
2217914d74bSmrg    exit $stat
2227914d74bSmrg  fi
2237914d74bSmrg  rm -f "$depfile"
2247914d74bSmrg  echo "$object : \\" > "$depfile"
225e6d5e4e0Smrg  # The second -e expression handles DOS-style file names with drive
226e6d5e4e0Smrg  # letters.
2277914d74bSmrg  sed -e 's/^[^:]*: / /' \
2287914d74bSmrg      -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
229e6d5e4e0Smrg## This next piece of magic avoids the "deleted header file" problem.
2307914d74bSmrg## The problem is that when a header file which appears in a .P file
2317914d74bSmrg## is deleted, the dependency causes make to die (because there is
2327914d74bSmrg## typically no way to rebuild the header).  We avoid this by adding
2337914d74bSmrg## dummy dependencies for each header file.  Too bad gcc doesn't do
2347914d74bSmrg## this for us directly.
235e6d5e4e0Smrg## Some versions of gcc put a space before the ':'.  On the theory
2367914d74bSmrg## that the space means something, we add a space to the output as
237e6d5e4e0Smrg## well.  hp depmode also adds that space, but also prefixes the VPATH
238e6d5e4e0Smrg## to the object.  Take care to not repeat it in the output.
2397914d74bSmrg## Some versions of the HPUX 10.20 sed can't process this invocation
2407914d74bSmrg## correctly.  Breaking it into two sed invocations is a workaround.
241e6d5e4e0Smrg  tr ' ' "$nl" < "$tmpdepfile" \
242e6d5e4e0Smrg    | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \
243e6d5e4e0Smrg    | sed -e 's/$/ :/' >> "$depfile"
2447914d74bSmrg  rm -f "$tmpdepfile"
2457914d74bSmrg  ;;
2467914d74bSmrg
2477914d74bSmrghp)
2487914d74bSmrg  # This case exists only to let depend.m4 do its work.  It works by
2497914d74bSmrg  # looking at the text of this script.  This case will never be run,
2507914d74bSmrg  # since it is checked for above.
2517914d74bSmrg  exit 1
2527914d74bSmrg  ;;
2537914d74bSmrg
2547914d74bSmrgsgi)
2557914d74bSmrg  if test "$libtool" = yes; then
2567914d74bSmrg    "$@" "-Wp,-MDupdate,$tmpdepfile"
2577914d74bSmrg  else
2587914d74bSmrg    "$@" -MDupdate "$tmpdepfile"
2597914d74bSmrg  fi
2607914d74bSmrg  stat=$?
261e6d5e4e0Smrg  if test $stat -ne 0; then
2627914d74bSmrg    rm -f "$tmpdepfile"
2637914d74bSmrg    exit $stat
2647914d74bSmrg  fi
2657914d74bSmrg  rm -f "$depfile"
2667914d74bSmrg
2677914d74bSmrg  if test -f "$tmpdepfile"; then  # yes, the sourcefile depend on other files
2687914d74bSmrg    echo "$object : \\" > "$depfile"
2697914d74bSmrg    # Clip off the initial element (the dependent).  Don't try to be
2707914d74bSmrg    # clever and replace this with sed code, as IRIX sed won't handle
2717914d74bSmrg    # lines with more than a fixed number of characters (4096 in
2727914d74bSmrg    # IRIX 6.2 sed, 8192 in IRIX 6.5).  We also remove comment lines;
273e6d5e4e0Smrg    # the IRIX cc adds comments like '#:fec' to the end of the
2747914d74bSmrg    # dependency line.
275e6d5e4e0Smrg    tr ' ' "$nl" < "$tmpdepfile" \
276e6d5e4e0Smrg      | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \
277e6d5e4e0Smrg      | tr "$nl" ' ' >> "$depfile"
278e8ead290Smrg    echo >> "$depfile"
2797914d74bSmrg    # The second pass generates a dummy entry for each header file.
280e6d5e4e0Smrg    tr ' ' "$nl" < "$tmpdepfile" \
281e6d5e4e0Smrg      | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
282e6d5e4e0Smrg      >> "$depfile"
2837914d74bSmrg  else
284e6d5e4e0Smrg    make_dummy_depfile
2857914d74bSmrg  fi
2867914d74bSmrg  rm -f "$tmpdepfile"
2877914d74bSmrg  ;;
2887914d74bSmrg
289e6d5e4e0Smrgxlc)
290e6d5e4e0Smrg  # This case exists only to let depend.m4 do its work.  It works by
291e6d5e4e0Smrg  # looking at the text of this script.  This case will never be run,
292e6d5e4e0Smrg  # since it is checked for above.
293e6d5e4e0Smrg  exit 1
294e6d5e4e0Smrg  ;;
295e6d5e4e0Smrg
2967914d74bSmrgaix)
2977914d74bSmrg  # The C for AIX Compiler uses -M and outputs the dependencies
2987914d74bSmrg  # in a .u file.  In older versions, this file always lives in the
299e6d5e4e0Smrg  # current directory.  Also, the AIX compiler puts '$object:' at the
3007914d74bSmrg  # start of each line; $object doesn't have directory information.
3017914d74bSmrg  # Version 6 uses the directory in both cases.
302e6d5e4e0Smrg  set_dir_from "$object"
303e6d5e4e0Smrg  set_base_from "$object"
3047914d74bSmrg  if test "$libtool" = yes; then
305e169010aSmrg    tmpdepfile1=$dir$base.u
306e169010aSmrg    tmpdepfile2=$base.u
307e169010aSmrg    tmpdepfile3=$dir.libs/$base.u
3087914d74bSmrg    "$@" -Wc,-M
3097914d74bSmrg  else
310e169010aSmrg    tmpdepfile1=$dir$base.u
311e169010aSmrg    tmpdepfile2=$dir$base.u
312e169010aSmrg    tmpdepfile3=$dir$base.u
3137914d74bSmrg    "$@" -M
3147914d74bSmrg  fi
3157914d74bSmrg  stat=$?
316e6d5e4e0Smrg  if test $stat -ne 0; then
317e169010aSmrg    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
3187914d74bSmrg    exit $stat
3197914d74bSmrg  fi
3207914d74bSmrg
321e169010aSmrg  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
322e169010aSmrg  do
323e169010aSmrg    test -f "$tmpdepfile" && break
324e169010aSmrg  done
325e6d5e4e0Smrg  aix_post_process_depfile
326e6d5e4e0Smrg  ;;
327e6d5e4e0Smrg
328e6d5e4e0Smrgtcc)
329e6d5e4e0Smrg  # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26
330e6d5e4e0Smrg  # FIXME: That version still under development at the moment of writing.
331e6d5e4e0Smrg  #        Make that this statement remains true also for stable, released
332e6d5e4e0Smrg  #        versions.
333e6d5e4e0Smrg  # It will wrap lines (doesn't matter whether long or short) with a
334e6d5e4e0Smrg  # trailing '\', as in:
335e6d5e4e0Smrg  #
336e6d5e4e0Smrg  #   foo.o : \
337e6d5e4e0Smrg  #    foo.c \
338e6d5e4e0Smrg  #    foo.h \
339e6d5e4e0Smrg  #
340e6d5e4e0Smrg  # It will put a trailing '\' even on the last line, and will use leading
341e6d5e4e0Smrg  # spaces rather than leading tabs (at least since its commit 0394caf7
342e6d5e4e0Smrg  # "Emit spaces for -MD").
343e6d5e4e0Smrg  "$@" -MD -MF "$tmpdepfile"
344e6d5e4e0Smrg  stat=$?
345e6d5e4e0Smrg  if test $stat -ne 0; then
346e6d5e4e0Smrg    rm -f "$tmpdepfile"
347e6d5e4e0Smrg    exit $stat
3487914d74bSmrg  fi
349e6d5e4e0Smrg  rm -f "$depfile"
350e6d5e4e0Smrg  # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'.
351e6d5e4e0Smrg  # We have to change lines of the first kind to '$object: \'.
352e6d5e4e0Smrg  sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile"
353e6d5e4e0Smrg  # And for each line of the second kind, we have to emit a 'dep.h:'
354e6d5e4e0Smrg  # dummy dependency, to avoid the deleted-header problem.
355e6d5e4e0Smrg  sed -n -e 's|^  *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile"
3567914d74bSmrg  rm -f "$tmpdepfile"
3577914d74bSmrg  ;;
3587914d74bSmrg
359e6d5e4e0Smrg## The order of this option in the case statement is important, since the
360e6d5e4e0Smrg## shell code in configure will try each of these formats in the order
361e6d5e4e0Smrg## listed in this file.  A plain '-MD' option would be understood by many
362e6d5e4e0Smrg## compilers, so we must ensure this comes after the gcc and icc options.
363e6d5e4e0Smrgpgcc)
364e6d5e4e0Smrg  # Portland's C compiler understands '-MD'.
365e6d5e4e0Smrg  # Will always output deps to 'file.d' where file is the root name of the
366e6d5e4e0Smrg  # source file under compilation, even if file resides in a subdirectory.
367e6d5e4e0Smrg  # The object file name does not affect the name of the '.d' file.
368e6d5e4e0Smrg  # pgcc 10.2 will output
3697914d74bSmrg  #    foo.o: sub/foo.c sub/foo.h
370e6d5e4e0Smrg  # and will wrap long lines using '\' :
3717914d74bSmrg  #    foo.o: sub/foo.c ... \
3727914d74bSmrg  #     sub/foo.h ... \
3737914d74bSmrg  #     ...
374e6d5e4e0Smrg  set_dir_from "$object"
375e6d5e4e0Smrg  # Use the source, not the object, to determine the base name, since
376e6d5e4e0Smrg  # that's sadly what pgcc will do too.
377e6d5e4e0Smrg  set_base_from "$source"
378e6d5e4e0Smrg  tmpdepfile=$base.d
379e6d5e4e0Smrg
380e6d5e4e0Smrg  # For projects that build the same source file twice into different object
381e6d5e4e0Smrg  # files, the pgcc approach of using the *source* file root name can cause
382e6d5e4e0Smrg  # problems in parallel builds.  Use a locking strategy to avoid stomping on
383e6d5e4e0Smrg  # the same $tmpdepfile.
384e6d5e4e0Smrg  lockdir=$base.d-lock
385e6d5e4e0Smrg  trap "
386e6d5e4e0Smrg    echo '$0: caught signal, cleaning up...' >&2
387e6d5e4e0Smrg    rmdir '$lockdir'
388e6d5e4e0Smrg    exit 1
389e6d5e4e0Smrg  " 1 2 13 15
390e6d5e4e0Smrg  numtries=100
391e6d5e4e0Smrg  i=$numtries
392e6d5e4e0Smrg  while test $i -gt 0; do
393e6d5e4e0Smrg    # mkdir is a portable test-and-set.
394e6d5e4e0Smrg    if mkdir "$lockdir" 2>/dev/null; then
395e6d5e4e0Smrg      # This process acquired the lock.
396e6d5e4e0Smrg      "$@" -MD
397e6d5e4e0Smrg      stat=$?
398e6d5e4e0Smrg      # Release the lock.
399e6d5e4e0Smrg      rmdir "$lockdir"
400e6d5e4e0Smrg      break
401e6d5e4e0Smrg    else
402e6d5e4e0Smrg      # If the lock is being held by a different process, wait
403e6d5e4e0Smrg      # until the winning process is done or we timeout.
404e6d5e4e0Smrg      while test -d "$lockdir" && test $i -gt 0; do
405e6d5e4e0Smrg        sleep 1
406e6d5e4e0Smrg        i=`expr $i - 1`
407e6d5e4e0Smrg      done
408e6d5e4e0Smrg    fi
409e6d5e4e0Smrg    i=`expr $i - 1`
410e6d5e4e0Smrg  done
411e6d5e4e0Smrg  trap - 1 2 13 15
412e6d5e4e0Smrg  if test $i -le 0; then
413e6d5e4e0Smrg    echo "$0: failed to acquire lock after $numtries attempts" >&2
414e6d5e4e0Smrg    echo "$0: check lockdir '$lockdir'" >&2
415e6d5e4e0Smrg    exit 1
416e6d5e4e0Smrg  fi
4177914d74bSmrg
418e6d5e4e0Smrg  if test $stat -ne 0; then
4197914d74bSmrg    rm -f "$tmpdepfile"
4207914d74bSmrg    exit $stat
4217914d74bSmrg  fi
4227914d74bSmrg  rm -f "$depfile"
4237914d74bSmrg  # Each line is of the form `foo.o: dependent.h',
4247914d74bSmrg  # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'.
4257914d74bSmrg  # Do two passes, one to just change these to
4267914d74bSmrg  # `$object: dependent.h' and one to simply `dependent.h:'.
4277914d74bSmrg  sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
4287914d74bSmrg  # Some versions of the HPUX 10.20 sed can't process this invocation
4297914d74bSmrg  # correctly.  Breaking it into two sed invocations is a workaround.
430e6d5e4e0Smrg  sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \
431e6d5e4e0Smrg    | sed -e 's/$/ :/' >> "$depfile"
4327914d74bSmrg  rm -f "$tmpdepfile"
4337914d74bSmrg  ;;
4347914d74bSmrg
4357914d74bSmrghp2)
4367914d74bSmrg  # The "hp" stanza above does not work with aCC (C++) and HP's ia64
4377914d74bSmrg  # compilers, which have integrated preprocessors.  The correct option
4387914d74bSmrg  # to use with these is +Maked; it writes dependencies to a file named
4397914d74bSmrg  # 'foo.d', which lands next to the object file, wherever that
4407914d74bSmrg  # happens to be.
4417914d74bSmrg  # Much of this is similar to the tru64 case; see comments there.
442e6d5e4e0Smrg  set_dir_from  "$object"
443e6d5e4e0Smrg  set_base_from "$object"
4447914d74bSmrg  if test "$libtool" = yes; then
4457914d74bSmrg    tmpdepfile1=$dir$base.d
4467914d74bSmrg    tmpdepfile2=$dir.libs/$base.d
4477914d74bSmrg    "$@" -Wc,+Maked
4487914d74bSmrg  else
4497914d74bSmrg    tmpdepfile1=$dir$base.d
4507914d74bSmrg    tmpdepfile2=$dir$base.d
4517914d74bSmrg    "$@" +Maked
4527914d74bSmrg  fi
4537914d74bSmrg  stat=$?
454e6d5e4e0Smrg  if test $stat -ne 0; then
4557914d74bSmrg     rm -f "$tmpdepfile1" "$tmpdepfile2"
4567914d74bSmrg     exit $stat
4577914d74bSmrg  fi
4587914d74bSmrg
4597914d74bSmrg  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2"
4607914d74bSmrg  do
4617914d74bSmrg    test -f "$tmpdepfile" && break
4627914d74bSmrg  done
4637914d74bSmrg  if test -f "$tmpdepfile"; then
464e6d5e4e0Smrg    sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile"
465e6d5e4e0Smrg    # Add 'dependent.h:' lines.
466e8ead290Smrg    sed -ne '2,${
467e6d5e4e0Smrg               s/^ *//
468e6d5e4e0Smrg               s/ \\*$//
469e6d5e4e0Smrg               s/$/:/
470e6d5e4e0Smrg               p
471e6d5e4e0Smrg             }' "$tmpdepfile" >> "$depfile"
4727914d74bSmrg  else
473e6d5e4e0Smrg    make_dummy_depfile
4747914d74bSmrg  fi
4757914d74bSmrg  rm -f "$tmpdepfile" "$tmpdepfile2"
4767914d74bSmrg  ;;
4777914d74bSmrg
4787914d74bSmrgtru64)
479e6d5e4e0Smrg  # The Tru64 compiler uses -MD to generate dependencies as a side
480e6d5e4e0Smrg  # effect.  'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'.
481e6d5e4e0Smrg  # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
482e6d5e4e0Smrg  # dependencies in 'foo.d' instead, so we check for that too.
483e6d5e4e0Smrg  # Subdirectories are respected.
484e6d5e4e0Smrg  set_dir_from  "$object"
485e6d5e4e0Smrg  set_base_from "$object"
486e6d5e4e0Smrg
487e6d5e4e0Smrg  if test "$libtool" = yes; then
488e6d5e4e0Smrg    # Libtool generates 2 separate objects for the 2 libraries.  These
489e6d5e4e0Smrg    # two compilations output dependencies in $dir.libs/$base.o.d and
490e6d5e4e0Smrg    # in $dir$base.o.d.  We have to check for both files, because
491e6d5e4e0Smrg    # one of the two compilations can be disabled.  We should prefer
492e6d5e4e0Smrg    # $dir$base.o.d over $dir.libs/$base.o.d because the latter is
493e6d5e4e0Smrg    # automatically cleaned when .libs/ is deleted, while ignoring
494e6d5e4e0Smrg    # the former would cause a distcleancheck panic.
495e6d5e4e0Smrg    tmpdepfile1=$dir$base.o.d          # libtool 1.5
496e6d5e4e0Smrg    tmpdepfile2=$dir.libs/$base.o.d    # Likewise.
497e6d5e4e0Smrg    tmpdepfile3=$dir.libs/$base.d      # Compaq CCC V6.2-504
498e6d5e4e0Smrg    "$@" -Wc,-MD
499e6d5e4e0Smrg  else
500e6d5e4e0Smrg    tmpdepfile1=$dir$base.d
501e6d5e4e0Smrg    tmpdepfile2=$dir$base.d
502e6d5e4e0Smrg    tmpdepfile3=$dir$base.d
503e6d5e4e0Smrg    "$@" -MD
504e6d5e4e0Smrg  fi
505e6d5e4e0Smrg
506e6d5e4e0Smrg  stat=$?
507e6d5e4e0Smrg  if test $stat -ne 0; then
508e6d5e4e0Smrg    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
509e6d5e4e0Smrg    exit $stat
510e6d5e4e0Smrg  fi
511e6d5e4e0Smrg
512e6d5e4e0Smrg  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
513e6d5e4e0Smrg  do
514e6d5e4e0Smrg    test -f "$tmpdepfile" && break
515e6d5e4e0Smrg  done
516e6d5e4e0Smrg  # Same post-processing that is required for AIX mode.
517e6d5e4e0Smrg  aix_post_process_depfile
518e6d5e4e0Smrg  ;;
519e6d5e4e0Smrg
520e6d5e4e0Smrgmsvc7)
521e6d5e4e0Smrg  if test "$libtool" = yes; then
522e6d5e4e0Smrg    showIncludes=-Wc,-showIncludes
523e6d5e4e0Smrg  else
524e6d5e4e0Smrg    showIncludes=-showIncludes
525e6d5e4e0Smrg  fi
526e6d5e4e0Smrg  "$@" $showIncludes > "$tmpdepfile"
527e6d5e4e0Smrg  stat=$?
528e6d5e4e0Smrg  grep -v '^Note: including file: ' "$tmpdepfile"
529e6d5e4e0Smrg  if test $stat -ne 0; then
530e6d5e4e0Smrg    rm -f "$tmpdepfile"
531e6d5e4e0Smrg    exit $stat
532e6d5e4e0Smrg  fi
533e6d5e4e0Smrg  rm -f "$depfile"
534e6d5e4e0Smrg  echo "$object : \\" > "$depfile"
535e6d5e4e0Smrg  # The first sed program below extracts the file names and escapes
536e6d5e4e0Smrg  # backslashes for cygpath.  The second sed program outputs the file
537e6d5e4e0Smrg  # name when reading, but also accumulates all include files in the
538e6d5e4e0Smrg  # hold buffer in order to output them again at the end.  This only
539e6d5e4e0Smrg  # works with sed implementations that can handle large buffers.
540e6d5e4e0Smrg  sed < "$tmpdepfile" -n '
541e6d5e4e0Smrg/^Note: including file:  *\(.*\)/ {
542e6d5e4e0Smrg  s//\1/
543e6d5e4e0Smrg  s/\\/\\\\/g
544e6d5e4e0Smrg  p
545e6d5e4e0Smrg}' | $cygpath_u | sort -u | sed -n '
546e6d5e4e0Smrgs/ /\\ /g
547e6d5e4e0Smrgs/\(.*\)/'"$tab"'\1 \\/p
548e6d5e4e0Smrgs/.\(.*\) \\/\1:/
549e6d5e4e0SmrgH
550e6d5e4e0Smrg$ {
551e6d5e4e0Smrg  s/.*/'"$tab"'/
552e6d5e4e0Smrg  G
553e6d5e4e0Smrg  p
554e6d5e4e0Smrg}' >> "$depfile"
5559d0ccd10Smrg  echo >> "$depfile" # make sure the fragment doesn't end with a backslash
556e6d5e4e0Smrg  rm -f "$tmpdepfile"
557e6d5e4e0Smrg  ;;
558e6d5e4e0Smrg
559e6d5e4e0Smrgmsvc7msys)
560e6d5e4e0Smrg  # This case exists only to let depend.m4 do its work.  It works by
561e6d5e4e0Smrg  # looking at the text of this script.  This case will never be run,
562e6d5e4e0Smrg  # since it is checked for above.
563e6d5e4e0Smrg  exit 1
564e6d5e4e0Smrg  ;;
5657914d74bSmrg
5667914d74bSmrg#nosideeffect)
5677914d74bSmrg  # This comment above is used by automake to tell side-effect
5687914d74bSmrg  # dependency tracking mechanisms from slower ones.
5697914d74bSmrg
5707914d74bSmrgdashmstdout)
5717914d74bSmrg  # Important note: in order to support this mode, a compiler *must*
5727914d74bSmrg  # always write the preprocessed file to stdout, regardless of -o.
5737914d74bSmrg  "$@" || exit $?
5747914d74bSmrg
5757914d74bSmrg  # Remove the call to Libtool.
5767914d74bSmrg  if test "$libtool" = yes; then
577e8ead290Smrg    while test "X$1" != 'X--mode=compile'; do
5787914d74bSmrg      shift
5797914d74bSmrg    done
5807914d74bSmrg    shift
5817914d74bSmrg  fi
5827914d74bSmrg
583e6d5e4e0Smrg  # Remove '-o $object'.
5847914d74bSmrg  IFS=" "
5857914d74bSmrg  for arg
5867914d74bSmrg  do
5877914d74bSmrg    case $arg in
5887914d74bSmrg    -o)
5897914d74bSmrg      shift
5907914d74bSmrg      ;;
5917914d74bSmrg    $object)
5927914d74bSmrg      shift
5937914d74bSmrg      ;;
5947914d74bSmrg    *)
5957914d74bSmrg      set fnord "$@" "$arg"
5967914d74bSmrg      shift # fnord
5977914d74bSmrg      shift # $arg
5987914d74bSmrg      ;;
5997914d74bSmrg    esac
6007914d74bSmrg  done
6017914d74bSmrg
6027914d74bSmrg  test -z "$dashmflag" && dashmflag=-M
603e6d5e4e0Smrg  # Require at least two characters before searching for ':'
6047914d74bSmrg  # in the target name.  This is to cope with DOS-style filenames:
605e6d5e4e0Smrg  # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise.
6067914d74bSmrg  "$@" $dashmflag |
607e6d5e4e0Smrg    sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile"
6087914d74bSmrg  rm -f "$depfile"
6097914d74bSmrg  cat < "$tmpdepfile" > "$depfile"
610e6d5e4e0Smrg  # Some versions of the HPUX 10.20 sed can't process this sed invocation
611e6d5e4e0Smrg  # correctly.  Breaking it into two sed invocations is a workaround.
612e6d5e4e0Smrg  tr ' ' "$nl" < "$tmpdepfile" \
613e6d5e4e0Smrg    | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
614e6d5e4e0Smrg    | sed -e 's/$/ :/' >> "$depfile"
6157914d74bSmrg  rm -f "$tmpdepfile"
6167914d74bSmrg  ;;
6177914d74bSmrg
6187914d74bSmrgdashXmstdout)
6197914d74bSmrg  # This case only exists to satisfy depend.m4.  It is never actually
6207914d74bSmrg  # run, as this mode is specially recognized in the preamble.
6217914d74bSmrg  exit 1
6227914d74bSmrg  ;;
6237914d74bSmrg
6247914d74bSmrgmakedepend)
6257914d74bSmrg  "$@" || exit $?
6267914d74bSmrg  # Remove any Libtool call
6277914d74bSmrg  if test "$libtool" = yes; then
628e8ead290Smrg    while test "X$1" != 'X--mode=compile'; do
6297914d74bSmrg      shift
6307914d74bSmrg    done
6317914d74bSmrg    shift
6327914d74bSmrg  fi
6337914d74bSmrg  # X makedepend
6347914d74bSmrg  shift
635e8ead290Smrg  cleared=no eat=no
636e8ead290Smrg  for arg
637e8ead290Smrg  do
6387914d74bSmrg    case $cleared in
6397914d74bSmrg    no)
6407914d74bSmrg      set ""; shift
6417914d74bSmrg      cleared=yes ;;
6427914d74bSmrg    esac
643e8ead290Smrg    if test $eat = yes; then
644e8ead290Smrg      eat=no
645e8ead290Smrg      continue
646e8ead290Smrg    fi
6477914d74bSmrg    case "$arg" in
6487914d74bSmrg    -D*|-I*)
6497914d74bSmrg      set fnord "$@" "$arg"; shift ;;
6507914d74bSmrg    # Strip any option that makedepend may not understand.  Remove
6517914d74bSmrg    # the object too, otherwise makedepend will parse it as a source file.
652e8ead290Smrg    -arch)
653e8ead290Smrg      eat=yes ;;
6547914d74bSmrg    -*|$object)
6557914d74bSmrg      ;;
6567914d74bSmrg    *)
6577914d74bSmrg      set fnord "$@" "$arg"; shift ;;
6587914d74bSmrg    esac
6597914d74bSmrg  done
660e8ead290Smrg  obj_suffix=`echo "$object" | sed 's/^.*\././'`
6617914d74bSmrg  touch "$tmpdepfile"
6627914d74bSmrg  ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
6637914d74bSmrg  rm -f "$depfile"
664e6d5e4e0Smrg  # makedepend may prepend the VPATH from the source file name to the object.
665e6d5e4e0Smrg  # No need to regex-escape $object, excess matching of '.' is harmless.
666e6d5e4e0Smrg  sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile"
667e6d5e4e0Smrg  # Some versions of the HPUX 10.20 sed can't process the last invocation
668e6d5e4e0Smrg  # correctly.  Breaking it into two sed invocations is a workaround.
669e6d5e4e0Smrg  sed '1,2d' "$tmpdepfile" \
670e6d5e4e0Smrg    | tr ' ' "$nl" \
671e6d5e4e0Smrg    | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
672e6d5e4e0Smrg    | sed -e 's/$/ :/' >> "$depfile"
6737914d74bSmrg  rm -f "$tmpdepfile" "$tmpdepfile".bak
6747914d74bSmrg  ;;
6757914d74bSmrg
6767914d74bSmrgcpp)
6777914d74bSmrg  # Important note: in order to support this mode, a compiler *must*
6787914d74bSmrg  # always write the preprocessed file to stdout.
6797914d74bSmrg  "$@" || exit $?
6807914d74bSmrg
6817914d74bSmrg  # Remove the call to Libtool.
6827914d74bSmrg  if test "$libtool" = yes; then
683e8ead290Smrg    while test "X$1" != 'X--mode=compile'; do
6847914d74bSmrg      shift
6857914d74bSmrg    done
6867914d74bSmrg    shift
6877914d74bSmrg  fi
6887914d74bSmrg
689e6d5e4e0Smrg  # Remove '-o $object'.
6907914d74bSmrg  IFS=" "
6917914d74bSmrg  for arg
6927914d74bSmrg  do
6937914d74bSmrg    case $arg in
6947914d74bSmrg    -o)
6957914d74bSmrg      shift
6967914d74bSmrg      ;;
6977914d74bSmrg    $object)
6987914d74bSmrg      shift
6997914d74bSmrg      ;;
7007914d74bSmrg    *)
7017914d74bSmrg      set fnord "$@" "$arg"
7027914d74bSmrg      shift # fnord
7037914d74bSmrg      shift # $arg
7047914d74bSmrg      ;;
7057914d74bSmrg    esac
7067914d74bSmrg  done
7077914d74bSmrg
708e6d5e4e0Smrg  "$@" -E \
709e6d5e4e0Smrg    | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
710e6d5e4e0Smrg             -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
711e6d5e4e0Smrg    | sed '$ s: \\$::' > "$tmpdepfile"
7127914d74bSmrg  rm -f "$depfile"
7137914d74bSmrg  echo "$object : \\" > "$depfile"
7147914d74bSmrg  cat < "$tmpdepfile" >> "$depfile"
7157914d74bSmrg  sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
7167914d74bSmrg  rm -f "$tmpdepfile"
7177914d74bSmrg  ;;
7187914d74bSmrg
7197914d74bSmrgmsvisualcpp)
7207914d74bSmrg  # Important note: in order to support this mode, a compiler *must*
721e8ead290Smrg  # always write the preprocessed file to stdout.
7227914d74bSmrg  "$@" || exit $?
723e8ead290Smrg
724e8ead290Smrg  # Remove the call to Libtool.
725e8ead290Smrg  if test "$libtool" = yes; then
726e8ead290Smrg    while test "X$1" != 'X--mode=compile'; do
727e8ead290Smrg      shift
728e8ead290Smrg    done
729e8ead290Smrg    shift
730e8ead290Smrg  fi
731e8ead290Smrg
7327914d74bSmrg  IFS=" "
7337914d74bSmrg  for arg
7347914d74bSmrg  do
7357914d74bSmrg    case "$arg" in
736e8ead290Smrg    -o)
737e8ead290Smrg      shift
738e8ead290Smrg      ;;
739e8ead290Smrg    $object)
740e8ead290Smrg      shift
741e8ead290Smrg      ;;
7427914d74bSmrg    "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
743e6d5e4e0Smrg        set fnord "$@"
744e6d5e4e0Smrg        shift
745e6d5e4e0Smrg        shift
746e6d5e4e0Smrg        ;;
7477914d74bSmrg    *)
748e6d5e4e0Smrg        set fnord "$@" "$arg"
749e6d5e4e0Smrg        shift
750e6d5e4e0Smrg        shift
751e6d5e4e0Smrg        ;;
7527914d74bSmrg    esac
7537914d74bSmrg  done
754e8ead290Smrg  "$@" -E 2>/dev/null |
755e8ead290Smrg  sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile"
7567914d74bSmrg  rm -f "$depfile"
7577914d74bSmrg  echo "$object : \\" > "$depfile"
758e6d5e4e0Smrg  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile"
759e6d5e4e0Smrg  echo "$tab" >> "$depfile"
760e8ead290Smrg  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile"
7617914d74bSmrg  rm -f "$tmpdepfile"
7627914d74bSmrg  ;;
7637914d74bSmrg
764e8ead290Smrgmsvcmsys)
765e8ead290Smrg  # This case exists only to let depend.m4 do its work.  It works by
766e8ead290Smrg  # looking at the text of this script.  This case will never be run,
767e8ead290Smrg  # since it is checked for above.
768e8ead290Smrg  exit 1
769e8ead290Smrg  ;;
770e8ead290Smrg
7717914d74bSmrgnone)
7727914d74bSmrg  exec "$@"
7737914d74bSmrg  ;;
7747914d74bSmrg
7757914d74bSmrg*)
7767914d74bSmrg  echo "Unknown depmode $depmode" 1>&2
7777914d74bSmrg  exit 1
7787914d74bSmrg  ;;
7797914d74bSmrgesac
7807914d74bSmrg
7817914d74bSmrgexit 0
7827914d74bSmrg
7837914d74bSmrg# Local Variables:
7847914d74bSmrg# mode: shell-script
7857914d74bSmrg# sh-indentation: 2
7867914d74bSmrg# eval: (add-hook 'write-file-hooks 'time-stamp)
7877914d74bSmrg# time-stamp-start: "scriptversion="
7887914d74bSmrg# time-stamp-format: "%:y-%02m-%02d.%02H"
789e8ead290Smrg# time-stamp-time-zone: "UTC"
790e8ead290Smrg# time-stamp-end: "; # UTC"
7917914d74bSmrg# End:
792