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