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