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