*** empty log message ***
[external/binutils.git] / 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: