xref: /netbsd-src/external/gpl3/gcc/dist/depcomp (revision 4d5abbe83f525258eb479e5fca29f25cb943f379)
14fee23f9Smrg#! /bin/sh
24fee23f9Smrg# depcomp - compile a program generating dependencies as side-effects
34fee23f9Smrg
4*4d5abbe8Smrgscriptversion=2013-05-30.07; # UTC
54fee23f9Smrg
6*4d5abbe8Smrg# Copyright (C) 1999-2014 Free Software Foundation, Inc.
74fee23f9Smrg
84fee23f9Smrg# This program is free software; you can redistribute it and/or modify
94fee23f9Smrg# it under the terms of the GNU General Public License as published by
104fee23f9Smrg# the Free Software Foundation; either version 2, or (at your option)
114fee23f9Smrg# any later version.
124fee23f9Smrg
134fee23f9Smrg# This program is distributed in the hope that it will be useful,
144fee23f9Smrg# but WITHOUT ANY WARRANTY; without even the implied warranty of
154fee23f9Smrg# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
164fee23f9Smrg# GNU General Public License for more details.
174fee23f9Smrg
184fee23f9Smrg# You should have received a copy of the GNU General Public License
194fee23f9Smrg# along with this program.  If not, see <http://www.gnu.org/licenses/>.
204fee23f9Smrg
214fee23f9Smrg# As a special exception to the GNU General Public License, if you
224fee23f9Smrg# distribute this file as part of a program that contains a
234fee23f9Smrg# configuration script generated by Autoconf, you may include it under
244fee23f9Smrg# the same distribution terms that you use for the rest of that program.
254fee23f9Smrg
264fee23f9Smrg# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>.
274fee23f9Smrg
284fee23f9Smrgcase $1 in
294fee23f9Smrg  '')
30*4d5abbe8Smrg    echo "$0: No command.  Try '$0 --help' for more information." 1>&2
314fee23f9Smrg    exit 1;
324fee23f9Smrg    ;;
334fee23f9Smrg  -h | --h*)
344fee23f9Smrg    cat <<\EOF
354fee23f9SmrgUsage: depcomp [--help] [--version] PROGRAM [ARGS]
364fee23f9Smrg
374fee23f9SmrgRun PROGRAMS ARGS to compile a file, generating dependencies
384fee23f9Smrgas side-effects.
394fee23f9Smrg
404fee23f9SmrgEnvironment variables:
414fee23f9Smrg  depmode     Dependency tracking mode.
42*4d5abbe8Smrg  source      Source file read by 'PROGRAMS ARGS'.
43*4d5abbe8Smrg  object      Object file output by 'PROGRAMS ARGS'.
444fee23f9Smrg  DEPDIR      directory where to store dependencies.
454fee23f9Smrg  depfile     Dependency file to output.
46*4d5abbe8Smrg  tmpdepfile  Temporary file to use when outputting dependencies.
474fee23f9Smrg  libtool     Whether libtool is used (yes/no).
484fee23f9Smrg
494fee23f9SmrgReport bugs to <bug-automake@gnu.org>.
504fee23f9SmrgEOF
514fee23f9Smrg    exit $?
524fee23f9Smrg    ;;
534fee23f9Smrg  -v | --v*)
544fee23f9Smrg    echo "depcomp $scriptversion"
554fee23f9Smrg    exit $?
564fee23f9Smrg    ;;
574fee23f9Smrgesac
584fee23f9Smrg
59*4d5abbe8Smrg# Get the directory component of the given path, and save it in the
60*4d5abbe8Smrg# global variables '$dir'.  Note that this directory component will
61*4d5abbe8Smrg# be either empty or ending with a '/' character.  This is deliberate.
62*4d5abbe8Smrgset_dir_from ()
63*4d5abbe8Smrg{
64*4d5abbe8Smrg  case $1 in
65*4d5abbe8Smrg    */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;;
66*4d5abbe8Smrg      *) dir=;;
67*4d5abbe8Smrg  esac
68*4d5abbe8Smrg}
69*4d5abbe8Smrg
70*4d5abbe8Smrg# Get the suffix-stripped basename of the given path, and save it the
71*4d5abbe8Smrg# global variable '$base'.
72*4d5abbe8Smrgset_base_from ()
73*4d5abbe8Smrg{
74*4d5abbe8Smrg  base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'`
75*4d5abbe8Smrg}
76*4d5abbe8Smrg
77*4d5abbe8Smrg# If no dependency file was actually created by the compiler invocation,
78*4d5abbe8Smrg# we still have to create a dummy depfile, to avoid errors with the
79*4d5abbe8Smrg# Makefile "include basename.Plo" scheme.
80*4d5abbe8Smrgmake_dummy_depfile ()
81*4d5abbe8Smrg{
82*4d5abbe8Smrg  echo "#dummy" > "$depfile"
83*4d5abbe8Smrg}
84*4d5abbe8Smrg
85*4d5abbe8Smrg# Factor out some common post-processing of the generated depfile.
86*4d5abbe8Smrg# Requires the auxiliary global variable '$tmpdepfile' to be set.
87*4d5abbe8Smrgaix_post_process_depfile ()
88*4d5abbe8Smrg{
89*4d5abbe8Smrg  # If the compiler actually managed to produce a dependency file,
90*4d5abbe8Smrg  # post-process it.
91*4d5abbe8Smrg  if test -f "$tmpdepfile"; then
92*4d5abbe8Smrg    # Each line is of the form 'foo.o: dependency.h'.
93*4d5abbe8Smrg    # Do two passes, one to just change these to
94*4d5abbe8Smrg    #   $object: dependency.h
95*4d5abbe8Smrg    # and one to simply output
96*4d5abbe8Smrg    #   dependency.h:
97*4d5abbe8Smrg    # which is needed to avoid the deleted-header problem.
98*4d5abbe8Smrg    { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile"
99*4d5abbe8Smrg      sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile"
100*4d5abbe8Smrg    } > "$depfile"
101*4d5abbe8Smrg    rm -f "$tmpdepfile"
102*4d5abbe8Smrg  else
103*4d5abbe8Smrg    make_dummy_depfile
104*4d5abbe8Smrg  fi
105*4d5abbe8Smrg}
106*4d5abbe8Smrg
107*4d5abbe8Smrg# A tabulation character.
108*4d5abbe8Smrgtab='	'
109*4d5abbe8Smrg# A newline character.
110*4d5abbe8Smrgnl='
111*4d5abbe8Smrg'
112*4d5abbe8Smrg# Character ranges might be problematic outside the C locale.
113*4d5abbe8Smrg# These definitions help.
114*4d5abbe8Smrgupper=ABCDEFGHIJKLMNOPQRSTUVWXYZ
115*4d5abbe8Smrglower=abcdefghijklmnopqrstuvwxyz
116*4d5abbe8Smrgdigits=0123456789
117*4d5abbe8Smrgalpha=${upper}${lower}
118*4d5abbe8Smrg
1194fee23f9Smrgif test -z "$depmode" || test -z "$source" || test -z "$object"; then
1204fee23f9Smrg  echo "depcomp: Variables source, object and depmode must be set" 1>&2
1214fee23f9Smrg  exit 1
1224fee23f9Smrgfi
1234fee23f9Smrg
1244fee23f9Smrg# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.
1254fee23f9Smrgdepfile=${depfile-`echo "$object" |
1264fee23f9Smrg  sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`}
1274fee23f9Smrgtmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
1284fee23f9Smrg
1294fee23f9Smrgrm -f "$tmpdepfile"
1304fee23f9Smrg
131*4d5abbe8Smrg# Avoid interferences from the environment.
132*4d5abbe8Smrggccflag= dashmflag=
133*4d5abbe8Smrg
1344fee23f9Smrg# Some modes work just like other modes, but use different flags.  We
1354fee23f9Smrg# parameterize here, but still list the modes in the big case below,
1364fee23f9Smrg# to make depend.m4 easier to write.  Note that we *cannot* use a case
1374fee23f9Smrg# here, because this file can only contain one case statement.
1384fee23f9Smrgif test "$depmode" = hp; then
1394fee23f9Smrg  # HP compiler uses -M and no extra arg.
1404fee23f9Smrg  gccflag=-M
1414fee23f9Smrg  depmode=gcc
1424fee23f9Smrgfi
1434fee23f9Smrg
1444fee23f9Smrgif test "$depmode" = dashXmstdout; then
1454fee23f9Smrg  # This is just like dashmstdout with a different argument.
1464fee23f9Smrg  dashmflag=-xM
1474fee23f9Smrg  depmode=dashmstdout
1484fee23f9Smrgfi
1494fee23f9Smrg
1504fee23f9Smrgcygpath_u="cygpath -u -f -"
1514fee23f9Smrgif test "$depmode" = msvcmsys; then
1524fee23f9Smrg  # This is just like msvisualcpp but w/o cygpath translation.
1534fee23f9Smrg  # Just convert the backslash-escaped backslashes to single forward
1544fee23f9Smrg  # slashes to satisfy depend.m4
155*4d5abbe8Smrg  cygpath_u='sed s,\\\\,/,g'
1564fee23f9Smrg  depmode=msvisualcpp
1574fee23f9Smrgfi
1584fee23f9Smrg
159*4d5abbe8Smrgif test "$depmode" = msvc7msys; then
160*4d5abbe8Smrg  # This is just like msvc7 but w/o cygpath translation.
161*4d5abbe8Smrg  # Just convert the backslash-escaped backslashes to single forward
162*4d5abbe8Smrg  # slashes to satisfy depend.m4
163*4d5abbe8Smrg  cygpath_u='sed s,\\\\,/,g'
164*4d5abbe8Smrg  depmode=msvc7
165*4d5abbe8Smrgfi
166*4d5abbe8Smrg
167*4d5abbe8Smrgif test "$depmode" = xlc; then
168*4d5abbe8Smrg  # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information.
169*4d5abbe8Smrg  gccflag=-qmakedep=gcc,-MF
170*4d5abbe8Smrg  depmode=gcc
171*4d5abbe8Smrgfi
172*4d5abbe8Smrg
1734fee23f9Smrgcase "$depmode" in
1744fee23f9Smrggcc3)
1754fee23f9Smrg## gcc 3 implements dependency tracking that does exactly what
1764fee23f9Smrg## we want.  Yay!  Note: for some reason libtool 1.4 doesn't like
1774fee23f9Smrg## it if -MD -MP comes after the -MF stuff.  Hmm.
1784fee23f9Smrg## Unfortunately, FreeBSD c89 acceptance of flags depends upon
1794fee23f9Smrg## the command line argument order; so add the flags where they
1804fee23f9Smrg## appear in depend2.am.  Note that the slowdown incurred here
1814fee23f9Smrg## affects only configure: in makefiles, %FASTDEP% shortcuts this.
1824fee23f9Smrg  for arg
1834fee23f9Smrg  do
1844fee23f9Smrg    case $arg in
1854fee23f9Smrg    -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;;
1864fee23f9Smrg    *)  set fnord "$@" "$arg" ;;
1874fee23f9Smrg    esac
1884fee23f9Smrg    shift # fnord
1894fee23f9Smrg    shift # $arg
1904fee23f9Smrg  done
1914fee23f9Smrg  "$@"
1924fee23f9Smrg  stat=$?
193*4d5abbe8Smrg  if test $stat -ne 0; then
1944fee23f9Smrg    rm -f "$tmpdepfile"
1954fee23f9Smrg    exit $stat
1964fee23f9Smrg  fi
1974fee23f9Smrg  mv "$tmpdepfile" "$depfile"
1984fee23f9Smrg  ;;
1994fee23f9Smrg
2004fee23f9Smrggcc)
201*4d5abbe8Smrg## Note that this doesn't just cater to obsosete pre-3.x GCC compilers.
202*4d5abbe8Smrg## but also to in-use compilers like IMB xlc/xlC and the HP C compiler.
203*4d5abbe8Smrg## (see the conditional assignment to $gccflag above).
2044fee23f9Smrg## There are various ways to get dependency output from gcc.  Here's
2054fee23f9Smrg## why we pick this rather obscure method:
2064fee23f9Smrg## - Don't want to use -MD because we'd like the dependencies to end
2074fee23f9Smrg##   up in a subdir.  Having to rename by hand is ugly.
2084fee23f9Smrg##   (We might end up doing this anyway to support other compilers.)
2094fee23f9Smrg## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
210*4d5abbe8Smrg##   -MM, not -M (despite what the docs say).  Also, it might not be
211*4d5abbe8Smrg##   supported by the other compilers which use the 'gcc' depmode.
2124fee23f9Smrg## - Using -M directly means running the compiler twice (even worse
2134fee23f9Smrg##   than renaming).
2144fee23f9Smrg  if test -z "$gccflag"; then
2154fee23f9Smrg    gccflag=-MD,
2164fee23f9Smrg  fi
2174fee23f9Smrg  "$@" -Wp,"$gccflag$tmpdepfile"
2184fee23f9Smrg  stat=$?
219*4d5abbe8Smrg  if test $stat -ne 0; then
2204fee23f9Smrg    rm -f "$tmpdepfile"
2214fee23f9Smrg    exit $stat
2224fee23f9Smrg  fi
2234fee23f9Smrg  rm -f "$depfile"
2244fee23f9Smrg  echo "$object : \\" > "$depfile"
225*4d5abbe8Smrg  # The second -e expression handles DOS-style file names with drive
226*4d5abbe8Smrg  # letters.
2274fee23f9Smrg  sed -e 's/^[^:]*: / /' \
2284fee23f9Smrg      -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
229*4d5abbe8Smrg## This next piece of magic avoids the "deleted header file" problem.
2304fee23f9Smrg## The problem is that when a header file which appears in a .P file
2314fee23f9Smrg## is deleted, the dependency causes make to die (because there is
2324fee23f9Smrg## typically no way to rebuild the header).  We avoid this by adding
2334fee23f9Smrg## dummy dependencies for each header file.  Too bad gcc doesn't do
2344fee23f9Smrg## this for us directly.
235*4d5abbe8Smrg## Some versions of gcc put a space before the ':'.  On the theory
2364fee23f9Smrg## that the space means something, we add a space to the output as
237*4d5abbe8Smrg## well.  hp depmode also adds that space, but also prefixes the VPATH
238*4d5abbe8Smrg## to the object.  Take care to not repeat it in the output.
2394fee23f9Smrg## Some versions of the HPUX 10.20 sed can't process this invocation
2404fee23f9Smrg## correctly.  Breaking it into two sed invocations is a workaround.
241*4d5abbe8Smrg  tr ' ' "$nl" < "$tmpdepfile" \
242*4d5abbe8Smrg    | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \
243*4d5abbe8Smrg    | sed -e 's/$/ :/' >> "$depfile"
2444fee23f9Smrg  rm -f "$tmpdepfile"
2454fee23f9Smrg  ;;
2464fee23f9Smrg
2474fee23f9Smrghp)
2484fee23f9Smrg  # This case exists only to let depend.m4 do its work.  It works by
2494fee23f9Smrg  # looking at the text of this script.  This case will never be run,
2504fee23f9Smrg  # since it is checked for above.
2514fee23f9Smrg  exit 1
2524fee23f9Smrg  ;;
2534fee23f9Smrg
254*4d5abbe8Smrgxlc)
255*4d5abbe8Smrg  # This case exists only to let depend.m4 do its work.  It works by
256*4d5abbe8Smrg  # looking at the text of this script.  This case will never be run,
257*4d5abbe8Smrg  # since it is checked for above.
258*4d5abbe8Smrg  exit 1
2594fee23f9Smrg  ;;
2604fee23f9Smrg
2614fee23f9Smrgaix)
2624fee23f9Smrg  # The C for AIX Compiler uses -M and outputs the dependencies
2634fee23f9Smrg  # in a .u file.  In older versions, this file always lives in the
264*4d5abbe8Smrg  # current directory.  Also, the AIX compiler puts '$object:' at the
2654fee23f9Smrg  # start of each line; $object doesn't have directory information.
2664fee23f9Smrg  # Version 6 uses the directory in both cases.
267*4d5abbe8Smrg  set_dir_from "$object"
268*4d5abbe8Smrg  set_base_from "$object"
2694fee23f9Smrg  if test "$libtool" = yes; then
2704fee23f9Smrg    tmpdepfile1=$dir$base.u
2714fee23f9Smrg    tmpdepfile2=$base.u
2724fee23f9Smrg    tmpdepfile3=$dir.libs/$base.u
2734fee23f9Smrg    "$@" -Wc,-M
2744fee23f9Smrg  else
2754fee23f9Smrg    tmpdepfile1=$dir$base.u
2764fee23f9Smrg    tmpdepfile2=$dir$base.u
2774fee23f9Smrg    tmpdepfile3=$dir$base.u
2784fee23f9Smrg    "$@" -M
2794fee23f9Smrg  fi
2804fee23f9Smrg  stat=$?
281*4d5abbe8Smrg  if test $stat -ne 0; then
2824fee23f9Smrg    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
2834fee23f9Smrg    exit $stat
2844fee23f9Smrg  fi
2854fee23f9Smrg
2864fee23f9Smrg  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
2874fee23f9Smrg  do
2884fee23f9Smrg    test -f "$tmpdepfile" && break
2894fee23f9Smrg  done
290*4d5abbe8Smrg  aix_post_process_depfile
291*4d5abbe8Smrg  ;;
292*4d5abbe8Smrg
293*4d5abbe8Smrgtcc)
294*4d5abbe8Smrg  # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26
295*4d5abbe8Smrg  # FIXME: That version still under development at the moment of writing.
296*4d5abbe8Smrg  #        Make that this statement remains true also for stable, released
297*4d5abbe8Smrg  #        versions.
298*4d5abbe8Smrg  # It will wrap lines (doesn't matter whether long or short) with a
299*4d5abbe8Smrg  # trailing '\', as in:
300*4d5abbe8Smrg  #
301*4d5abbe8Smrg  #   foo.o : \
302*4d5abbe8Smrg  #    foo.c \
303*4d5abbe8Smrg  #    foo.h \
304*4d5abbe8Smrg  #
305*4d5abbe8Smrg  # It will put a trailing '\' even on the last line, and will use leading
306*4d5abbe8Smrg  # spaces rather than leading tabs (at least since its commit 0394caf7
307*4d5abbe8Smrg  # "Emit spaces for -MD").
308*4d5abbe8Smrg  "$@" -MD -MF "$tmpdepfile"
309*4d5abbe8Smrg  stat=$?
310*4d5abbe8Smrg  if test $stat -ne 0; then
311*4d5abbe8Smrg    rm -f "$tmpdepfile"
312*4d5abbe8Smrg    exit $stat
3134fee23f9Smrg  fi
314*4d5abbe8Smrg  rm -f "$depfile"
315*4d5abbe8Smrg  # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'.
316*4d5abbe8Smrg  # We have to change lines of the first kind to '$object: \'.
317*4d5abbe8Smrg  sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile"
318*4d5abbe8Smrg  # And for each line of the second kind, we have to emit a 'dep.h:'
319*4d5abbe8Smrg  # dummy dependency, to avoid the deleted-header problem.
320*4d5abbe8Smrg  sed -n -e 's|^  *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile"
3214fee23f9Smrg  rm -f "$tmpdepfile"
3224fee23f9Smrg  ;;
3234fee23f9Smrg
324*4d5abbe8Smrg## The order of this option in the case statement is important, since the
325*4d5abbe8Smrg## shell code in configure will try each of these formats in the order
326*4d5abbe8Smrg## listed in this file.  A plain '-MD' option would be understood by many
327*4d5abbe8Smrg## compilers, so we must ensure this comes after the gcc and icc options.
328*4d5abbe8Smrgpgcc)
329*4d5abbe8Smrg  # Portland's C compiler understands '-MD'.
330*4d5abbe8Smrg  # Will always output deps to 'file.d' where file is the root name of the
331*4d5abbe8Smrg  # source file under compilation, even if file resides in a subdirectory.
332*4d5abbe8Smrg  # The object file name does not affect the name of the '.d' file.
333*4d5abbe8Smrg  # pgcc 10.2 will output
3344fee23f9Smrg  #    foo.o: sub/foo.c sub/foo.h
335*4d5abbe8Smrg  # and will wrap long lines using '\' :
3364fee23f9Smrg  #    foo.o: sub/foo.c ... \
3374fee23f9Smrg  #     sub/foo.h ... \
3384fee23f9Smrg  #     ...
339*4d5abbe8Smrg  set_dir_from "$object"
340*4d5abbe8Smrg  # Use the source, not the object, to determine the base name, since
341*4d5abbe8Smrg  # that's sadly what pgcc will do too.
342*4d5abbe8Smrg  set_base_from "$source"
343*4d5abbe8Smrg  tmpdepfile=$base.d
3444fee23f9Smrg
345*4d5abbe8Smrg  # For projects that build the same source file twice into different object
346*4d5abbe8Smrg  # files, the pgcc approach of using the *source* file root name can cause
347*4d5abbe8Smrg  # problems in parallel builds.  Use a locking strategy to avoid stomping on
348*4d5abbe8Smrg  # the same $tmpdepfile.
349*4d5abbe8Smrg  lockdir=$base.d-lock
350*4d5abbe8Smrg  trap "
351*4d5abbe8Smrg    echo '$0: caught signal, cleaning up...' >&2
352*4d5abbe8Smrg    rmdir '$lockdir'
353*4d5abbe8Smrg    exit 1
354*4d5abbe8Smrg  " 1 2 13 15
355*4d5abbe8Smrg  numtries=100
356*4d5abbe8Smrg  i=$numtries
357*4d5abbe8Smrg  while test $i -gt 0; do
358*4d5abbe8Smrg    # mkdir is a portable test-and-set.
359*4d5abbe8Smrg    if mkdir "$lockdir" 2>/dev/null; then
360*4d5abbe8Smrg      # This process acquired the lock.
361*4d5abbe8Smrg      "$@" -MD
3624fee23f9Smrg      stat=$?
363*4d5abbe8Smrg      # Release the lock.
364*4d5abbe8Smrg      rmdir "$lockdir"
365*4d5abbe8Smrg      break
3664fee23f9Smrg    else
367*4d5abbe8Smrg      # If the lock is being held by a different process, wait
368*4d5abbe8Smrg      # until the winning process is done or we timeout.
369*4d5abbe8Smrg      while test -d "$lockdir" && test $i -gt 0; do
370*4d5abbe8Smrg        sleep 1
371*4d5abbe8Smrg        i=`expr $i - 1`
372*4d5abbe8Smrg      done
373*4d5abbe8Smrg    fi
374*4d5abbe8Smrg    i=`expr $i - 1`
375*4d5abbe8Smrg  done
376*4d5abbe8Smrg  trap - 1 2 13 15
377*4d5abbe8Smrg  if test $i -le 0; then
378*4d5abbe8Smrg    echo "$0: failed to acquire lock after $numtries attempts" >&2
379*4d5abbe8Smrg    echo "$0: check lockdir '$lockdir'" >&2
380*4d5abbe8Smrg    exit 1
381*4d5abbe8Smrg  fi
382*4d5abbe8Smrg
383*4d5abbe8Smrg  if test $stat -ne 0; then
3844fee23f9Smrg    rm -f "$tmpdepfile"
3854fee23f9Smrg    exit $stat
3864fee23f9Smrg  fi
3874fee23f9Smrg  rm -f "$depfile"
3884fee23f9Smrg  # Each line is of the form `foo.o: dependent.h',
3894fee23f9Smrg  # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'.
3904fee23f9Smrg  # Do two passes, one to just change these to
3914fee23f9Smrg  # `$object: dependent.h' and one to simply `dependent.h:'.
3924fee23f9Smrg  sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
3934fee23f9Smrg  # Some versions of the HPUX 10.20 sed can't process this invocation
3944fee23f9Smrg  # correctly.  Breaking it into two sed invocations is a workaround.
395*4d5abbe8Smrg  sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \
396*4d5abbe8Smrg    | sed -e 's/$/ :/' >> "$depfile"
3974fee23f9Smrg  rm -f "$tmpdepfile"
3984fee23f9Smrg  ;;
3994fee23f9Smrg
4004fee23f9Smrghp2)
4014fee23f9Smrg  # The "hp" stanza above does not work with aCC (C++) and HP's ia64
4024fee23f9Smrg  # compilers, which have integrated preprocessors.  The correct option
4034fee23f9Smrg  # to use with these is +Maked; it writes dependencies to a file named
4044fee23f9Smrg  # 'foo.d', which lands next to the object file, wherever that
4054fee23f9Smrg  # happens to be.
4064fee23f9Smrg  # Much of this is similar to the tru64 case; see comments there.
407*4d5abbe8Smrg  set_dir_from  "$object"
408*4d5abbe8Smrg  set_base_from "$object"
4094fee23f9Smrg  if test "$libtool" = yes; then
4104fee23f9Smrg    tmpdepfile1=$dir$base.d
4114fee23f9Smrg    tmpdepfile2=$dir.libs/$base.d
4124fee23f9Smrg    "$@" -Wc,+Maked
4134fee23f9Smrg  else
4144fee23f9Smrg    tmpdepfile1=$dir$base.d
4154fee23f9Smrg    tmpdepfile2=$dir$base.d
4164fee23f9Smrg    "$@" +Maked
4174fee23f9Smrg  fi
4184fee23f9Smrg  stat=$?
419*4d5abbe8Smrg  if test $stat -ne 0; then
4204fee23f9Smrg     rm -f "$tmpdepfile1" "$tmpdepfile2"
4214fee23f9Smrg     exit $stat
4224fee23f9Smrg  fi
4234fee23f9Smrg
4244fee23f9Smrg  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2"
4254fee23f9Smrg  do
4264fee23f9Smrg    test -f "$tmpdepfile" && break
4274fee23f9Smrg  done
4284fee23f9Smrg  if test -f "$tmpdepfile"; then
429*4d5abbe8Smrg    sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile"
430*4d5abbe8Smrg    # Add 'dependent.h:' lines.
4314fee23f9Smrg    sed -ne '2,${
4324fee23f9Smrg               s/^ *//
4334fee23f9Smrg               s/ \\*$//
4344fee23f9Smrg               s/$/:/
4354fee23f9Smrg               p
4364fee23f9Smrg             }' "$tmpdepfile" >> "$depfile"
4374fee23f9Smrg  else
438*4d5abbe8Smrg    make_dummy_depfile
4394fee23f9Smrg  fi
4404fee23f9Smrg  rm -f "$tmpdepfile" "$tmpdepfile2"
4414fee23f9Smrg  ;;
4424fee23f9Smrg
4434fee23f9Smrgtru64)
4444fee23f9Smrg  # The Tru64 compiler uses -MD to generate dependencies as a side
445*4d5abbe8Smrg  # effect.  'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'.
4464fee23f9Smrg  # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
447*4d5abbe8Smrg  # dependencies in 'foo.d' instead, so we check for that too.
4484fee23f9Smrg  # Subdirectories are respected.
449*4d5abbe8Smrg  set_dir_from  "$object"
450*4d5abbe8Smrg  set_base_from "$object"
4514fee23f9Smrg
4524fee23f9Smrg  if test "$libtool" = yes; then
453*4d5abbe8Smrg    # Libtool generates 2 separate objects for the 2 libraries.  These
454*4d5abbe8Smrg    # two compilations output dependencies in $dir.libs/$base.o.d and
4554fee23f9Smrg    # in $dir$base.o.d.  We have to check for both files, because
4564fee23f9Smrg    # one of the two compilations can be disabled.  We should prefer
4574fee23f9Smrg    # $dir$base.o.d over $dir.libs/$base.o.d because the latter is
4584fee23f9Smrg    # automatically cleaned when .libs/ is deleted, while ignoring
4594fee23f9Smrg    # the former would cause a distcleancheck panic.
460*4d5abbe8Smrg    tmpdepfile1=$dir$base.o.d          # libtool 1.5
461*4d5abbe8Smrg    tmpdepfile2=$dir.libs/$base.o.d    # Likewise.
462*4d5abbe8Smrg    tmpdepfile3=$dir.libs/$base.d      # Compaq CCC V6.2-504
4634fee23f9Smrg    "$@" -Wc,-MD
4644fee23f9Smrg  else
465*4d5abbe8Smrg    tmpdepfile1=$dir$base.d
4664fee23f9Smrg    tmpdepfile2=$dir$base.d
4674fee23f9Smrg    tmpdepfile3=$dir$base.d
4684fee23f9Smrg    "$@" -MD
4694fee23f9Smrg  fi
4704fee23f9Smrg
4714fee23f9Smrg  stat=$?
472*4d5abbe8Smrg  if test $stat -ne 0; then
473*4d5abbe8Smrg    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
4744fee23f9Smrg    exit $stat
4754fee23f9Smrg  fi
4764fee23f9Smrg
477*4d5abbe8Smrg  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
4784fee23f9Smrg  do
4794fee23f9Smrg    test -f "$tmpdepfile" && break
4804fee23f9Smrg  done
481*4d5abbe8Smrg  # Same post-processing that is required for AIX mode.
482*4d5abbe8Smrg  aix_post_process_depfile
483*4d5abbe8Smrg  ;;
484*4d5abbe8Smrg
485*4d5abbe8Smrgmsvc7)
486*4d5abbe8Smrg  if test "$libtool" = yes; then
487*4d5abbe8Smrg    showIncludes=-Wc,-showIncludes
4884fee23f9Smrg  else
489*4d5abbe8Smrg    showIncludes=-showIncludes
4904fee23f9Smrg  fi
491*4d5abbe8Smrg  "$@" $showIncludes > "$tmpdepfile"
492*4d5abbe8Smrg  stat=$?
493*4d5abbe8Smrg  grep -v '^Note: including file: ' "$tmpdepfile"
494*4d5abbe8Smrg  if test $stat -ne 0; then
4954fee23f9Smrg    rm -f "$tmpdepfile"
496*4d5abbe8Smrg    exit $stat
497*4d5abbe8Smrg  fi
498*4d5abbe8Smrg  rm -f "$depfile"
499*4d5abbe8Smrg  echo "$object : \\" > "$depfile"
500*4d5abbe8Smrg  # The first sed program below extracts the file names and escapes
501*4d5abbe8Smrg  # backslashes for cygpath.  The second sed program outputs the file
502*4d5abbe8Smrg  # name when reading, but also accumulates all include files in the
503*4d5abbe8Smrg  # hold buffer in order to output them again at the end.  This only
504*4d5abbe8Smrg  # works with sed implementations that can handle large buffers.
505*4d5abbe8Smrg  sed < "$tmpdepfile" -n '
506*4d5abbe8Smrg/^Note: including file:  *\(.*\)/ {
507*4d5abbe8Smrg  s//\1/
508*4d5abbe8Smrg  s/\\/\\\\/g
509*4d5abbe8Smrg  p
510*4d5abbe8Smrg}' | $cygpath_u | sort -u | sed -n '
511*4d5abbe8Smrgs/ /\\ /g
512*4d5abbe8Smrgs/\(.*\)/'"$tab"'\1 \\/p
513*4d5abbe8Smrgs/.\(.*\) \\/\1:/
514*4d5abbe8SmrgH
515*4d5abbe8Smrg$ {
516*4d5abbe8Smrg  s/.*/'"$tab"'/
517*4d5abbe8Smrg  G
518*4d5abbe8Smrg  p
519*4d5abbe8Smrg}' >> "$depfile"
520*4d5abbe8Smrg  echo >> "$depfile" # make sure the fragment doesn't end with a backslash
521*4d5abbe8Smrg  rm -f "$tmpdepfile"
522*4d5abbe8Smrg  ;;
523*4d5abbe8Smrg
524*4d5abbe8Smrgmsvc7msys)
525*4d5abbe8Smrg  # This case exists only to let depend.m4 do its work.  It works by
526*4d5abbe8Smrg  # looking at the text of this script.  This case will never be run,
527*4d5abbe8Smrg  # since it is checked for above.
528*4d5abbe8Smrg  exit 1
5294fee23f9Smrg  ;;
5304fee23f9Smrg
5314fee23f9Smrg#nosideeffect)
5324fee23f9Smrg  # This comment above is used by automake to tell side-effect
5334fee23f9Smrg  # dependency tracking mechanisms from slower ones.
5344fee23f9Smrg
5354fee23f9Smrgdashmstdout)
5364fee23f9Smrg  # Important note: in order to support this mode, a compiler *must*
5374fee23f9Smrg  # always write the preprocessed file to stdout, regardless of -o.
5384fee23f9Smrg  "$@" || exit $?
5394fee23f9Smrg
5404fee23f9Smrg  # Remove the call to Libtool.
5414fee23f9Smrg  if test "$libtool" = yes; then
5424fee23f9Smrg    while test "X$1" != 'X--mode=compile'; do
5434fee23f9Smrg      shift
5444fee23f9Smrg    done
5454fee23f9Smrg    shift
5464fee23f9Smrg  fi
5474fee23f9Smrg
548*4d5abbe8Smrg  # Remove '-o $object'.
5494fee23f9Smrg  IFS=" "
5504fee23f9Smrg  for arg
5514fee23f9Smrg  do
5524fee23f9Smrg    case $arg in
5534fee23f9Smrg    -o)
5544fee23f9Smrg      shift
5554fee23f9Smrg      ;;
5564fee23f9Smrg    $object)
5574fee23f9Smrg      shift
5584fee23f9Smrg      ;;
5594fee23f9Smrg    *)
5604fee23f9Smrg      set fnord "$@" "$arg"
5614fee23f9Smrg      shift # fnord
5624fee23f9Smrg      shift # $arg
5634fee23f9Smrg      ;;
5644fee23f9Smrg    esac
5654fee23f9Smrg  done
5664fee23f9Smrg
5674fee23f9Smrg  test -z "$dashmflag" && dashmflag=-M
568*4d5abbe8Smrg  # Require at least two characters before searching for ':'
5694fee23f9Smrg  # in the target name.  This is to cope with DOS-style filenames:
570*4d5abbe8Smrg  # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise.
5714fee23f9Smrg  "$@" $dashmflag |
572*4d5abbe8Smrg    sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile"
5734fee23f9Smrg  rm -f "$depfile"
5744fee23f9Smrg  cat < "$tmpdepfile" > "$depfile"
575*4d5abbe8Smrg  # Some versions of the HPUX 10.20 sed can't process this sed invocation
576*4d5abbe8Smrg  # correctly.  Breaking it into two sed invocations is a workaround.
577*4d5abbe8Smrg  tr ' ' "$nl" < "$tmpdepfile" \
578*4d5abbe8Smrg    | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
579*4d5abbe8Smrg    | sed -e 's/$/ :/' >> "$depfile"
5804fee23f9Smrg  rm -f "$tmpdepfile"
5814fee23f9Smrg  ;;
5824fee23f9Smrg
5834fee23f9SmrgdashXmstdout)
5844fee23f9Smrg  # This case only exists to satisfy depend.m4.  It is never actually
5854fee23f9Smrg  # run, as this mode is specially recognized in the preamble.
5864fee23f9Smrg  exit 1
5874fee23f9Smrg  ;;
5884fee23f9Smrg
5894fee23f9Smrgmakedepend)
5904fee23f9Smrg  "$@" || exit $?
5914fee23f9Smrg  # Remove any Libtool call
5924fee23f9Smrg  if test "$libtool" = yes; then
5934fee23f9Smrg    while test "X$1" != 'X--mode=compile'; do
5944fee23f9Smrg      shift
5954fee23f9Smrg    done
5964fee23f9Smrg    shift
5974fee23f9Smrg  fi
5984fee23f9Smrg  # X makedepend
5994fee23f9Smrg  shift
6004fee23f9Smrg  cleared=no eat=no
6014fee23f9Smrg  for arg
6024fee23f9Smrg  do
6034fee23f9Smrg    case $cleared in
6044fee23f9Smrg    no)
6054fee23f9Smrg      set ""; shift
6064fee23f9Smrg      cleared=yes ;;
6074fee23f9Smrg    esac
6084fee23f9Smrg    if test $eat = yes; then
6094fee23f9Smrg      eat=no
6104fee23f9Smrg      continue
6114fee23f9Smrg    fi
6124fee23f9Smrg    case "$arg" in
6134fee23f9Smrg    -D*|-I*)
6144fee23f9Smrg      set fnord "$@" "$arg"; shift ;;
6154fee23f9Smrg    # Strip any option that makedepend may not understand.  Remove
6164fee23f9Smrg    # the object too, otherwise makedepend will parse it as a source file.
6174fee23f9Smrg    -arch)
6184fee23f9Smrg      eat=yes ;;
6194fee23f9Smrg    -*|$object)
6204fee23f9Smrg      ;;
6214fee23f9Smrg    *)
6224fee23f9Smrg      set fnord "$@" "$arg"; shift ;;
6234fee23f9Smrg    esac
6244fee23f9Smrg  done
6254fee23f9Smrg  obj_suffix=`echo "$object" | sed 's/^.*\././'`
6264fee23f9Smrg  touch "$tmpdepfile"
6274fee23f9Smrg  ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
6284fee23f9Smrg  rm -f "$depfile"
629*4d5abbe8Smrg  # makedepend may prepend the VPATH from the source file name to the object.
630*4d5abbe8Smrg  # No need to regex-escape $object, excess matching of '.' is harmless.
631*4d5abbe8Smrg  sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile"
632*4d5abbe8Smrg  # Some versions of the HPUX 10.20 sed can't process the last invocation
633*4d5abbe8Smrg  # correctly.  Breaking it into two sed invocations is a workaround.
634*4d5abbe8Smrg  sed '1,2d' "$tmpdepfile" \
635*4d5abbe8Smrg    | tr ' ' "$nl" \
636*4d5abbe8Smrg    | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
637*4d5abbe8Smrg    | sed -e 's/$/ :/' >> "$depfile"
6384fee23f9Smrg  rm -f "$tmpdepfile" "$tmpdepfile".bak
6394fee23f9Smrg  ;;
6404fee23f9Smrg
6414fee23f9Smrgcpp)
6424fee23f9Smrg  # Important note: in order to support this mode, a compiler *must*
6434fee23f9Smrg  # always write the preprocessed file to stdout.
6444fee23f9Smrg  "$@" || exit $?
6454fee23f9Smrg
6464fee23f9Smrg  # Remove the call to Libtool.
6474fee23f9Smrg  if test "$libtool" = yes; then
6484fee23f9Smrg    while test "X$1" != 'X--mode=compile'; do
6494fee23f9Smrg      shift
6504fee23f9Smrg    done
6514fee23f9Smrg    shift
6524fee23f9Smrg  fi
6534fee23f9Smrg
654*4d5abbe8Smrg  # Remove '-o $object'.
6554fee23f9Smrg  IFS=" "
6564fee23f9Smrg  for arg
6574fee23f9Smrg  do
6584fee23f9Smrg    case $arg in
6594fee23f9Smrg    -o)
6604fee23f9Smrg      shift
6614fee23f9Smrg      ;;
6624fee23f9Smrg    $object)
6634fee23f9Smrg      shift
6644fee23f9Smrg      ;;
6654fee23f9Smrg    *)
6664fee23f9Smrg      set fnord "$@" "$arg"
6674fee23f9Smrg      shift # fnord
6684fee23f9Smrg      shift # $arg
6694fee23f9Smrg      ;;
6704fee23f9Smrg    esac
6714fee23f9Smrg  done
6724fee23f9Smrg
673*4d5abbe8Smrg  "$@" -E \
674*4d5abbe8Smrg    | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
675*4d5abbe8Smrg             -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
676*4d5abbe8Smrg    | sed '$ s: \\$::' > "$tmpdepfile"
6774fee23f9Smrg  rm -f "$depfile"
6784fee23f9Smrg  echo "$object : \\" > "$depfile"
6794fee23f9Smrg  cat < "$tmpdepfile" >> "$depfile"
6804fee23f9Smrg  sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
6814fee23f9Smrg  rm -f "$tmpdepfile"
6824fee23f9Smrg  ;;
6834fee23f9Smrg
6844fee23f9Smrgmsvisualcpp)
6854fee23f9Smrg  # Important note: in order to support this mode, a compiler *must*
6864fee23f9Smrg  # always write the preprocessed file to stdout.
6874fee23f9Smrg  "$@" || exit $?
6884fee23f9Smrg
6894fee23f9Smrg  # Remove the call to Libtool.
6904fee23f9Smrg  if test "$libtool" = yes; then
6914fee23f9Smrg    while test "X$1" != 'X--mode=compile'; do
6924fee23f9Smrg      shift
6934fee23f9Smrg    done
6944fee23f9Smrg    shift
6954fee23f9Smrg  fi
6964fee23f9Smrg
6974fee23f9Smrg  IFS=" "
6984fee23f9Smrg  for arg
6994fee23f9Smrg  do
7004fee23f9Smrg    case "$arg" in
7014fee23f9Smrg    -o)
7024fee23f9Smrg      shift
7034fee23f9Smrg      ;;
7044fee23f9Smrg    $object)
7054fee23f9Smrg      shift
7064fee23f9Smrg      ;;
7074fee23f9Smrg    "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
7084fee23f9Smrg        set fnord "$@"
7094fee23f9Smrg        shift
7104fee23f9Smrg        shift
7114fee23f9Smrg        ;;
7124fee23f9Smrg    *)
7134fee23f9Smrg        set fnord "$@" "$arg"
7144fee23f9Smrg        shift
7154fee23f9Smrg        shift
7164fee23f9Smrg        ;;
7174fee23f9Smrg    esac
7184fee23f9Smrg  done
7194fee23f9Smrg  "$@" -E 2>/dev/null |
7204fee23f9Smrg  sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile"
7214fee23f9Smrg  rm -f "$depfile"
7224fee23f9Smrg  echo "$object : \\" > "$depfile"
723*4d5abbe8Smrg  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile"
724*4d5abbe8Smrg  echo "$tab" >> "$depfile"
7254fee23f9Smrg  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile"
7264fee23f9Smrg  rm -f "$tmpdepfile"
7274fee23f9Smrg  ;;
7284fee23f9Smrg
7294fee23f9Smrgmsvcmsys)
7304fee23f9Smrg  # This case exists only to let depend.m4 do its work.  It works by
7314fee23f9Smrg  # looking at the text of this script.  This case will never be run,
7324fee23f9Smrg  # since it is checked for above.
7334fee23f9Smrg  exit 1
7344fee23f9Smrg  ;;
7354fee23f9Smrg
7364fee23f9Smrgnone)
7374fee23f9Smrg  exec "$@"
7384fee23f9Smrg  ;;
7394fee23f9Smrg
7404fee23f9Smrg*)
7414fee23f9Smrg  echo "Unknown depmode $depmode" 1>&2
7424fee23f9Smrg  exit 1
7434fee23f9Smrg  ;;
7444fee23f9Smrgesac
7454fee23f9Smrg
7464fee23f9Smrgexit 0
7474fee23f9Smrg
7484fee23f9Smrg# Local Variables:
7494fee23f9Smrg# mode: shell-script
7504fee23f9Smrg# sh-indentation: 2
7514fee23f9Smrg# eval: (add-hook 'write-file-hooks 'time-stamp)
7524fee23f9Smrg# time-stamp-start: "scriptversion="
7534fee23f9Smrg# time-stamp-format: "%:y-%02m-%02d.%02H"
7544fee23f9Smrg# time-stamp-time-zone: "UTC"
7554fee23f9Smrg# time-stamp-end: "; # UTC"
7564fee23f9Smrg# End:
757