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