1251883Speter#! /bin/sh
2251883Speter# depcomp - compile a program generating dependencies as side-effects
3251883Speter
4346442Scyscriptversion=2016-01-11.22; # UTC
5251883Speter
6346442Scy# Copyright (C) 1999-2017 Free Software Foundation, Inc.
7251883Speter
8251883Speter# This program is free software; you can redistribute it and/or modify
9251883Speter# it under the terms of the GNU General Public License as published by
10251883Speter# the Free Software Foundation; either version 2, or (at your option)
11251883Speter# any later version.
12251883Speter
13251883Speter# This program is distributed in the hope that it will be useful,
14251883Speter# but WITHOUT ANY WARRANTY; without even the implied warranty of
15251883Speter# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16251883Speter# GNU General Public License for more details.
17251883Speter
18251883Speter# You should have received a copy of the GNU General Public License
19269851Speter# along with this program.  If not, see <http://www.gnu.org/licenses/>.
20251883Speter
21251883Speter# As a special exception to the GNU General Public License, if you
22251883Speter# distribute this file as part of a program that contains a
23251883Speter# configuration script generated by Autoconf, you may include it under
24251883Speter# the same distribution terms that you use for the rest of that program.
25251883Speter
26251883Speter# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>.
27251883Speter
28251883Spetercase $1 in
29251883Speter  '')
30298161Sbapt    echo "$0: No command.  Try '$0 --help' for more information." 1>&2
31298161Sbapt    exit 1;
32298161Sbapt    ;;
33251883Speter  -h | --h*)
34251883Speter    cat <<\EOF
35251883SpeterUsage: depcomp [--help] [--version] PROGRAM [ARGS]
36251883Speter
37251883SpeterRun PROGRAMS ARGS to compile a file, generating dependencies
38251883Speteras side-effects.
39251883Speter
40251883SpeterEnvironment variables:
41251883Speter  depmode     Dependency tracking mode.
42269851Speter  source      Source file read by 'PROGRAMS ARGS'.
43269851Speter  object      Object file output by 'PROGRAMS ARGS'.
44251883Speter  DEPDIR      directory where to store dependencies.
45251883Speter  depfile     Dependency file to output.
46269851Speter  tmpdepfile  Temporary file to use when outputting dependencies.
47251883Speter  libtool     Whether libtool is used (yes/no).
48251883Speter
49251883SpeterReport bugs to <bug-automake@gnu.org>.
50251883SpeterEOF
51251883Speter    exit $?
52251883Speter    ;;
53251883Speter  -v | --v*)
54251883Speter    echo "depcomp $scriptversion"
55251883Speter    exit $?
56251883Speter    ;;
57251883Speteresac
58251883Speter
59298161Sbapt# Get the directory component of the given path, and save it in the
60298161Sbapt# global variables '$dir'.  Note that this directory component will
61298161Sbapt# be either empty or ending with a '/' character.  This is deliberate.
62298161Sbaptset_dir_from ()
63298161Sbapt{
64298161Sbapt  case $1 in
65298161Sbapt    */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;;
66298161Sbapt      *) dir=;;
67298161Sbapt  esac
68298161Sbapt}
69298161Sbapt
70298161Sbapt# Get the suffix-stripped basename of the given path, and save it the
71298161Sbapt# global variable '$base'.
72298161Sbaptset_base_from ()
73298161Sbapt{
74298161Sbapt  base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'`
75298161Sbapt}
76298161Sbapt
77298161Sbapt# If no dependency file was actually created by the compiler invocation,
78298161Sbapt# we still have to create a dummy depfile, to avoid errors with the
79298161Sbapt# Makefile "include basename.Plo" scheme.
80298161Sbaptmake_dummy_depfile ()
81298161Sbapt{
82298161Sbapt  echo "#dummy" > "$depfile"
83298161Sbapt}
84298161Sbapt
85298161Sbapt# Factor out some common post-processing of the generated depfile.
86298161Sbapt# Requires the auxiliary global variable '$tmpdepfile' to be set.
87298161Sbaptaix_post_process_depfile ()
88298161Sbapt{
89298161Sbapt  # If the compiler actually managed to produce a dependency file,
90298161Sbapt  # post-process it.
91298161Sbapt  if test -f "$tmpdepfile"; then
92298161Sbapt    # Each line is of the form 'foo.o: dependency.h'.
93298161Sbapt    # Do two passes, one to just change these to
94298161Sbapt    #   $object: dependency.h
95298161Sbapt    # and one to simply output
96298161Sbapt    #   dependency.h:
97298161Sbapt    # which is needed to avoid the deleted-header problem.
98298161Sbapt    { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile"
99298161Sbapt      sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile"
100298161Sbapt    } > "$depfile"
101298161Sbapt    rm -f "$tmpdepfile"
102298161Sbapt  else
103298161Sbapt    make_dummy_depfile
104298161Sbapt  fi
105298161Sbapt}
106298161Sbapt
107269851Speter# A tabulation character.
108269851Spetertab='	'
109269851Speter# A newline character.
110269851Speternl='
111269851Speter'
112298161Sbapt# Character ranges might be problematic outside the C locale.
113298161Sbapt# These definitions help.
114298161Sbaptupper=ABCDEFGHIJKLMNOPQRSTUVWXYZ
115298161Sbaptlower=abcdefghijklmnopqrstuvwxyz
116298161Sbaptdigits=0123456789
117298161Sbaptalpha=${upper}${lower}
118269851Speter
119251883Speterif test -z "$depmode" || test -z "$source" || test -z "$object"; then
120251883Speter  echo "depcomp: Variables source, object and depmode must be set" 1>&2
121251883Speter  exit 1
122251883Speterfi
123251883Speter
124251883Speter# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.
125251883Speterdepfile=${depfile-`echo "$object" |
126251883Speter  sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`}
127251883Spetertmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
128251883Speter
129251883Speterrm -f "$tmpdepfile"
130251883Speter
131298161Sbapt# Avoid interferences from the environment.
132298161Sbaptgccflag= dashmflag=
133298161Sbapt
134251883Speter# Some modes work just like other modes, but use different flags.  We
135251883Speter# parameterize here, but still list the modes in the big case below,
136251883Speter# to make depend.m4 easier to write.  Note that we *cannot* use a case
137251883Speter# here, because this file can only contain one case statement.
138251883Speterif test "$depmode" = hp; then
139251883Speter  # HP compiler uses -M and no extra arg.
140251883Speter  gccflag=-M
141251883Speter  depmode=gcc
142251883Speterfi
143251883Speter
144251883Speterif test "$depmode" = dashXmstdout; then
145298161Sbapt  # This is just like dashmstdout with a different argument.
146298161Sbapt  dashmflag=-xM
147298161Sbapt  depmode=dashmstdout
148251883Speterfi
149251883Speter
150269851Spetercygpath_u="cygpath -u -f -"
151269851Speterif test "$depmode" = msvcmsys; then
152298161Sbapt  # This is just like msvisualcpp but w/o cygpath translation.
153298161Sbapt  # Just convert the backslash-escaped backslashes to single forward
154298161Sbapt  # slashes to satisfy depend.m4
155298161Sbapt  cygpath_u='sed s,\\\\,/,g'
156298161Sbapt  depmode=msvisualcpp
157269851Speterfi
158269851Speter
159269851Speterif test "$depmode" = msvc7msys; then
160298161Sbapt  # This is just like msvc7 but w/o cygpath translation.
161298161Sbapt  # Just convert the backslash-escaped backslashes to single forward
162298161Sbapt  # slashes to satisfy depend.m4
163298161Sbapt  cygpath_u='sed s,\\\\,/,g'
164298161Sbapt  depmode=msvc7
165269851Speterfi
166269851Speter
167269851Speterif test "$depmode" = xlc; then
168298161Sbapt  # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information.
169298161Sbapt  gccflag=-qmakedep=gcc,-MF
170298161Sbapt  depmode=gcc
171269851Speterfi
172269851Speter
173251883Spetercase "$depmode" in
174251883Spetergcc3)
175251883Speter## gcc 3 implements dependency tracking that does exactly what
176251883Speter## we want.  Yay!  Note: for some reason libtool 1.4 doesn't like
177251883Speter## it if -MD -MP comes after the -MF stuff.  Hmm.
178269851Speter## Unfortunately, FreeBSD c89 acceptance of flags depends upon
179269851Speter## the command line argument order; so add the flags where they
180269851Speter## appear in depend2.am.  Note that the slowdown incurred here
181269851Speter## affects only configure: in makefiles, %FASTDEP% shortcuts this.
182269851Speter  for arg
183269851Speter  do
184269851Speter    case $arg in
185269851Speter    -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;;
186269851Speter    *)  set fnord "$@" "$arg" ;;
187269851Speter    esac
188269851Speter    shift # fnord
189269851Speter    shift # $arg
190269851Speter  done
191269851Speter  "$@"
192251883Speter  stat=$?
193298161Sbapt  if test $stat -ne 0; then
194251883Speter    rm -f "$tmpdepfile"
195251883Speter    exit $stat
196251883Speter  fi
197251883Speter  mv "$tmpdepfile" "$depfile"
198251883Speter  ;;
199251883Speter
200251883Spetergcc)
201298161Sbapt## Note that this doesn't just cater to obsosete pre-3.x GCC compilers.
202298161Sbapt## but also to in-use compilers like IMB xlc/xlC and the HP C compiler.
203298161Sbapt## (see the conditional assignment to $gccflag above).
204251883Speter## There are various ways to get dependency output from gcc.  Here's
205251883Speter## why we pick this rather obscure method:
206251883Speter## - Don't want to use -MD because we'd like the dependencies to end
207251883Speter##   up in a subdir.  Having to rename by hand is ugly.
208251883Speter##   (We might end up doing this anyway to support other compilers.)
209251883Speter## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
210298161Sbapt##   -MM, not -M (despite what the docs say).  Also, it might not be
211298161Sbapt##   supported by the other compilers which use the 'gcc' depmode.
212251883Speter## - Using -M directly means running the compiler twice (even worse
213251883Speter##   than renaming).
214251883Speter  if test -z "$gccflag"; then
215251883Speter    gccflag=-MD,
216251883Speter  fi
217251883Speter  "$@" -Wp,"$gccflag$tmpdepfile"
218251883Speter  stat=$?
219298161Sbapt  if test $stat -ne 0; then
220251883Speter    rm -f "$tmpdepfile"
221251883Speter    exit $stat
222251883Speter  fi
223251883Speter  rm -f "$depfile"
224251883Speter  echo "$object : \\" > "$depfile"
225298161Sbapt  # The second -e expression handles DOS-style file names with drive
226298161Sbapt  # letters.
227251883Speter  sed -e 's/^[^:]*: / /' \
228251883Speter      -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
229269851Speter## This next piece of magic avoids the "deleted header file" problem.
230251883Speter## The problem is that when a header file which appears in a .P file
231251883Speter## is deleted, the dependency causes make to die (because there is
232251883Speter## typically no way to rebuild the header).  We avoid this by adding
233251883Speter## dummy dependencies for each header file.  Too bad gcc doesn't do
234251883Speter## this for us directly.
235269851Speter## Some versions of gcc put a space before the ':'.  On the theory
236251883Speter## that the space means something, we add a space to the output as
237269851Speter## well.  hp depmode also adds that space, but also prefixes the VPATH
238269851Speter## to the object.  Take care to not repeat it in the output.
239251883Speter## Some versions of the HPUX 10.20 sed can't process this invocation
240251883Speter## correctly.  Breaking it into two sed invocations is a workaround.
241298161Sbapt  tr ' ' "$nl" < "$tmpdepfile" \
242298161Sbapt    | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \
243298161Sbapt    | sed -e 's/$/ :/' >> "$depfile"
244251883Speter  rm -f "$tmpdepfile"
245251883Speter  ;;
246251883Speter
247251883Speterhp)
248251883Speter  # This case exists only to let depend.m4 do its work.  It works by
249251883Speter  # looking at the text of this script.  This case will never be run,
250251883Speter  # since it is checked for above.
251251883Speter  exit 1
252251883Speter  ;;
253251883Speter
254251883Spetersgi)
255251883Speter  if test "$libtool" = yes; then
256251883Speter    "$@" "-Wp,-MDupdate,$tmpdepfile"
257251883Speter  else
258251883Speter    "$@" -MDupdate "$tmpdepfile"
259251883Speter  fi
260251883Speter  stat=$?
261298161Sbapt  if test $stat -ne 0; then
262251883Speter    rm -f "$tmpdepfile"
263251883Speter    exit $stat
264251883Speter  fi
265251883Speter  rm -f "$depfile"
266251883Speter
267251883Speter  if test -f "$tmpdepfile"; then  # yes, the sourcefile depend on other files
268251883Speter    echo "$object : \\" > "$depfile"
269251883Speter    # Clip off the initial element (the dependent).  Don't try to be
270251883Speter    # clever and replace this with sed code, as IRIX sed won't handle
271251883Speter    # lines with more than a fixed number of characters (4096 in
272251883Speter    # IRIX 6.2 sed, 8192 in IRIX 6.5).  We also remove comment lines;
273269851Speter    # the IRIX cc adds comments like '#:fec' to the end of the
274251883Speter    # dependency line.
275269851Speter    tr ' ' "$nl" < "$tmpdepfile" \
276298161Sbapt      | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \
277298161Sbapt      | tr "$nl" ' ' >> "$depfile"
278269851Speter    echo >> "$depfile"
279251883Speter    # The second pass generates a dummy entry for each header file.
280269851Speter    tr ' ' "$nl" < "$tmpdepfile" \
281298161Sbapt      | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
282298161Sbapt      >> "$depfile"
283251883Speter  else
284298161Sbapt    make_dummy_depfile
285251883Speter  fi
286251883Speter  rm -f "$tmpdepfile"
287251883Speter  ;;
288251883Speter
289269851Speterxlc)
290269851Speter  # This case exists only to let depend.m4 do its work.  It works by
291269851Speter  # looking at the text of this script.  This case will never be run,
292269851Speter  # since it is checked for above.
293269851Speter  exit 1
294269851Speter  ;;
295269851Speter
296251883Speteraix)
297251883Speter  # The C for AIX Compiler uses -M and outputs the dependencies
298251883Speter  # in a .u file.  In older versions, this file always lives in the
299269851Speter  # current directory.  Also, the AIX compiler puts '$object:' at the
300251883Speter  # start of each line; $object doesn't have directory information.
301251883Speter  # Version 6 uses the directory in both cases.
302298161Sbapt  set_dir_from "$object"
303298161Sbapt  set_base_from "$object"
304251883Speter  if test "$libtool" = yes; then
305269851Speter    tmpdepfile1=$dir$base.u
306269851Speter    tmpdepfile2=$base.u
307269851Speter    tmpdepfile3=$dir.libs/$base.u
308251883Speter    "$@" -Wc,-M
309251883Speter  else
310269851Speter    tmpdepfile1=$dir$base.u
311269851Speter    tmpdepfile2=$dir$base.u
312269851Speter    tmpdepfile3=$dir$base.u
313251883Speter    "$@" -M
314251883Speter  fi
315251883Speter  stat=$?
316298161Sbapt  if test $stat -ne 0; then
317269851Speter    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
318251883Speter    exit $stat
319251883Speter  fi
320251883Speter
321269851Speter  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
322269851Speter  do
323269851Speter    test -f "$tmpdepfile" && break
324269851Speter  done
325298161Sbapt  aix_post_process_depfile
326298161Sbapt  ;;
327298161Sbapt
328298161Sbapttcc)
329298161Sbapt  # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26
330298161Sbapt  # FIXME: That version still under development at the moment of writing.
331298161Sbapt  #        Make that this statement remains true also for stable, released
332298161Sbapt  #        versions.
333298161Sbapt  # It will wrap lines (doesn't matter whether long or short) with a
334298161Sbapt  # trailing '\', as in:
335298161Sbapt  #
336298161Sbapt  #   foo.o : \
337298161Sbapt  #    foo.c \
338298161Sbapt  #    foo.h \
339298161Sbapt  #
340298161Sbapt  # It will put a trailing '\' even on the last line, and will use leading
341298161Sbapt  # spaces rather than leading tabs (at least since its commit 0394caf7
342298161Sbapt  # "Emit spaces for -MD").
343298161Sbapt  "$@" -MD -MF "$tmpdepfile"
344298161Sbapt  stat=$?
345298161Sbapt  if test $stat -ne 0; then
346298161Sbapt    rm -f "$tmpdepfile"
347298161Sbapt    exit $stat
348251883Speter  fi
349298161Sbapt  rm -f "$depfile"
350298161Sbapt  # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'.
351298161Sbapt  # We have to change lines of the first kind to '$object: \'.
352298161Sbapt  sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile"
353298161Sbapt  # And for each line of the second kind, we have to emit a 'dep.h:'
354298161Sbapt  # dummy dependency, to avoid the deleted-header problem.
355298161Sbapt  sed -n -e 's|^  *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile"
356251883Speter  rm -f "$tmpdepfile"
357251883Speter  ;;
358251883Speter
359298161Sbapt## The order of this option in the case statement is important, since the
360298161Sbapt## shell code in configure will try each of these formats in the order
361298161Sbapt## listed in this file.  A plain '-MD' option would be understood by many
362298161Sbapt## compilers, so we must ensure this comes after the gcc and icc options.
363298161Sbaptpgcc)
364298161Sbapt  # Portland's C compiler understands '-MD'.
365298161Sbapt  # Will always output deps to 'file.d' where file is the root name of the
366298161Sbapt  # source file under compilation, even if file resides in a subdirectory.
367298161Sbapt  # The object file name does not affect the name of the '.d' file.
368298161Sbapt  # pgcc 10.2 will output
369251883Speter  #    foo.o: sub/foo.c sub/foo.h
370298161Sbapt  # and will wrap long lines using '\' :
371251883Speter  #    foo.o: sub/foo.c ... \
372251883Speter  #     sub/foo.h ... \
373251883Speter  #     ...
374298161Sbapt  set_dir_from "$object"
375298161Sbapt  # Use the source, not the object, to determine the base name, since
376298161Sbapt  # that's sadly what pgcc will do too.
377298161Sbapt  set_base_from "$source"
378298161Sbapt  tmpdepfile=$base.d
379298161Sbapt
380298161Sbapt  # For projects that build the same source file twice into different object
381298161Sbapt  # files, the pgcc approach of using the *source* file root name can cause
382298161Sbapt  # problems in parallel builds.  Use a locking strategy to avoid stomping on
383298161Sbapt  # the same $tmpdepfile.
384298161Sbapt  lockdir=$base.d-lock
385298161Sbapt  trap "
386298161Sbapt    echo '$0: caught signal, cleaning up...' >&2
387298161Sbapt    rmdir '$lockdir'
388298161Sbapt    exit 1
389298161Sbapt  " 1 2 13 15
390298161Sbapt  numtries=100
391298161Sbapt  i=$numtries
392298161Sbapt  while test $i -gt 0; do
393298161Sbapt    # mkdir is a portable test-and-set.
394298161Sbapt    if mkdir "$lockdir" 2>/dev/null; then
395298161Sbapt      # This process acquired the lock.
396298161Sbapt      "$@" -MD
397298161Sbapt      stat=$?
398298161Sbapt      # Release the lock.
399298161Sbapt      rmdir "$lockdir"
400298161Sbapt      break
401298161Sbapt    else
402298161Sbapt      # If the lock is being held by a different process, wait
403298161Sbapt      # until the winning process is done or we timeout.
404298161Sbapt      while test -d "$lockdir" && test $i -gt 0; do
405298161Sbapt        sleep 1
406298161Sbapt        i=`expr $i - 1`
407298161Sbapt      done
408298161Sbapt    fi
409298161Sbapt    i=`expr $i - 1`
410298161Sbapt  done
411298161Sbapt  trap - 1 2 13 15
412298161Sbapt  if test $i -le 0; then
413298161Sbapt    echo "$0: failed to acquire lock after $numtries attempts" >&2
414298161Sbapt    echo "$0: check lockdir '$lockdir'" >&2
415298161Sbapt    exit 1
416298161Sbapt  fi
417298161Sbapt
418298161Sbapt  if test $stat -ne 0; then
419251883Speter    rm -f "$tmpdepfile"
420251883Speter    exit $stat
421251883Speter  fi
422251883Speter  rm -f "$depfile"
423298161Sbapt  # Each line is of the form `foo.o: dependent.h',
424298161Sbapt  # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'.
425251883Speter  # Do two passes, one to just change these to
426298161Sbapt  # `$object: dependent.h' and one to simply `dependent.h:'.
427298161Sbapt  sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
428298161Sbapt  # Some versions of the HPUX 10.20 sed can't process this invocation
429298161Sbapt  # correctly.  Breaking it into two sed invocations is a workaround.
430298161Sbapt  sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \
431298161Sbapt    | sed -e 's/$/ :/' >> "$depfile"
432251883Speter  rm -f "$tmpdepfile"
433251883Speter  ;;
434251883Speter
435269851Speterhp2)
436269851Speter  # The "hp" stanza above does not work with aCC (C++) and HP's ia64
437269851Speter  # compilers, which have integrated preprocessors.  The correct option
438269851Speter  # to use with these is +Maked; it writes dependencies to a file named
439269851Speter  # 'foo.d', which lands next to the object file, wherever that
440269851Speter  # happens to be.
441269851Speter  # Much of this is similar to the tru64 case; see comments there.
442298161Sbapt  set_dir_from  "$object"
443298161Sbapt  set_base_from "$object"
444269851Speter  if test "$libtool" = yes; then
445269851Speter    tmpdepfile1=$dir$base.d
446269851Speter    tmpdepfile2=$dir.libs/$base.d
447269851Speter    "$@" -Wc,+Maked
448269851Speter  else
449269851Speter    tmpdepfile1=$dir$base.d
450269851Speter    tmpdepfile2=$dir$base.d
451269851Speter    "$@" +Maked
452269851Speter  fi
453269851Speter  stat=$?
454298161Sbapt  if test $stat -ne 0; then
455269851Speter     rm -f "$tmpdepfile1" "$tmpdepfile2"
456269851Speter     exit $stat
457269851Speter  fi
458269851Speter
459269851Speter  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2"
460269851Speter  do
461269851Speter    test -f "$tmpdepfile" && break
462269851Speter  done
463269851Speter  if test -f "$tmpdepfile"; then
464298161Sbapt    sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile"
465269851Speter    # Add 'dependent.h:' lines.
466269851Speter    sed -ne '2,${
467298161Sbapt               s/^ *//
468298161Sbapt               s/ \\*$//
469298161Sbapt               s/$/:/
470298161Sbapt               p
471298161Sbapt             }' "$tmpdepfile" >> "$depfile"
472269851Speter  else
473298161Sbapt    make_dummy_depfile
474269851Speter  fi
475269851Speter  rm -f "$tmpdepfile" "$tmpdepfile2"
476269851Speter  ;;
477269851Speter
478251883Spetertru64)
479298161Sbapt  # The Tru64 compiler uses -MD to generate dependencies as a side
480298161Sbapt  # effect.  'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'.
481298161Sbapt  # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
482298161Sbapt  # dependencies in 'foo.d' instead, so we check for that too.
483298161Sbapt  # Subdirectories are respected.
484298161Sbapt  set_dir_from  "$object"
485298161Sbapt  set_base_from "$object"
486251883Speter
487298161Sbapt  if test "$libtool" = yes; then
488298161Sbapt    # Libtool generates 2 separate objects for the 2 libraries.  These
489298161Sbapt    # two compilations output dependencies in $dir.libs/$base.o.d and
490298161Sbapt    # in $dir$base.o.d.  We have to check for both files, because
491298161Sbapt    # one of the two compilations can be disabled.  We should prefer
492298161Sbapt    # $dir$base.o.d over $dir.libs/$base.o.d because the latter is
493298161Sbapt    # automatically cleaned when .libs/ is deleted, while ignoring
494298161Sbapt    # the former would cause a distcleancheck panic.
495298161Sbapt    tmpdepfile1=$dir$base.o.d          # libtool 1.5
496298161Sbapt    tmpdepfile2=$dir.libs/$base.o.d    # Likewise.
497298161Sbapt    tmpdepfile3=$dir.libs/$base.d      # Compaq CCC V6.2-504
498298161Sbapt    "$@" -Wc,-MD
499298161Sbapt  else
500298161Sbapt    tmpdepfile1=$dir$base.d
501298161Sbapt    tmpdepfile2=$dir$base.d
502298161Sbapt    tmpdepfile3=$dir$base.d
503298161Sbapt    "$@" -MD
504298161Sbapt  fi
505251883Speter
506298161Sbapt  stat=$?
507298161Sbapt  if test $stat -ne 0; then
508298161Sbapt    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
509298161Sbapt    exit $stat
510298161Sbapt  fi
511251883Speter
512298161Sbapt  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
513298161Sbapt  do
514298161Sbapt    test -f "$tmpdepfile" && break
515298161Sbapt  done
516298161Sbapt  # Same post-processing that is required for AIX mode.
517298161Sbapt  aix_post_process_depfile
518298161Sbapt  ;;
519251883Speter
520269851Spetermsvc7)
521269851Speter  if test "$libtool" = yes; then
522269851Speter    showIncludes=-Wc,-showIncludes
523269851Speter  else
524269851Speter    showIncludes=-showIncludes
525269851Speter  fi
526269851Speter  "$@" $showIncludes > "$tmpdepfile"
527269851Speter  stat=$?
528269851Speter  grep -v '^Note: including file: ' "$tmpdepfile"
529298161Sbapt  if test $stat -ne 0; then
530269851Speter    rm -f "$tmpdepfile"
531269851Speter    exit $stat
532269851Speter  fi
533269851Speter  rm -f "$depfile"
534269851Speter  echo "$object : \\" > "$depfile"
535269851Speter  # The first sed program below extracts the file names and escapes
536269851Speter  # backslashes for cygpath.  The second sed program outputs the file
537269851Speter  # name when reading, but also accumulates all include files in the
538269851Speter  # hold buffer in order to output them again at the end.  This only
539269851Speter  # works with sed implementations that can handle large buffers.
540269851Speter  sed < "$tmpdepfile" -n '
541269851Speter/^Note: including file:  *\(.*\)/ {
542269851Speter  s//\1/
543269851Speter  s/\\/\\\\/g
544269851Speter  p
545269851Speter}' | $cygpath_u | sort -u | sed -n '
546269851Speters/ /\\ /g
547269851Speters/\(.*\)/'"$tab"'\1 \\/p
548269851Speters/.\(.*\) \\/\1:/
549269851SpeterH
550269851Speter$ {
551269851Speter  s/.*/'"$tab"'/
552269851Speter  G
553269851Speter  p
554269851Speter}' >> "$depfile"
555298161Sbapt  echo >> "$depfile" # make sure the fragment doesn't end with a backslash
556269851Speter  rm -f "$tmpdepfile"
557269851Speter  ;;
558269851Speter
559269851Spetermsvc7msys)
560269851Speter  # This case exists only to let depend.m4 do its work.  It works by
561269851Speter  # looking at the text of this script.  This case will never be run,
562269851Speter  # since it is checked for above.
563269851Speter  exit 1
564269851Speter  ;;
565269851Speter
566251883Speter#nosideeffect)
567251883Speter  # This comment above is used by automake to tell side-effect
568251883Speter  # dependency tracking mechanisms from slower ones.
569251883Speter
570251883Speterdashmstdout)
571251883Speter  # Important note: in order to support this mode, a compiler *must*
572251883Speter  # always write the preprocessed file to stdout, regardless of -o.
573251883Speter  "$@" || exit $?
574251883Speter
575251883Speter  # Remove the call to Libtool.
576251883Speter  if test "$libtool" = yes; then
577269851Speter    while test "X$1" != 'X--mode=compile'; do
578251883Speter      shift
579251883Speter    done
580251883Speter    shift
581251883Speter  fi
582251883Speter
583269851Speter  # Remove '-o $object'.
584251883Speter  IFS=" "
585251883Speter  for arg
586251883Speter  do
587251883Speter    case $arg in
588251883Speter    -o)
589251883Speter      shift
590251883Speter      ;;
591251883Speter    $object)
592251883Speter      shift
593251883Speter      ;;
594251883Speter    *)
595251883Speter      set fnord "$@" "$arg"
596251883Speter      shift # fnord
597251883Speter      shift # $arg
598251883Speter      ;;
599251883Speter    esac
600251883Speter  done
601251883Speter
602251883Speter  test -z "$dashmflag" && dashmflag=-M
603269851Speter  # Require at least two characters before searching for ':'
604251883Speter  # in the target name.  This is to cope with DOS-style filenames:
605269851Speter  # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise.
606251883Speter  "$@" $dashmflag |
607298161Sbapt    sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile"
608251883Speter  rm -f "$depfile"
609251883Speter  cat < "$tmpdepfile" > "$depfile"
610298161Sbapt  # Some versions of the HPUX 10.20 sed can't process this sed invocation
611298161Sbapt  # correctly.  Breaking it into two sed invocations is a workaround.
612298161Sbapt  tr ' ' "$nl" < "$tmpdepfile" \
613298161Sbapt    | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
614298161Sbapt    | sed -e 's/$/ :/' >> "$depfile"
615251883Speter  rm -f "$tmpdepfile"
616251883Speter  ;;
617251883Speter
618251883SpeterdashXmstdout)
619251883Speter  # This case only exists to satisfy depend.m4.  It is never actually
620251883Speter  # run, as this mode is specially recognized in the preamble.
621251883Speter  exit 1
622251883Speter  ;;
623251883Speter
624251883Spetermakedepend)
625251883Speter  "$@" || exit $?
626251883Speter  # Remove any Libtool call
627251883Speter  if test "$libtool" = yes; then
628269851Speter    while test "X$1" != 'X--mode=compile'; do
629251883Speter      shift
630251883Speter    done
631251883Speter    shift
632251883Speter  fi
633251883Speter  # X makedepend
634251883Speter  shift
635269851Speter  cleared=no eat=no
636269851Speter  for arg
637269851Speter  do
638251883Speter    case $cleared in
639251883Speter    no)
640251883Speter      set ""; shift
641251883Speter      cleared=yes ;;
642251883Speter    esac
643269851Speter    if test $eat = yes; then
644269851Speter      eat=no
645269851Speter      continue
646269851Speter    fi
647251883Speter    case "$arg" in
648251883Speter    -D*|-I*)
649251883Speter      set fnord "$@" "$arg"; shift ;;
650251883Speter    # Strip any option that makedepend may not understand.  Remove
651251883Speter    # the object too, otherwise makedepend will parse it as a source file.
652269851Speter    -arch)
653269851Speter      eat=yes ;;
654251883Speter    -*|$object)
655251883Speter      ;;
656251883Speter    *)
657251883Speter      set fnord "$@" "$arg"; shift ;;
658251883Speter    esac
659251883Speter  done
660269851Speter  obj_suffix=`echo "$object" | sed 's/^.*\././'`
661251883Speter  touch "$tmpdepfile"
662251883Speter  ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
663251883Speter  rm -f "$depfile"
664269851Speter  # makedepend may prepend the VPATH from the source file name to the object.
665269851Speter  # No need to regex-escape $object, excess matching of '.' is harmless.
666269851Speter  sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile"
667298161Sbapt  # Some versions of the HPUX 10.20 sed can't process the last invocation
668298161Sbapt  # correctly.  Breaking it into two sed invocations is a workaround.
669298161Sbapt  sed '1,2d' "$tmpdepfile" \
670298161Sbapt    | tr ' ' "$nl" \
671298161Sbapt    | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
672298161Sbapt    | sed -e 's/$/ :/' >> "$depfile"
673251883Speter  rm -f "$tmpdepfile" "$tmpdepfile".bak
674251883Speter  ;;
675251883Speter
676251883Spetercpp)
677251883Speter  # Important note: in order to support this mode, a compiler *must*
678251883Speter  # always write the preprocessed file to stdout.
679251883Speter  "$@" || exit $?
680251883Speter
681251883Speter  # Remove the call to Libtool.
682251883Speter  if test "$libtool" = yes; then
683269851Speter    while test "X$1" != 'X--mode=compile'; do
684251883Speter      shift
685251883Speter    done
686251883Speter    shift
687251883Speter  fi
688251883Speter
689269851Speter  # Remove '-o $object'.
690251883Speter  IFS=" "
691251883Speter  for arg
692251883Speter  do
693251883Speter    case $arg in
694251883Speter    -o)
695251883Speter      shift
696251883Speter      ;;
697251883Speter    $object)
698251883Speter      shift
699251883Speter      ;;
700251883Speter    *)
701251883Speter      set fnord "$@" "$arg"
702251883Speter      shift # fnord
703251883Speter      shift # $arg
704251883Speter      ;;
705251883Speter    esac
706251883Speter  done
707251883Speter
708298161Sbapt  "$@" -E \
709298161Sbapt    | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
710298161Sbapt             -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
711298161Sbapt    | sed '$ s: \\$::' > "$tmpdepfile"
712251883Speter  rm -f "$depfile"
713251883Speter  echo "$object : \\" > "$depfile"
714251883Speter  cat < "$tmpdepfile" >> "$depfile"
715251883Speter  sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
716251883Speter  rm -f "$tmpdepfile"
717251883Speter  ;;
718251883Speter
719251883Spetermsvisualcpp)
720251883Speter  # Important note: in order to support this mode, a compiler *must*
721269851Speter  # always write the preprocessed file to stdout.
722251883Speter  "$@" || exit $?
723269851Speter
724269851Speter  # Remove the call to Libtool.
725269851Speter  if test "$libtool" = yes; then
726269851Speter    while test "X$1" != 'X--mode=compile'; do
727269851Speter      shift
728269851Speter    done
729269851Speter    shift
730269851Speter  fi
731269851Speter
732251883Speter  IFS=" "
733251883Speter  for arg
734251883Speter  do
735251883Speter    case "$arg" in
736269851Speter    -o)
737269851Speter      shift
738269851Speter      ;;
739269851Speter    $object)
740269851Speter      shift
741269851Speter      ;;
742251883Speter    "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
743298161Sbapt        set fnord "$@"
744298161Sbapt        shift
745298161Sbapt        shift
746298161Sbapt        ;;
747251883Speter    *)
748298161Sbapt        set fnord "$@" "$arg"
749298161Sbapt        shift
750298161Sbapt        shift
751298161Sbapt        ;;
752251883Speter    esac
753251883Speter  done
754269851Speter  "$@" -E 2>/dev/null |
755269851Speter  sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile"
756251883Speter  rm -f "$depfile"
757251883Speter  echo "$object : \\" > "$depfile"
758269851Speter  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile"
759269851Speter  echo "$tab" >> "$depfile"
760269851Speter  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile"
761251883Speter  rm -f "$tmpdepfile"
762251883Speter  ;;
763251883Speter
764269851Spetermsvcmsys)
765269851Speter  # This case exists only to let depend.m4 do its work.  It works by
766269851Speter  # looking at the text of this script.  This case will never be run,
767269851Speter  # since it is checked for above.
768269851Speter  exit 1
769269851Speter  ;;
770269851Speter
771251883Speternone)
772251883Speter  exec "$@"
773251883Speter  ;;
774251883Speter
775251883Speter*)
776251883Speter  echo "Unknown depmode $depmode" 1>&2
777251883Speter  exit 1
778251883Speter  ;;
779251883Speteresac
780251883Speter
781251883Speterexit 0
782251883Speter
783251883Speter# Local Variables:
784251883Speter# mode: shell-script
785251883Speter# sh-indentation: 2
786251883Speter# eval: (add-hook 'write-file-hooks 'time-stamp)
787251883Speter# time-stamp-start: "scriptversion="
788251883Speter# time-stamp-format: "%:y-%02m-%02d.%02H"
789346442Scy# time-stamp-time-zone: "UTC0"
790269851Speter# time-stamp-end: "; # UTC"
791251883Speter# End:
792