Merge branch 'deprecate-lzma' into maint
[platform/upstream/automake.git] / lib / depcomp
1 #! /bin/sh
2 # depcomp - compile a program generating dependencies as side-effects
3
4 scriptversion=2011-12-04.11; # UTC
5
6 # Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007, 2009, 2011,
7 # Free 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 outputting 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.  hp depmode also adds that space, but also prefixes the VPATH
162 ## to the object.  Take care to not repeat it in the output.
163 ## Some versions of the HPUX 10.20 sed can't process this invocation
164 ## correctly.  Breaking it into two sed invocations is a workaround.
165     sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \
166       | sed -e 's/$/ :/' >> "$depfile"
167   rm -f "$tmpdepfile"
168   ;;
169
170 hp)
171   # This case exists only to let depend.m4 do its work.  It works by
172   # looking at the text of this script.  This case will never be run,
173   # since it is checked for above.
174   exit 1
175   ;;
176
177 sgi)
178   if test "$libtool" = yes; then
179     "$@" "-Wp,-MDupdate,$tmpdepfile"
180   else
181     "$@" -MDupdate "$tmpdepfile"
182   fi
183   stat=$?
184   if test $stat -eq 0; then :
185   else
186     rm -f "$tmpdepfile"
187     exit $stat
188   fi
189   rm -f "$depfile"
190
191   if test -f "$tmpdepfile"; then  # yes, the sourcefile depend on other files
192     echo "$object : \\" > "$depfile"
193
194     # Clip off the initial element (the dependent).  Don't try to be
195     # clever and replace this with sed code, as IRIX sed won't handle
196     # lines with more than a fixed number of characters (4096 in
197     # IRIX 6.2 sed, 8192 in IRIX 6.5).  We also remove comment lines;
198     # the IRIX cc adds comments like `#:fec' to the end of the
199     # dependency line.
200     tr ' ' '
201 ' < "$tmpdepfile" \
202     | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \
203     tr '
204 ' ' ' >> "$depfile"
205     echo >> "$depfile"
206
207     # The second pass generates a dummy entry for each header file.
208     tr ' ' '
209 ' < "$tmpdepfile" \
210    | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
211    >> "$depfile"
212   else
213     # The sourcefile does not contain any dependencies, so just
214     # store a dummy comment line, to avoid errors with the Makefile
215     # "include basename.Plo" scheme.
216     echo "#dummy" > "$depfile"
217   fi
218   rm -f "$tmpdepfile"
219   ;;
220
221 aix)
222   # The C for AIX Compiler uses -M and outputs the dependencies
223   # in a .u file.  In older versions, this file always lives in the
224   # current directory.  Also, the AIX compiler puts `$object:' at the
225   # start of each line; $object doesn't have directory information.
226   # Version 6 uses the directory in both cases.
227   dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
228   test "x$dir" = "x$object" && dir=
229   base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
230   if test "$libtool" = yes; then
231     tmpdepfile1=$dir$base.u
232     tmpdepfile2=$base.u
233     tmpdepfile3=$dir.libs/$base.u
234     "$@" -Wc,-M
235   else
236     tmpdepfile1=$dir$base.u
237     tmpdepfile2=$dir$base.u
238     tmpdepfile3=$dir$base.u
239     "$@" -M
240   fi
241   stat=$?
242
243   if test $stat -eq 0; then :
244   else
245     rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
246     exit $stat
247   fi
248
249   for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
250   do
251     test -f "$tmpdepfile" && break
252   done
253   if test -f "$tmpdepfile"; then
254     # Each line is of the form `foo.o: dependent.h'.
255     # Do two passes, one to just change these to
256     # `$object: dependent.h' and one to simply `dependent.h:'.
257     sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
258     # That's a tab and a space in the [].
259     sed -e 's,^.*\.[a-z]*:[      ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
260   else
261     # The sourcefile does not contain any dependencies, so just
262     # store a dummy comment line, to avoid errors with the Makefile
263     # "include basename.Plo" scheme.
264     echo "#dummy" > "$depfile"
265   fi
266   rm -f "$tmpdepfile"
267   ;;
268
269 icc)
270   # Intel's C compiler understands `-MD -MF file'.  However on
271   #    icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c
272   # ICC 7.0 will fill foo.d with something like
273   #    foo.o: sub/foo.c
274   #    foo.o: sub/foo.h
275   # which is wrong.  We want:
276   #    sub/foo.o: sub/foo.c
277   #    sub/foo.o: sub/foo.h
278   #    sub/foo.c:
279   #    sub/foo.h:
280   # ICC 7.1 will output
281   #    foo.o: sub/foo.c sub/foo.h
282   # and will wrap long lines using \ :
283   #    foo.o: sub/foo.c ... \
284   #     sub/foo.h ... \
285   #     ...
286
287   "$@" -MD -MF "$tmpdepfile"
288   stat=$?
289   if test $stat -eq 0; then :
290   else
291     rm -f "$tmpdepfile"
292     exit $stat
293   fi
294   rm -f "$depfile"
295   # Each line is of the form `foo.o: dependent.h',
296   # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'.
297   # Do two passes, one to just change these to
298   # `$object: dependent.h' and one to simply `dependent.h:'.
299   sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
300   # Some versions of the HPUX 10.20 sed can't process this invocation
301   # correctly.  Breaking it into two sed invocations is a workaround.
302   sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" |
303     sed -e 's/$/ :/' >> "$depfile"
304   rm -f "$tmpdepfile"
305   ;;
306
307 hp2)
308   # The "hp" stanza above does not work with aCC (C++) and HP's ia64
309   # compilers, which have integrated preprocessors.  The correct option
310   # to use with these is +Maked; it writes dependencies to a file named
311   # 'foo.d', which lands next to the object file, wherever that
312   # happens to be.
313   # Much of this is similar to the tru64 case; see comments there.
314   dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
315   test "x$dir" = "x$object" && dir=
316   base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
317   if test "$libtool" = yes; then
318     tmpdepfile1=$dir$base.d
319     tmpdepfile2=$dir.libs/$base.d
320     "$@" -Wc,+Maked
321   else
322     tmpdepfile1=$dir$base.d
323     tmpdepfile2=$dir$base.d
324     "$@" +Maked
325   fi
326   stat=$?
327   if test $stat -eq 0; then :
328   else
329      rm -f "$tmpdepfile1" "$tmpdepfile2"
330      exit $stat
331   fi
332
333   for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2"
334   do
335     test -f "$tmpdepfile" && break
336   done
337   if test -f "$tmpdepfile"; then
338     sed -e "s,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile"
339     # Add `dependent.h:' lines.
340     sed -ne '2,${
341                s/^ *//
342                s/ \\*$//
343                s/$/:/
344                p
345              }' "$tmpdepfile" >> "$depfile"
346   else
347     echo "#dummy" > "$depfile"
348   fi
349   rm -f "$tmpdepfile" "$tmpdepfile2"
350   ;;
351
352 tru64)
353    # The Tru64 compiler uses -MD to generate dependencies as a side
354    # effect.  `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'.
355    # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
356    # dependencies in `foo.d' instead, so we check for that too.
357    # Subdirectories are respected.
358    dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
359    test "x$dir" = "x$object" && dir=
360    base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
361
362    if test "$libtool" = yes; then
363       # With Tru64 cc, shared objects can also be used to make a
364       # static library.  This mechanism is used in libtool 1.4 series to
365       # handle both shared and static libraries in a single compilation.
366       # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d.
367       #
368       # With libtool 1.5 this exception was removed, and libtool now
369       # generates 2 separate objects for the 2 libraries.  These two
370       # compilations output dependencies in $dir.libs/$base.o.d and
371       # in $dir$base.o.d.  We have to check for both files, because
372       # one of the two compilations can be disabled.  We should prefer
373       # $dir$base.o.d over $dir.libs/$base.o.d because the latter is
374       # automatically cleaned when .libs/ is deleted, while ignoring
375       # the former would cause a distcleancheck panic.
376       tmpdepfile1=$dir.libs/$base.lo.d   # libtool 1.4
377       tmpdepfile2=$dir$base.o.d          # libtool 1.5
378       tmpdepfile3=$dir.libs/$base.o.d    # libtool 1.5
379       tmpdepfile4=$dir.libs/$base.d      # Compaq CCC V6.2-504
380       "$@" -Wc,-MD
381    else
382       tmpdepfile1=$dir$base.o.d
383       tmpdepfile2=$dir$base.d
384       tmpdepfile3=$dir$base.d
385       tmpdepfile4=$dir$base.d
386       "$@" -MD
387    fi
388
389    stat=$?
390    if test $stat -eq 0; then :
391    else
392       rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
393       exit $stat
394    fi
395
396    for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
397    do
398      test -f "$tmpdepfile" && break
399    done
400    if test -f "$tmpdepfile"; then
401       sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
402       # That's a tab and a space in the [].
403       sed -e 's,^.*\.[a-z]*:[    ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
404    else
405       echo "#dummy" > "$depfile"
406    fi
407    rm -f "$tmpdepfile"
408    ;;
409
410 #nosideeffect)
411   # This comment above is used by automake to tell side-effect
412   # dependency tracking mechanisms from slower ones.
413
414 dashmstdout)
415   # Important note: in order to support this mode, a compiler *must*
416   # always write the preprocessed file to stdout, regardless of -o.
417   "$@" || exit $?
418
419   # Remove the call to Libtool.
420   if test "$libtool" = yes; then
421     while test "X$1" != 'X--mode=compile'; do
422       shift
423     done
424     shift
425   fi
426
427   # Remove `-o $object'.
428   IFS=" "
429   for arg
430   do
431     case $arg in
432     -o)
433       shift
434       ;;
435     $object)
436       shift
437       ;;
438     *)
439       set fnord "$@" "$arg"
440       shift # fnord
441       shift # $arg
442       ;;
443     esac
444   done
445
446   test -z "$dashmflag" && dashmflag=-M
447   # Require at least two characters before searching for `:'
448   # in the target name.  This is to cope with DOS-style filenames:
449   # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise.
450   "$@" $dashmflag |
451     sed 's:^[  ]*[^: ][^:][^:]*\:[    ]*:'"$object"'\: :' > "$tmpdepfile"
452   rm -f "$depfile"
453   cat < "$tmpdepfile" > "$depfile"
454   tr ' ' '
455 ' < "$tmpdepfile" | \
456 ## Some versions of the HPUX 10.20 sed can't process this invocation
457 ## correctly.  Breaking it into two sed invocations is a workaround.
458     sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
459   rm -f "$tmpdepfile"
460   ;;
461
462 dashXmstdout)
463   # This case only exists to satisfy depend.m4.  It is never actually
464   # run, as this mode is specially recognized in the preamble.
465   exit 1
466   ;;
467
468 makedepend)
469   "$@" || exit $?
470   # Remove any Libtool call
471   if test "$libtool" = yes; then
472     while test "X$1" != 'X--mode=compile'; do
473       shift
474     done
475     shift
476   fi
477   # X makedepend
478   shift
479   cleared=no eat=no
480   for arg
481   do
482     case $cleared in
483     no)
484       set ""; shift
485       cleared=yes ;;
486     esac
487     if test $eat = yes; then
488       eat=no
489       continue
490     fi
491     case "$arg" in
492     -D*|-I*)
493       set fnord "$@" "$arg"; shift ;;
494     # Strip any option that makedepend may not understand.  Remove
495     # the object too, otherwise makedepend will parse it as a source file.
496     -arch)
497       eat=yes ;;
498     -*|$object)
499       ;;
500     *)
501       set fnord "$@" "$arg"; shift ;;
502     esac
503   done
504   obj_suffix=`echo "$object" | sed 's/^.*\././'`
505   touch "$tmpdepfile"
506   ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
507   rm -f "$depfile"
508   # makedepend may prepend the VPATH from the source file name to the object.
509   # No need to regex-escape $object, excess matching of '.' is harmless.
510   sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile"
511   sed '1,2d' "$tmpdepfile" | tr ' ' '
512 ' | \
513 ## Some versions of the HPUX 10.20 sed can't process this invocation
514 ## correctly.  Breaking it into two sed invocations is a workaround.
515     sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
516   rm -f "$tmpdepfile" "$tmpdepfile".bak
517   ;;
518
519 cpp)
520   # Important note: in order to support this mode, a compiler *must*
521   # always write the preprocessed file to stdout.
522   "$@" || exit $?
523
524   # Remove the call to Libtool.
525   if test "$libtool" = yes; then
526     while test "X$1" != 'X--mode=compile'; do
527       shift
528     done
529     shift
530   fi
531
532   # Remove `-o $object'.
533   IFS=" "
534   for arg
535   do
536     case $arg in
537     -o)
538       shift
539       ;;
540     $object)
541       shift
542       ;;
543     *)
544       set fnord "$@" "$arg"
545       shift # fnord
546       shift # $arg
547       ;;
548     esac
549   done
550
551   "$@" -E |
552     sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
553        -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' |
554     sed '$ s: \\$::' > "$tmpdepfile"
555   rm -f "$depfile"
556   echo "$object : \\" > "$depfile"
557   cat < "$tmpdepfile" >> "$depfile"
558   sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
559   rm -f "$tmpdepfile"
560   ;;
561
562 msvisualcpp)
563   # Important note: in order to support this mode, a compiler *must*
564   # always write the preprocessed file to stdout.
565   "$@" || exit $?
566
567   # Remove the call to Libtool.
568   if test "$libtool" = yes; then
569     while test "X$1" != 'X--mode=compile'; do
570       shift
571     done
572     shift
573   fi
574
575   IFS=" "
576   for arg
577   do
578     case "$arg" in
579     -o)
580       shift
581       ;;
582     $object)
583       shift
584       ;;
585     "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
586         set fnord "$@"
587         shift
588         shift
589         ;;
590     *)
591         set fnord "$@" "$arg"
592         shift
593         shift
594         ;;
595     esac
596   done
597   "$@" -E 2>/dev/null |
598   sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile"
599   rm -f "$depfile"
600   echo "$object : \\" > "$depfile"
601   sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::      \1 \\:p' >> "$depfile"
602   echo "        " >> "$depfile"
603   sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile"
604   rm -f "$tmpdepfile"
605   ;;
606
607 msvcmsys)
608   # This case exists only to let depend.m4 do its work.  It works by
609   # looking at the text of this script.  This case will never be run,
610   # since it is checked for above.
611   exit 1
612   ;;
613
614 none)
615   exec "$@"
616   ;;
617
618 *)
619   echo "Unknown depmode $depmode" 1>&2
620   exit 1
621   ;;
622 esac
623
624 exit 0
625
626 # Local Variables:
627 # mode: shell-script
628 # sh-indentation: 2
629 # eval: (add-hook 'write-file-hooks 'time-stamp)
630 # time-stamp-start: "scriptversion="
631 # time-stamp-format: "%:y-%02m-%02d.%02H"
632 # time-stamp-time-zone: "UTC"
633 # time-stamp-end: "; # UTC"
634 # End: