xref: /freebsd/contrib/lutok/admin/depcomp (revision 132f818ddbf457ee67d502cd89b5a18e0a34713d)
1*132f818dSEnji Cooper#! /bin/sh
2*132f818dSEnji Cooper# depcomp - compile a program generating dependencies as side-effects
3*132f818dSEnji Cooper
4*132f818dSEnji Cooperscriptversion=2024-06-19.01; # UTC
5*132f818dSEnji Cooper
6*132f818dSEnji Cooper# Copyright (C) 1999-2024 Free Software Foundation, Inc.
7*132f818dSEnji Cooper
8*132f818dSEnji Cooper# This program is free software; you can redistribute it and/or modify
9*132f818dSEnji Cooper# it under the terms of the GNU General Public License as published by
10*132f818dSEnji Cooper# the Free Software Foundation; either version 2, or (at your option)
11*132f818dSEnji Cooper# any later version.
12*132f818dSEnji Cooper
13*132f818dSEnji Cooper# This program is distributed in the hope that it will be useful,
14*132f818dSEnji Cooper# but WITHOUT ANY WARRANTY; without even the implied warranty of
15*132f818dSEnji Cooper# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16*132f818dSEnji Cooper# GNU General Public License for more details.
17*132f818dSEnji Cooper
18*132f818dSEnji Cooper# You should have received a copy of the GNU General Public License
19*132f818dSEnji Cooper# along with this program.  If not, see <https://www.gnu.org/licenses/>.
20*132f818dSEnji Cooper
21*132f818dSEnji Cooper# As a special exception to the GNU General Public License, if you
22*132f818dSEnji Cooper# distribute this file as part of a program that contains a
23*132f818dSEnji Cooper# configuration script generated by Autoconf, you may include it under
24*132f818dSEnji Cooper# the same distribution terms that you use for the rest of that program.
25*132f818dSEnji Cooper
26*132f818dSEnji Cooper# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>.
27*132f818dSEnji Cooper
28*132f818dSEnji Coopercase $1 in
29*132f818dSEnji Cooper  '')
30*132f818dSEnji Cooper    echo "$0: No command.  Try '$0 --help' for more information." 1>&2
31*132f818dSEnji Cooper    exit 1;
32*132f818dSEnji Cooper    ;;
33*132f818dSEnji Cooper  -h | --h*)
34*132f818dSEnji Cooper    cat <<\EOF
35*132f818dSEnji CooperUsage: depcomp [--help] [--version] PROGRAM [ARGS]
36*132f818dSEnji Cooper
37*132f818dSEnji CooperRun PROGRAMS ARGS to compile a file, generating dependencies
38*132f818dSEnji Cooperas side-effects.
39*132f818dSEnji Cooper
40*132f818dSEnji CooperEnvironment variables:
41*132f818dSEnji Cooper  depmode     Dependency tracking mode.
42*132f818dSEnji Cooper  source      Source file read by 'PROGRAMS ARGS'.
43*132f818dSEnji Cooper  object      Object file output by 'PROGRAMS ARGS'.
44*132f818dSEnji Cooper  DEPDIR      directory where to store dependencies.
45*132f818dSEnji Cooper  depfile     Dependency file to output.
46*132f818dSEnji Cooper  tmpdepfile  Temporary file to use when outputting dependencies.
47*132f818dSEnji Cooper  libtool     Whether libtool is used (yes/no).
48*132f818dSEnji Cooper
49*132f818dSEnji CooperReport bugs to <bug-automake@gnu.org>.
50*132f818dSEnji CooperGNU Automake home page: <https://www.gnu.org/software/automake/>.
51*132f818dSEnji CooperGeneral help using GNU software: <https://www.gnu.org/gethelp/>.
52*132f818dSEnji CooperEOF
53*132f818dSEnji Cooper    exit $?
54*132f818dSEnji Cooper    ;;
55*132f818dSEnji Cooper  -v | --v*)
56*132f818dSEnji Cooper    echo "depcomp (GNU Automake) $scriptversion"
57*132f818dSEnji Cooper    exit $?
58*132f818dSEnji Cooper    ;;
59*132f818dSEnji Cooperesac
60*132f818dSEnji Cooper
61*132f818dSEnji Cooper# Get the directory component of the given path, and save it in the
62*132f818dSEnji Cooper# global variables '$dir'.  Note that this directory component will
63*132f818dSEnji Cooper# be either empty or ending with a '/' character.  This is deliberate.
64*132f818dSEnji Cooperset_dir_from ()
65*132f818dSEnji Cooper{
66*132f818dSEnji Cooper  case $1 in
67*132f818dSEnji Cooper    */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;;
68*132f818dSEnji Cooper      *) dir=;;
69*132f818dSEnji Cooper  esac
70*132f818dSEnji Cooper}
71*132f818dSEnji Cooper
72*132f818dSEnji Cooper# Get the suffix-stripped basename of the given path, and save it the
73*132f818dSEnji Cooper# global variable '$base'.
74*132f818dSEnji Cooperset_base_from ()
75*132f818dSEnji Cooper{
76*132f818dSEnji Cooper  base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'`
77*132f818dSEnji Cooper}
78*132f818dSEnji Cooper
79*132f818dSEnji Cooper# If no dependency file was actually created by the compiler invocation,
80*132f818dSEnji Cooper# we still have to create a dummy depfile, to avoid errors with the
81*132f818dSEnji Cooper# Makefile "include basename.Plo" scheme.
82*132f818dSEnji Coopermake_dummy_depfile ()
83*132f818dSEnji Cooper{
84*132f818dSEnji Cooper  echo "#dummy" > "$depfile"
85*132f818dSEnji Cooper}
86*132f818dSEnji Cooper
87*132f818dSEnji Cooper# Factor out some common post-processing of the generated depfile.
88*132f818dSEnji Cooper# Requires the auxiliary global variable '$tmpdepfile' to be set.
89*132f818dSEnji Cooperaix_post_process_depfile ()
90*132f818dSEnji Cooper{
91*132f818dSEnji Cooper  # If the compiler actually managed to produce a dependency file,
92*132f818dSEnji Cooper  # post-process it.
93*132f818dSEnji Cooper  if test -f "$tmpdepfile"; then
94*132f818dSEnji Cooper    # Each line is of the form 'foo.o: dependency.h'.
95*132f818dSEnji Cooper    # Do two passes, one to just change these to
96*132f818dSEnji Cooper    #   $object: dependency.h
97*132f818dSEnji Cooper    # and one to simply output
98*132f818dSEnji Cooper    #   dependency.h:
99*132f818dSEnji Cooper    # which is needed to avoid the deleted-header problem.
100*132f818dSEnji Cooper    { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile"
101*132f818dSEnji Cooper      sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile"
102*132f818dSEnji Cooper    } > "$depfile"
103*132f818dSEnji Cooper    rm -f "$tmpdepfile"
104*132f818dSEnji Cooper  else
105*132f818dSEnji Cooper    make_dummy_depfile
106*132f818dSEnji Cooper  fi
107*132f818dSEnji Cooper}
108*132f818dSEnji Cooper
109*132f818dSEnji Cooper# A tabulation character.
110*132f818dSEnji Coopertab='	'
111*132f818dSEnji Cooper# A newline character.
112*132f818dSEnji Coopernl='
113*132f818dSEnji Cooper'
114*132f818dSEnji Cooper# Character ranges might be problematic outside the C locale.
115*132f818dSEnji Cooper# These definitions help.
116*132f818dSEnji Cooperupper=ABCDEFGHIJKLMNOPQRSTUVWXYZ
117*132f818dSEnji Cooperlower=abcdefghijklmnopqrstuvwxyz
118*132f818dSEnji Cooperalpha=${upper}${lower}
119*132f818dSEnji Cooper
120*132f818dSEnji Cooperif test -z "$depmode" || test -z "$source" || test -z "$object"; then
121*132f818dSEnji Cooper  echo "depcomp: Variables source, object and depmode must be set" 1>&2
122*132f818dSEnji Cooper  exit 1
123*132f818dSEnji Cooperfi
124*132f818dSEnji Cooper
125*132f818dSEnji Cooper# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.
126*132f818dSEnji Cooperdepfile=${depfile-`echo "$object" |
127*132f818dSEnji Cooper  sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`}
128*132f818dSEnji Coopertmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
129*132f818dSEnji Cooper
130*132f818dSEnji Cooperrm -f "$tmpdepfile"
131*132f818dSEnji Cooper
132*132f818dSEnji Cooper# Avoid interference from the environment.
133*132f818dSEnji Coopergccflag= dashmflag=
134*132f818dSEnji Cooper
135*132f818dSEnji Cooper# Some modes work just like other modes, but use different flags.  We
136*132f818dSEnji Cooper# parameterize here, but still list the modes in the big case below,
137*132f818dSEnji Cooper# to make depend.m4 easier to write.  Note that we *cannot* use a case
138*132f818dSEnji Cooper# here, because this file can only contain one case statement.
139*132f818dSEnji Cooperif test "$depmode" = hp; then
140*132f818dSEnji Cooper  # HP compiler uses -M and no extra arg.
141*132f818dSEnji Cooper  gccflag=-M
142*132f818dSEnji Cooper  depmode=gcc
143*132f818dSEnji Cooperfi
144*132f818dSEnji Cooper
145*132f818dSEnji Cooperif test "$depmode" = dashXmstdout; then
146*132f818dSEnji Cooper  # This is just like dashmstdout with a different argument.
147*132f818dSEnji Cooper  dashmflag=-xM
148*132f818dSEnji Cooper  depmode=dashmstdout
149*132f818dSEnji Cooperfi
150*132f818dSEnji Cooper
151*132f818dSEnji Coopercygpath_u="cygpath -u -f -"
152*132f818dSEnji Cooperif test "$depmode" = msvcmsys; then
153*132f818dSEnji Cooper  # This is just like msvisualcpp but w/o cygpath translation.
154*132f818dSEnji Cooper  # Just convert the backslash-escaped backslashes to single forward
155*132f818dSEnji Cooper  # slashes to satisfy depend.m4
156*132f818dSEnji Cooper  cygpath_u='sed s,\\\\,/,g'
157*132f818dSEnji Cooper  depmode=msvisualcpp
158*132f818dSEnji Cooperfi
159*132f818dSEnji Cooper
160*132f818dSEnji Cooperif test "$depmode" = msvc7msys; then
161*132f818dSEnji Cooper  # This is just like msvc7 but w/o cygpath translation.
162*132f818dSEnji Cooper  # Just convert the backslash-escaped backslashes to single forward
163*132f818dSEnji Cooper  # slashes to satisfy depend.m4
164*132f818dSEnji Cooper  cygpath_u='sed s,\\\\,/,g'
165*132f818dSEnji Cooper  depmode=msvc7
166*132f818dSEnji Cooperfi
167*132f818dSEnji Cooper
168*132f818dSEnji Cooperif test "$depmode" = xlc; then
169*132f818dSEnji Cooper  # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information.
170*132f818dSEnji Cooper  gccflag=-qmakedep=gcc,-MF
171*132f818dSEnji Cooper  depmode=gcc
172*132f818dSEnji Cooperfi
173*132f818dSEnji Cooper
174*132f818dSEnji Coopercase "$depmode" in
175*132f818dSEnji Coopergcc3)
176*132f818dSEnji Cooper## gcc 3 implements dependency tracking that does exactly what
177*132f818dSEnji Cooper## we want.  Yay!  Note: for some reason libtool 1.4 doesn't like
178*132f818dSEnji Cooper## it if -MD -MP comes after the -MF stuff.  Hmm.
179*132f818dSEnji Cooper## Unfortunately, FreeBSD c89 acceptance of flags depends upon
180*132f818dSEnji Cooper## the command line argument order; so add the flags where they
181*132f818dSEnji Cooper## appear in depend2.am.  Note that the slowdown incurred here
182*132f818dSEnji Cooper## affects only configure: in makefiles, %FASTDEP% shortcuts this.
183*132f818dSEnji Cooper  for arg
184*132f818dSEnji Cooper  do
185*132f818dSEnji Cooper    case $arg in
186*132f818dSEnji Cooper    -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;;
187*132f818dSEnji Cooper    *)  set fnord "$@" "$arg" ;;
188*132f818dSEnji Cooper    esac
189*132f818dSEnji Cooper    shift # fnord
190*132f818dSEnji Cooper    shift # $arg
191*132f818dSEnji Cooper  done
192*132f818dSEnji Cooper  "$@"
193*132f818dSEnji Cooper  stat=$?
194*132f818dSEnji Cooper  if test $stat -ne 0; then
195*132f818dSEnji Cooper    rm -f "$tmpdepfile"
196*132f818dSEnji Cooper    exit $stat
197*132f818dSEnji Cooper  fi
198*132f818dSEnji Cooper  mv "$tmpdepfile" "$depfile"
199*132f818dSEnji Cooper  ;;
200*132f818dSEnji Cooper
201*132f818dSEnji Coopergcc)
202*132f818dSEnji Cooper## Note that this doesn't just cater to obsolete pre-3.x GCC compilers.
203*132f818dSEnji Cooper## but also to in-use compilers like IBM xlc/xlC and the HP C compiler.
204*132f818dSEnji Cooper## (see the conditional assignment to $gccflag above).
205*132f818dSEnji Cooper## There are various ways to get dependency output from gcc.  Here's
206*132f818dSEnji Cooper## why we pick this rather obscure method:
207*132f818dSEnji Cooper## - Don't want to use -MD because we'd like the dependencies to end
208*132f818dSEnji Cooper##   up in a subdir.  Having to rename by hand is ugly.
209*132f818dSEnji Cooper##   (We might end up doing this anyway to support other compilers.)
210*132f818dSEnji Cooper## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
211*132f818dSEnji Cooper##   -MM, not -M (despite what the docs say).  Also, it might not be
212*132f818dSEnji Cooper##   supported by the other compilers which use the 'gcc' depmode.
213*132f818dSEnji Cooper## - Using -M directly means running the compiler twice (even worse
214*132f818dSEnji Cooper##   than renaming).
215*132f818dSEnji Cooper  if test -z "$gccflag"; then
216*132f818dSEnji Cooper    gccflag=-MD,
217*132f818dSEnji Cooper  fi
218*132f818dSEnji Cooper  "$@" -Wp,"$gccflag$tmpdepfile"
219*132f818dSEnji Cooper  stat=$?
220*132f818dSEnji Cooper  if test $stat -ne 0; then
221*132f818dSEnji Cooper    rm -f "$tmpdepfile"
222*132f818dSEnji Cooper    exit $stat
223*132f818dSEnji Cooper  fi
224*132f818dSEnji Cooper  rm -f "$depfile"
225*132f818dSEnji Cooper  echo "$object : \\" > "$depfile"
226*132f818dSEnji Cooper  # The second -e expression handles DOS-style file names with drive
227*132f818dSEnji Cooper  # letters.
228*132f818dSEnji Cooper  sed -e 's/^[^:]*: / /' \
229*132f818dSEnji Cooper      -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
230*132f818dSEnji Cooper## This next piece of magic avoids the "deleted header file" problem.
231*132f818dSEnji Cooper## The problem is that when a header file which appears in a .P file
232*132f818dSEnji Cooper## is deleted, the dependency causes make to die (because there is
233*132f818dSEnji Cooper## typically no way to rebuild the header).  We avoid this by adding
234*132f818dSEnji Cooper## dummy dependencies for each header file.  Too bad gcc doesn't do
235*132f818dSEnji Cooper## this for us directly.
236*132f818dSEnji Cooper## Some versions of gcc put a space before the ':'.  On the theory
237*132f818dSEnji Cooper## that the space means something, we add a space to the output as
238*132f818dSEnji Cooper## well.  hp depmode also adds that space, but also prefixes the VPATH
239*132f818dSEnji Cooper## to the object.  Take care to not repeat it in the output.
240*132f818dSEnji Cooper## Some versions of the HPUX 10.20 sed can't process this invocation
241*132f818dSEnji Cooper## correctly.  Breaking it into two sed invocations is a workaround.
242*132f818dSEnji Cooper  tr ' ' "$nl" < "$tmpdepfile" \
243*132f818dSEnji Cooper    | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \
244*132f818dSEnji Cooper    | sed -e 's/$/ :/' >> "$depfile"
245*132f818dSEnji Cooper  rm -f "$tmpdepfile"
246*132f818dSEnji Cooper  ;;
247*132f818dSEnji Cooper
248*132f818dSEnji Cooperhp)
249*132f818dSEnji Cooper  # This case exists only to let depend.m4 do its work.  It works by
250*132f818dSEnji Cooper  # looking at the text of this script.  This case will never be run,
251*132f818dSEnji Cooper  # since it is checked for above.
252*132f818dSEnji Cooper  exit 1
253*132f818dSEnji Cooper  ;;
254*132f818dSEnji Cooper
255*132f818dSEnji Coopersgi)
256*132f818dSEnji Cooper  if test "$libtool" = yes; then
257*132f818dSEnji Cooper    "$@" "-Wp,-MDupdate,$tmpdepfile"
258*132f818dSEnji Cooper  else
259*132f818dSEnji Cooper    "$@" -MDupdate "$tmpdepfile"
260*132f818dSEnji Cooper  fi
261*132f818dSEnji Cooper  stat=$?
262*132f818dSEnji Cooper  if test $stat -ne 0; then
263*132f818dSEnji Cooper    rm -f "$tmpdepfile"
264*132f818dSEnji Cooper    exit $stat
265*132f818dSEnji Cooper  fi
266*132f818dSEnji Cooper  rm -f "$depfile"
267*132f818dSEnji Cooper
268*132f818dSEnji Cooper  if test -f "$tmpdepfile"; then  # yes, the sourcefile depend on other files
269*132f818dSEnji Cooper    echo "$object : \\" > "$depfile"
270*132f818dSEnji Cooper    # Clip off the initial element (the dependent).  Don't try to be
271*132f818dSEnji Cooper    # clever and replace this with sed code, as IRIX sed won't handle
272*132f818dSEnji Cooper    # lines with more than a fixed number of characters (4096 in
273*132f818dSEnji Cooper    # IRIX 6.2 sed, 8192 in IRIX 6.5).  We also remove comment lines;
274*132f818dSEnji Cooper    # the IRIX cc adds comments like '#:fec' to the end of the
275*132f818dSEnji Cooper    # dependency line.
276*132f818dSEnji Cooper    tr ' ' "$nl" < "$tmpdepfile" \
277*132f818dSEnji Cooper      | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \
278*132f818dSEnji Cooper      | tr "$nl" ' ' >> "$depfile"
279*132f818dSEnji Cooper    echo >> "$depfile"
280*132f818dSEnji Cooper    # The second pass generates a dummy entry for each header file.
281*132f818dSEnji Cooper    tr ' ' "$nl" < "$tmpdepfile" \
282*132f818dSEnji Cooper      | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
283*132f818dSEnji Cooper      >> "$depfile"
284*132f818dSEnji Cooper  else
285*132f818dSEnji Cooper    make_dummy_depfile
286*132f818dSEnji Cooper  fi
287*132f818dSEnji Cooper  rm -f "$tmpdepfile"
288*132f818dSEnji Cooper  ;;
289*132f818dSEnji Cooper
290*132f818dSEnji Cooperxlc)
291*132f818dSEnji Cooper  # This case exists only to let depend.m4 do its work.  It works by
292*132f818dSEnji Cooper  # looking at the text of this script.  This case will never be run,
293*132f818dSEnji Cooper  # since it is checked for above.
294*132f818dSEnji Cooper  exit 1
295*132f818dSEnji Cooper  ;;
296*132f818dSEnji Cooper
297*132f818dSEnji Cooperaix)
298*132f818dSEnji Cooper  # The C for AIX Compiler uses -M and outputs the dependencies
299*132f818dSEnji Cooper  # in a .u file.  In older versions, this file always lives in the
300*132f818dSEnji Cooper  # current directory.  Also, the AIX compiler puts '$object:' at the
301*132f818dSEnji Cooper  # start of each line; $object doesn't have directory information.
302*132f818dSEnji Cooper  # Version 6 uses the directory in both cases.
303*132f818dSEnji Cooper  set_dir_from "$object"
304*132f818dSEnji Cooper  set_base_from "$object"
305*132f818dSEnji Cooper  if test "$libtool" = yes; then
306*132f818dSEnji Cooper    tmpdepfile1=$dir$base.u
307*132f818dSEnji Cooper    tmpdepfile2=$base.u
308*132f818dSEnji Cooper    tmpdepfile3=$dir.libs/$base.u
309*132f818dSEnji Cooper    "$@" -Wc,-M
310*132f818dSEnji Cooper  else
311*132f818dSEnji Cooper    tmpdepfile1=$dir$base.u
312*132f818dSEnji Cooper    tmpdepfile2=$dir$base.u
313*132f818dSEnji Cooper    tmpdepfile3=$dir$base.u
314*132f818dSEnji Cooper    "$@" -M
315*132f818dSEnji Cooper  fi
316*132f818dSEnji Cooper  stat=$?
317*132f818dSEnji Cooper  if test $stat -ne 0; then
318*132f818dSEnji Cooper    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
319*132f818dSEnji Cooper    exit $stat
320*132f818dSEnji Cooper  fi
321*132f818dSEnji Cooper
322*132f818dSEnji Cooper  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
323*132f818dSEnji Cooper  do
324*132f818dSEnji Cooper    test -f "$tmpdepfile" && break
325*132f818dSEnji Cooper  done
326*132f818dSEnji Cooper  aix_post_process_depfile
327*132f818dSEnji Cooper  ;;
328*132f818dSEnji Cooper
329*132f818dSEnji Coopertcc)
330*132f818dSEnji Cooper  # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26
331*132f818dSEnji Cooper  # FIXME: That version still under development at the moment of writing.
332*132f818dSEnji Cooper  #        Make that this statement remains true also for stable, released
333*132f818dSEnji Cooper  #        versions.
334*132f818dSEnji Cooper  # It will wrap lines (doesn't matter whether long or short) with a
335*132f818dSEnji Cooper  # trailing '\', as in:
336*132f818dSEnji Cooper  #
337*132f818dSEnji Cooper  #   foo.o : \
338*132f818dSEnji Cooper  #    foo.c \
339*132f818dSEnji Cooper  #    foo.h \
340*132f818dSEnji Cooper  #
341*132f818dSEnji Cooper  # It will put a trailing '\' even on the last line, and will use leading
342*132f818dSEnji Cooper  # spaces rather than leading tabs (at least since its commit 0394caf7
343*132f818dSEnji Cooper  # "Emit spaces for -MD").
344*132f818dSEnji Cooper  "$@" -MD -MF "$tmpdepfile"
345*132f818dSEnji Cooper  stat=$?
346*132f818dSEnji Cooper  if test $stat -ne 0; then
347*132f818dSEnji Cooper    rm -f "$tmpdepfile"
348*132f818dSEnji Cooper    exit $stat
349*132f818dSEnji Cooper  fi
350*132f818dSEnji Cooper  rm -f "$depfile"
351*132f818dSEnji Cooper  # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'.
352*132f818dSEnji Cooper  # We have to change lines of the first kind to '$object: \'.
353*132f818dSEnji Cooper  sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile"
354*132f818dSEnji Cooper  # And for each line of the second kind, we have to emit a 'dep.h:'
355*132f818dSEnji Cooper  # dummy dependency, to avoid the deleted-header problem.
356*132f818dSEnji Cooper  sed -n -e 's|^  *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile"
357*132f818dSEnji Cooper  rm -f "$tmpdepfile"
358*132f818dSEnji Cooper  ;;
359*132f818dSEnji Cooper
360*132f818dSEnji Cooper## The order of this option in the case statement is important, since the
361*132f818dSEnji Cooper## shell code in configure will try each of these formats in the order
362*132f818dSEnji Cooper## listed in this file.  A plain '-MD' option would be understood by many
363*132f818dSEnji Cooper## compilers, so we must ensure this comes after the gcc and icc options.
364*132f818dSEnji Cooperpgcc)
365*132f818dSEnji Cooper  # Portland's C compiler understands '-MD'.
366*132f818dSEnji Cooper  # Will always output deps to 'file.d' where file is the root name of the
367*132f818dSEnji Cooper  # source file under compilation, even if file resides in a subdirectory.
368*132f818dSEnji Cooper  # The object file name does not affect the name of the '.d' file.
369*132f818dSEnji Cooper  # pgcc 10.2 will output
370*132f818dSEnji Cooper  #    foo.o: sub/foo.c sub/foo.h
371*132f818dSEnji Cooper  # and will wrap long lines using '\' :
372*132f818dSEnji Cooper  #    foo.o: sub/foo.c ... \
373*132f818dSEnji Cooper  #     sub/foo.h ... \
374*132f818dSEnji Cooper  #     ...
375*132f818dSEnji Cooper  set_dir_from "$object"
376*132f818dSEnji Cooper  # Use the source, not the object, to determine the base name, since
377*132f818dSEnji Cooper  # that's sadly what pgcc will do too.
378*132f818dSEnji Cooper  set_base_from "$source"
379*132f818dSEnji Cooper  tmpdepfile=$base.d
380*132f818dSEnji Cooper
381*132f818dSEnji Cooper  # For projects that build the same source file twice into different object
382*132f818dSEnji Cooper  # files, the pgcc approach of using the *source* file root name can cause
383*132f818dSEnji Cooper  # problems in parallel builds.  Use a locking strategy to avoid stomping on
384*132f818dSEnji Cooper  # the same $tmpdepfile.
385*132f818dSEnji Cooper  lockdir=$base.d-lock
386*132f818dSEnji Cooper  trap "
387*132f818dSEnji Cooper    echo '$0: caught signal, cleaning up...' >&2
388*132f818dSEnji Cooper    rmdir '$lockdir'
389*132f818dSEnji Cooper    exit 1
390*132f818dSEnji Cooper  " 1 2 13 15
391*132f818dSEnji Cooper  numtries=100
392*132f818dSEnji Cooper  i=$numtries
393*132f818dSEnji Cooper  while test $i -gt 0; do
394*132f818dSEnji Cooper    # mkdir is a portable test-and-set.
395*132f818dSEnji Cooper    if mkdir "$lockdir" 2>/dev/null; then
396*132f818dSEnji Cooper      # This process acquired the lock.
397*132f818dSEnji Cooper      "$@" -MD
398*132f818dSEnji Cooper      stat=$?
399*132f818dSEnji Cooper      # Release the lock.
400*132f818dSEnji Cooper      rmdir "$lockdir"
401*132f818dSEnji Cooper      break
402*132f818dSEnji Cooper    else
403*132f818dSEnji Cooper      # If the lock is being held by a different process, wait
404*132f818dSEnji Cooper      # until the winning process is done or we timeout.
405*132f818dSEnji Cooper      while test -d "$lockdir" && test $i -gt 0; do
406*132f818dSEnji Cooper        sleep 1
407*132f818dSEnji Cooper        i=`expr $i - 1`
408*132f818dSEnji Cooper      done
409*132f818dSEnji Cooper    fi
410*132f818dSEnji Cooper    i=`expr $i - 1`
411*132f818dSEnji Cooper  done
412*132f818dSEnji Cooper  trap - 1 2 13 15
413*132f818dSEnji Cooper  if test $i -le 0; then
414*132f818dSEnji Cooper    echo "$0: failed to acquire lock after $numtries attempts" >&2
415*132f818dSEnji Cooper    echo "$0: check lockdir '$lockdir'" >&2
416*132f818dSEnji Cooper    exit 1
417*132f818dSEnji Cooper  fi
418*132f818dSEnji Cooper
419*132f818dSEnji Cooper  if test $stat -ne 0; then
420*132f818dSEnji Cooper    rm -f "$tmpdepfile"
421*132f818dSEnji Cooper    exit $stat
422*132f818dSEnji Cooper  fi
423*132f818dSEnji Cooper  rm -f "$depfile"
424*132f818dSEnji Cooper  # Each line is of the form `foo.o: dependent.h',
425*132f818dSEnji Cooper  # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'.
426*132f818dSEnji Cooper  # Do two passes, one to just change these to
427*132f818dSEnji Cooper  # `$object: dependent.h' and one to simply `dependent.h:'.
428*132f818dSEnji Cooper  sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
429*132f818dSEnji Cooper  # Some versions of the HPUX 10.20 sed can't process this invocation
430*132f818dSEnji Cooper  # correctly.  Breaking it into two sed invocations is a workaround.
431*132f818dSEnji Cooper  sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \
432*132f818dSEnji Cooper    | sed -e 's/$/ :/' >> "$depfile"
433*132f818dSEnji Cooper  rm -f "$tmpdepfile"
434*132f818dSEnji Cooper  ;;
435*132f818dSEnji Cooper
436*132f818dSEnji Cooperhp2)
437*132f818dSEnji Cooper  # The "hp" stanza above does not work with aCC (C++) and HP's ia64
438*132f818dSEnji Cooper  # compilers, which have integrated preprocessors.  The correct option
439*132f818dSEnji Cooper  # to use with these is +Maked; it writes dependencies to a file named
440*132f818dSEnji Cooper  # 'foo.d', which lands next to the object file, wherever that
441*132f818dSEnji Cooper  # happens to be.
442*132f818dSEnji Cooper  # Much of this is similar to the tru64 case; see comments there.
443*132f818dSEnji Cooper  set_dir_from  "$object"
444*132f818dSEnji Cooper  set_base_from "$object"
445*132f818dSEnji Cooper  if test "$libtool" = yes; then
446*132f818dSEnji Cooper    tmpdepfile1=$dir$base.d
447*132f818dSEnji Cooper    tmpdepfile2=$dir.libs/$base.d
448*132f818dSEnji Cooper    "$@" -Wc,+Maked
449*132f818dSEnji Cooper  else
450*132f818dSEnji Cooper    tmpdepfile1=$dir$base.d
451*132f818dSEnji Cooper    tmpdepfile2=$dir$base.d
452*132f818dSEnji Cooper    "$@" +Maked
453*132f818dSEnji Cooper  fi
454*132f818dSEnji Cooper  stat=$?
455*132f818dSEnji Cooper  if test $stat -ne 0; then
456*132f818dSEnji Cooper     rm -f "$tmpdepfile1" "$tmpdepfile2"
457*132f818dSEnji Cooper     exit $stat
458*132f818dSEnji Cooper  fi
459*132f818dSEnji Cooper
460*132f818dSEnji Cooper  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2"
461*132f818dSEnji Cooper  do
462*132f818dSEnji Cooper    test -f "$tmpdepfile" && break
463*132f818dSEnji Cooper  done
464*132f818dSEnji Cooper  if test -f "$tmpdepfile"; then
465*132f818dSEnji Cooper    sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile"
466*132f818dSEnji Cooper    # Add 'dependent.h:' lines.
467*132f818dSEnji Cooper    sed -ne '2,${
468*132f818dSEnji Cooper               s/^ *//
469*132f818dSEnji Cooper               s/ \\*$//
470*132f818dSEnji Cooper               s/$/:/
471*132f818dSEnji Cooper               p
472*132f818dSEnji Cooper             }' "$tmpdepfile" >> "$depfile"
473*132f818dSEnji Cooper  else
474*132f818dSEnji Cooper    make_dummy_depfile
475*132f818dSEnji Cooper  fi
476*132f818dSEnji Cooper  rm -f "$tmpdepfile" "$tmpdepfile2"
477*132f818dSEnji Cooper  ;;
478*132f818dSEnji Cooper
479*132f818dSEnji Coopertru64)
480*132f818dSEnji Cooper  # The Tru64 compiler uses -MD to generate dependencies as a side
481*132f818dSEnji Cooper  # effect.  'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'.
482*132f818dSEnji Cooper  # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
483*132f818dSEnji Cooper  # dependencies in 'foo.d' instead, so we check for that too.
484*132f818dSEnji Cooper  # Subdirectories are respected.
485*132f818dSEnji Cooper  set_dir_from  "$object"
486*132f818dSEnji Cooper  set_base_from "$object"
487*132f818dSEnji Cooper
488*132f818dSEnji Cooper  if test "$libtool" = yes; then
489*132f818dSEnji Cooper    # Libtool generates 2 separate objects for the 2 libraries.  These
490*132f818dSEnji Cooper    # two compilations output dependencies in $dir.libs/$base.o.d and
491*132f818dSEnji Cooper    # in $dir$base.o.d.  We have to check for both files, because
492*132f818dSEnji Cooper    # one of the two compilations can be disabled.  We should prefer
493*132f818dSEnji Cooper    # $dir$base.o.d over $dir.libs/$base.o.d because the latter is
494*132f818dSEnji Cooper    # automatically cleaned when .libs/ is deleted, while ignoring
495*132f818dSEnji Cooper    # the former would cause a distcleancheck panic.
496*132f818dSEnji Cooper    tmpdepfile1=$dir$base.o.d          # libtool 1.5
497*132f818dSEnji Cooper    tmpdepfile2=$dir.libs/$base.o.d    # Likewise.
498*132f818dSEnji Cooper    tmpdepfile3=$dir.libs/$base.d      # Compaq CCC V6.2-504
499*132f818dSEnji Cooper    "$@" -Wc,-MD
500*132f818dSEnji Cooper  else
501*132f818dSEnji Cooper    tmpdepfile1=$dir$base.d
502*132f818dSEnji Cooper    tmpdepfile2=$dir$base.d
503*132f818dSEnji Cooper    tmpdepfile3=$dir$base.d
504*132f818dSEnji Cooper    "$@" -MD
505*132f818dSEnji Cooper  fi
506*132f818dSEnji Cooper
507*132f818dSEnji Cooper  stat=$?
508*132f818dSEnji Cooper  if test $stat -ne 0; then
509*132f818dSEnji Cooper    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
510*132f818dSEnji Cooper    exit $stat
511*132f818dSEnji Cooper  fi
512*132f818dSEnji Cooper
513*132f818dSEnji Cooper  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
514*132f818dSEnji Cooper  do
515*132f818dSEnji Cooper    test -f "$tmpdepfile" && break
516*132f818dSEnji Cooper  done
517*132f818dSEnji Cooper  # Same post-processing that is required for AIX mode.
518*132f818dSEnji Cooper  aix_post_process_depfile
519*132f818dSEnji Cooper  ;;
520*132f818dSEnji Cooper
521*132f818dSEnji Coopermsvc7)
522*132f818dSEnji Cooper  if test "$libtool" = yes; then
523*132f818dSEnji Cooper    showIncludes=-Wc,-showIncludes
524*132f818dSEnji Cooper  else
525*132f818dSEnji Cooper    showIncludes=-showIncludes
526*132f818dSEnji Cooper  fi
527*132f818dSEnji Cooper  "$@" $showIncludes > "$tmpdepfile"
528*132f818dSEnji Cooper  stat=$?
529*132f818dSEnji Cooper  grep -v '^Note: including file: ' "$tmpdepfile"
530*132f818dSEnji Cooper  if test $stat -ne 0; then
531*132f818dSEnji Cooper    rm -f "$tmpdepfile"
532*132f818dSEnji Cooper    exit $stat
533*132f818dSEnji Cooper  fi
534*132f818dSEnji Cooper  rm -f "$depfile"
535*132f818dSEnji Cooper  echo "$object : \\" > "$depfile"
536*132f818dSEnji Cooper  # The first sed program below extracts the file names and escapes
537*132f818dSEnji Cooper  # backslashes for cygpath.  The second sed program outputs the file
538*132f818dSEnji Cooper  # name when reading, but also accumulates all include files in the
539*132f818dSEnji Cooper  # hold buffer in order to output them again at the end.  This only
540*132f818dSEnji Cooper  # works with sed implementations that can handle large buffers.
541*132f818dSEnji Cooper  sed < "$tmpdepfile" -n '
542*132f818dSEnji Cooper/^Note: including file:  *\(.*\)/ {
543*132f818dSEnji Cooper  s//\1/
544*132f818dSEnji Cooper  s/\\/\\\\/g
545*132f818dSEnji Cooper  p
546*132f818dSEnji Cooper}' | $cygpath_u | sort -u | sed -n '
547*132f818dSEnji Coopers/ /\\ /g
548*132f818dSEnji Coopers/\(.*\)/'"$tab"'\1 \\/p
549*132f818dSEnji Coopers/.\(.*\) \\/\1:/
550*132f818dSEnji CooperH
551*132f818dSEnji Cooper$ {
552*132f818dSEnji Cooper  s/.*/'"$tab"'/
553*132f818dSEnji Cooper  G
554*132f818dSEnji Cooper  p
555*132f818dSEnji Cooper}' >> "$depfile"
556*132f818dSEnji Cooper  echo >> "$depfile" # make sure the fragment doesn't end with a backslash
557*132f818dSEnji Cooper  rm -f "$tmpdepfile"
558*132f818dSEnji Cooper  ;;
559*132f818dSEnji Cooper
560*132f818dSEnji Coopermsvc7msys)
561*132f818dSEnji Cooper  # This case exists only to let depend.m4 do its work.  It works by
562*132f818dSEnji Cooper  # looking at the text of this script.  This case will never be run,
563*132f818dSEnji Cooper  # since it is checked for above.
564*132f818dSEnji Cooper  exit 1
565*132f818dSEnji Cooper  ;;
566*132f818dSEnji Cooper
567*132f818dSEnji Cooper#nosideeffect)
568*132f818dSEnji Cooper  # This comment above is used by automake to tell side-effect
569*132f818dSEnji Cooper  # dependency tracking mechanisms from slower ones.
570*132f818dSEnji Cooper
571*132f818dSEnji Cooperdashmstdout)
572*132f818dSEnji Cooper  # Important note: in order to support this mode, a compiler *must*
573*132f818dSEnji Cooper  # always write the preprocessed file to stdout, regardless of -o.
574*132f818dSEnji Cooper  "$@" || exit $?
575*132f818dSEnji Cooper
576*132f818dSEnji Cooper  # Remove the call to Libtool.
577*132f818dSEnji Cooper  if test "$libtool" = yes; then
578*132f818dSEnji Cooper    while test "X$1" != 'X--mode=compile'; do
579*132f818dSEnji Cooper      shift
580*132f818dSEnji Cooper    done
581*132f818dSEnji Cooper    shift
582*132f818dSEnji Cooper  fi
583*132f818dSEnji Cooper
584*132f818dSEnji Cooper  # Remove '-o $object'.
585*132f818dSEnji Cooper  IFS=" "
586*132f818dSEnji Cooper  for arg
587*132f818dSEnji Cooper  do
588*132f818dSEnji Cooper    case $arg in
589*132f818dSEnji Cooper    -o)
590*132f818dSEnji Cooper      shift
591*132f818dSEnji Cooper      ;;
592*132f818dSEnji Cooper    $object)
593*132f818dSEnji Cooper      shift
594*132f818dSEnji Cooper      ;;
595*132f818dSEnji Cooper    *)
596*132f818dSEnji Cooper      set fnord "$@" "$arg"
597*132f818dSEnji Cooper      shift # fnord
598*132f818dSEnji Cooper      shift # $arg
599*132f818dSEnji Cooper      ;;
600*132f818dSEnji Cooper    esac
601*132f818dSEnji Cooper  done
602*132f818dSEnji Cooper
603*132f818dSEnji Cooper  test -z "$dashmflag" && dashmflag=-M
604*132f818dSEnji Cooper  # Require at least two characters before searching for ':'
605*132f818dSEnji Cooper  # in the target name.  This is to cope with DOS-style filenames:
606*132f818dSEnji Cooper  # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise.
607*132f818dSEnji Cooper  "$@" $dashmflag |
608*132f818dSEnji Cooper    sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile"
609*132f818dSEnji Cooper  rm -f "$depfile"
610*132f818dSEnji Cooper  cat < "$tmpdepfile" > "$depfile"
611*132f818dSEnji Cooper  # Some versions of the HPUX 10.20 sed can't process this sed invocation
612*132f818dSEnji Cooper  # correctly.  Breaking it into two sed invocations is a workaround.
613*132f818dSEnji Cooper  tr ' ' "$nl" < "$tmpdepfile" \
614*132f818dSEnji Cooper    | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
615*132f818dSEnji Cooper    | sed -e 's/$/ :/' >> "$depfile"
616*132f818dSEnji Cooper  rm -f "$tmpdepfile"
617*132f818dSEnji Cooper  ;;
618*132f818dSEnji Cooper
619*132f818dSEnji CooperdashXmstdout)
620*132f818dSEnji Cooper  # This case only exists to satisfy depend.m4.  It is never actually
621*132f818dSEnji Cooper  # run, as this mode is specially recognized in the preamble.
622*132f818dSEnji Cooper  exit 1
623*132f818dSEnji Cooper  ;;
624*132f818dSEnji Cooper
625*132f818dSEnji Coopermakedepend)
626*132f818dSEnji Cooper  "$@" || exit $?
627*132f818dSEnji Cooper  # Remove any Libtool call
628*132f818dSEnji Cooper  if test "$libtool" = yes; then
629*132f818dSEnji Cooper    while test "X$1" != 'X--mode=compile'; do
630*132f818dSEnji Cooper      shift
631*132f818dSEnji Cooper    done
632*132f818dSEnji Cooper    shift
633*132f818dSEnji Cooper  fi
634*132f818dSEnji Cooper  # X makedepend
635*132f818dSEnji Cooper  shift
636*132f818dSEnji Cooper  cleared=no eat=no
637*132f818dSEnji Cooper  for arg
638*132f818dSEnji Cooper  do
639*132f818dSEnji Cooper    case $cleared in
640*132f818dSEnji Cooper    no)
641*132f818dSEnji Cooper      set ""; shift
642*132f818dSEnji Cooper      cleared=yes ;;
643*132f818dSEnji Cooper    esac
644*132f818dSEnji Cooper    if test $eat = yes; then
645*132f818dSEnji Cooper      eat=no
646*132f818dSEnji Cooper      continue
647*132f818dSEnji Cooper    fi
648*132f818dSEnji Cooper    case "$arg" in
649*132f818dSEnji Cooper    -D*|-I*)
650*132f818dSEnji Cooper      set fnord "$@" "$arg"; shift ;;
651*132f818dSEnji Cooper    # Strip any option that makedepend may not understand.  Remove
652*132f818dSEnji Cooper    # the object too, otherwise makedepend will parse it as a source file.
653*132f818dSEnji Cooper    -arch)
654*132f818dSEnji Cooper      eat=yes ;;
655*132f818dSEnji Cooper    -*|$object)
656*132f818dSEnji Cooper      ;;
657*132f818dSEnji Cooper    *)
658*132f818dSEnji Cooper      set fnord "$@" "$arg"; shift ;;
659*132f818dSEnji Cooper    esac
660*132f818dSEnji Cooper  done
661*132f818dSEnji Cooper  obj_suffix=`echo "$object" | sed 's/^.*\././'`
662*132f818dSEnji Cooper  touch "$tmpdepfile"
663*132f818dSEnji Cooper  ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
664*132f818dSEnji Cooper  rm -f "$depfile"
665*132f818dSEnji Cooper  # makedepend may prepend the VPATH from the source file name to the object.
666*132f818dSEnji Cooper  # No need to regex-escape $object, excess matching of '.' is harmless.
667*132f818dSEnji Cooper  sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile"
668*132f818dSEnji Cooper  # Some versions of the HPUX 10.20 sed can't process the last invocation
669*132f818dSEnji Cooper  # correctly.  Breaking it into two sed invocations is a workaround.
670*132f818dSEnji Cooper  sed '1,2d' "$tmpdepfile" \
671*132f818dSEnji Cooper    | tr ' ' "$nl" \
672*132f818dSEnji Cooper    | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
673*132f818dSEnji Cooper    | sed -e 's/$/ :/' >> "$depfile"
674*132f818dSEnji Cooper  rm -f "$tmpdepfile" "$tmpdepfile".bak
675*132f818dSEnji Cooper  ;;
676*132f818dSEnji Cooper
677*132f818dSEnji Coopercpp)
678*132f818dSEnji Cooper  # Important note: in order to support this mode, a compiler *must*
679*132f818dSEnji Cooper  # always write the preprocessed file to stdout.
680*132f818dSEnji Cooper  "$@" || exit $?
681*132f818dSEnji Cooper
682*132f818dSEnji Cooper  # Remove the call to Libtool.
683*132f818dSEnji Cooper  if test "$libtool" = yes; then
684*132f818dSEnji Cooper    while test "X$1" != 'X--mode=compile'; do
685*132f818dSEnji Cooper      shift
686*132f818dSEnji Cooper    done
687*132f818dSEnji Cooper    shift
688*132f818dSEnji Cooper  fi
689*132f818dSEnji Cooper
690*132f818dSEnji Cooper  # Remove '-o $object'.
691*132f818dSEnji Cooper  IFS=" "
692*132f818dSEnji Cooper  for arg
693*132f818dSEnji Cooper  do
694*132f818dSEnji Cooper    case $arg in
695*132f818dSEnji Cooper    -o)
696*132f818dSEnji Cooper      shift
697*132f818dSEnji Cooper      ;;
698*132f818dSEnji Cooper    $object)
699*132f818dSEnji Cooper      shift
700*132f818dSEnji Cooper      ;;
701*132f818dSEnji Cooper    *)
702*132f818dSEnji Cooper      set fnord "$@" "$arg"
703*132f818dSEnji Cooper      shift # fnord
704*132f818dSEnji Cooper      shift # $arg
705*132f818dSEnji Cooper      ;;
706*132f818dSEnji Cooper    esac
707*132f818dSEnji Cooper  done
708*132f818dSEnji Cooper
709*132f818dSEnji Cooper  "$@" -E \
710*132f818dSEnji Cooper    | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
711*132f818dSEnji Cooper             -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
712*132f818dSEnji Cooper    | sed '$ s: \\$::' > "$tmpdepfile"
713*132f818dSEnji Cooper  rm -f "$depfile"
714*132f818dSEnji Cooper  echo "$object : \\" > "$depfile"
715*132f818dSEnji Cooper  cat < "$tmpdepfile" >> "$depfile"
716*132f818dSEnji Cooper  sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
717*132f818dSEnji Cooper  rm -f "$tmpdepfile"
718*132f818dSEnji Cooper  ;;
719*132f818dSEnji Cooper
720*132f818dSEnji Coopermsvisualcpp)
721*132f818dSEnji Cooper  # Important note: in order to support this mode, a compiler *must*
722*132f818dSEnji Cooper  # always write the preprocessed file to stdout.
723*132f818dSEnji Cooper  "$@" || exit $?
724*132f818dSEnji Cooper
725*132f818dSEnji Cooper  # Remove the call to Libtool.
726*132f818dSEnji Cooper  if test "$libtool" = yes; then
727*132f818dSEnji Cooper    while test "X$1" != 'X--mode=compile'; do
728*132f818dSEnji Cooper      shift
729*132f818dSEnji Cooper    done
730*132f818dSEnji Cooper    shift
731*132f818dSEnji Cooper  fi
732*132f818dSEnji Cooper
733*132f818dSEnji Cooper  IFS=" "
734*132f818dSEnji Cooper  for arg
735*132f818dSEnji Cooper  do
736*132f818dSEnji Cooper    case "$arg" in
737*132f818dSEnji Cooper    -o)
738*132f818dSEnji Cooper      shift
739*132f818dSEnji Cooper      ;;
740*132f818dSEnji Cooper    $object)
741*132f818dSEnji Cooper      shift
742*132f818dSEnji Cooper      ;;
743*132f818dSEnji Cooper    "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
744*132f818dSEnji Cooper        set fnord "$@"
745*132f818dSEnji Cooper        shift
746*132f818dSEnji Cooper        shift
747*132f818dSEnji Cooper        ;;
748*132f818dSEnji Cooper    *)
749*132f818dSEnji Cooper        set fnord "$@" "$arg"
750*132f818dSEnji Cooper        shift
751*132f818dSEnji Cooper        shift
752*132f818dSEnji Cooper        ;;
753*132f818dSEnji Cooper    esac
754*132f818dSEnji Cooper  done
755*132f818dSEnji Cooper  "$@" -E 2>/dev/null |
756*132f818dSEnji Cooper  sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile"
757*132f818dSEnji Cooper  rm -f "$depfile"
758*132f818dSEnji Cooper  echo "$object : \\" > "$depfile"
759*132f818dSEnji Cooper  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile"
760*132f818dSEnji Cooper  echo "$tab" >> "$depfile"
761*132f818dSEnji Cooper  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile"
762*132f818dSEnji Cooper  rm -f "$tmpdepfile"
763*132f818dSEnji Cooper  ;;
764*132f818dSEnji Cooper
765*132f818dSEnji Coopermsvcmsys)
766*132f818dSEnji Cooper  # This case exists only to let depend.m4 do its work.  It works by
767*132f818dSEnji Cooper  # looking at the text of this script.  This case will never be run,
768*132f818dSEnji Cooper  # since it is checked for above.
769*132f818dSEnji Cooper  exit 1
770*132f818dSEnji Cooper  ;;
771*132f818dSEnji Cooper
772*132f818dSEnji Coopernone)
773*132f818dSEnji Cooper  exec "$@"
774*132f818dSEnji Cooper  ;;
775*132f818dSEnji Cooper
776*132f818dSEnji Cooper*)
777*132f818dSEnji Cooper  echo "Unknown depmode $depmode" 1>&2
778*132f818dSEnji Cooper  exit 1
779*132f818dSEnji Cooper  ;;
780*132f818dSEnji Cooperesac
781*132f818dSEnji Cooper
782*132f818dSEnji Cooperexit 0
783*132f818dSEnji Cooper
784*132f818dSEnji Cooper# Local Variables:
785*132f818dSEnji Cooper# mode: shell-script
786*132f818dSEnji Cooper# sh-indentation: 2
787*132f818dSEnji Cooper# eval: (add-hook 'before-save-hook 'time-stamp)
788*132f818dSEnji Cooper# time-stamp-start: "scriptversion="
789*132f818dSEnji Cooper# time-stamp-format: "%:y-%02m-%02d.%02H"
790*132f818dSEnji Cooper# time-stamp-time-zone: "UTC0"
791*132f818dSEnji Cooper# time-stamp-end: "; # UTC"
792*132f818dSEnji Cooper# End:
793