1#! /bin/sh
2# depcomp - compile a program generating dependencies as side-effects
3
4scriptversion=2009-04-28.21; # UTC
5
6# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007, 2009 Free
7# Software Foundation, Inc.
8
9# This program is free software; you can redistribute it and/or modify
10# it under the terms of the GNU General Public License as published by
11# the Free Software Foundation; either version 2, or (at your option)
12# any later version.
13
14# This program is distributed in the hope that it will be useful,
15# but WITHOUT ANY WARRANTY; without even the implied warranty of
16# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17# GNU General Public License for more details.
18
19# You should have received a copy of the GNU General Public License
20# along with this program; if not, write to the Free Software
21# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
22# 02110-1301, USA.
23
24# As a special exception to the GNU General Public License, if you
25# distribute this file as part of a program that contains a
26# configuration script generated by Autoconf, you may include it under
27# the same distribution terms that you use for the rest of that program.
28
29# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>.
30
31case $1 in
32  '')
33     echo "$0: No command.  Try \`$0 --help' for more information." 1>&2
34     exit 1;
35     ;;
36  -h | --h*)
37    cat <<\EOF
38Usage: depcomp [--help] [--version] PROGRAM [ARGS]
39
40Run PROGRAMS ARGS to compile a file, generating dependencies
41as side-effects.
42
43Environment variables:
44  depmode     Dependency tracking mode.
45  source      Source file read by `PROGRAMS ARGS'.
46  object      Object file output by `PROGRAMS ARGS'.
47  DEPDIR      directory where to store dependencies.
48  depfile     Dependency file to output.
49  tmpdepfile  Temporary file to use when outputing dependencies.
50  libtool     Whether libtool is used (yes/no).
51
52Report bugs to <bug-automake@gnu.org>.
53EOF
54    exit $?
55    ;;
56  -v | --v*)
57    echo "depcomp $scriptversion"
58    exit $?
59    ;;
60esac
61
62if test -z "$depmode" || test -z "$source" || test -z "$object"; then
63  echo "depcomp: Variables source, object and depmode must be set" 1>&2
64  exit 1
65fi
66
67# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.
68depfile=${depfile-`echo "$object" |
69  sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`}
70tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
71
72rm -f "$tmpdepfile"
73
74# Some modes work just like other modes, but use different flags.  We
75# parameterize here, but still list the modes in the big case below,
76# to make depend.m4 easier to write.  Note that we *cannot* use a case
77# here, because this file can only contain one case statement.
78if test "$depmode" = hp; then
79  # HP compiler uses -M and no extra arg.
80  gccflag=-M
81  depmode=gcc
82fi
83
84if test "$depmode" = dashXmstdout; then
85   # This is just like dashmstdout with a different argument.
86   dashmflag=-xM
87   depmode=dashmstdout
88fi
89
90cygpath_u="cygpath -u -f -"
91if test "$depmode" = msvcmsys; then
92   # This is just like msvisualcpp but w/o cygpath translation.
93   # Just convert the backslash-escaped backslashes to single forward
94   # slashes to satisfy depend.m4
95   cygpath_u="sed s,\\\\\\\\,/,g"
96   depmode=msvisualcpp
97fi
98
99case "$depmode" in
100gcc3)
101## gcc 3 implements dependency tracking that does exactly what
102## we want.  Yay!  Note: for some reason libtool 1.4 doesn't like
103## it if -MD -MP comes after the -MF stuff.  Hmm.
104## Unfortunately, FreeBSD c89 acceptance of flags depends upon
105## the command line argument order; so add the flags where they
106## appear in depend2.am.  Note that the slowdown incurred here
107## affects only configure: in makefiles, %FASTDEP% shortcuts this.
108  for arg
109  do
110    case $arg in
111    -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;;
112    *)  set fnord "$@" "$arg" ;;
113    esac
114    shift # fnord
115    shift # $arg
116  done
117  "$@"
118  stat=$?
119  if test $stat -eq 0; then :
120  else
121    rm -f "$tmpdepfile"
122    exit $stat
123  fi
124  mv "$tmpdepfile" "$depfile"
125  ;;
126
127gcc)
128## There are various ways to get dependency output from gcc.  Here's
129## why we pick this rather obscure method:
130## - Don't want to use -MD because we'd like the dependencies to end
131##   up in a subdir.  Having to rename by hand is ugly.
132##   (We might end up doing this anyway to support other compilers.)
133## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
134##   -MM, not -M (despite what the docs say).
135## - Using -M directly means running the compiler twice (even worse
136##   than renaming).
137  if test -z "$gccflag"; then
138    gccflag=-MD,
139  fi
140  "$@" -Wp,"$gccflag$tmpdepfile"
141  stat=$?
142  if test $stat -eq 0; then :
143  else
144    rm -f "$tmpdepfile"
145    exit $stat
146  fi
147  rm -f "$depfile"
148  echo "$object : \\" > "$depfile"
149  alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
150## The second -e expression handles DOS-style file names with drive letters.
151  sed -e 's/^[^:]*: / /' \
152      -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
153## This next piece of magic avoids the `deleted header file' problem.
154## The problem is that when a header file which appears in a .P file
155## is deleted, the dependency causes make to die (because there is
156## typically no way to rebuild the header).  We avoid this by adding
157## dummy dependencies for each header file.  Too bad gcc doesn't do
158## this for us directly.
159  tr ' ' '
160' < "$tmpdepfile" |
161## Some versions of gcc put a space before the `:'.  On the theory
162## that the space means something, we add a space to the output as
163## well.
164## Some versions of the HPUX 10.20 sed can't process this invocation
165## correctly.  Breaking it into two sed invocations is a workaround.
166    sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
167  rm -f "$tmpdepfile"
168  ;;
169
170hp)
171  # This case exists only to let depend.m4 do its work.  It works by
172  # looking at the text of this script.  This case will never be run,
173  # since it is checked for above.
174  exit 1
175  ;;
176
177sgi)
178  if test "$libtool" = yes; then
179    "$@" "-Wp,-MDupdate,$tmpdepfile"
180  else
181    "$@" -MDupdate "$tmpdepfile"
182  fi
183  stat=$?
184  if test $stat -eq 0; then :
185  else
186    rm -f "$tmpdepfile"
187    exit $stat
188  fi
189  rm -f "$depfile"
190
191  if test -f "$tmpdepfile"; then  # yes, the sourcefile depend on other files
192    echo "$object : \\" > "$depfile"
193
194    # Clip off the initial element (the dependent).  Don't try to be
195    # clever and replace this with sed code, as IRIX sed won't handle
196    # lines with more than a fixed number of characters (4096 in
197    # IRIX 6.2 sed, 8192 in IRIX 6.5).  We also remove comment lines;
198    # the IRIX cc adds comments like `#:fec' to the end of the
199    # dependency line.
200    tr ' ' '
201' < "$tmpdepfile" \
202    | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \
203    tr '
204' ' ' >> "$depfile"
205    echo >> "$depfile"
206
207    # The second pass generates a dummy entry for each header file.
208    tr ' ' '
209' < "$tmpdepfile" \
210   | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
211   >> "$depfile"
212  else
213    # The sourcefile does not contain any dependencies, so just
214    # store a dummy comment line, to avoid errors with the Makefile
215    # "include basename.Plo" scheme.
216    echo "#dummy" > "$depfile"
217  fi
218  rm -f "$tmpdepfile"
219  ;;
220
221aix)
222  # The C for AIX Compiler uses -M and outputs the dependencies
223  # in a .u file.  In older versions, this file always lives in the
224  # current directory.  Also, the AIX compiler puts `$object:' at the
225  # start of each line; $object doesn't have directory information.
226  # Version 6 uses the directory in both cases.
227  dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
228  test "x$dir" = "x$object" && dir=
229  base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
230  if test "$libtool" = yes; then
231    tmpdepfile1=$dir$base.u
232    tmpdepfile2=$base.u
233    tmpdepfile3=$dir.libs/$base.u
234    "$@" -Wc,-M
235  else
236    tmpdepfile1=$dir$base.u
237    tmpdepfile2=$dir$base.u
238    tmpdepfile3=$dir$base.u
239    "$@" -M
240  fi
241  stat=$?
242
243  if test $stat -eq 0; then :
244  else
245    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
246    exit $stat
247  fi
248
249  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
250  do
251    test -f "$tmpdepfile" && break
252  done
253  if test -f "$tmpdepfile"; then
254    # Each line is of the form `foo.o: dependent.h'.
255    # Do two passes, one to just change these to
256    # `$object: dependent.h' and one to simply `dependent.h:'.
257    sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
258    # That's a tab and a space in the [].
259    sed -e 's,^.*\.[a-z]*:[	 ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
260  else
261    # The sourcefile does not contain any dependencies, so just
262    # store a dummy comment line, to avoid errors with the Makefile
263    # "include basename.Plo" scheme.
264    echo "#dummy" > "$depfile"
265  fi
266  rm -f "$tmpdepfile"
267  ;;
268
269icc)
270  # Intel's C compiler understands `-MD -MF file'.  However on
271  #    icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c
272  # ICC 7.0 will fill foo.d with something like
273  #    foo.o: sub/foo.c
274  #    foo.o: sub/foo.h
275  # which is wrong.  We want:
276  #    sub/foo.o: sub/foo.c
277  #    sub/foo.o: sub/foo.h
278  #    sub/foo.c:
279  #    sub/foo.h:
280  # ICC 7.1 will output
281  #    foo.o: sub/foo.c sub/foo.h
282  # and will wrap long lines using \ :
283  #    foo.o: sub/foo.c ... \
284  #     sub/foo.h ... \
285  #     ...
286
287  "$@" -MD -MF "$tmpdepfile"
288  stat=$?
289  if test $stat -eq 0; then :
290  else
291    rm -f "$tmpdepfile"
292    exit $stat
293  fi
294  rm -f "$depfile"
295  # Each line is of the form `foo.o: dependent.h',
296  # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'.
297  # Do two passes, one to just change these to
298  # `$object: dependent.h' and one to simply `dependent.h:'.
299  sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
300  # Some versions of the HPUX 10.20 sed can't process this invocation
301  # correctly.  Breaking it into two sed invocations is a workaround.
302  sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" |
303    sed -e 's/$/ :/' >> "$depfile"
304  rm -f "$tmpdepfile"
305  ;;
306
307hp2)
308  # The "hp" stanza above does not work with aCC (C++) and HP's ia64
309  # compilers, which have integrated preprocessors.  The correct option
310  # to use with these is +Maked; it writes dependencies to a file named
311  # 'foo.d', which lands next to the object file, wherever that
312  # happens to be.
313  # Much of this is similar to the tru64 case; see comments there.
314  dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
315  test "x$dir" = "x$object" && dir=
316  base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
317  if test "$libtool" = yes; then
318    tmpdepfile1=$dir$base.d
319    tmpdepfile2=$dir.libs/$base.d
320    "$@" -Wc,+Maked
321  else
322    tmpdepfile1=$dir$base.d
323    tmpdepfile2=$dir$base.d
324    "$@" +Maked
325  fi
326  stat=$?
327  if test $stat -eq 0; then :
328  else
329     rm -f "$tmpdepfile1" "$tmpdepfile2"
330     exit $stat
331  fi
332
333  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2"
334  do
335    test -f "$tmpdepfile" && break
336  done
337  if test -f "$tmpdepfile"; then
338    sed -e "s,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile"
339    # Add `dependent.h:' lines.
340    sed -ne '2,${
341	       s/^ *//
342	       s/ \\*$//
343	       s/$/:/
344	       p
345	     }' "$tmpdepfile" >> "$depfile"
346  else
347    echo "#dummy" > "$depfile"
348  fi
349  rm -f "$tmpdepfile" "$tmpdepfile2"
350  ;;
351
352tru64)
353   # The Tru64 compiler uses -MD to generate dependencies as a side
354   # effect.  `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'.
355   # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
356   # dependencies in `foo.d' instead, so we check for that too.
357   # Subdirectories are respected.
358   dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
359   test "x$dir" = "x$object" && dir=
360   base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
361
362   if test "$libtool" = yes; then
363      # With Tru64 cc, shared objects can also be used to make a
364      # static library.  This mechanism is used in libtool 1.4 series to
365      # handle both shared and static libraries in a single compilation.
366      # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d.
367      #
368      # With libtool 1.5 this exception was removed, and libtool now
369      # generates 2 separate objects for the 2 libraries.  These two
370      # compilations output dependencies in $dir.libs/$base.o.d and
371      # in $dir$base.o.d.  We have to check for both files, because
372      # one of the two compilations can be disabled.  We should prefer
373      # $dir$base.o.d over $dir.libs/$base.o.d because the latter is
374      # automatically cleaned when .libs/ is deleted, while ignoring
375      # the former would cause a distcleancheck panic.
376      tmpdepfile1=$dir.libs/$base.lo.d   # libtool 1.4
377      tmpdepfile2=$dir$base.o.d          # libtool 1.5
378      tmpdepfile3=$dir.libs/$base.o.d    # libtool 1.5
379      tmpdepfile4=$dir.libs/$base.d      # Compaq CCC V6.2-504
380      "$@" -Wc,-MD
381   else
382      tmpdepfile1=$dir$base.o.d
383      tmpdepfile2=$dir$base.d
384      tmpdepfile3=$dir$base.d
385      tmpdepfile4=$dir$base.d
386      "$@" -MD
387   fi
388
389   stat=$?
390   if test $stat -eq 0; then :
391   else
392      rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
393      exit $stat
394   fi
395
396   for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
397   do
398     test -f "$tmpdepfile" && break
399   done
400   if test -f "$tmpdepfile"; then
401      sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
402      # That's a tab and a space in the [].
403      sed -e 's,^.*\.[a-z]*:[	 ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
404   else
405      echo "#dummy" > "$depfile"
406   fi
407   rm -f "$tmpdepfile"
408   ;;
409
410#nosideeffect)
411  # This comment above is used by automake to tell side-effect
412  # dependency tracking mechanisms from slower ones.
413
414dashmstdout)
415  # Important note: in order to support this mode, a compiler *must*
416  # always write the preprocessed file to stdout, regardless of -o.
417  "$@" || exit $?
418
419  # Remove the call to Libtool.
420  if test "$libtool" = yes; then
421    while test "X$1" != 'X--mode=compile'; do
422      shift
423    done
424    shift
425  fi
426
427  # Remove `-o $object'.
428  IFS=" "
429  for arg
430  do
431    case $arg in
432    -o)
433      shift
434      ;;
435    $object)
436      shift
437      ;;
438    *)
439      set fnord "$@" "$arg"
440      shift # fnord
441      shift # $arg
442      ;;
443    esac
444  done
445
446  test -z "$dashmflag" && dashmflag=-M
447  # Require at least two characters before searching for `:'
448  # in the target name.  This is to cope with DOS-style filenames:
449  # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise.
450  "$@" $dashmflag |
451    sed 's:^[  ]*[^: ][^:][^:]*\:[    ]*:'"$object"'\: :' > "$tmpdepfile"
452  rm -f "$depfile"
453  cat < "$tmpdepfile" > "$depfile"
454  tr ' ' '
455' < "$tmpdepfile" | \
456## Some versions of the HPUX 10.20 sed can't process this invocation
457## correctly.  Breaking it into two sed invocations is a workaround.
458    sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
459  rm -f "$tmpdepfile"
460  ;;
461
462dashXmstdout)
463  # This case only exists to satisfy depend.m4.  It is never actually
464  # run, as this mode is specially recognized in the preamble.
465  exit 1
466  ;;
467
468makedepend)
469  "$@" || exit $?
470  # Remove any Libtool call
471  if test "$libtool" = yes; then
472    while test "X$1" != 'X--mode=compile'; do
473      shift
474    done
475    shift
476  fi
477  # X makedepend
478  shift
479  cleared=no eat=no
480  for arg
481  do
482    case $cleared in
483    no)
484      set ""; shift
485      cleared=yes ;;
486    esac
487    if test $eat = yes; then
488      eat=no
489      continue
490    fi
491    case "$arg" in
492    -D*|-I*)
493      set fnord "$@" "$arg"; shift ;;
494    # Strip any option that makedepend may not understand.  Remove
495    # the object too, otherwise makedepend will parse it as a source file.
496    -arch)
497      eat=yes ;;
498    -*|$object)
499      ;;
500    *)
501      set fnord "$@" "$arg"; shift ;;
502    esac
503  done
504  obj_suffix=`echo "$object" | sed 's/^.*\././'`
505  touch "$tmpdepfile"
506  ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
507  rm -f "$depfile"
508  cat < "$tmpdepfile" > "$depfile"
509  sed '1,2d' "$tmpdepfile" | tr ' ' '
510' | \
511## Some versions of the HPUX 10.20 sed can't process this invocation
512## correctly.  Breaking it into two sed invocations is a workaround.
513    sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
514  rm -f "$tmpdepfile" "$tmpdepfile".bak
515  ;;
516
517cpp)
518  # Important note: in order to support this mode, a compiler *must*
519  # always write the preprocessed file to stdout.
520  "$@" || exit $?
521
522  # Remove the call to Libtool.
523  if test "$libtool" = yes; then
524    while test "X$1" != 'X--mode=compile'; do
525      shift
526    done
527    shift
528  fi
529
530  # Remove `-o $object'.
531  IFS=" "
532  for arg
533  do
534    case $arg in
535    -o)
536      shift
537      ;;
538    $object)
539      shift
540      ;;
541    *)
542      set fnord "$@" "$arg"
543      shift # fnord
544      shift # $arg
545      ;;
546    esac
547  done
548
549  "$@" -E |
550    sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
551       -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' |
552    sed '$ s: \\$::' > "$tmpdepfile"
553  rm -f "$depfile"
554  echo "$object : \\" > "$depfile"
555  cat < "$tmpdepfile" >> "$depfile"
556  sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
557  rm -f "$tmpdepfile"
558  ;;
559
560msvisualcpp)
561  # Important note: in order to support this mode, a compiler *must*
562  # always write the preprocessed file to stdout.
563  "$@" || exit $?
564
565  # Remove the call to Libtool.
566  if test "$libtool" = yes; then
567    while test "X$1" != 'X--mode=compile'; do
568      shift
569    done
570    shift
571  fi
572
573  IFS=" "
574  for arg
575  do
576    case "$arg" in
577    -o)
578      shift
579      ;;
580    $object)
581      shift
582      ;;
583    "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
584	set fnord "$@"
585	shift
586	shift
587	;;
588    *)
589	set fnord "$@" "$arg"
590	shift
591	shift
592	;;
593    esac
594  done
595  "$@" -E 2>/dev/null |
596  sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile"
597  rm -f "$depfile"
598  echo "$object : \\" > "$depfile"
599  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::	\1 \\:p' >> "$depfile"
600  echo "	" >> "$depfile"
601  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile"
602  rm -f "$tmpdepfile"
603  ;;
604
605msvcmsys)
606  # This case exists only to let depend.m4 do its work.  It works by
607  # looking at the text of this script.  This case will never be run,
608  # since it is checked for above.
609  exit 1
610  ;;
611
612none)
613  exec "$@"
614  ;;
615
616*)
617  echo "Unknown depmode $depmode" 1>&2
618  exit 1
619  ;;
620esac
621
622exit 0
623
624# Local Variables:
625# mode: shell-script
626# sh-indentation: 2
627# eval: (add-hook 'write-file-hooks 'time-stamp)
628# time-stamp-start: "scriptversion="
629# time-stamp-format: "%:y-%02m-%02d.%02H"
630# time-stamp-time-zone: "UTC"
631# time-stamp-end: "; # UTC"
632# End:
633