ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/utils/depcomp
Revision: 1.1
Committed: Fri Feb 3 07:14:47 2006 UTC (18 years, 3 months ago) by root
Branch: MAIN
Branch point for: UPSTREAM
Log Message:
Initial revision

File Contents

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