166fe65f6Smrg#! /bin/sh
266fe65f6Smrg# depcomp - compile a program generating dependencies as side-effects
366fe65f6Smrg
4bc77032bSmrgscriptversion=2018-03-07.03; # UTC
566fe65f6Smrg
6bc77032bSmrg# Copyright (C) 1999-2021 Free Software Foundation, Inc.
766fe65f6Smrg
866fe65f6Smrg# This program is free software; you can redistribute it and/or modify
966fe65f6Smrg# it under the terms of the GNU General Public License as published by
1066fe65f6Smrg# the Free Software Foundation; either version 2, or (at your option)
1166fe65f6Smrg# any later version.
1266fe65f6Smrg
1366fe65f6Smrg# This program is distributed in the hope that it will be useful,
1466fe65f6Smrg# but WITHOUT ANY WARRANTY; without even the implied warranty of
1566fe65f6Smrg# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1666fe65f6Smrg# GNU General Public License for more details.
1766fe65f6Smrg
1866fe65f6Smrg# You should have received a copy of the GNU General Public License
19bc77032bSmrg# along with this program.  If not, see <https://www.gnu.org/licenses/>.
2066fe65f6Smrg
2166fe65f6Smrg# As a special exception to the GNU General Public License, if you
2266fe65f6Smrg# distribute this file as part of a program that contains a
2366fe65f6Smrg# configuration script generated by Autoconf, you may include it under
2466fe65f6Smrg# the same distribution terms that you use for the rest of that program.
2566fe65f6Smrg
2666fe65f6Smrg# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>.
2766fe65f6Smrg
2866fe65f6Smrgcase $1 in
2966fe65f6Smrg  '')
30c6a6acfbSmrg    echo "$0: No command.  Try '$0 --help' for more information." 1>&2
31c6a6acfbSmrg    exit 1;
32c6a6acfbSmrg    ;;
3366fe65f6Smrg  -h | --h*)
3466fe65f6Smrg    cat <<\EOF
3566fe65f6SmrgUsage: depcomp [--help] [--version] PROGRAM [ARGS]
3666fe65f6Smrg
3766fe65f6SmrgRun PROGRAMS ARGS to compile a file, generating dependencies
3866fe65f6Smrgas side-effects.
3966fe65f6Smrg
4066fe65f6SmrgEnvironment variables:
4166fe65f6Smrg  depmode     Dependency tracking mode.
42c6a6acfbSmrg  source      Source file read by 'PROGRAMS ARGS'.
43c6a6acfbSmrg  object      Object file output by 'PROGRAMS ARGS'.
4466fe65f6Smrg  DEPDIR      directory where to store dependencies.
4566fe65f6Smrg  depfile     Dependency file to output.
46c6a6acfbSmrg  tmpdepfile  Temporary file to use when outputting dependencies.
4766fe65f6Smrg  libtool     Whether libtool is used (yes/no).
4866fe65f6Smrg
4966fe65f6SmrgReport bugs to <bug-automake@gnu.org>.
5066fe65f6SmrgEOF
5166fe65f6Smrg    exit $?
5266fe65f6Smrg    ;;
5366fe65f6Smrg  -v | --v*)
5466fe65f6Smrg    echo "depcomp $scriptversion"
5566fe65f6Smrg    exit $?
5666fe65f6Smrg    ;;
5766fe65f6Smrgesac
5866fe65f6Smrg
59c6a6acfbSmrg# Get the directory component of the given path, and save it in the
60c6a6acfbSmrg# global variables '$dir'.  Note that this directory component will
61c6a6acfbSmrg# be either empty or ending with a '/' character.  This is deliberate.
62c6a6acfbSmrgset_dir_from ()
63c6a6acfbSmrg{
64c6a6acfbSmrg  case $1 in
65c6a6acfbSmrg    */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;;
66c6a6acfbSmrg      *) dir=;;
67c6a6acfbSmrg  esac
68c6a6acfbSmrg}
69c6a6acfbSmrg
70c6a6acfbSmrg# Get the suffix-stripped basename of the given path, and save it the
71c6a6acfbSmrg# global variable '$base'.
72c6a6acfbSmrgset_base_from ()
73c6a6acfbSmrg{
74c6a6acfbSmrg  base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'`
75c6a6acfbSmrg}
76c6a6acfbSmrg
77c6a6acfbSmrg# If no dependency file was actually created by the compiler invocation,
78c6a6acfbSmrg# we still have to create a dummy depfile, to avoid errors with the
79c6a6acfbSmrg# Makefile "include basename.Plo" scheme.
80c6a6acfbSmrgmake_dummy_depfile ()
81c6a6acfbSmrg{
82c6a6acfbSmrg  echo "#dummy" > "$depfile"
83c6a6acfbSmrg}
84c6a6acfbSmrg
85c6a6acfbSmrg# Factor out some common post-processing of the generated depfile.
86c6a6acfbSmrg# Requires the auxiliary global variable '$tmpdepfile' to be set.
87c6a6acfbSmrgaix_post_process_depfile ()
88c6a6acfbSmrg{
89c6a6acfbSmrg  # If the compiler actually managed to produce a dependency file,
90c6a6acfbSmrg  # post-process it.
91c6a6acfbSmrg  if test -f "$tmpdepfile"; then
92c6a6acfbSmrg    # Each line is of the form 'foo.o: dependency.h'.
93c6a6acfbSmrg    # Do two passes, one to just change these to
94c6a6acfbSmrg    #   $object: dependency.h
95c6a6acfbSmrg    # and one to simply output
96c6a6acfbSmrg    #   dependency.h:
97c6a6acfbSmrg    # which is needed to avoid the deleted-header problem.
98c6a6acfbSmrg    { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile"
99c6a6acfbSmrg      sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile"
100c6a6acfbSmrg    } > "$depfile"
101c6a6acfbSmrg    rm -f "$tmpdepfile"
102c6a6acfbSmrg  else
103c6a6acfbSmrg    make_dummy_depfile
104c6a6acfbSmrg  fi
105c6a6acfbSmrg}
106c6a6acfbSmrg
107c6a6acfbSmrg# A tabulation character.
108c6a6acfbSmrgtab='	'
109c6a6acfbSmrg# A newline character.
110c6a6acfbSmrgnl='
111c6a6acfbSmrg'
112c6a6acfbSmrg# Character ranges might be problematic outside the C locale.
113c6a6acfbSmrg# These definitions help.
114c6a6acfbSmrgupper=ABCDEFGHIJKLMNOPQRSTUVWXYZ
115c6a6acfbSmrglower=abcdefghijklmnopqrstuvwxyz
116c6a6acfbSmrgdigits=0123456789
117c6a6acfbSmrgalpha=${upper}${lower}
118c6a6acfbSmrg
11966fe65f6Smrgif test -z "$depmode" || test -z "$source" || test -z "$object"; then
12066fe65f6Smrg  echo "depcomp: Variables source, object and depmode must be set" 1>&2
12166fe65f6Smrg  exit 1
12266fe65f6Smrgfi
12366fe65f6Smrg
12466fe65f6Smrg# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.
12566fe65f6Smrgdepfile=${depfile-`echo "$object" |
12666fe65f6Smrg  sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`}
12766fe65f6Smrgtmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
12866fe65f6Smrg
12966fe65f6Smrgrm -f "$tmpdepfile"
13066fe65f6Smrg
131c6a6acfbSmrg# Avoid interferences from the environment.
132c6a6acfbSmrggccflag= dashmflag=
133c6a6acfbSmrg
13466fe65f6Smrg# Some modes work just like other modes, but use different flags.  We
13566fe65f6Smrg# parameterize here, but still list the modes in the big case below,
13666fe65f6Smrg# to make depend.m4 easier to write.  Note that we *cannot* use a case
13766fe65f6Smrg# here, because this file can only contain one case statement.
13866fe65f6Smrgif test "$depmode" = hp; then
13966fe65f6Smrg  # HP compiler uses -M and no extra arg.
14066fe65f6Smrg  gccflag=-M
14166fe65f6Smrg  depmode=gcc
14266fe65f6Smrgfi
14366fe65f6Smrg
14466fe65f6Smrgif test "$depmode" = dashXmstdout; then
145c6a6acfbSmrg  # This is just like dashmstdout with a different argument.
146c6a6acfbSmrg  dashmflag=-xM
147c6a6acfbSmrg  depmode=dashmstdout
14866fe65f6Smrgfi
14966fe65f6Smrg
150a9274bcdSmrgcygpath_u="cygpath -u -f -"
151a9274bcdSmrgif test "$depmode" = msvcmsys; then
152c6a6acfbSmrg  # This is just like msvisualcpp but w/o cygpath translation.
153c6a6acfbSmrg  # Just convert the backslash-escaped backslashes to single forward
154c6a6acfbSmrg  # slashes to satisfy depend.m4
155c6a6acfbSmrg  cygpath_u='sed s,\\\\,/,g'
156c6a6acfbSmrg  depmode=msvisualcpp
157c6a6acfbSmrgfi
158c6a6acfbSmrg
159c6a6acfbSmrgif test "$depmode" = msvc7msys; then
160c6a6acfbSmrg  # This is just like msvc7 but w/o cygpath translation.
161c6a6acfbSmrg  # Just convert the backslash-escaped backslashes to single forward
162c6a6acfbSmrg  # slashes to satisfy depend.m4
163c6a6acfbSmrg  cygpath_u='sed s,\\\\,/,g'
164c6a6acfbSmrg  depmode=msvc7
165c6a6acfbSmrgfi
166c6a6acfbSmrg
167c6a6acfbSmrgif test "$depmode" = xlc; then
168c6a6acfbSmrg  # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information.
169c6a6acfbSmrg  gccflag=-qmakedep=gcc,-MF
170c6a6acfbSmrg  depmode=gcc
171a9274bcdSmrgfi
172a9274bcdSmrg
17366fe65f6Smrgcase "$depmode" in
17466fe65f6Smrggcc3)
17566fe65f6Smrg## gcc 3 implements dependency tracking that does exactly what
17666fe65f6Smrg## we want.  Yay!  Note: for some reason libtool 1.4 doesn't like
17766fe65f6Smrg## it if -MD -MP comes after the -MF stuff.  Hmm.
17889d09728Smrg## Unfortunately, FreeBSD c89 acceptance of flags depends upon
17989d09728Smrg## the command line argument order; so add the flags where they
18089d09728Smrg## appear in depend2.am.  Note that the slowdown incurred here
18189d09728Smrg## affects only configure: in makefiles, %FASTDEP% shortcuts this.
18289d09728Smrg  for arg
18389d09728Smrg  do
18489d09728Smrg    case $arg in
18589d09728Smrg    -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;;
18689d09728Smrg    *)  set fnord "$@" "$arg" ;;
18789d09728Smrg    esac
18889d09728Smrg    shift # fnord
18989d09728Smrg    shift # $arg
19089d09728Smrg  done
19189d09728Smrg  "$@"
19266fe65f6Smrg  stat=$?
193c6a6acfbSmrg  if test $stat -ne 0; then
19466fe65f6Smrg    rm -f "$tmpdepfile"
19566fe65f6Smrg    exit $stat
19666fe65f6Smrg  fi
19766fe65f6Smrg  mv "$tmpdepfile" "$depfile"
19866fe65f6Smrg  ;;
19966fe65f6Smrg
20066fe65f6Smrggcc)
201c6a6acfbSmrg## Note that this doesn't just cater to obsosete pre-3.x GCC compilers.
202c6a6acfbSmrg## but also to in-use compilers like IMB xlc/xlC and the HP C compiler.
203c6a6acfbSmrg## (see the conditional assignment to $gccflag above).
20466fe65f6Smrg## There are various ways to get dependency output from gcc.  Here's
20566fe65f6Smrg## why we pick this rather obscure method:
20666fe65f6Smrg## - Don't want to use -MD because we'd like the dependencies to end
20766fe65f6Smrg##   up in a subdir.  Having to rename by hand is ugly.
20866fe65f6Smrg##   (We might end up doing this anyway to support other compilers.)
20966fe65f6Smrg## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
210c6a6acfbSmrg##   -MM, not -M (despite what the docs say).  Also, it might not be
211c6a6acfbSmrg##   supported by the other compilers which use the 'gcc' depmode.
21266fe65f6Smrg## - Using -M directly means running the compiler twice (even worse
21366fe65f6Smrg##   than renaming).
21466fe65f6Smrg  if test -z "$gccflag"; then
21566fe65f6Smrg    gccflag=-MD,
21666fe65f6Smrg  fi
21766fe65f6Smrg  "$@" -Wp,"$gccflag$tmpdepfile"
21866fe65f6Smrg  stat=$?
219c6a6acfbSmrg  if test $stat -ne 0; then
22066fe65f6Smrg    rm -f "$tmpdepfile"
22166fe65f6Smrg    exit $stat
22266fe65f6Smrg  fi
22366fe65f6Smrg  rm -f "$depfile"
22466fe65f6Smrg  echo "$object : \\" > "$depfile"
225c6a6acfbSmrg  # The second -e expression handles DOS-style file names with drive
226c6a6acfbSmrg  # letters.
22766fe65f6Smrg  sed -e 's/^[^:]*: / /' \
22866fe65f6Smrg      -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
229c6a6acfbSmrg## This next piece of magic avoids the "deleted header file" problem.
23066fe65f6Smrg## The problem is that when a header file which appears in a .P file
23166fe65f6Smrg## is deleted, the dependency causes make to die (because there is
23266fe65f6Smrg## typically no way to rebuild the header).  We avoid this by adding
23366fe65f6Smrg## dummy dependencies for each header file.  Too bad gcc doesn't do
23466fe65f6Smrg## this for us directly.
235c6a6acfbSmrg## Some versions of gcc put a space before the ':'.  On the theory
23666fe65f6Smrg## that the space means something, we add a space to the output as
237c6a6acfbSmrg## well.  hp depmode also adds that space, but also prefixes the VPATH
238c6a6acfbSmrg## to the object.  Take care to not repeat it in the output.
23966fe65f6Smrg## Some versions of the HPUX 10.20 sed can't process this invocation
24066fe65f6Smrg## correctly.  Breaking it into two sed invocations is a workaround.
241c6a6acfbSmrg  tr ' ' "$nl" < "$tmpdepfile" \
242c6a6acfbSmrg    | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \
243c6a6acfbSmrg    | sed -e 's/$/ :/' >> "$depfile"
24466fe65f6Smrg  rm -f "$tmpdepfile"
24566fe65f6Smrg  ;;
24666fe65f6Smrg
24766fe65f6Smrghp)
24866fe65f6Smrg  # This case exists only to let depend.m4 do its work.  It works by
24966fe65f6Smrg  # looking at the text of this script.  This case will never be run,
25066fe65f6Smrg  # since it is checked for above.
25166fe65f6Smrg  exit 1
25266fe65f6Smrg  ;;
25366fe65f6Smrg
25466fe65f6Smrgsgi)
25566fe65f6Smrg  if test "$libtool" = yes; then
25666fe65f6Smrg    "$@" "-Wp,-MDupdate,$tmpdepfile"
25766fe65f6Smrg  else
25866fe65f6Smrg    "$@" -MDupdate "$tmpdepfile"
25966fe65f6Smrg  fi
26066fe65f6Smrg  stat=$?
261c6a6acfbSmrg  if test $stat -ne 0; then
26266fe65f6Smrg    rm -f "$tmpdepfile"
26366fe65f6Smrg    exit $stat
26466fe65f6Smrg  fi
26566fe65f6Smrg  rm -f "$depfile"
26666fe65f6Smrg
26766fe65f6Smrg  if test -f "$tmpdepfile"; then  # yes, the sourcefile depend on other files
26866fe65f6Smrg    echo "$object : \\" > "$depfile"
26966fe65f6Smrg    # Clip off the initial element (the dependent).  Don't try to be
27066fe65f6Smrg    # clever and replace this with sed code, as IRIX sed won't handle
27166fe65f6Smrg    # lines with more than a fixed number of characters (4096 in
27266fe65f6Smrg    # IRIX 6.2 sed, 8192 in IRIX 6.5).  We also remove comment lines;
273c6a6acfbSmrg    # the IRIX cc adds comments like '#:fec' to the end of the
27466fe65f6Smrg    # dependency line.
275c6a6acfbSmrg    tr ' ' "$nl" < "$tmpdepfile" \
276c6a6acfbSmrg      | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \
277c6a6acfbSmrg      | tr "$nl" ' ' >> "$depfile"
278a9274bcdSmrg    echo >> "$depfile"
27966fe65f6Smrg    # The second pass generates a dummy entry for each header file.
280c6a6acfbSmrg    tr ' ' "$nl" < "$tmpdepfile" \
281c6a6acfbSmrg      | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
282c6a6acfbSmrg      >> "$depfile"
28366fe65f6Smrg  else
284c6a6acfbSmrg    make_dummy_depfile
28566fe65f6Smrg  fi
28666fe65f6Smrg  rm -f "$tmpdepfile"
28766fe65f6Smrg  ;;
28866fe65f6Smrg
289c6a6acfbSmrgxlc)
290c6a6acfbSmrg  # This case exists only to let depend.m4 do its work.  It works by
291c6a6acfbSmrg  # looking at the text of this script.  This case will never be run,
292c6a6acfbSmrg  # since it is checked for above.
293c6a6acfbSmrg  exit 1
294c6a6acfbSmrg  ;;
295c6a6acfbSmrg
29666fe65f6Smrgaix)
29766fe65f6Smrg  # The C for AIX Compiler uses -M and outputs the dependencies
29866fe65f6Smrg  # in a .u file.  In older versions, this file always lives in the
299c6a6acfbSmrg  # current directory.  Also, the AIX compiler puts '$object:' at the
30066fe65f6Smrg  # start of each line; $object doesn't have directory information.
30166fe65f6Smrg  # Version 6 uses the directory in both cases.
302c6a6acfbSmrg  set_dir_from "$object"
303c6a6acfbSmrg  set_base_from "$object"
30466fe65f6Smrg  if test "$libtool" = yes; then
30589d09728Smrg    tmpdepfile1=$dir$base.u
30689d09728Smrg    tmpdepfile2=$base.u
30789d09728Smrg    tmpdepfile3=$dir.libs/$base.u
30866fe65f6Smrg    "$@" -Wc,-M
30966fe65f6Smrg  else
31089d09728Smrg    tmpdepfile1=$dir$base.u
31189d09728Smrg    tmpdepfile2=$dir$base.u
31289d09728Smrg    tmpdepfile3=$dir$base.u
31366fe65f6Smrg    "$@" -M
31466fe65f6Smrg  fi
31566fe65f6Smrg  stat=$?
316c6a6acfbSmrg  if test $stat -ne 0; then
31789d09728Smrg    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
31866fe65f6Smrg    exit $stat
31966fe65f6Smrg  fi
32066fe65f6Smrg
32189d09728Smrg  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
32289d09728Smrg  do
32389d09728Smrg    test -f "$tmpdepfile" && break
32489d09728Smrg  done
325c6a6acfbSmrg  aix_post_process_depfile
326c6a6acfbSmrg  ;;
327c6a6acfbSmrg
328c6a6acfbSmrgtcc)
329c6a6acfbSmrg  # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26
330c6a6acfbSmrg  # FIXME: That version still under development at the moment of writing.
331c6a6acfbSmrg  #        Make that this statement remains true also for stable, released
332c6a6acfbSmrg  #        versions.
333c6a6acfbSmrg  # It will wrap lines (doesn't matter whether long or short) with a
334c6a6acfbSmrg  # trailing '\', as in:
335c6a6acfbSmrg  #
336c6a6acfbSmrg  #   foo.o : \
337c6a6acfbSmrg  #    foo.c \
338c6a6acfbSmrg  #    foo.h \
339c6a6acfbSmrg  #
340c6a6acfbSmrg  # It will put a trailing '\' even on the last line, and will use leading
341c6a6acfbSmrg  # spaces rather than leading tabs (at least since its commit 0394caf7
342c6a6acfbSmrg  # "Emit spaces for -MD").
343c6a6acfbSmrg  "$@" -MD -MF "$tmpdepfile"
344c6a6acfbSmrg  stat=$?
345c6a6acfbSmrg  if test $stat -ne 0; then
346c6a6acfbSmrg    rm -f "$tmpdepfile"
347c6a6acfbSmrg    exit $stat
34866fe65f6Smrg  fi
349c6a6acfbSmrg  rm -f "$depfile"
350c6a6acfbSmrg  # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'.
351c6a6acfbSmrg  # We have to change lines of the first kind to '$object: \'.
352c6a6acfbSmrg  sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile"
353c6a6acfbSmrg  # And for each line of the second kind, we have to emit a 'dep.h:'
354c6a6acfbSmrg  # dummy dependency, to avoid the deleted-header problem.
355c6a6acfbSmrg  sed -n -e 's|^  *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile"
35666fe65f6Smrg  rm -f "$tmpdepfile"
35766fe65f6Smrg  ;;
35866fe65f6Smrg
359c6a6acfbSmrg## The order of this option in the case statement is important, since the
360c6a6acfbSmrg## shell code in configure will try each of these formats in the order
361c6a6acfbSmrg## listed in this file.  A plain '-MD' option would be understood by many
362c6a6acfbSmrg## compilers, so we must ensure this comes after the gcc and icc options.
363c6a6acfbSmrgpgcc)
364c6a6acfbSmrg  # Portland's C compiler understands '-MD'.
365c6a6acfbSmrg  # Will always output deps to 'file.d' where file is the root name of the
366c6a6acfbSmrg  # source file under compilation, even if file resides in a subdirectory.
367c6a6acfbSmrg  # The object file name does not affect the name of the '.d' file.
368c6a6acfbSmrg  # pgcc 10.2 will output
36966fe65f6Smrg  #    foo.o: sub/foo.c sub/foo.h
370c6a6acfbSmrg  # and will wrap long lines using '\' :
37166fe65f6Smrg  #    foo.o: sub/foo.c ... \
37266fe65f6Smrg  #     sub/foo.h ... \
37366fe65f6Smrg  #     ...
374c6a6acfbSmrg  set_dir_from "$object"
375c6a6acfbSmrg  # Use the source, not the object, to determine the base name, since
376c6a6acfbSmrg  # that's sadly what pgcc will do too.
377c6a6acfbSmrg  set_base_from "$source"
378c6a6acfbSmrg  tmpdepfile=$base.d
379c6a6acfbSmrg
380c6a6acfbSmrg  # For projects that build the same source file twice into different object
381c6a6acfbSmrg  # files, the pgcc approach of using the *source* file root name can cause
382c6a6acfbSmrg  # problems in parallel builds.  Use a locking strategy to avoid stomping on
383c6a6acfbSmrg  # the same $tmpdepfile.
384c6a6acfbSmrg  lockdir=$base.d-lock
385c6a6acfbSmrg  trap "
386c6a6acfbSmrg    echo '$0: caught signal, cleaning up...' >&2
387c6a6acfbSmrg    rmdir '$lockdir'
388c6a6acfbSmrg    exit 1
389c6a6acfbSmrg  " 1 2 13 15
390c6a6acfbSmrg  numtries=100
391c6a6acfbSmrg  i=$numtries
392c6a6acfbSmrg  while test $i -gt 0; do
393c6a6acfbSmrg    # mkdir is a portable test-and-set.
394c6a6acfbSmrg    if mkdir "$lockdir" 2>/dev/null; then
395c6a6acfbSmrg      # This process acquired the lock.
396c6a6acfbSmrg      "$@" -MD
397c6a6acfbSmrg      stat=$?
398c6a6acfbSmrg      # Release the lock.
399c6a6acfbSmrg      rmdir "$lockdir"
400c6a6acfbSmrg      break
401c6a6acfbSmrg    else
402c6a6acfbSmrg      # If the lock is being held by a different process, wait
403c6a6acfbSmrg      # until the winning process is done or we timeout.
404c6a6acfbSmrg      while test -d "$lockdir" && test $i -gt 0; do
405c6a6acfbSmrg        sleep 1
406c6a6acfbSmrg        i=`expr $i - 1`
407c6a6acfbSmrg      done
408c6a6acfbSmrg    fi
409c6a6acfbSmrg    i=`expr $i - 1`
410c6a6acfbSmrg  done
411c6a6acfbSmrg  trap - 1 2 13 15
412c6a6acfbSmrg  if test $i -le 0; then
413c6a6acfbSmrg    echo "$0: failed to acquire lock after $numtries attempts" >&2
414c6a6acfbSmrg    echo "$0: check lockdir '$lockdir'" >&2
415c6a6acfbSmrg    exit 1
416c6a6acfbSmrg  fi
41766fe65f6Smrg
418c6a6acfbSmrg  if test $stat -ne 0; then
41966fe65f6Smrg    rm -f "$tmpdepfile"
42066fe65f6Smrg    exit $stat
42166fe65f6Smrg  fi
42266fe65f6Smrg  rm -f "$depfile"
42366fe65f6Smrg  # Each line is of the form `foo.o: dependent.h',
42466fe65f6Smrg  # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'.
42566fe65f6Smrg  # Do two passes, one to just change these to
42666fe65f6Smrg  # `$object: dependent.h' and one to simply `dependent.h:'.
42766fe65f6Smrg  sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
42866fe65f6Smrg  # Some versions of the HPUX 10.20 sed can't process this invocation
42966fe65f6Smrg  # correctly.  Breaking it into two sed invocations is a workaround.
430c6a6acfbSmrg  sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \
431c6a6acfbSmrg    | sed -e 's/$/ :/' >> "$depfile"
43266fe65f6Smrg  rm -f "$tmpdepfile"
43366fe65f6Smrg  ;;
43466fe65f6Smrg
43589d09728Smrghp2)
43689d09728Smrg  # The "hp" stanza above does not work with aCC (C++) and HP's ia64
43789d09728Smrg  # compilers, which have integrated preprocessors.  The correct option
43889d09728Smrg  # to use with these is +Maked; it writes dependencies to a file named
43989d09728Smrg  # 'foo.d', which lands next to the object file, wherever that
44089d09728Smrg  # happens to be.
44189d09728Smrg  # Much of this is similar to the tru64 case; see comments there.
442c6a6acfbSmrg  set_dir_from  "$object"
443c6a6acfbSmrg  set_base_from "$object"
44489d09728Smrg  if test "$libtool" = yes; then
44589d09728Smrg    tmpdepfile1=$dir$base.d
44689d09728Smrg    tmpdepfile2=$dir.libs/$base.d
44789d09728Smrg    "$@" -Wc,+Maked
44889d09728Smrg  else
44989d09728Smrg    tmpdepfile1=$dir$base.d
45089d09728Smrg    tmpdepfile2=$dir$base.d
45189d09728Smrg    "$@" +Maked
45289d09728Smrg  fi
45389d09728Smrg  stat=$?
454c6a6acfbSmrg  if test $stat -ne 0; then
45589d09728Smrg     rm -f "$tmpdepfile1" "$tmpdepfile2"
45689d09728Smrg     exit $stat
45789d09728Smrg  fi
45889d09728Smrg
45989d09728Smrg  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2"
46089d09728Smrg  do
46189d09728Smrg    test -f "$tmpdepfile" && break
46289d09728Smrg  done
46389d09728Smrg  if test -f "$tmpdepfile"; then
464c6a6acfbSmrg    sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile"
465c6a6acfbSmrg    # Add 'dependent.h:' lines.
466a9274bcdSmrg    sed -ne '2,${
467c6a6acfbSmrg               s/^ *//
468c6a6acfbSmrg               s/ \\*$//
469c6a6acfbSmrg               s/$/:/
470c6a6acfbSmrg               p
471c6a6acfbSmrg             }' "$tmpdepfile" >> "$depfile"
47289d09728Smrg  else
473c6a6acfbSmrg    make_dummy_depfile
47489d09728Smrg  fi
47589d09728Smrg  rm -f "$tmpdepfile" "$tmpdepfile2"
47689d09728Smrg  ;;
47789d09728Smrg
47866fe65f6Smrgtru64)
479c6a6acfbSmrg  # The Tru64 compiler uses -MD to generate dependencies as a side
480c6a6acfbSmrg  # effect.  'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'.
481c6a6acfbSmrg  # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
482c6a6acfbSmrg  # dependencies in 'foo.d' instead, so we check for that too.
483c6a6acfbSmrg  # Subdirectories are respected.
484c6a6acfbSmrg  set_dir_from  "$object"
485c6a6acfbSmrg  set_base_from "$object"
486c6a6acfbSmrg
487c6a6acfbSmrg  if test "$libtool" = yes; then
488c6a6acfbSmrg    # Libtool generates 2 separate objects for the 2 libraries.  These
489c6a6acfbSmrg    # two compilations output dependencies in $dir.libs/$base.o.d and
490c6a6acfbSmrg    # in $dir$base.o.d.  We have to check for both files, because
491c6a6acfbSmrg    # one of the two compilations can be disabled.  We should prefer
492c6a6acfbSmrg    # $dir$base.o.d over $dir.libs/$base.o.d because the latter is
493c6a6acfbSmrg    # automatically cleaned when .libs/ is deleted, while ignoring
494c6a6acfbSmrg    # the former would cause a distcleancheck panic.
495c6a6acfbSmrg    tmpdepfile1=$dir$base.o.d          # libtool 1.5
496c6a6acfbSmrg    tmpdepfile2=$dir.libs/$base.o.d    # Likewise.
497c6a6acfbSmrg    tmpdepfile3=$dir.libs/$base.d      # Compaq CCC V6.2-504
498c6a6acfbSmrg    "$@" -Wc,-MD
499c6a6acfbSmrg  else
500c6a6acfbSmrg    tmpdepfile1=$dir$base.d
501c6a6acfbSmrg    tmpdepfile2=$dir$base.d
502c6a6acfbSmrg    tmpdepfile3=$dir$base.d
503c6a6acfbSmrg    "$@" -MD
504c6a6acfbSmrg  fi
505c6a6acfbSmrg
506c6a6acfbSmrg  stat=$?
507c6a6acfbSmrg  if test $stat -ne 0; then
508c6a6acfbSmrg    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
509c6a6acfbSmrg    exit $stat
510c6a6acfbSmrg  fi
511c6a6acfbSmrg
512c6a6acfbSmrg  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
513c6a6acfbSmrg  do
514c6a6acfbSmrg    test -f "$tmpdepfile" && break
515c6a6acfbSmrg  done
516c6a6acfbSmrg  # Same post-processing that is required for AIX mode.
517c6a6acfbSmrg  aix_post_process_depfile
518c6a6acfbSmrg  ;;
519c6a6acfbSmrg
520c6a6acfbSmrgmsvc7)
521c6a6acfbSmrg  if test "$libtool" = yes; then
522c6a6acfbSmrg    showIncludes=-Wc,-showIncludes
523c6a6acfbSmrg  else
524c6a6acfbSmrg    showIncludes=-showIncludes
525c6a6acfbSmrg  fi
526c6a6acfbSmrg  "$@" $showIncludes > "$tmpdepfile"
527c6a6acfbSmrg  stat=$?
528c6a6acfbSmrg  grep -v '^Note: including file: ' "$tmpdepfile"
529c6a6acfbSmrg  if test $stat -ne 0; then
530c6a6acfbSmrg    rm -f "$tmpdepfile"
531c6a6acfbSmrg    exit $stat
532c6a6acfbSmrg  fi
533c6a6acfbSmrg  rm -f "$depfile"
534c6a6acfbSmrg  echo "$object : \\" > "$depfile"
535c6a6acfbSmrg  # The first sed program below extracts the file names and escapes
536c6a6acfbSmrg  # backslashes for cygpath.  The second sed program outputs the file
537c6a6acfbSmrg  # name when reading, but also accumulates all include files in the
538c6a6acfbSmrg  # hold buffer in order to output them again at the end.  This only
539c6a6acfbSmrg  # works with sed implementations that can handle large buffers.
540c6a6acfbSmrg  sed < "$tmpdepfile" -n '
541c6a6acfbSmrg/^Note: including file:  *\(.*\)/ {
542c6a6acfbSmrg  s//\1/
543c6a6acfbSmrg  s/\\/\\\\/g
544c6a6acfbSmrg  p
545c6a6acfbSmrg}' | $cygpath_u | sort -u | sed -n '
546c6a6acfbSmrgs/ /\\ /g
547c6a6acfbSmrgs/\(.*\)/'"$tab"'\1 \\/p
548c6a6acfbSmrgs/.\(.*\) \\/\1:/
549c6a6acfbSmrgH
550c6a6acfbSmrg$ {
551c6a6acfbSmrg  s/.*/'"$tab"'/
552c6a6acfbSmrg  G
553c6a6acfbSmrg  p
554c6a6acfbSmrg}' >> "$depfile"
555c6a6acfbSmrg  echo >> "$depfile" # make sure the fragment doesn't end with a backslash
556c6a6acfbSmrg  rm -f "$tmpdepfile"
557c6a6acfbSmrg  ;;
558c6a6acfbSmrg
559c6a6acfbSmrgmsvc7msys)
560c6a6acfbSmrg  # This case exists only to let depend.m4 do its work.  It works by
561c6a6acfbSmrg  # looking at the text of this script.  This case will never be run,
562c6a6acfbSmrg  # since it is checked for above.
563c6a6acfbSmrg  exit 1
564c6a6acfbSmrg  ;;
56566fe65f6Smrg
56666fe65f6Smrg#nosideeffect)
56766fe65f6Smrg  # This comment above is used by automake to tell side-effect
56866fe65f6Smrg  # dependency tracking mechanisms from slower ones.
56966fe65f6Smrg
57066fe65f6Smrgdashmstdout)
57166fe65f6Smrg  # Important note: in order to support this mode, a compiler *must*
57266fe65f6Smrg  # always write the preprocessed file to stdout, regardless of -o.
57366fe65f6Smrg  "$@" || exit $?
57466fe65f6Smrg
57566fe65f6Smrg  # Remove the call to Libtool.
57666fe65f6Smrg  if test "$libtool" = yes; then
577a9274bcdSmrg    while test "X$1" != 'X--mode=compile'; do
57866fe65f6Smrg      shift
57966fe65f6Smrg    done
58066fe65f6Smrg    shift
58166fe65f6Smrg  fi
58266fe65f6Smrg
583c6a6acfbSmrg  # Remove '-o $object'.
58466fe65f6Smrg  IFS=" "
58566fe65f6Smrg  for arg
58666fe65f6Smrg  do
58766fe65f6Smrg    case $arg in
58866fe65f6Smrg    -o)
58966fe65f6Smrg      shift
59066fe65f6Smrg      ;;
59166fe65f6Smrg    $object)
59266fe65f6Smrg      shift
59366fe65f6Smrg      ;;
59466fe65f6Smrg    *)
59566fe65f6Smrg      set fnord "$@" "$arg"
59666fe65f6Smrg      shift # fnord
59766fe65f6Smrg      shift # $arg
59866fe65f6Smrg      ;;
59966fe65f6Smrg    esac
60066fe65f6Smrg  done
60166fe65f6Smrg
60266fe65f6Smrg  test -z "$dashmflag" && dashmflag=-M
603c6a6acfbSmrg  # Require at least two characters before searching for ':'
60466fe65f6Smrg  # in the target name.  This is to cope with DOS-style filenames:
605c6a6acfbSmrg  # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise.
60666fe65f6Smrg  "$@" $dashmflag |
607c6a6acfbSmrg    sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile"
60866fe65f6Smrg  rm -f "$depfile"
60966fe65f6Smrg  cat < "$tmpdepfile" > "$depfile"
610c6a6acfbSmrg  # Some versions of the HPUX 10.20 sed can't process this sed invocation
611c6a6acfbSmrg  # correctly.  Breaking it into two sed invocations is a workaround.
612c6a6acfbSmrg  tr ' ' "$nl" < "$tmpdepfile" \
613c6a6acfbSmrg    | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
614c6a6acfbSmrg    | sed -e 's/$/ :/' >> "$depfile"
61566fe65f6Smrg  rm -f "$tmpdepfile"
61666fe65f6Smrg  ;;
61766fe65f6Smrg
61866fe65f6SmrgdashXmstdout)
61966fe65f6Smrg  # This case only exists to satisfy depend.m4.  It is never actually
62066fe65f6Smrg  # run, as this mode is specially recognized in the preamble.
62166fe65f6Smrg  exit 1
62266fe65f6Smrg  ;;
62366fe65f6Smrg
62466fe65f6Smrgmakedepend)
62566fe65f6Smrg  "$@" || exit $?
62666fe65f6Smrg  # Remove any Libtool call
62766fe65f6Smrg  if test "$libtool" = yes; then
628a9274bcdSmrg    while test "X$1" != 'X--mode=compile'; do
62966fe65f6Smrg      shift
63066fe65f6Smrg    done
63166fe65f6Smrg    shift
63266fe65f6Smrg  fi
63366fe65f6Smrg  # X makedepend
63466fe65f6Smrg  shift
635a9274bcdSmrg  cleared=no eat=no
636a9274bcdSmrg  for arg
637a9274bcdSmrg  do
63866fe65f6Smrg    case $cleared in
63966fe65f6Smrg    no)
64066fe65f6Smrg      set ""; shift
64166fe65f6Smrg      cleared=yes ;;
64266fe65f6Smrg    esac
643a9274bcdSmrg    if test $eat = yes; then
644a9274bcdSmrg      eat=no
645a9274bcdSmrg      continue
646a9274bcdSmrg    fi
64766fe65f6Smrg    case "$arg" in
64866fe65f6Smrg    -D*|-I*)
64966fe65f6Smrg      set fnord "$@" "$arg"; shift ;;
65066fe65f6Smrg    # Strip any option that makedepend may not understand.  Remove
65166fe65f6Smrg    # the object too, otherwise makedepend will parse it as a source file.
652a9274bcdSmrg    -arch)
653a9274bcdSmrg      eat=yes ;;
65466fe65f6Smrg    -*|$object)
65566fe65f6Smrg      ;;
65666fe65f6Smrg    *)
65766fe65f6Smrg      set fnord "$@" "$arg"; shift ;;
65866fe65f6Smrg    esac
65966fe65f6Smrg  done
660a9274bcdSmrg  obj_suffix=`echo "$object" | sed 's/^.*\././'`
66166fe65f6Smrg  touch "$tmpdepfile"
66266fe65f6Smrg  ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
66366fe65f6Smrg  rm -f "$depfile"
664c6a6acfbSmrg  # makedepend may prepend the VPATH from the source file name to the object.
665c6a6acfbSmrg  # No need to regex-escape $object, excess matching of '.' is harmless.
666c6a6acfbSmrg  sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile"
667c6a6acfbSmrg  # Some versions of the HPUX 10.20 sed can't process the last invocation
668c6a6acfbSmrg  # correctly.  Breaking it into two sed invocations is a workaround.
669c6a6acfbSmrg  sed '1,2d' "$tmpdepfile" \
670c6a6acfbSmrg    | tr ' ' "$nl" \
671c6a6acfbSmrg    | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
672c6a6acfbSmrg    | sed -e 's/$/ :/' >> "$depfile"
67366fe65f6Smrg  rm -f "$tmpdepfile" "$tmpdepfile".bak
67466fe65f6Smrg  ;;
67566fe65f6Smrg
67666fe65f6Smrgcpp)
67766fe65f6Smrg  # Important note: in order to support this mode, a compiler *must*
67866fe65f6Smrg  # always write the preprocessed file to stdout.
67966fe65f6Smrg  "$@" || exit $?
68066fe65f6Smrg
68166fe65f6Smrg  # Remove the call to Libtool.
68266fe65f6Smrg  if test "$libtool" = yes; then
683a9274bcdSmrg    while test "X$1" != 'X--mode=compile'; do
68466fe65f6Smrg      shift
68566fe65f6Smrg    done
68666fe65f6Smrg    shift
68766fe65f6Smrg  fi
68866fe65f6Smrg
689c6a6acfbSmrg  # Remove '-o $object'.
69066fe65f6Smrg  IFS=" "
69166fe65f6Smrg  for arg
69266fe65f6Smrg  do
69366fe65f6Smrg    case $arg in
69466fe65f6Smrg    -o)
69566fe65f6Smrg      shift
69666fe65f6Smrg      ;;
69766fe65f6Smrg    $object)
69866fe65f6Smrg      shift
69966fe65f6Smrg      ;;
70066fe65f6Smrg    *)
70166fe65f6Smrg      set fnord "$@" "$arg"
70266fe65f6Smrg      shift # fnord
70366fe65f6Smrg      shift # $arg
70466fe65f6Smrg      ;;
70566fe65f6Smrg    esac
70666fe65f6Smrg  done
70766fe65f6Smrg
708c6a6acfbSmrg  "$@" -E \
709c6a6acfbSmrg    | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
710c6a6acfbSmrg             -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
711c6a6acfbSmrg    | sed '$ s: \\$::' > "$tmpdepfile"
71266fe65f6Smrg  rm -f "$depfile"
71366fe65f6Smrg  echo "$object : \\" > "$depfile"
71466fe65f6Smrg  cat < "$tmpdepfile" >> "$depfile"
71566fe65f6Smrg  sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
71666fe65f6Smrg  rm -f "$tmpdepfile"
71766fe65f6Smrg  ;;
71866fe65f6Smrg
71966fe65f6Smrgmsvisualcpp)
72066fe65f6Smrg  # Important note: in order to support this mode, a compiler *must*
721a9274bcdSmrg  # always write the preprocessed file to stdout.
72266fe65f6Smrg  "$@" || exit $?
723a9274bcdSmrg
724a9274bcdSmrg  # Remove the call to Libtool.
725a9274bcdSmrg  if test "$libtool" = yes; then
726a9274bcdSmrg    while test "X$1" != 'X--mode=compile'; do
727a9274bcdSmrg      shift
728a9274bcdSmrg    done
729a9274bcdSmrg    shift
730a9274bcdSmrg  fi
731a9274bcdSmrg
73266fe65f6Smrg  IFS=" "
73366fe65f6Smrg  for arg
73466fe65f6Smrg  do
73566fe65f6Smrg    case "$arg" in
736a9274bcdSmrg    -o)
737a9274bcdSmrg      shift
738a9274bcdSmrg      ;;
739a9274bcdSmrg    $object)
740a9274bcdSmrg      shift
741a9274bcdSmrg      ;;
74266fe65f6Smrg    "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
743c6a6acfbSmrg        set fnord "$@"
744c6a6acfbSmrg        shift
745c6a6acfbSmrg        shift
746c6a6acfbSmrg        ;;
74766fe65f6Smrg    *)
748c6a6acfbSmrg        set fnord "$@" "$arg"
749c6a6acfbSmrg        shift
750c6a6acfbSmrg        shift
751c6a6acfbSmrg        ;;
75266fe65f6Smrg    esac
75366fe65f6Smrg  done
754a9274bcdSmrg  "$@" -E 2>/dev/null |
755a9274bcdSmrg  sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile"
75666fe65f6Smrg  rm -f "$depfile"
75766fe65f6Smrg  echo "$object : \\" > "$depfile"
758c6a6acfbSmrg  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile"
759c6a6acfbSmrg  echo "$tab" >> "$depfile"
760a9274bcdSmrg  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile"
76166fe65f6Smrg  rm -f "$tmpdepfile"
76266fe65f6Smrg  ;;
76366fe65f6Smrg
764a9274bcdSmrgmsvcmsys)
765a9274bcdSmrg  # This case exists only to let depend.m4 do its work.  It works by
766a9274bcdSmrg  # looking at the text of this script.  This case will never be run,
767a9274bcdSmrg  # since it is checked for above.
768a9274bcdSmrg  exit 1
769a9274bcdSmrg  ;;
770a9274bcdSmrg
77166fe65f6Smrgnone)
77266fe65f6Smrg  exec "$@"
77366fe65f6Smrg  ;;
77466fe65f6Smrg
77566fe65f6Smrg*)
77666fe65f6Smrg  echo "Unknown depmode $depmode" 1>&2
77766fe65f6Smrg  exit 1
77866fe65f6Smrg  ;;
77966fe65f6Smrgesac
78066fe65f6Smrg
78166fe65f6Smrgexit 0
78266fe65f6Smrg
78366fe65f6Smrg# Local Variables:
78466fe65f6Smrg# mode: shell-script
78566fe65f6Smrg# sh-indentation: 2
786bc77032bSmrg# eval: (add-hook 'before-save-hook 'time-stamp)
78766fe65f6Smrg# time-stamp-start: "scriptversion="
78866fe65f6Smrg# time-stamp-format: "%:y-%02m-%02d.%02H"
789bc77032bSmrg# time-stamp-time-zone: "UTC0"
790a9274bcdSmrg# time-stamp-end: "; # UTC"
79166fe65f6Smrg# End:
792