xref: /openbsd/gnu/usr.bin/cvs/depcomp (revision d415bd75)
1#! /bin/sh
2
3# depcomp - compile a program generating dependencies as side-effects
4# Copyright 1999, 2000 Free Software Foundation, Inc.
5
6# This program is free software; you can redistribute it and/or modify
7# it under the terms of the GNU General Public License as published by
8# the Free Software Foundation; either version 2, or (at your option)
9# any later version.
10
11# This program is distributed in the hope that it will be useful,
12# but WITHOUT ANY WARRANTY; without even the implied warranty of
13# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14# GNU General Public License for more details.
15
16# You should have received a copy of the GNU General Public License
17# along with this program; if not, write to the Free Software
18# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
19# 02111-1307, USA.
20
21# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>.
22
23if test -z "$depmode" || test -z "$source" || test -z "$object"; then
24  echo "depcomp: Variables source, object and depmode must be set" 1>&2
25  exit 1
26fi
27# `libtool' can also be set to `yes' or `no'.
28
29depfile=${depfile-`echo "$object" | sed 's,\([^/]*\)$,.deps/\1,;s/\.\([^.]*\)$/.P\1/'`}
30tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
31
32rm -f "$tmpdepfile"
33
34# Some modes work just like other modes, but use different flags.  We
35# parameterize here, but still list the modes in the big case below,
36# to make depend.m4 easier to write.  Note that we *cannot* use a case
37# here, because this file can only contain one case statement.
38if test "$depmode" = hp; then
39  # HP compiler uses -M and no extra arg.
40  gccflag=-M
41  depmode=gcc
42fi
43
44if test "$depmode" = dashXmstdout; then
45   # This is just like dashmstdout with a different argument.
46   dashmflag=-xM
47   depmode=dashmstdout
48fi
49
50case "$depmode" in
51gcc3)
52## gcc 3 implements dependency tracking that does exactly what
53## we want.  Yay!
54  "$@" -MT "$object" -MF "$tmpdepfile" -MD -MP
55  stat=$?
56  if test $stat -eq 0; then :
57  else
58    rm -f "$tmpdepfile"
59    exit $stat
60  fi
61  mv "$tmpdepfile" "$depfile"
62  ;;
63
64gcc)
65## There are various ways to get dependency output from gcc.  Here's
66## why we pick this rather obscure method:
67## - Don't want to use -MD because we'd like the dependencies to end
68##   up in a subdir.  Having to rename by hand is ugly.
69##   (We might end up doing this anyway to support other compilers.)
70## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
71##   -MM, not -M (despite what the docs say).
72## - Using -M directly means running the compiler twice (even worse
73##   than renaming).
74  if test -z "$gccflag"; then
75    gccflag=-MD,
76  fi
77  "$@" -Wp,"$gccflag$tmpdepfile"
78  stat=$?
79  if test $stat -eq 0; then :
80  else
81    rm -f "$tmpdepfile"
82    exit $stat
83  fi
84  rm -f "$depfile"
85  echo "$object : \\" > "$depfile"
86  alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
87## The second -e expression handles DOS-style file names with drive letters.
88  sed -e 's/^[^:]*: / /' \
89      -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
90## This next piece of magic avoids the `deleted header file' problem.
91## The problem is that when a header file which appears in a .P file
92## is deleted, the dependency causes make to die (because there is
93## typically no way to rebuild the header).  We avoid this by adding
94## dummy dependencies for each header file.  Too bad gcc doesn't do
95## this for us directly.
96  tr ' ' '
97' < "$tmpdepfile" |
98## Some versions of gcc put a space before the `:'.  On the theory
99## that the space means something, we add a space to the output as
100## well.
101## Some versions of the HPUX 10.20 sed can't process this invocation
102## correctly.  Breaking it into two sed invocations is a workaround.
103    sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
104  rm -f "$tmpdepfile"
105  ;;
106
107hp)
108  # This case exists only to let depend.m4 do its work.  It works by
109  # looking at the text of this script.  This case will never be run,
110  # since it is checked for above.
111  exit 1
112  ;;
113
114sgi)
115  if test "$libtool" = yes; then
116    "$@" "-Wp,-MDupdate,$tmpdepfile"
117  else
118    "$@" -MDupdate "$tmpdepfile"
119  fi
120  stat=$?
121  if test $stat -eq 0; then :
122  else
123    rm -f "$tmpdepfile"
124    exit $stat
125  fi
126
127  if test -f "$tmpdepfile"; then  # yes, the sourcefile depend on other files
128    rm -f "$depfile"
129    cp "$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.
135    tr ' ' '
136' < "$tmpdepfile" | \
137      sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' -e '/^#/d' | sed -e 's/$/ :/' >> "$depfile"
138  else
139    # The sourcefile does not contain any dependencies, so just
140    # store a dummy comment line, to avoid errors with the Makefile
141    # "include basename.Plo" scheme.
142    echo "#dummy" > "$depfile"
143  fi
144  rm -f "$tmpdepfile"
145  ;;
146
147aix)
148  # The C for AIX Compiler uses -M and outputs the dependencies
149  # in a .u file.
150  tmpdepfile=`echo "$object" | sed 's/\(.*\)\..*$/\1.u/'`
151  if test "$libtool" = yes; then
152    "$@" -Wc,-M
153  else
154    "$@" -M
155  fi
156
157  stat=$?
158  if test $stat -eq 0; then :
159  else
160    rm -f "$tmpdepfile"
161    exit $stat
162  fi
163
164  if test -f "$tmpdepfile"; then
165    rm -f "$depfile"
166    cp "$tmpdepfile" "$depfile"
167## This next piece of magic avoids the `deleted header file' problem.
168## The problem is that when a header file which appears in a .P file
169## is deleted, the dependency causes make to die (because there is
170## typically no way to rebuild the header).  We avoid this by adding
171## dummy dependencies for each header file.
172    tr ' ' '
173' < "$tmpdepfile" | \
174      sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
175  else
176    # The sourcefile does not contain any dependencies, so just
177    # store a dummy comment line, to avoid errors with the Makefile
178    # "include basename.Plo" scheme.
179    echo "#dummy" > "$depfile"
180  fi
181  rm -f "$tmpdepfile"
182  ;;
183
184#nosideeffect)
185  # This comment above is used by automake to tell side-effect
186  # dependency tracking mechanisms from slower ones.
187
188dashmstdout)
189  # Important note: in order to support this mode, a compiler *must*
190  # always write the proprocessed file to stdout, regardless of -o,
191  # because we must use -o when running libtool.
192  test -z "$dashmflag" && dashmflag=-M
193  ( IFS=" "
194    case " $* " in
195    *" --mode=compile "*) # this is libtool, let us make it quiet
196      for arg
197      do # cycle over the arguments
198        case "$arg" in
199	"--mode=compile")
200	  # insert --quiet before "--mode=compile"
201	  set fnord "$@" --quiet
202	  shift # fnord
203	  ;;
204	esac
205	set fnord "$@" "$arg"
206	shift # fnord
207	shift # "$arg"
208      done
209      ;;
210    esac
211    "$@" $dashmflag | sed 's:^[^:]*\:[ 	]*:'"$object"'\: :' > "$tmpdepfile"
212  ) &
213  proc=$!
214  "$@"
215  stat=$?
216  wait "$proc"
217  if test "$stat" != 0; then exit $stat; fi
218  rm -f "$depfile"
219  cat < "$tmpdepfile" > "$depfile"
220  tr ' ' '
221' < "$tmpdepfile" | \
222## Some versions of the HPUX 10.20 sed can't process this invocation
223## correctly.  Breaking it into two sed invocations is a workaround.
224    sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
225  rm -f "$tmpdepfile"
226  ;;
227
228dashXmstdout)
229  # This case only exists to satisfy depend.m4.  It is never actually
230  # run, as this mode is specially recognized in the preamble.
231  exit 1
232  ;;
233
234makedepend)
235  # X makedepend
236  (
237    shift
238    cleared=no
239    for arg in "$@"; do
240      case $cleared in no)
241        set ""; shift
242	cleared=yes
243      esac
244      case "$arg" in
245        -D*|-I*)
246	  set fnord "$@" "$arg"; shift;;
247	-*)
248	  ;;
249	*)
250	  set fnord "$@" "$arg"; shift;;
251      esac
252    done
253    obj_suffix="`echo $object | sed 's/^.*\././'`"
254    touch "$tmpdepfile"
255    ${MAKEDEPEND-makedepend} 2>/dev/null -o"$obj_suffix" -f"$tmpdepfile" "$@"
256  ) &
257  proc=$!
258  "$@"
259  stat=$?
260  wait "$proc"
261  if test "$stat" != 0; then exit $stat; fi
262  rm -f "$depfile"
263  cat < "$tmpdepfile" > "$depfile"
264  tail +3 "$tmpdepfile" | tr ' ' '
265' | \
266## Some versions of the HPUX 10.20 sed can't process this invocation
267## correctly.  Breaking it into two sed invocations is a workaround.
268    sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
269  rm -f "$tmpdepfile" "$tmpdepfile".bak
270  ;;
271
272cpp)
273  # Important note: in order to support this mode, a compiler *must*
274  # always write the proprocessed file to stdout, regardless of -o,
275  # because we must use -o when running libtool.
276  ( IFS=" "
277    case " $* " in
278    *" --mode=compile "*)
279      for arg
280      do # cycle over the arguments
281        case $arg in
282	"--mode=compile")
283	  # insert --quiet before "--mode=compile"
284	  set fnord "$@" --quiet
285	  shift # fnord
286	  ;;
287	esac
288	set fnord "$@" "$arg"
289	shift # fnord
290	shift # "$arg"
291      done
292      ;;
293    esac
294    "$@" -E |
295    sed -n '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' |
296    sed '$ s: \\$::' > "$tmpdepfile"
297  ) &
298  proc=$!
299  "$@"
300  stat=$?
301  wait "$proc"
302  if test "$stat" != 0; then exit $stat; fi
303  rm -f "$depfile"
304  echo "$object : \\" > "$depfile"
305  cat < "$tmpdepfile" >> "$depfile"
306  sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
307  rm -f "$tmpdepfile"
308  ;;
309
310msvisualcpp)
311  # Important note: in order to support this mode, a compiler *must*
312  # always write the proprocessed file to stdout, regardless of -o,
313  # because we must use -o when running libtool.
314  ( IFS=" "
315    case " $* " in
316    *" --mode=compile "*)
317      for arg
318      do # cycle over the arguments
319        case $arg in
320	"--mode=compile")
321	  # insert --quiet before "--mode=compile"
322	  set fnord "$@" --quiet
323	  shift # fnord
324	  ;;
325	esac
326	set fnord "$@" "$arg"
327	shift # fnord
328	shift # "$arg"
329      done
330      ;;
331    esac
332    "$@" -E |
333    sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::echo "`cygpath -u \\"\1\\"`":p' | sort | uniq > "$tmpdepfile"
334  ) &
335  proc=$!
336  "$@"
337  stat=$?
338  wait "$proc"
339  if test "$stat" != 0; then exit $stat; fi
340  rm -f "$depfile"
341  echo "$object : \\" > "$depfile"
342  . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::	\1 \\:p' >> "$depfile"
343  echo "	" >> "$depfile"
344  . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::\1\::p' >> "$depfile"
345  rm -f "$tmpdepfile"
346  ;;
347
348none)
349  exec "$@"
350  ;;
351
352*)
353  echo "Unknown depmode $depmode" 1>&2
354  exit 1
355  ;;
356esac
357
358exit 0
359