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