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