depcomp revision 05bee9bc
1ff7e0accSmrg#! /bin/sh
2ff7e0accSmrg# depcomp - compile a program generating dependencies as side-effects
3ff7e0accSmrg
405bee9bcSmrgscriptversion=2012-10-18.11; # UTC
5ff7e0accSmrg
605bee9bcSmrg# Copyright (C) 1999-2013 Free Software Foundation, Inc.
7ff7e0accSmrg
8ff7e0accSmrg# This program is free software; you can redistribute it and/or modify
9ff7e0accSmrg# it under the terms of the GNU General Public License as published by
10ff7e0accSmrg# the Free Software Foundation; either version 2, or (at your option)
11ff7e0accSmrg# any later version.
12ff7e0accSmrg
13ff7e0accSmrg# This program is distributed in the hope that it will be useful,
14ff7e0accSmrg# but WITHOUT ANY WARRANTY; without even the implied warranty of
15ff7e0accSmrg# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16ff7e0accSmrg# GNU General Public License for more details.
17ff7e0accSmrg
18ff7e0accSmrg# You should have received a copy of the GNU General Public License
1910998002Smrg# along with this program.  If not, see <http://www.gnu.org/licenses/>.
20ff7e0accSmrg
21ff7e0accSmrg# As a special exception to the GNU General Public License, if you
22ff7e0accSmrg# distribute this file as part of a program that contains a
23ff7e0accSmrg# configuration script generated by Autoconf, you may include it under
24ff7e0accSmrg# the same distribution terms that you use for the rest of that program.
25ff7e0accSmrg
26ff7e0accSmrg# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>.
27ff7e0accSmrg
28ff7e0accSmrgcase $1 in
29ff7e0accSmrg  '')
3005bee9bcSmrg    echo "$0: No command.  Try '$0 --help' for more information." 1>&2
3105bee9bcSmrg    exit 1;
3205bee9bcSmrg    ;;
33ff7e0accSmrg  -h | --h*)
34ff7e0accSmrg    cat <<\EOF
35ff7e0accSmrgUsage: depcomp [--help] [--version] PROGRAM [ARGS]
36ff7e0accSmrg
37ff7e0accSmrgRun PROGRAMS ARGS to compile a file, generating dependencies
38ff7e0accSmrgas side-effects.
39ff7e0accSmrg
40ff7e0accSmrgEnvironment variables:
41ff7e0accSmrg  depmode     Dependency tracking mode.
4205bee9bcSmrg  source      Source file read by 'PROGRAMS ARGS'.
4305bee9bcSmrg  object      Object file output by 'PROGRAMS ARGS'.
44ff7e0accSmrg  DEPDIR      directory where to store dependencies.
45ff7e0accSmrg  depfile     Dependency file to output.
4605bee9bcSmrg  tmpdepfile  Temporary file to use when outputting dependencies.
47ff7e0accSmrg  libtool     Whether libtool is used (yes/no).
48ff7e0accSmrg
49ff7e0accSmrgReport bugs to <bug-automake@gnu.org>.
50ff7e0accSmrgEOF
51ff7e0accSmrg    exit $?
52ff7e0accSmrg    ;;
53ff7e0accSmrg  -v | --v*)
54ff7e0accSmrg    echo "depcomp $scriptversion"
55ff7e0accSmrg    exit $?
56ff7e0accSmrg    ;;
57ff7e0accSmrgesac
58ff7e0accSmrg
5905bee9bcSmrg# Get the directory component of the given path, and save it in the
6005bee9bcSmrg# global variables '$dir'.  Note that this directory component will
6105bee9bcSmrg# be either empty or ending with a '/' character.  This is deliberate.
6205bee9bcSmrgset_dir_from ()
6305bee9bcSmrg{
6405bee9bcSmrg  case $1 in
6505bee9bcSmrg    */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;;
6605bee9bcSmrg      *) dir=;;
6705bee9bcSmrg  esac
6805bee9bcSmrg}
6905bee9bcSmrg
7005bee9bcSmrg# Get the suffix-stripped basename of the given path, and save it the
7105bee9bcSmrg# global variable '$base'.
7205bee9bcSmrgset_base_from ()
7305bee9bcSmrg{
7405bee9bcSmrg  base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'`
7505bee9bcSmrg}
7605bee9bcSmrg
7705bee9bcSmrg# If no dependency file was actually created by the compiler invocation,
7805bee9bcSmrg# we still have to create a dummy depfile, to avoid errors with the
7905bee9bcSmrg# Makefile "include basename.Plo" scheme.
8005bee9bcSmrgmake_dummy_depfile ()
8105bee9bcSmrg{
8205bee9bcSmrg  echo "#dummy" > "$depfile"
8305bee9bcSmrg}
8405bee9bcSmrg
8505bee9bcSmrg# Factor out some common post-processing of the generated depfile.
8605bee9bcSmrg# Requires the auxiliary global variable '$tmpdepfile' to be set.
8705bee9bcSmrgaix_post_process_depfile ()
8805bee9bcSmrg{
8905bee9bcSmrg  # If the compiler actually managed to produce a dependency file,
9005bee9bcSmrg  # post-process it.
9105bee9bcSmrg  if test -f "$tmpdepfile"; then
9205bee9bcSmrg    # Each line is of the form 'foo.o: dependency.h'.
9305bee9bcSmrg    # Do two passes, one to just change these to
9405bee9bcSmrg    #   $object: dependency.h
9505bee9bcSmrg    # and one to simply output
9605bee9bcSmrg    #   dependency.h:
9705bee9bcSmrg    # which is needed to avoid the deleted-header problem.
9805bee9bcSmrg    { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile"
9905bee9bcSmrg      sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile"
10005bee9bcSmrg    } > "$depfile"
10105bee9bcSmrg    rm -f "$tmpdepfile"
10205bee9bcSmrg  else
10305bee9bcSmrg    make_dummy_depfile
10405bee9bcSmrg  fi
10505bee9bcSmrg}
10605bee9bcSmrg
10705bee9bcSmrg# A tabulation character.
10805bee9bcSmrgtab='	'
10905bee9bcSmrg# A newline character.
11005bee9bcSmrgnl='
11105bee9bcSmrg'
11205bee9bcSmrg# Character ranges might be problematic outside the C locale.
11305bee9bcSmrg# These definitions help.
11405bee9bcSmrgupper=ABCDEFGHIJKLMNOPQRSTUVWXYZ
11505bee9bcSmrglower=abcdefghijklmnopqrstuvwxyz
11605bee9bcSmrgdigits=0123456789
11705bee9bcSmrgalpha=${upper}${lower}
11805bee9bcSmrg
119ff7e0accSmrgif test -z "$depmode" || test -z "$source" || test -z "$object"; then
120ff7e0accSmrg  echo "depcomp: Variables source, object and depmode must be set" 1>&2
121ff7e0accSmrg  exit 1
122ff7e0accSmrgfi
123ff7e0accSmrg
124ff7e0accSmrg# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.
125ff7e0accSmrgdepfile=${depfile-`echo "$object" |
126ff7e0accSmrg  sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`}
127ff7e0accSmrgtmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
128ff7e0accSmrg
129ff7e0accSmrgrm -f "$tmpdepfile"
130ff7e0accSmrg
13105bee9bcSmrg# Avoid interferences from the environment.
13205bee9bcSmrggccflag= dashmflag=
13305bee9bcSmrg
134ff7e0accSmrg# Some modes work just like other modes, but use different flags.  We
135ff7e0accSmrg# parameterize here, but still list the modes in the big case below,
136ff7e0accSmrg# to make depend.m4 easier to write.  Note that we *cannot* use a case
137ff7e0accSmrg# here, because this file can only contain one case statement.
138ff7e0accSmrgif test "$depmode" = hp; then
139ff7e0accSmrg  # HP compiler uses -M and no extra arg.
140ff7e0accSmrg  gccflag=-M
141ff7e0accSmrg  depmode=gcc
142ff7e0accSmrgfi
143ff7e0accSmrg
144ff7e0accSmrgif test "$depmode" = dashXmstdout; then
14505bee9bcSmrg  # This is just like dashmstdout with a different argument.
14605bee9bcSmrg  dashmflag=-xM
14705bee9bcSmrg  depmode=dashmstdout
148ff7e0accSmrgfi
149ff7e0accSmrg
15010998002Smrgcygpath_u="cygpath -u -f -"
15110998002Smrgif test "$depmode" = msvcmsys; then
15205bee9bcSmrg  # This is just like msvisualcpp but w/o cygpath translation.
15305bee9bcSmrg  # Just convert the backslash-escaped backslashes to single forward
15405bee9bcSmrg  # slashes to satisfy depend.m4
15505bee9bcSmrg  cygpath_u='sed s,\\\\,/,g'
15605bee9bcSmrg  depmode=msvisualcpp
15705bee9bcSmrgfi
15805bee9bcSmrg
15905bee9bcSmrgif test "$depmode" = msvc7msys; then
16005bee9bcSmrg  # This is just like msvc7 but w/o cygpath translation.
16105bee9bcSmrg  # Just convert the backslash-escaped backslashes to single forward
16205bee9bcSmrg  # slashes to satisfy depend.m4
16305bee9bcSmrg  cygpath_u='sed s,\\\\,/,g'
16405bee9bcSmrg  depmode=msvc7
16505bee9bcSmrgfi
16605bee9bcSmrg
16705bee9bcSmrgif test "$depmode" = xlc; then
16805bee9bcSmrg  # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information.
16905bee9bcSmrg  gccflag=-qmakedep=gcc,-MF
17005bee9bcSmrg  depmode=gcc
17110998002Smrgfi
17210998002Smrg
173ff7e0accSmrgcase "$depmode" in
174ff7e0accSmrggcc3)
175ff7e0accSmrg## gcc 3 implements dependency tracking that does exactly what
176ff7e0accSmrg## we want.  Yay!  Note: for some reason libtool 1.4 doesn't like
177ff7e0accSmrg## it if -MD -MP comes after the -MF stuff.  Hmm.
178ff7e0accSmrg## Unfortunately, FreeBSD c89 acceptance of flags depends upon
179ff7e0accSmrg## the command line argument order; so add the flags where they
180ff7e0accSmrg## appear in depend2.am.  Note that the slowdown incurred here
181ff7e0accSmrg## affects only configure: in makefiles, %FASTDEP% shortcuts this.
182ff7e0accSmrg  for arg
183ff7e0accSmrg  do
184ff7e0accSmrg    case $arg in
185ff7e0accSmrg    -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;;
186ff7e0accSmrg    *)  set fnord "$@" "$arg" ;;
187ff7e0accSmrg    esac
188ff7e0accSmrg    shift # fnord
189ff7e0accSmrg    shift # $arg
190ff7e0accSmrg  done
191ff7e0accSmrg  "$@"
192ff7e0accSmrg  stat=$?
19305bee9bcSmrg  if test $stat -ne 0; then
194ff7e0accSmrg    rm -f "$tmpdepfile"
195ff7e0accSmrg    exit $stat
196ff7e0accSmrg  fi
197ff7e0accSmrg  mv "$tmpdepfile" "$depfile"
198ff7e0accSmrg  ;;
199ff7e0accSmrg
200ff7e0accSmrggcc)
20105bee9bcSmrg## Note that this doesn't just cater to obsosete pre-3.x GCC compilers.
20205bee9bcSmrg## but also to in-use compilers like IMB xlc/xlC and the HP C compiler.
20305bee9bcSmrg## (see the conditional assignment to $gccflag above).
204ff7e0accSmrg## There are various ways to get dependency output from gcc.  Here's
205ff7e0accSmrg## why we pick this rather obscure method:
206ff7e0accSmrg## - Don't want to use -MD because we'd like the dependencies to end
207ff7e0accSmrg##   up in a subdir.  Having to rename by hand is ugly.
208ff7e0accSmrg##   (We might end up doing this anyway to support other compilers.)
209ff7e0accSmrg## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
21005bee9bcSmrg##   -MM, not -M (despite what the docs say).  Also, it might not be
21105bee9bcSmrg##   supported by the other compilers which use the 'gcc' depmode.
212ff7e0accSmrg## - Using -M directly means running the compiler twice (even worse
213ff7e0accSmrg##   than renaming).
214ff7e0accSmrg  if test -z "$gccflag"; then
215ff7e0accSmrg    gccflag=-MD,
216ff7e0accSmrg  fi
217ff7e0accSmrg  "$@" -Wp,"$gccflag$tmpdepfile"
218ff7e0accSmrg  stat=$?
21905bee9bcSmrg  if test $stat -ne 0; then
220ff7e0accSmrg    rm -f "$tmpdepfile"
221ff7e0accSmrg    exit $stat
222ff7e0accSmrg  fi
223ff7e0accSmrg  rm -f "$depfile"
224ff7e0accSmrg  echo "$object : \\" > "$depfile"
22505bee9bcSmrg  # The second -e expression handles DOS-style file names with drive
22605bee9bcSmrg  # letters.
227ff7e0accSmrg  sed -e 's/^[^:]*: / /' \
228ff7e0accSmrg      -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
22905bee9bcSmrg## This next piece of magic avoids the "deleted header file" problem.
230ff7e0accSmrg## The problem is that when a header file which appears in a .P file
231ff7e0accSmrg## is deleted, the dependency causes make to die (because there is
232ff7e0accSmrg## typically no way to rebuild the header).  We avoid this by adding
233ff7e0accSmrg## dummy dependencies for each header file.  Too bad gcc doesn't do
234ff7e0accSmrg## this for us directly.
23505bee9bcSmrg## Some versions of gcc put a space before the ':'.  On the theory
236ff7e0accSmrg## that the space means something, we add a space to the output as
23705bee9bcSmrg## well.  hp depmode also adds that space, but also prefixes the VPATH
23805bee9bcSmrg## to the object.  Take care to not repeat it in the output.
239ff7e0accSmrg## Some versions of the HPUX 10.20 sed can't process this invocation
240ff7e0accSmrg## correctly.  Breaking it into two sed invocations is a workaround.
24105bee9bcSmrg  tr ' ' "$nl" < "$tmpdepfile" \
24205bee9bcSmrg    | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \
24305bee9bcSmrg    | sed -e 's/$/ :/' >> "$depfile"
244ff7e0accSmrg  rm -f "$tmpdepfile"
245ff7e0accSmrg  ;;
246ff7e0accSmrg
247ff7e0accSmrghp)
248ff7e0accSmrg  # This case exists only to let depend.m4 do its work.  It works by
249ff7e0accSmrg  # looking at the text of this script.  This case will never be run,
250ff7e0accSmrg  # since it is checked for above.
251ff7e0accSmrg  exit 1
252ff7e0accSmrg  ;;
253ff7e0accSmrg
254ff7e0accSmrgsgi)
255ff7e0accSmrg  if test "$libtool" = yes; then
256ff7e0accSmrg    "$@" "-Wp,-MDupdate,$tmpdepfile"
257ff7e0accSmrg  else
258ff7e0accSmrg    "$@" -MDupdate "$tmpdepfile"
259ff7e0accSmrg  fi
260ff7e0accSmrg  stat=$?
26105bee9bcSmrg  if test $stat -ne 0; then
262ff7e0accSmrg    rm -f "$tmpdepfile"
263ff7e0accSmrg    exit $stat
264ff7e0accSmrg  fi
265ff7e0accSmrg  rm -f "$depfile"
266ff7e0accSmrg
267ff7e0accSmrg  if test -f "$tmpdepfile"; then  # yes, the sourcefile depend on other files
268ff7e0accSmrg    echo "$object : \\" > "$depfile"
269ff7e0accSmrg    # Clip off the initial element (the dependent).  Don't try to be
270ff7e0accSmrg    # clever and replace this with sed code, as IRIX sed won't handle
271ff7e0accSmrg    # lines with more than a fixed number of characters (4096 in
272ff7e0accSmrg    # IRIX 6.2 sed, 8192 in IRIX 6.5).  We also remove comment lines;
27305bee9bcSmrg    # the IRIX cc adds comments like '#:fec' to the end of the
274ff7e0accSmrg    # dependency line.
27505bee9bcSmrg    tr ' ' "$nl" < "$tmpdepfile" \
27605bee9bcSmrg      | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \
27705bee9bcSmrg      | tr "$nl" ' ' >> "$depfile"
27810998002Smrg    echo >> "$depfile"
279ff7e0accSmrg    # The second pass generates a dummy entry for each header file.
28005bee9bcSmrg    tr ' ' "$nl" < "$tmpdepfile" \
28105bee9bcSmrg      | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
28205bee9bcSmrg      >> "$depfile"
283ff7e0accSmrg  else
28405bee9bcSmrg    make_dummy_depfile
285ff7e0accSmrg  fi
286ff7e0accSmrg  rm -f "$tmpdepfile"
287ff7e0accSmrg  ;;
288ff7e0accSmrg
28905bee9bcSmrgxlc)
29005bee9bcSmrg  # This case exists only to let depend.m4 do its work.  It works by
29105bee9bcSmrg  # looking at the text of this script.  This case will never be run,
29205bee9bcSmrg  # since it is checked for above.
29305bee9bcSmrg  exit 1
29405bee9bcSmrg  ;;
29505bee9bcSmrg
296ff7e0accSmrgaix)
297ff7e0accSmrg  # The C for AIX Compiler uses -M and outputs the dependencies
298ff7e0accSmrg  # in a .u file.  In older versions, this file always lives in the
29905bee9bcSmrg  # current directory.  Also, the AIX compiler puts '$object:' at the
300ff7e0accSmrg  # start of each line; $object doesn't have directory information.
301ff7e0accSmrg  # Version 6 uses the directory in both cases.
30205bee9bcSmrg  set_dir_from "$object"
30305bee9bcSmrg  set_base_from "$object"
304ff7e0accSmrg  if test "$libtool" = yes; then
305a005d216Smrg    tmpdepfile1=$dir$base.u
306a005d216Smrg    tmpdepfile2=$base.u
307a005d216Smrg    tmpdepfile3=$dir.libs/$base.u
308ff7e0accSmrg    "$@" -Wc,-M
309ff7e0accSmrg  else
310a005d216Smrg    tmpdepfile1=$dir$base.u
311a005d216Smrg    tmpdepfile2=$dir$base.u
312a005d216Smrg    tmpdepfile3=$dir$base.u
313ff7e0accSmrg    "$@" -M
314ff7e0accSmrg  fi
315ff7e0accSmrg  stat=$?
31605bee9bcSmrg  if test $stat -ne 0; then
317a005d216Smrg    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
318ff7e0accSmrg    exit $stat
319ff7e0accSmrg  fi
320ff7e0accSmrg
321a005d216Smrg  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
322a005d216Smrg  do
323a005d216Smrg    test -f "$tmpdepfile" && break
324a005d216Smrg  done
32505bee9bcSmrg  aix_post_process_depfile
32605bee9bcSmrg  ;;
32705bee9bcSmrg
32805bee9bcSmrgtcc)
32905bee9bcSmrg  # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26
33005bee9bcSmrg  # FIXME: That version still under development at the moment of writing.
33105bee9bcSmrg  #        Make that this statement remains true also for stable, released
33205bee9bcSmrg  #        versions.
33305bee9bcSmrg  # It will wrap lines (doesn't matter whether long or short) with a
33405bee9bcSmrg  # trailing '\', as in:
33505bee9bcSmrg  #
33605bee9bcSmrg  #   foo.o : \
33705bee9bcSmrg  #    foo.c \
33805bee9bcSmrg  #    foo.h \
33905bee9bcSmrg  #
34005bee9bcSmrg  # It will put a trailing '\' even on the last line, and will use leading
34105bee9bcSmrg  # spaces rather than leading tabs (at least since its commit 0394caf7
34205bee9bcSmrg  # "Emit spaces for -MD").
34305bee9bcSmrg  "$@" -MD -MF "$tmpdepfile"
34405bee9bcSmrg  stat=$?
34505bee9bcSmrg  if test $stat -ne 0; then
34605bee9bcSmrg    rm -f "$tmpdepfile"
34705bee9bcSmrg    exit $stat
348ff7e0accSmrg  fi
34905bee9bcSmrg  rm -f "$depfile"
35005bee9bcSmrg  # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'.
35105bee9bcSmrg  # We have to change lines of the first kind to '$object: \'.
35205bee9bcSmrg  sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile"
35305bee9bcSmrg  # And for each line of the second kind, we have to emit a 'dep.h:'
35405bee9bcSmrg  # dummy dependency, to avoid the deleted-header problem.
35505bee9bcSmrg  sed -n -e 's|^  *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile"
356ff7e0accSmrg  rm -f "$tmpdepfile"
357ff7e0accSmrg  ;;
358ff7e0accSmrg
35905bee9bcSmrg## The order of this option in the case statement is important, since the
36005bee9bcSmrg## shell code in configure will try each of these formats in the order
36105bee9bcSmrg## listed in this file.  A plain '-MD' option would be understood by many
36205bee9bcSmrg## compilers, so we must ensure this comes after the gcc and icc options.
36305bee9bcSmrgpgcc)
36405bee9bcSmrg  # Portland's C compiler understands '-MD'.
36505bee9bcSmrg  # Will always output deps to 'file.d' where file is the root name of the
36605bee9bcSmrg  # source file under compilation, even if file resides in a subdirectory.
36705bee9bcSmrg  # The object file name does not affect the name of the '.d' file.
36805bee9bcSmrg  # pgcc 10.2 will output
369ff7e0accSmrg  #    foo.o: sub/foo.c sub/foo.h
37005bee9bcSmrg  # and will wrap long lines using '\' :
371ff7e0accSmrg  #    foo.o: sub/foo.c ... \
372ff7e0accSmrg  #     sub/foo.h ... \
373ff7e0accSmrg  #     ...
37405bee9bcSmrg  set_dir_from "$object"
37505bee9bcSmrg  # Use the source, not the object, to determine the base name, since
37605bee9bcSmrg  # that's sadly what pgcc will do too.
37705bee9bcSmrg  set_base_from "$source"
37805bee9bcSmrg  tmpdepfile=$base.d
37905bee9bcSmrg
38005bee9bcSmrg  # For projects that build the same source file twice into different object
38105bee9bcSmrg  # files, the pgcc approach of using the *source* file root name can cause
38205bee9bcSmrg  # problems in parallel builds.  Use a locking strategy to avoid stomping on
38305bee9bcSmrg  # the same $tmpdepfile.
38405bee9bcSmrg  lockdir=$base.d-lock
38505bee9bcSmrg  trap "
38605bee9bcSmrg    echo '$0: caught signal, cleaning up...' >&2
38705bee9bcSmrg    rmdir '$lockdir'
38805bee9bcSmrg    exit 1
38905bee9bcSmrg  " 1 2 13 15
39005bee9bcSmrg  numtries=100
39105bee9bcSmrg  i=$numtries
39205bee9bcSmrg  while test $i -gt 0; do
39305bee9bcSmrg    # mkdir is a portable test-and-set.
39405bee9bcSmrg    if mkdir "$lockdir" 2>/dev/null; then
39505bee9bcSmrg      # This process acquired the lock.
39605bee9bcSmrg      "$@" -MD
39705bee9bcSmrg      stat=$?
39805bee9bcSmrg      # Release the lock.
39905bee9bcSmrg      rmdir "$lockdir"
40005bee9bcSmrg      break
40105bee9bcSmrg    else
40205bee9bcSmrg      # If the lock is being held by a different process, wait
40305bee9bcSmrg      # until the winning process is done or we timeout.
40405bee9bcSmrg      while test -d "$lockdir" && test $i -gt 0; do
40505bee9bcSmrg        sleep 1
40605bee9bcSmrg        i=`expr $i - 1`
40705bee9bcSmrg      done
40805bee9bcSmrg    fi
40905bee9bcSmrg    i=`expr $i - 1`
41005bee9bcSmrg  done
41105bee9bcSmrg  trap - 1 2 13 15
41205bee9bcSmrg  if test $i -le 0; then
41305bee9bcSmrg    echo "$0: failed to acquire lock after $numtries attempts" >&2
41405bee9bcSmrg    echo "$0: check lockdir '$lockdir'" >&2
41505bee9bcSmrg    exit 1
41605bee9bcSmrg  fi
417ff7e0accSmrg
41805bee9bcSmrg  if test $stat -ne 0; then
419ff7e0accSmrg    rm -f "$tmpdepfile"
420ff7e0accSmrg    exit $stat
421ff7e0accSmrg  fi
422ff7e0accSmrg  rm -f "$depfile"
423ff7e0accSmrg  # Each line is of the form `foo.o: dependent.h',
424ff7e0accSmrg  # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'.
425ff7e0accSmrg  # Do two passes, one to just change these to
426ff7e0accSmrg  # `$object: dependent.h' and one to simply `dependent.h:'.
427ff7e0accSmrg  sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
428ff7e0accSmrg  # Some versions of the HPUX 10.20 sed can't process this invocation
429ff7e0accSmrg  # correctly.  Breaking it into two sed invocations is a workaround.
43005bee9bcSmrg  sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \
43105bee9bcSmrg    | sed -e 's/$/ :/' >> "$depfile"
432ff7e0accSmrg  rm -f "$tmpdepfile"
433ff7e0accSmrg  ;;
434ff7e0accSmrg
435ff7e0accSmrghp2)
436ff7e0accSmrg  # The "hp" stanza above does not work with aCC (C++) and HP's ia64
437ff7e0accSmrg  # compilers, which have integrated preprocessors.  The correct option
438ff7e0accSmrg  # to use with these is +Maked; it writes dependencies to a file named
439ff7e0accSmrg  # 'foo.d', which lands next to the object file, wherever that
440ff7e0accSmrg  # happens to be.
441ff7e0accSmrg  # Much of this is similar to the tru64 case; see comments there.
44205bee9bcSmrg  set_dir_from  "$object"
44305bee9bcSmrg  set_base_from "$object"
444ff7e0accSmrg  if test "$libtool" = yes; then
445ff7e0accSmrg    tmpdepfile1=$dir$base.d
446ff7e0accSmrg    tmpdepfile2=$dir.libs/$base.d
447ff7e0accSmrg    "$@" -Wc,+Maked
448ff7e0accSmrg  else
449ff7e0accSmrg    tmpdepfile1=$dir$base.d
450ff7e0accSmrg    tmpdepfile2=$dir$base.d
451ff7e0accSmrg    "$@" +Maked
452ff7e0accSmrg  fi
453ff7e0accSmrg  stat=$?
45405bee9bcSmrg  if test $stat -ne 0; then
455ff7e0accSmrg     rm -f "$tmpdepfile1" "$tmpdepfile2"
456ff7e0accSmrg     exit $stat
457ff7e0accSmrg  fi
458ff7e0accSmrg
459ff7e0accSmrg  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2"
460ff7e0accSmrg  do
461ff7e0accSmrg    test -f "$tmpdepfile" && break
462ff7e0accSmrg  done
463ff7e0accSmrg  if test -f "$tmpdepfile"; then
46405bee9bcSmrg    sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile"
46505bee9bcSmrg    # Add 'dependent.h:' lines.
46610998002Smrg    sed -ne '2,${
46705bee9bcSmrg               s/^ *//
46805bee9bcSmrg               s/ \\*$//
46905bee9bcSmrg               s/$/:/
47005bee9bcSmrg               p
47105bee9bcSmrg             }' "$tmpdepfile" >> "$depfile"
472ff7e0accSmrg  else
47305bee9bcSmrg    make_dummy_depfile
474ff7e0accSmrg  fi
475ff7e0accSmrg  rm -f "$tmpdepfile" "$tmpdepfile2"
476ff7e0accSmrg  ;;
477ff7e0accSmrg
478ff7e0accSmrgtru64)
47905bee9bcSmrg  # The Tru64 compiler uses -MD to generate dependencies as a side
48005bee9bcSmrg  # effect.  'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'.
48105bee9bcSmrg  # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
48205bee9bcSmrg  # dependencies in 'foo.d' instead, so we check for that too.
48305bee9bcSmrg  # Subdirectories are respected.
48405bee9bcSmrg  set_dir_from  "$object"
48505bee9bcSmrg  set_base_from "$object"
48605bee9bcSmrg
48705bee9bcSmrg  if test "$libtool" = yes; then
48805bee9bcSmrg    # Libtool generates 2 separate objects for the 2 libraries.  These
48905bee9bcSmrg    # two compilations output dependencies in $dir.libs/$base.o.d and
49005bee9bcSmrg    # in $dir$base.o.d.  We have to check for both files, because
49105bee9bcSmrg    # one of the two compilations can be disabled.  We should prefer
49205bee9bcSmrg    # $dir$base.o.d over $dir.libs/$base.o.d because the latter is
49305bee9bcSmrg    # automatically cleaned when .libs/ is deleted, while ignoring
49405bee9bcSmrg    # the former would cause a distcleancheck panic.
49505bee9bcSmrg    tmpdepfile1=$dir$base.o.d          # libtool 1.5
49605bee9bcSmrg    tmpdepfile2=$dir.libs/$base.o.d    # Likewise.
49705bee9bcSmrg    tmpdepfile3=$dir.libs/$base.d      # Compaq CCC V6.2-504
49805bee9bcSmrg    "$@" -Wc,-MD
49905bee9bcSmrg  else
50005bee9bcSmrg    tmpdepfile1=$dir$base.d
50105bee9bcSmrg    tmpdepfile2=$dir$base.d
50205bee9bcSmrg    tmpdepfile3=$dir$base.d
50305bee9bcSmrg    "$@" -MD
50405bee9bcSmrg  fi
50505bee9bcSmrg
50605bee9bcSmrg  stat=$?
50705bee9bcSmrg  if test $stat -ne 0; then
50805bee9bcSmrg    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
50905bee9bcSmrg    exit $stat
51005bee9bcSmrg  fi
51105bee9bcSmrg
51205bee9bcSmrg  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
51305bee9bcSmrg  do
51405bee9bcSmrg    test -f "$tmpdepfile" && break
51505bee9bcSmrg  done
51605bee9bcSmrg  # Same post-processing that is required for AIX mode.
51705bee9bcSmrg  aix_post_process_depfile
51805bee9bcSmrg  ;;
51905bee9bcSmrg
52005bee9bcSmrgmsvc7)
52105bee9bcSmrg  if test "$libtool" = yes; then
52205bee9bcSmrg    showIncludes=-Wc,-showIncludes
52305bee9bcSmrg  else
52405bee9bcSmrg    showIncludes=-showIncludes
52505bee9bcSmrg  fi
52605bee9bcSmrg  "$@" $showIncludes > "$tmpdepfile"
52705bee9bcSmrg  stat=$?
52805bee9bcSmrg  grep -v '^Note: including file: ' "$tmpdepfile"
52905bee9bcSmrg  if test $stat -ne 0; then
53005bee9bcSmrg    rm -f "$tmpdepfile"
53105bee9bcSmrg    exit $stat
53205bee9bcSmrg  fi
53305bee9bcSmrg  rm -f "$depfile"
53405bee9bcSmrg  echo "$object : \\" > "$depfile"
53505bee9bcSmrg  # The first sed program below extracts the file names and escapes
53605bee9bcSmrg  # backslashes for cygpath.  The second sed program outputs the file
53705bee9bcSmrg  # name when reading, but also accumulates all include files in the
53805bee9bcSmrg  # hold buffer in order to output them again at the end.  This only
53905bee9bcSmrg  # works with sed implementations that can handle large buffers.
54005bee9bcSmrg  sed < "$tmpdepfile" -n '
54105bee9bcSmrg/^Note: including file:  *\(.*\)/ {
54205bee9bcSmrg  s//\1/
54305bee9bcSmrg  s/\\/\\\\/g
54405bee9bcSmrg  p
54505bee9bcSmrg}' | $cygpath_u | sort -u | sed -n '
54605bee9bcSmrgs/ /\\ /g
54705bee9bcSmrgs/\(.*\)/'"$tab"'\1 \\/p
54805bee9bcSmrgs/.\(.*\) \\/\1:/
54905bee9bcSmrgH
55005bee9bcSmrg$ {
55105bee9bcSmrg  s/.*/'"$tab"'/
55205bee9bcSmrg  G
55305bee9bcSmrg  p
55405bee9bcSmrg}' >> "$depfile"
55505bee9bcSmrg  rm -f "$tmpdepfile"
55605bee9bcSmrg  ;;
55705bee9bcSmrg
55805bee9bcSmrgmsvc7msys)
55905bee9bcSmrg  # This case exists only to let depend.m4 do its work.  It works by
56005bee9bcSmrg  # looking at the text of this script.  This case will never be run,
56105bee9bcSmrg  # since it is checked for above.
56205bee9bcSmrg  exit 1
56305bee9bcSmrg  ;;
564ff7e0accSmrg
565ff7e0accSmrg#nosideeffect)
566ff7e0accSmrg  # This comment above is used by automake to tell side-effect
567ff7e0accSmrg  # dependency tracking mechanisms from slower ones.
568ff7e0accSmrg
569ff7e0accSmrgdashmstdout)
570ff7e0accSmrg  # Important note: in order to support this mode, a compiler *must*
571ff7e0accSmrg  # always write the preprocessed file to stdout, regardless of -o.
572ff7e0accSmrg  "$@" || exit $?
573ff7e0accSmrg
574ff7e0accSmrg  # Remove the call to Libtool.
575ff7e0accSmrg  if test "$libtool" = yes; then
57610998002Smrg    while test "X$1" != 'X--mode=compile'; do
577ff7e0accSmrg      shift
578ff7e0accSmrg    done
579ff7e0accSmrg    shift
580ff7e0accSmrg  fi
581ff7e0accSmrg
58205bee9bcSmrg  # Remove '-o $object'.
583ff7e0accSmrg  IFS=" "
584ff7e0accSmrg  for arg
585ff7e0accSmrg  do
586ff7e0accSmrg    case $arg in
587ff7e0accSmrg    -o)
588ff7e0accSmrg      shift
589ff7e0accSmrg      ;;
590ff7e0accSmrg    $object)
591ff7e0accSmrg      shift
592ff7e0accSmrg      ;;
593ff7e0accSmrg    *)
594ff7e0accSmrg      set fnord "$@" "$arg"
595ff7e0accSmrg      shift # fnord
596ff7e0accSmrg      shift # $arg
597ff7e0accSmrg      ;;
598ff7e0accSmrg    esac
599ff7e0accSmrg  done
600ff7e0accSmrg
601ff7e0accSmrg  test -z "$dashmflag" && dashmflag=-M
60205bee9bcSmrg  # Require at least two characters before searching for ':'
603ff7e0accSmrg  # in the target name.  This is to cope with DOS-style filenames:
60405bee9bcSmrg  # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise.
605ff7e0accSmrg  "$@" $dashmflag |
60605bee9bcSmrg    sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile"
607ff7e0accSmrg  rm -f "$depfile"
608ff7e0accSmrg  cat < "$tmpdepfile" > "$depfile"
60905bee9bcSmrg  # Some versions of the HPUX 10.20 sed can't process this sed invocation
61005bee9bcSmrg  # correctly.  Breaking it into two sed invocations is a workaround.
61105bee9bcSmrg  tr ' ' "$nl" < "$tmpdepfile" \
61205bee9bcSmrg    | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
61305bee9bcSmrg    | sed -e 's/$/ :/' >> "$depfile"
614ff7e0accSmrg  rm -f "$tmpdepfile"
615ff7e0accSmrg  ;;
616ff7e0accSmrg
617ff7e0accSmrgdashXmstdout)
618ff7e0accSmrg  # This case only exists to satisfy depend.m4.  It is never actually
619ff7e0accSmrg  # run, as this mode is specially recognized in the preamble.
620ff7e0accSmrg  exit 1
621ff7e0accSmrg  ;;
622ff7e0accSmrg
623ff7e0accSmrgmakedepend)
624ff7e0accSmrg  "$@" || exit $?
625ff7e0accSmrg  # Remove any Libtool call
626ff7e0accSmrg  if test "$libtool" = yes; then
62710998002Smrg    while test "X$1" != 'X--mode=compile'; do
628ff7e0accSmrg      shift
629ff7e0accSmrg    done
630ff7e0accSmrg    shift
631ff7e0accSmrg  fi
632ff7e0accSmrg  # X makedepend
633ff7e0accSmrg  shift
63410998002Smrg  cleared=no eat=no
63510998002Smrg  for arg
63610998002Smrg  do
637ff7e0accSmrg    case $cleared in
638ff7e0accSmrg    no)
639ff7e0accSmrg      set ""; shift
640ff7e0accSmrg      cleared=yes ;;
641ff7e0accSmrg    esac
64210998002Smrg    if test $eat = yes; then
64310998002Smrg      eat=no
64410998002Smrg      continue
64510998002Smrg    fi
646ff7e0accSmrg    case "$arg" in
647ff7e0accSmrg    -D*|-I*)
648ff7e0accSmrg      set fnord "$@" "$arg"; shift ;;
649ff7e0accSmrg    # Strip any option that makedepend may not understand.  Remove
650ff7e0accSmrg    # the object too, otherwise makedepend will parse it as a source file.
65110998002Smrg    -arch)
65210998002Smrg      eat=yes ;;
653ff7e0accSmrg    -*|$object)
654ff7e0accSmrg      ;;
655ff7e0accSmrg    *)
656ff7e0accSmrg      set fnord "$@" "$arg"; shift ;;
657ff7e0accSmrg    esac
658ff7e0accSmrg  done
65910998002Smrg  obj_suffix=`echo "$object" | sed 's/^.*\././'`
660ff7e0accSmrg  touch "$tmpdepfile"
661ff7e0accSmrg  ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
662ff7e0accSmrg  rm -f "$depfile"
66305bee9bcSmrg  # makedepend may prepend the VPATH from the source file name to the object.
66405bee9bcSmrg  # No need to regex-escape $object, excess matching of '.' is harmless.
66505bee9bcSmrg  sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile"
66605bee9bcSmrg  # Some versions of the HPUX 10.20 sed can't process the last invocation
66705bee9bcSmrg  # correctly.  Breaking it into two sed invocations is a workaround.
66805bee9bcSmrg  sed '1,2d' "$tmpdepfile" \
66905bee9bcSmrg    | tr ' ' "$nl" \
67005bee9bcSmrg    | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
67105bee9bcSmrg    | sed -e 's/$/ :/' >> "$depfile"
672ff7e0accSmrg  rm -f "$tmpdepfile" "$tmpdepfile".bak
673ff7e0accSmrg  ;;
674ff7e0accSmrg
675ff7e0accSmrgcpp)
676ff7e0accSmrg  # Important note: in order to support this mode, a compiler *must*
677ff7e0accSmrg  # always write the preprocessed file to stdout.
678ff7e0accSmrg  "$@" || exit $?
679ff7e0accSmrg
680ff7e0accSmrg  # Remove the call to Libtool.
681ff7e0accSmrg  if test "$libtool" = yes; then
68210998002Smrg    while test "X$1" != 'X--mode=compile'; do
683ff7e0accSmrg      shift
684ff7e0accSmrg    done
685ff7e0accSmrg    shift
686ff7e0accSmrg  fi
687ff7e0accSmrg
68805bee9bcSmrg  # Remove '-o $object'.
689ff7e0accSmrg  IFS=" "
690ff7e0accSmrg  for arg
691ff7e0accSmrg  do
692ff7e0accSmrg    case $arg in
693ff7e0accSmrg    -o)
694ff7e0accSmrg      shift
695ff7e0accSmrg      ;;
696ff7e0accSmrg    $object)
697ff7e0accSmrg      shift
698ff7e0accSmrg      ;;
699ff7e0accSmrg    *)
700ff7e0accSmrg      set fnord "$@" "$arg"
701ff7e0accSmrg      shift # fnord
702ff7e0accSmrg      shift # $arg
703ff7e0accSmrg      ;;
704ff7e0accSmrg    esac
705ff7e0accSmrg  done
706ff7e0accSmrg
70705bee9bcSmrg  "$@" -E \
70805bee9bcSmrg    | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
70905bee9bcSmrg             -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
71005bee9bcSmrg    | sed '$ s: \\$::' > "$tmpdepfile"
711ff7e0accSmrg  rm -f "$depfile"
712ff7e0accSmrg  echo "$object : \\" > "$depfile"
713ff7e0accSmrg  cat < "$tmpdepfile" >> "$depfile"
714ff7e0accSmrg  sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
715ff7e0accSmrg  rm -f "$tmpdepfile"
716ff7e0accSmrg  ;;
717ff7e0accSmrg
718ff7e0accSmrgmsvisualcpp)
719ff7e0accSmrg  # Important note: in order to support this mode, a compiler *must*
72010998002Smrg  # always write the preprocessed file to stdout.
721ff7e0accSmrg  "$@" || exit $?
72210998002Smrg
72310998002Smrg  # Remove the call to Libtool.
72410998002Smrg  if test "$libtool" = yes; then
72510998002Smrg    while test "X$1" != 'X--mode=compile'; do
72610998002Smrg      shift
72710998002Smrg    done
72810998002Smrg    shift
72910998002Smrg  fi
73010998002Smrg
731ff7e0accSmrg  IFS=" "
732ff7e0accSmrg  for arg
733ff7e0accSmrg  do
734ff7e0accSmrg    case "$arg" in
73510998002Smrg    -o)
73610998002Smrg      shift
73710998002Smrg      ;;
73810998002Smrg    $object)
73910998002Smrg      shift
74010998002Smrg      ;;
741ff7e0accSmrg    "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
74205bee9bcSmrg        set fnord "$@"
74305bee9bcSmrg        shift
74405bee9bcSmrg        shift
74505bee9bcSmrg        ;;
746ff7e0accSmrg    *)
74705bee9bcSmrg        set fnord "$@" "$arg"
74805bee9bcSmrg        shift
74905bee9bcSmrg        shift
75005bee9bcSmrg        ;;
751ff7e0accSmrg    esac
752ff7e0accSmrg  done
75310998002Smrg  "$@" -E 2>/dev/null |
75410998002Smrg  sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile"
755ff7e0accSmrg  rm -f "$depfile"
756ff7e0accSmrg  echo "$object : \\" > "$depfile"
75705bee9bcSmrg  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile"
75805bee9bcSmrg  echo "$tab" >> "$depfile"
75910998002Smrg  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile"
760ff7e0accSmrg  rm -f "$tmpdepfile"
761ff7e0accSmrg  ;;
762ff7e0accSmrg
76310998002Smrgmsvcmsys)
76410998002Smrg  # This case exists only to let depend.m4 do its work.  It works by
76510998002Smrg  # looking at the text of this script.  This case will never be run,
76610998002Smrg  # since it is checked for above.
76710998002Smrg  exit 1
76810998002Smrg  ;;
76910998002Smrg
770ff7e0accSmrgnone)
771ff7e0accSmrg  exec "$@"
772ff7e0accSmrg  ;;
773ff7e0accSmrg
774ff7e0accSmrg*)
775ff7e0accSmrg  echo "Unknown depmode $depmode" 1>&2
776ff7e0accSmrg  exit 1
777ff7e0accSmrg  ;;
778ff7e0accSmrgesac
779ff7e0accSmrg
780ff7e0accSmrgexit 0
781ff7e0accSmrg
782ff7e0accSmrg# Local Variables:
783ff7e0accSmrg# mode: shell-script
784ff7e0accSmrg# sh-indentation: 2
785ff7e0accSmrg# eval: (add-hook 'write-file-hooks 'time-stamp)
786ff7e0accSmrg# time-stamp-start: "scriptversion="
787ff7e0accSmrg# time-stamp-format: "%:y-%02m-%02d.%02H"
78810998002Smrg# time-stamp-time-zone: "UTC"
78910998002Smrg# time-stamp-end: "; # UTC"
790ff7e0accSmrg# End:
791