build-aux/depcomp: restore lost x bit
[gnulib.git] / build-aux / depcomp
1 #! /bin/sh
2 # depcomp - compile a program generating dependencies as side-effects
3
4 scriptversion=2009-03-03.11
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 3, 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,${; s/^ *//; s/ \\*$//; s/$/:/; p;}' "$tmpdepfile" >> "$depfile"
339   else
340     echo "#dummy" > "$depfile"
341   fi
342   rm -f "$tmpdepfile" "$tmpdepfile2"
343   ;;
344
345 tru64)
346    # The Tru64 compiler uses -MD to generate dependencies as a side
347    # effect.  `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'.
348    # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
349    # dependencies in `foo.d' instead, so we check for that too.
350    # Subdirectories are respected.
351    dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
352    test "x$dir" = "x$object" && dir=
353    base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
354
355    if test "$libtool" = yes; then
356       # With Tru64 cc, shared objects can also be used to make a
357       # static library.  This mechanism is used in libtool 1.4 series to
358       # handle both shared and static libraries in a single compilation.
359       # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d.
360       #
361       # With libtool 1.5 this exception was removed, and libtool now
362       # generates 2 separate objects for the 2 libraries.  These two
363       # compilations output dependencies in $dir.libs/$base.o.d and
364       # in $dir$base.o.d.  We have to check for both files, because
365       # one of the two compilations can be disabled.  We should prefer
366       # $dir$base.o.d over $dir.libs/$base.o.d because the latter is
367       # automatically cleaned when .libs/ is deleted, while ignoring
368       # the former would cause a distcleancheck panic.
369       tmpdepfile1=$dir.libs/$base.lo.d   # libtool 1.4
370       tmpdepfile2=$dir$base.o.d          # libtool 1.5
371       tmpdepfile3=$dir.libs/$base.o.d    # libtool 1.5
372       tmpdepfile4=$dir.libs/$base.d      # Compaq CCC V6.2-504
373       "$@" -Wc,-MD
374    else
375       tmpdepfile1=$dir$base.o.d
376       tmpdepfile2=$dir$base.d
377       tmpdepfile3=$dir$base.d
378       tmpdepfile4=$dir$base.d
379       "$@" -MD
380    fi
381
382    stat=$?
383    if test $stat -eq 0; then :
384    else
385       rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
386       exit $stat
387    fi
388
389    for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
390    do
391      test -f "$tmpdepfile" && break
392    done
393    if test -f "$tmpdepfile"; then
394       sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
395       # That's a tab and a space in the [].
396       sed -e 's,^.*\.[a-z]*:[    ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
397    else
398       echo "#dummy" > "$depfile"
399    fi
400    rm -f "$tmpdepfile"
401    ;;
402
403 #nosideeffect)
404   # This comment above is used by automake to tell side-effect
405   # dependency tracking mechanisms from slower ones.
406
407 dashmstdout)
408   # Important note: in order to support this mode, a compiler *must*
409   # always write the preprocessed file to stdout, regardless of -o.
410   "$@" || exit $?
411
412   # Remove the call to Libtool.
413   if test "$libtool" = yes; then
414     while test $1 != '--mode=compile'; do
415       shift
416     done
417     shift
418   fi
419
420   # Remove `-o $object'.
421   IFS=" "
422   for arg
423   do
424     case $arg in
425     -o)
426       shift
427       ;;
428     $object)
429       shift
430       ;;
431     *)
432       set fnord "$@" "$arg"
433       shift # fnord
434       shift # $arg
435       ;;
436     esac
437   done
438
439   test -z "$dashmflag" && dashmflag=-M
440   # Require at least two characters before searching for `:'
441   # in the target name.  This is to cope with DOS-style filenames:
442   # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise.
443   "$@" $dashmflag |
444     sed 's:^[  ]*[^: ][^:][^:]*\:[    ]*:'"$object"'\: :' > "$tmpdepfile"
445   rm -f "$depfile"
446   cat < "$tmpdepfile" > "$depfile"
447   tr ' ' '
448 ' < "$tmpdepfile" | \
449 ## Some versions of the HPUX 10.20 sed can't process this invocation
450 ## correctly.  Breaking it into two sed invocations is a workaround.
451     sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
452   rm -f "$tmpdepfile"
453   ;;
454
455 dashXmstdout)
456   # This case only exists to satisfy depend.m4.  It is never actually
457   # run, as this mode is specially recognized in the preamble.
458   exit 1
459   ;;
460
461 makedepend)
462   "$@" || exit $?
463   # Remove any Libtool call
464   if test "$libtool" = yes; then
465     while test $1 != '--mode=compile'; do
466       shift
467     done
468     shift
469   fi
470   # X makedepend
471   shift
472   cleared=no
473   for arg in "$@"; do
474     case $cleared in
475     no)
476       set ""; shift
477       cleared=yes ;;
478     esac
479     case "$arg" in
480     -D*|-I*)
481       set fnord "$@" "$arg"; shift ;;
482     # Strip any option that makedepend may not understand.  Remove
483     # the object too, otherwise makedepend will parse it as a source file.
484     -*|$object)
485       ;;
486     *)
487       set fnord "$@" "$arg"; shift ;;
488     esac
489   done
490   obj_suffix="`echo $object | sed 's/^.*\././'`"
491   touch "$tmpdepfile"
492   ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
493   rm -f "$depfile"
494   cat < "$tmpdepfile" > "$depfile"
495   sed '1,2d' "$tmpdepfile" | tr ' ' '
496 ' | \
497 ## Some versions of the HPUX 10.20 sed can't process this invocation
498 ## correctly.  Breaking it into two sed invocations is a workaround.
499     sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
500   rm -f "$tmpdepfile" "$tmpdepfile".bak
501   ;;
502
503 cpp)
504   # Important note: in order to support this mode, a compiler *must*
505   # always write the preprocessed file to stdout.
506   "$@" || exit $?
507
508   # Remove the call to Libtool.
509   if test "$libtool" = yes; then
510     while test $1 != '--mode=compile'; do
511       shift
512     done
513     shift
514   fi
515
516   # Remove `-o $object'.
517   IFS=" "
518   for arg
519   do
520     case $arg in
521     -o)
522       shift
523       ;;
524     $object)
525       shift
526       ;;
527     *)
528       set fnord "$@" "$arg"
529       shift # fnord
530       shift # $arg
531       ;;
532     esac
533   done
534
535   "$@" -E |
536     sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
537        -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' |
538     sed '$ s: \\$::' > "$tmpdepfile"
539   rm -f "$depfile"
540   echo "$object : \\" > "$depfile"
541   cat < "$tmpdepfile" >> "$depfile"
542   sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
543   rm -f "$tmpdepfile"
544   ;;
545
546 msvisualcpp)
547   # Important note: in order to support this mode, a compiler *must*
548   # always write the preprocessed file to stdout.
549   "$@" || exit $?
550
551   # Remove the call to Libtool.
552   if test "$libtool" = yes; then
553     while test $1 != '--mode=compile'; do
554       shift
555     done
556     shift
557   fi
558
559   IFS=" "
560   for arg
561   do
562     case "$arg" in
563     -o)
564       shift
565       ;;
566     $object)
567       shift
568       ;;
569     "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
570         set fnord "$@"
571         shift
572         shift
573         ;;
574     *)
575         set fnord "$@" "$arg"
576         shift
577         shift
578         ;;
579     esac
580   done
581   "$@" -E 2>/dev/null |
582   sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile"
583   rm -f "$depfile"
584   echo "$object : \\" > "$depfile"
585   sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::      \1 \\:p' >> "$depfile"
586   echo "        " >> "$depfile"
587   sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile"
588   rm -f "$tmpdepfile"
589   ;;
590
591 msvcmsys)
592   # This case exists only to let depend.m4 do its work.  It works by
593   # looking at the text of this script.  This case will never be run,
594   # since it is checked for above.
595   exit 1
596   ;;
597
598 none)
599   exec "$@"
600   ;;
601
602 *)
603   echo "Unknown depmode $depmode" 1>&2
604   exit 1
605   ;;
606 esac
607
608 exit 0
609
610 # Local Variables:
611 # mode: shell-script
612 # sh-indentation: 2
613 # eval: (add-hook 'write-file-hooks 'time-stamp)
614 # time-stamp-start: "scriptversion="
615 # time-stamp-format: "%:y-%02m-%02d.%02H"
616 # time-stamp-end: "$"
617 # End: