depcomp revision 6af7124f
1ba6a1819Smrg#! /bin/sh
2ba6a1819Smrg# depcomp - compile a program generating dependencies as side-effects
3ba6a1819Smrg
46af7124fSmrgscriptversion=2013-05-30.07; # UTC
5ba6a1819Smrg
61bedbe3fSmrg# Copyright (C) 1999-2013 Free Software Foundation, Inc.
7ba6a1819Smrg
8ba6a1819Smrg# This program is free software; you can redistribute it and/or modify
9ba6a1819Smrg# it under the terms of the GNU General Public License as published by
10ba6a1819Smrg# the Free Software Foundation; either version 2, or (at your option)
11ba6a1819Smrg# any later version.
12ba6a1819Smrg
13ba6a1819Smrg# This program is distributed in the hope that it will be useful,
14ba6a1819Smrg# but WITHOUT ANY WARRANTY; without even the implied warranty of
15ba6a1819Smrg# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16ba6a1819Smrg# GNU General Public License for more details.
17ba6a1819Smrg
18ba6a1819Smrg# You should have received a copy of the GNU General Public License
19549e21daSmrg# along with this program.  If not, see <http://www.gnu.org/licenses/>.
20ba6a1819Smrg
21ba6a1819Smrg# As a special exception to the GNU General Public License, if you
22ba6a1819Smrg# distribute this file as part of a program that contains a
23ba6a1819Smrg# configuration script generated by Autoconf, you may include it under
24ba6a1819Smrg# the same distribution terms that you use for the rest of that program.
25ba6a1819Smrg
26ba6a1819Smrg# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>.
27ba6a1819Smrg
28ba6a1819Smrgcase $1 in
29ba6a1819Smrg  '')
301bedbe3fSmrg    echo "$0: No command.  Try '$0 --help' for more information." 1>&2
311bedbe3fSmrg    exit 1;
321bedbe3fSmrg    ;;
33ba6a1819Smrg  -h | --h*)
34ba6a1819Smrg    cat <<\EOF
35ba6a1819SmrgUsage: depcomp [--help] [--version] PROGRAM [ARGS]
36ba6a1819Smrg
37ba6a1819SmrgRun PROGRAMS ARGS to compile a file, generating dependencies
38ba6a1819Smrgas side-effects.
39ba6a1819Smrg
40ba6a1819SmrgEnvironment variables:
41ba6a1819Smrg  depmode     Dependency tracking mode.
421bedbe3fSmrg  source      Source file read by 'PROGRAMS ARGS'.
431bedbe3fSmrg  object      Object file output by 'PROGRAMS ARGS'.
44ba6a1819Smrg  DEPDIR      directory where to store dependencies.
45ba6a1819Smrg  depfile     Dependency file to output.
461bedbe3fSmrg  tmpdepfile  Temporary file to use when outputting dependencies.
47ba6a1819Smrg  libtool     Whether libtool is used (yes/no).
48ba6a1819Smrg
49ba6a1819SmrgReport bugs to <bug-automake@gnu.org>.
50ba6a1819SmrgEOF
51ba6a1819Smrg    exit $?
52ba6a1819Smrg    ;;
53ba6a1819Smrg  -v | --v*)
54ba6a1819Smrg    echo "depcomp $scriptversion"
55ba6a1819Smrg    exit $?
56ba6a1819Smrg    ;;
57ba6a1819Smrgesac
58ba6a1819Smrg
591bedbe3fSmrg# Get the directory component of the given path, and save it in the
601bedbe3fSmrg# global variables '$dir'.  Note that this directory component will
611bedbe3fSmrg# be either empty or ending with a '/' character.  This is deliberate.
621bedbe3fSmrgset_dir_from ()
631bedbe3fSmrg{
641bedbe3fSmrg  case $1 in
651bedbe3fSmrg    */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;;
661bedbe3fSmrg      *) dir=;;
671bedbe3fSmrg  esac
681bedbe3fSmrg}
691bedbe3fSmrg
701bedbe3fSmrg# Get the suffix-stripped basename of the given path, and save it the
711bedbe3fSmrg# global variable '$base'.
721bedbe3fSmrgset_base_from ()
731bedbe3fSmrg{
741bedbe3fSmrg  base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'`
751bedbe3fSmrg}
761bedbe3fSmrg
771bedbe3fSmrg# If no dependency file was actually created by the compiler invocation,
781bedbe3fSmrg# we still have to create a dummy depfile, to avoid errors with the
791bedbe3fSmrg# Makefile "include basename.Plo" scheme.
801bedbe3fSmrgmake_dummy_depfile ()
811bedbe3fSmrg{
821bedbe3fSmrg  echo "#dummy" > "$depfile"
831bedbe3fSmrg}
841bedbe3fSmrg
851bedbe3fSmrg# Factor out some common post-processing of the generated depfile.
861bedbe3fSmrg# Requires the auxiliary global variable '$tmpdepfile' to be set.
871bedbe3fSmrgaix_post_process_depfile ()
881bedbe3fSmrg{
891bedbe3fSmrg  # If the compiler actually managed to produce a dependency file,
901bedbe3fSmrg  # post-process it.
911bedbe3fSmrg  if test -f "$tmpdepfile"; then
921bedbe3fSmrg    # Each line is of the form 'foo.o: dependency.h'.
931bedbe3fSmrg    # Do two passes, one to just change these to
941bedbe3fSmrg    #   $object: dependency.h
951bedbe3fSmrg    # and one to simply output
961bedbe3fSmrg    #   dependency.h:
971bedbe3fSmrg    # which is needed to avoid the deleted-header problem.
981bedbe3fSmrg    { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile"
991bedbe3fSmrg      sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile"
1001bedbe3fSmrg    } > "$depfile"
1011bedbe3fSmrg    rm -f "$tmpdepfile"
1021bedbe3fSmrg  else
1031bedbe3fSmrg    make_dummy_depfile
1041bedbe3fSmrg  fi
1051bedbe3fSmrg}
1061bedbe3fSmrg
1071bedbe3fSmrg# A tabulation character.
1081bedbe3fSmrgtab='	'
1091bedbe3fSmrg# A newline character.
1101bedbe3fSmrgnl='
1111bedbe3fSmrg'
1121bedbe3fSmrg# Character ranges might be problematic outside the C locale.
1131bedbe3fSmrg# These definitions help.
1141bedbe3fSmrgupper=ABCDEFGHIJKLMNOPQRSTUVWXYZ
1151bedbe3fSmrglower=abcdefghijklmnopqrstuvwxyz
1161bedbe3fSmrgdigits=0123456789
1171bedbe3fSmrgalpha=${upper}${lower}
1181bedbe3fSmrg
119ba6a1819Smrgif test -z "$depmode" || test -z "$source" || test -z "$object"; then
120ba6a1819Smrg  echo "depcomp: Variables source, object and depmode must be set" 1>&2
121ba6a1819Smrg  exit 1
122ba6a1819Smrgfi
123ba6a1819Smrg
124ba6a1819Smrg# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.
125ba6a1819Smrgdepfile=${depfile-`echo "$object" |
126ba6a1819Smrg  sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`}
127ba6a1819Smrgtmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
128ba6a1819Smrg
129ba6a1819Smrgrm -f "$tmpdepfile"
130ba6a1819Smrg
1311bedbe3fSmrg# Avoid interferences from the environment.
1321bedbe3fSmrggccflag= dashmflag=
1331bedbe3fSmrg
134ba6a1819Smrg# Some modes work just like other modes, but use different flags.  We
135ba6a1819Smrg# parameterize here, but still list the modes in the big case below,
136ba6a1819Smrg# to make depend.m4 easier to write.  Note that we *cannot* use a case
137ba6a1819Smrg# here, because this file can only contain one case statement.
138ba6a1819Smrgif test "$depmode" = hp; then
139ba6a1819Smrg  # HP compiler uses -M and no extra arg.
140ba6a1819Smrg  gccflag=-M
141ba6a1819Smrg  depmode=gcc
142ba6a1819Smrgfi
143ba6a1819Smrg
144ba6a1819Smrgif test "$depmode" = dashXmstdout; then
1451bedbe3fSmrg  # This is just like dashmstdout with a different argument.
1461bedbe3fSmrg  dashmflag=-xM
1471bedbe3fSmrg  depmode=dashmstdout
148ba6a1819Smrgfi
149ba6a1819Smrg
150549e21daSmrgcygpath_u="cygpath -u -f -"
151549e21daSmrgif test "$depmode" = msvcmsys; then
1521bedbe3fSmrg  # This is just like msvisualcpp but w/o cygpath translation.
1531bedbe3fSmrg  # Just convert the backslash-escaped backslashes to single forward
1541bedbe3fSmrg  # slashes to satisfy depend.m4
1551bedbe3fSmrg  cygpath_u='sed s,\\\\,/,g'
1561bedbe3fSmrg  depmode=msvisualcpp
1571bedbe3fSmrgfi
1581bedbe3fSmrg
1591bedbe3fSmrgif test "$depmode" = msvc7msys; then
1601bedbe3fSmrg  # This is just like msvc7 but w/o cygpath translation.
1611bedbe3fSmrg  # Just convert the backslash-escaped backslashes to single forward
1621bedbe3fSmrg  # slashes to satisfy depend.m4
1631bedbe3fSmrg  cygpath_u='sed s,\\\\,/,g'
1641bedbe3fSmrg  depmode=msvc7
1651bedbe3fSmrgfi
1661bedbe3fSmrg
1671bedbe3fSmrgif test "$depmode" = xlc; then
1681bedbe3fSmrg  # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information.
1691bedbe3fSmrg  gccflag=-qmakedep=gcc,-MF
1701bedbe3fSmrg  depmode=gcc
171549e21daSmrgfi
172549e21daSmrg
173ba6a1819Smrgcase "$depmode" in
174ba6a1819Smrggcc3)
175ba6a1819Smrg## gcc 3 implements dependency tracking that does exactly what
176ba6a1819Smrg## we want.  Yay!  Note: for some reason libtool 1.4 doesn't like
177ba6a1819Smrg## it if -MD -MP comes after the -MF stuff.  Hmm.
178ba6a1819Smrg## Unfortunately, FreeBSD c89 acceptance of flags depends upon
179ba6a1819Smrg## the command line argument order; so add the flags where they
180ba6a1819Smrg## appear in depend2.am.  Note that the slowdown incurred here
181ba6a1819Smrg## affects only configure: in makefiles, %FASTDEP% shortcuts this.
182ba6a1819Smrg  for arg
183ba6a1819Smrg  do
184ba6a1819Smrg    case $arg in
185ba6a1819Smrg    -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;;
186ba6a1819Smrg    *)  set fnord "$@" "$arg" ;;
187ba6a1819Smrg    esac
188ba6a1819Smrg    shift # fnord
189ba6a1819Smrg    shift # $arg
190ba6a1819Smrg  done
191ba6a1819Smrg  "$@"
192ba6a1819Smrg  stat=$?
1931bedbe3fSmrg  if test $stat -ne 0; then
194ba6a1819Smrg    rm -f "$tmpdepfile"
195ba6a1819Smrg    exit $stat
196ba6a1819Smrg  fi
197ba6a1819Smrg  mv "$tmpdepfile" "$depfile"
198ba6a1819Smrg  ;;
199ba6a1819Smrg
200ba6a1819Smrggcc)
2011bedbe3fSmrg## Note that this doesn't just cater to obsosete pre-3.x GCC compilers.
2021bedbe3fSmrg## but also to in-use compilers like IMB xlc/xlC and the HP C compiler.
2031bedbe3fSmrg## (see the conditional assignment to $gccflag above).
204ba6a1819Smrg## There are various ways to get dependency output from gcc.  Here's
205ba6a1819Smrg## why we pick this rather obscure method:
206ba6a1819Smrg## - Don't want to use -MD because we'd like the dependencies to end
207ba6a1819Smrg##   up in a subdir.  Having to rename by hand is ugly.
208ba6a1819Smrg##   (We might end up doing this anyway to support other compilers.)
209ba6a1819Smrg## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
2101bedbe3fSmrg##   -MM, not -M (despite what the docs say).  Also, it might not be
2111bedbe3fSmrg##   supported by the other compilers which use the 'gcc' depmode.
212ba6a1819Smrg## - Using -M directly means running the compiler twice (even worse
213ba6a1819Smrg##   than renaming).
214ba6a1819Smrg  if test -z "$gccflag"; then
215ba6a1819Smrg    gccflag=-MD,
216ba6a1819Smrg  fi
217ba6a1819Smrg  "$@" -Wp,"$gccflag$tmpdepfile"
218ba6a1819Smrg  stat=$?
2191bedbe3fSmrg  if test $stat -ne 0; then
220ba6a1819Smrg    rm -f "$tmpdepfile"
221ba6a1819Smrg    exit $stat
222ba6a1819Smrg  fi
223ba6a1819Smrg  rm -f "$depfile"
224ba6a1819Smrg  echo "$object : \\" > "$depfile"
2251bedbe3fSmrg  # The second -e expression handles DOS-style file names with drive
2261bedbe3fSmrg  # letters.
227ba6a1819Smrg  sed -e 's/^[^:]*: / /' \
228ba6a1819Smrg      -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
2291bedbe3fSmrg## This next piece of magic avoids the "deleted header file" problem.
230ba6a1819Smrg## The problem is that when a header file which appears in a .P file
231ba6a1819Smrg## is deleted, the dependency causes make to die (because there is
232ba6a1819Smrg## typically no way to rebuild the header).  We avoid this by adding
233ba6a1819Smrg## dummy dependencies for each header file.  Too bad gcc doesn't do
234ba6a1819Smrg## this for us directly.
2351bedbe3fSmrg## Some versions of gcc put a space before the ':'.  On the theory
236ba6a1819Smrg## that the space means something, we add a space to the output as
2371bedbe3fSmrg## well.  hp depmode also adds that space, but also prefixes the VPATH
2381bedbe3fSmrg## to the object.  Take care to not repeat it in the output.
239ba6a1819Smrg## Some versions of the HPUX 10.20 sed can't process this invocation
240ba6a1819Smrg## correctly.  Breaking it into two sed invocations is a workaround.
2411bedbe3fSmrg  tr ' ' "$nl" < "$tmpdepfile" \
2421bedbe3fSmrg    | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \
2431bedbe3fSmrg    | sed -e 's/$/ :/' >> "$depfile"
244ba6a1819Smrg  rm -f "$tmpdepfile"
245ba6a1819Smrg  ;;
246ba6a1819Smrg
247ba6a1819Smrghp)
248ba6a1819Smrg  # This case exists only to let depend.m4 do its work.  It works by
249ba6a1819Smrg  # looking at the text of this script.  This case will never be run,
250ba6a1819Smrg  # since it is checked for above.
251ba6a1819Smrg  exit 1
252ba6a1819Smrg  ;;
253ba6a1819Smrg
254ba6a1819Smrgsgi)
255ba6a1819Smrg  if test "$libtool" = yes; then
256ba6a1819Smrg    "$@" "-Wp,-MDupdate,$tmpdepfile"
257ba6a1819Smrg  else
258ba6a1819Smrg    "$@" -MDupdate "$tmpdepfile"
259ba6a1819Smrg  fi
260ba6a1819Smrg  stat=$?
2611bedbe3fSmrg  if test $stat -ne 0; then
262ba6a1819Smrg    rm -f "$tmpdepfile"
263ba6a1819Smrg    exit $stat
264ba6a1819Smrg  fi
265ba6a1819Smrg  rm -f "$depfile"
266ba6a1819Smrg
267ba6a1819Smrg  if test -f "$tmpdepfile"; then  # yes, the sourcefile depend on other files
268ba6a1819Smrg    echo "$object : \\" > "$depfile"
269ba6a1819Smrg    # Clip off the initial element (the dependent).  Don't try to be
270ba6a1819Smrg    # clever and replace this with sed code, as IRIX sed won't handle
271ba6a1819Smrg    # lines with more than a fixed number of characters (4096 in
272ba6a1819Smrg    # IRIX 6.2 sed, 8192 in IRIX 6.5).  We also remove comment lines;
2731bedbe3fSmrg    # the IRIX cc adds comments like '#:fec' to the end of the
274ba6a1819Smrg    # dependency line.
2751bedbe3fSmrg    tr ' ' "$nl" < "$tmpdepfile" \
2761bedbe3fSmrg      | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \
2771bedbe3fSmrg      | tr "$nl" ' ' >> "$depfile"
278549e21daSmrg    echo >> "$depfile"
279ba6a1819Smrg    # The second pass generates a dummy entry for each header file.
2801bedbe3fSmrg    tr ' ' "$nl" < "$tmpdepfile" \
2811bedbe3fSmrg      | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
2821bedbe3fSmrg      >> "$depfile"
283ba6a1819Smrg  else
2841bedbe3fSmrg    make_dummy_depfile
285ba6a1819Smrg  fi
286ba6a1819Smrg  rm -f "$tmpdepfile"
287ba6a1819Smrg  ;;
288ba6a1819Smrg
2891bedbe3fSmrgxlc)
2901bedbe3fSmrg  # This case exists only to let depend.m4 do its work.  It works by
2911bedbe3fSmrg  # looking at the text of this script.  This case will never be run,
2921bedbe3fSmrg  # since it is checked for above.
2931bedbe3fSmrg  exit 1
2941bedbe3fSmrg  ;;
2951bedbe3fSmrg
296ba6a1819Smrgaix)
297ba6a1819Smrg  # The C for AIX Compiler uses -M and outputs the dependencies
298ba6a1819Smrg  # in a .u file.  In older versions, this file always lives in the
2991bedbe3fSmrg  # current directory.  Also, the AIX compiler puts '$object:' at the
300ba6a1819Smrg  # start of each line; $object doesn't have directory information.
301ba6a1819Smrg  # Version 6 uses the directory in both cases.
3021bedbe3fSmrg  set_dir_from "$object"
3031bedbe3fSmrg  set_base_from "$object"
304ba6a1819Smrg  if test "$libtool" = yes; then
305549e21daSmrg    tmpdepfile1=$dir$base.u
306549e21daSmrg    tmpdepfile2=$base.u
307549e21daSmrg    tmpdepfile3=$dir.libs/$base.u
308ba6a1819Smrg    "$@" -Wc,-M
309ba6a1819Smrg  else
310549e21daSmrg    tmpdepfile1=$dir$base.u
311549e21daSmrg    tmpdepfile2=$dir$base.u
312549e21daSmrg    tmpdepfile3=$dir$base.u
313ba6a1819Smrg    "$@" -M
314ba6a1819Smrg  fi
315ba6a1819Smrg  stat=$?
3161bedbe3fSmrg  if test $stat -ne 0; then
317549e21daSmrg    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
318ba6a1819Smrg    exit $stat
319ba6a1819Smrg  fi
320ba6a1819Smrg
321549e21daSmrg  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
322549e21daSmrg  do
323549e21daSmrg    test -f "$tmpdepfile" && break
324549e21daSmrg  done
3251bedbe3fSmrg  aix_post_process_depfile
3261bedbe3fSmrg  ;;
3271bedbe3fSmrg
3281bedbe3fSmrgtcc)
3291bedbe3fSmrg  # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26
3301bedbe3fSmrg  # FIXME: That version still under development at the moment of writing.
3311bedbe3fSmrg  #        Make that this statement remains true also for stable, released
3321bedbe3fSmrg  #        versions.
3331bedbe3fSmrg  # It will wrap lines (doesn't matter whether long or short) with a
3341bedbe3fSmrg  # trailing '\', as in:
3351bedbe3fSmrg  #
3361bedbe3fSmrg  #   foo.o : \
3371bedbe3fSmrg  #    foo.c \
3381bedbe3fSmrg  #    foo.h \
3391bedbe3fSmrg  #
3401bedbe3fSmrg  # It will put a trailing '\' even on the last line, and will use leading
3411bedbe3fSmrg  # spaces rather than leading tabs (at least since its commit 0394caf7
3421bedbe3fSmrg  # "Emit spaces for -MD").
3431bedbe3fSmrg  "$@" -MD -MF "$tmpdepfile"
3441bedbe3fSmrg  stat=$?
3451bedbe3fSmrg  if test $stat -ne 0; then
3461bedbe3fSmrg    rm -f "$tmpdepfile"
3471bedbe3fSmrg    exit $stat
348ba6a1819Smrg  fi
3491bedbe3fSmrg  rm -f "$depfile"
3501bedbe3fSmrg  # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'.
3511bedbe3fSmrg  # We have to change lines of the first kind to '$object: \'.
3521bedbe3fSmrg  sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile"
3531bedbe3fSmrg  # And for each line of the second kind, we have to emit a 'dep.h:'
3541bedbe3fSmrg  # dummy dependency, to avoid the deleted-header problem.
3551bedbe3fSmrg  sed -n -e 's|^  *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile"
356ba6a1819Smrg  rm -f "$tmpdepfile"
357ba6a1819Smrg  ;;
358ba6a1819Smrg
3591bedbe3fSmrg## The order of this option in the case statement is important, since the
3601bedbe3fSmrg## shell code in configure will try each of these formats in the order
3611bedbe3fSmrg## listed in this file.  A plain '-MD' option would be understood by many
3621bedbe3fSmrg## compilers, so we must ensure this comes after the gcc and icc options.
3631bedbe3fSmrgpgcc)
3641bedbe3fSmrg  # Portland's C compiler understands '-MD'.
3651bedbe3fSmrg  # Will always output deps to 'file.d' where file is the root name of the
3661bedbe3fSmrg  # source file under compilation, even if file resides in a subdirectory.
3671bedbe3fSmrg  # The object file name does not affect the name of the '.d' file.
3681bedbe3fSmrg  # pgcc 10.2 will output
369ba6a1819Smrg  #    foo.o: sub/foo.c sub/foo.h
3701bedbe3fSmrg  # and will wrap long lines using '\' :
371ba6a1819Smrg  #    foo.o: sub/foo.c ... \
372ba6a1819Smrg  #     sub/foo.h ... \
373ba6a1819Smrg  #     ...
3741bedbe3fSmrg  set_dir_from "$object"
3751bedbe3fSmrg  # Use the source, not the object, to determine the base name, since
3761bedbe3fSmrg  # that's sadly what pgcc will do too.
3771bedbe3fSmrg  set_base_from "$source"
3781bedbe3fSmrg  tmpdepfile=$base.d
3791bedbe3fSmrg
3801bedbe3fSmrg  # For projects that build the same source file twice into different object
3811bedbe3fSmrg  # files, the pgcc approach of using the *source* file root name can cause
3821bedbe3fSmrg  # problems in parallel builds.  Use a locking strategy to avoid stomping on
3831bedbe3fSmrg  # the same $tmpdepfile.
3841bedbe3fSmrg  lockdir=$base.d-lock
3851bedbe3fSmrg  trap "
3861bedbe3fSmrg    echo '$0: caught signal, cleaning up...' >&2
3871bedbe3fSmrg    rmdir '$lockdir'
3881bedbe3fSmrg    exit 1
3891bedbe3fSmrg  " 1 2 13 15
3901bedbe3fSmrg  numtries=100
3911bedbe3fSmrg  i=$numtries
3921bedbe3fSmrg  while test $i -gt 0; do
3931bedbe3fSmrg    # mkdir is a portable test-and-set.
3941bedbe3fSmrg    if mkdir "$lockdir" 2>/dev/null; then
3951bedbe3fSmrg      # This process acquired the lock.
3961bedbe3fSmrg      "$@" -MD
3971bedbe3fSmrg      stat=$?
3981bedbe3fSmrg      # Release the lock.
3991bedbe3fSmrg      rmdir "$lockdir"
4001bedbe3fSmrg      break
4011bedbe3fSmrg    else
4021bedbe3fSmrg      # If the lock is being held by a different process, wait
4031bedbe3fSmrg      # until the winning process is done or we timeout.
4041bedbe3fSmrg      while test -d "$lockdir" && test $i -gt 0; do
4051bedbe3fSmrg        sleep 1
4061bedbe3fSmrg        i=`expr $i - 1`
4071bedbe3fSmrg      done
4081bedbe3fSmrg    fi
4091bedbe3fSmrg    i=`expr $i - 1`
4101bedbe3fSmrg  done
4111bedbe3fSmrg  trap - 1 2 13 15
4121bedbe3fSmrg  if test $i -le 0; then
4131bedbe3fSmrg    echo "$0: failed to acquire lock after $numtries attempts" >&2
4141bedbe3fSmrg    echo "$0: check lockdir '$lockdir'" >&2
4151bedbe3fSmrg    exit 1
4161bedbe3fSmrg  fi
417ba6a1819Smrg
4181bedbe3fSmrg  if test $stat -ne 0; then
419ba6a1819Smrg    rm -f "$tmpdepfile"
420ba6a1819Smrg    exit $stat
421ba6a1819Smrg  fi
422ba6a1819Smrg  rm -f "$depfile"
423ba6a1819Smrg  # Each line is of the form `foo.o: dependent.h',
424ba6a1819Smrg  # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'.
425ba6a1819Smrg  # Do two passes, one to just change these to
426ba6a1819Smrg  # `$object: dependent.h' and one to simply `dependent.h:'.
427ba6a1819Smrg  sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
428ba6a1819Smrg  # Some versions of the HPUX 10.20 sed can't process this invocation
429ba6a1819Smrg  # correctly.  Breaking it into two sed invocations is a workaround.
4301bedbe3fSmrg  sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \
4311bedbe3fSmrg    | sed -e 's/$/ :/' >> "$depfile"
432ba6a1819Smrg  rm -f "$tmpdepfile"
433ba6a1819Smrg  ;;
434ba6a1819Smrg
435ba6a1819Smrghp2)
436ba6a1819Smrg  # The "hp" stanza above does not work with aCC (C++) and HP's ia64
437ba6a1819Smrg  # compilers, which have integrated preprocessors.  The correct option
438ba6a1819Smrg  # to use with these is +Maked; it writes dependencies to a file named
439ba6a1819Smrg  # 'foo.d', which lands next to the object file, wherever that
440ba6a1819Smrg  # happens to be.
441ba6a1819Smrg  # Much of this is similar to the tru64 case; see comments there.
4421bedbe3fSmrg  set_dir_from  "$object"
4431bedbe3fSmrg  set_base_from "$object"
444ba6a1819Smrg  if test "$libtool" = yes; then
445ba6a1819Smrg    tmpdepfile1=$dir$base.d
446ba6a1819Smrg    tmpdepfile2=$dir.libs/$base.d
447ba6a1819Smrg    "$@" -Wc,+Maked
448ba6a1819Smrg  else
449ba6a1819Smrg    tmpdepfile1=$dir$base.d
450ba6a1819Smrg    tmpdepfile2=$dir$base.d
451ba6a1819Smrg    "$@" +Maked
452ba6a1819Smrg  fi
453ba6a1819Smrg  stat=$?
4541bedbe3fSmrg  if test $stat -ne 0; then
455ba6a1819Smrg     rm -f "$tmpdepfile1" "$tmpdepfile2"
456ba6a1819Smrg     exit $stat
457ba6a1819Smrg  fi
458ba6a1819Smrg
459ba6a1819Smrg  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2"
460ba6a1819Smrg  do
461ba6a1819Smrg    test -f "$tmpdepfile" && break
462ba6a1819Smrg  done
463ba6a1819Smrg  if test -f "$tmpdepfile"; then
4641bedbe3fSmrg    sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile"
4651bedbe3fSmrg    # Add 'dependent.h:' lines.
466549e21daSmrg    sed -ne '2,${
4671bedbe3fSmrg               s/^ *//
4681bedbe3fSmrg               s/ \\*$//
4691bedbe3fSmrg               s/$/:/
4701bedbe3fSmrg               p
4711bedbe3fSmrg             }' "$tmpdepfile" >> "$depfile"
472ba6a1819Smrg  else
4731bedbe3fSmrg    make_dummy_depfile
474ba6a1819Smrg  fi
475ba6a1819Smrg  rm -f "$tmpdepfile" "$tmpdepfile2"
476ba6a1819Smrg  ;;
477ba6a1819Smrg
478ba6a1819Smrgtru64)
4791bedbe3fSmrg  # The Tru64 compiler uses -MD to generate dependencies as a side
4801bedbe3fSmrg  # effect.  'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'.
4811bedbe3fSmrg  # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
4821bedbe3fSmrg  # dependencies in 'foo.d' instead, so we check for that too.
4831bedbe3fSmrg  # Subdirectories are respected.
4841bedbe3fSmrg  set_dir_from  "$object"
4851bedbe3fSmrg  set_base_from "$object"
4861bedbe3fSmrg
4871bedbe3fSmrg  if test "$libtool" = yes; then
4881bedbe3fSmrg    # Libtool generates 2 separate objects for the 2 libraries.  These
4891bedbe3fSmrg    # two compilations output dependencies in $dir.libs/$base.o.d and
4901bedbe3fSmrg    # in $dir$base.o.d.  We have to check for both files, because
4911bedbe3fSmrg    # one of the two compilations can be disabled.  We should prefer
4921bedbe3fSmrg    # $dir$base.o.d over $dir.libs/$base.o.d because the latter is
4931bedbe3fSmrg    # automatically cleaned when .libs/ is deleted, while ignoring
4941bedbe3fSmrg    # the former would cause a distcleancheck panic.
4951bedbe3fSmrg    tmpdepfile1=$dir$base.o.d          # libtool 1.5
4961bedbe3fSmrg    tmpdepfile2=$dir.libs/$base.o.d    # Likewise.
4971bedbe3fSmrg    tmpdepfile3=$dir.libs/$base.d      # Compaq CCC V6.2-504
4981bedbe3fSmrg    "$@" -Wc,-MD
4991bedbe3fSmrg  else
5001bedbe3fSmrg    tmpdepfile1=$dir$base.d
5011bedbe3fSmrg    tmpdepfile2=$dir$base.d
5021bedbe3fSmrg    tmpdepfile3=$dir$base.d
5031bedbe3fSmrg    "$@" -MD
5041bedbe3fSmrg  fi
5051bedbe3fSmrg
5061bedbe3fSmrg  stat=$?
5071bedbe3fSmrg  if test $stat -ne 0; then
5081bedbe3fSmrg    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
5091bedbe3fSmrg    exit $stat
5101bedbe3fSmrg  fi
5111bedbe3fSmrg
5121bedbe3fSmrg  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
5131bedbe3fSmrg  do
5141bedbe3fSmrg    test -f "$tmpdepfile" && break
5151bedbe3fSmrg  done
5161bedbe3fSmrg  # Same post-processing that is required for AIX mode.
5171bedbe3fSmrg  aix_post_process_depfile
5181bedbe3fSmrg  ;;
5191bedbe3fSmrg
5201bedbe3fSmrgmsvc7)
5211bedbe3fSmrg  if test "$libtool" = yes; then
5221bedbe3fSmrg    showIncludes=-Wc,-showIncludes
5231bedbe3fSmrg  else
5241bedbe3fSmrg    showIncludes=-showIncludes
5251bedbe3fSmrg  fi
5261bedbe3fSmrg  "$@" $showIncludes > "$tmpdepfile"
5271bedbe3fSmrg  stat=$?
5281bedbe3fSmrg  grep -v '^Note: including file: ' "$tmpdepfile"
5291bedbe3fSmrg  if test $stat -ne 0; then
5301bedbe3fSmrg    rm -f "$tmpdepfile"
5311bedbe3fSmrg    exit $stat
5321bedbe3fSmrg  fi
5331bedbe3fSmrg  rm -f "$depfile"
5341bedbe3fSmrg  echo "$object : \\" > "$depfile"
5351bedbe3fSmrg  # The first sed program below extracts the file names and escapes
5361bedbe3fSmrg  # backslashes for cygpath.  The second sed program outputs the file
5371bedbe3fSmrg  # name when reading, but also accumulates all include files in the
5381bedbe3fSmrg  # hold buffer in order to output them again at the end.  This only
5391bedbe3fSmrg  # works with sed implementations that can handle large buffers.
5401bedbe3fSmrg  sed < "$tmpdepfile" -n '
5411bedbe3fSmrg/^Note: including file:  *\(.*\)/ {
5421bedbe3fSmrg  s//\1/
5431bedbe3fSmrg  s/\\/\\\\/g
5441bedbe3fSmrg  p
5451bedbe3fSmrg}' | $cygpath_u | sort -u | sed -n '
5461bedbe3fSmrgs/ /\\ /g
5471bedbe3fSmrgs/\(.*\)/'"$tab"'\1 \\/p
5481bedbe3fSmrgs/.\(.*\) \\/\1:/
5491bedbe3fSmrgH
5501bedbe3fSmrg$ {
5511bedbe3fSmrg  s/.*/'"$tab"'/
5521bedbe3fSmrg  G
5531bedbe3fSmrg  p
5541bedbe3fSmrg}' >> "$depfile"
5556af7124fSmrg  echo >> "$depfile" # make sure the fragment doesn't end with a backslash
5561bedbe3fSmrg  rm -f "$tmpdepfile"
5571bedbe3fSmrg  ;;
5581bedbe3fSmrg
5591bedbe3fSmrgmsvc7msys)
5601bedbe3fSmrg  # This case exists only to let depend.m4 do its work.  It works by
5611bedbe3fSmrg  # looking at the text of this script.  This case will never be run,
5621bedbe3fSmrg  # since it is checked for above.
5631bedbe3fSmrg  exit 1
5641bedbe3fSmrg  ;;
565ba6a1819Smrg
566ba6a1819Smrg#nosideeffect)
567ba6a1819Smrg  # This comment above is used by automake to tell side-effect
568ba6a1819Smrg  # dependency tracking mechanisms from slower ones.
569ba6a1819Smrg
570ba6a1819Smrgdashmstdout)
571ba6a1819Smrg  # Important note: in order to support this mode, a compiler *must*
572ba6a1819Smrg  # always write the preprocessed file to stdout, regardless of -o.
573ba6a1819Smrg  "$@" || exit $?
574ba6a1819Smrg
575ba6a1819Smrg  # Remove the call to Libtool.
576ba6a1819Smrg  if test "$libtool" = yes; then
577549e21daSmrg    while test "X$1" != 'X--mode=compile'; do
578ba6a1819Smrg      shift
579ba6a1819Smrg    done
580ba6a1819Smrg    shift
581ba6a1819Smrg  fi
582ba6a1819Smrg
5831bedbe3fSmrg  # Remove '-o $object'.
584ba6a1819Smrg  IFS=" "
585ba6a1819Smrg  for arg
586ba6a1819Smrg  do
587ba6a1819Smrg    case $arg in
588ba6a1819Smrg    -o)
589ba6a1819Smrg      shift
590ba6a1819Smrg      ;;
591ba6a1819Smrg    $object)
592ba6a1819Smrg      shift
593ba6a1819Smrg      ;;
594ba6a1819Smrg    *)
595ba6a1819Smrg      set fnord "$@" "$arg"
596ba6a1819Smrg      shift # fnord
597ba6a1819Smrg      shift # $arg
598ba6a1819Smrg      ;;
599ba6a1819Smrg    esac
600ba6a1819Smrg  done
601ba6a1819Smrg
602ba6a1819Smrg  test -z "$dashmflag" && dashmflag=-M
6031bedbe3fSmrg  # Require at least two characters before searching for ':'
604ba6a1819Smrg  # in the target name.  This is to cope with DOS-style filenames:
6051bedbe3fSmrg  # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise.
606ba6a1819Smrg  "$@" $dashmflag |
6071bedbe3fSmrg    sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile"
608ba6a1819Smrg  rm -f "$depfile"
609ba6a1819Smrg  cat < "$tmpdepfile" > "$depfile"
6101bedbe3fSmrg  # Some versions of the HPUX 10.20 sed can't process this sed invocation
6111bedbe3fSmrg  # correctly.  Breaking it into two sed invocations is a workaround.
6121bedbe3fSmrg  tr ' ' "$nl" < "$tmpdepfile" \
6131bedbe3fSmrg    | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
6141bedbe3fSmrg    | sed -e 's/$/ :/' >> "$depfile"
615ba6a1819Smrg  rm -f "$tmpdepfile"
616ba6a1819Smrg  ;;
617ba6a1819Smrg
618ba6a1819SmrgdashXmstdout)
619ba6a1819Smrg  # This case only exists to satisfy depend.m4.  It is never actually
620ba6a1819Smrg  # run, as this mode is specially recognized in the preamble.
621ba6a1819Smrg  exit 1
622ba6a1819Smrg  ;;
623ba6a1819Smrg
624ba6a1819Smrgmakedepend)
625ba6a1819Smrg  "$@" || exit $?
626ba6a1819Smrg  # Remove any Libtool call
627ba6a1819Smrg  if test "$libtool" = yes; then
628549e21daSmrg    while test "X$1" != 'X--mode=compile'; do
629ba6a1819Smrg      shift
630ba6a1819Smrg    done
631ba6a1819Smrg    shift
632ba6a1819Smrg  fi
633ba6a1819Smrg  # X makedepend
634ba6a1819Smrg  shift
635549e21daSmrg  cleared=no eat=no
636549e21daSmrg  for arg
637549e21daSmrg  do
638ba6a1819Smrg    case $cleared in
639ba6a1819Smrg    no)
640ba6a1819Smrg      set ""; shift
641ba6a1819Smrg      cleared=yes ;;
642ba6a1819Smrg    esac
643549e21daSmrg    if test $eat = yes; then
644549e21daSmrg      eat=no
645549e21daSmrg      continue
646549e21daSmrg    fi
647ba6a1819Smrg    case "$arg" in
648ba6a1819Smrg    -D*|-I*)
649ba6a1819Smrg      set fnord "$@" "$arg"; shift ;;
650ba6a1819Smrg    # Strip any option that makedepend may not understand.  Remove
651ba6a1819Smrg    # the object too, otherwise makedepend will parse it as a source file.
652549e21daSmrg    -arch)
653549e21daSmrg      eat=yes ;;
654ba6a1819Smrg    -*|$object)
655ba6a1819Smrg      ;;
656ba6a1819Smrg    *)
657ba6a1819Smrg      set fnord "$@" "$arg"; shift ;;
658ba6a1819Smrg    esac
659ba6a1819Smrg  done
660549e21daSmrg  obj_suffix=`echo "$object" | sed 's/^.*\././'`
661ba6a1819Smrg  touch "$tmpdepfile"
662ba6a1819Smrg  ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
663ba6a1819Smrg  rm -f "$depfile"
6641bedbe3fSmrg  # makedepend may prepend the VPATH from the source file name to the object.
6651bedbe3fSmrg  # No need to regex-escape $object, excess matching of '.' is harmless.
6661bedbe3fSmrg  sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile"
6671bedbe3fSmrg  # Some versions of the HPUX 10.20 sed can't process the last invocation
6681bedbe3fSmrg  # correctly.  Breaking it into two sed invocations is a workaround.
6691bedbe3fSmrg  sed '1,2d' "$tmpdepfile" \
6701bedbe3fSmrg    | tr ' ' "$nl" \
6711bedbe3fSmrg    | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
6721bedbe3fSmrg    | sed -e 's/$/ :/' >> "$depfile"
673ba6a1819Smrg  rm -f "$tmpdepfile" "$tmpdepfile".bak
674ba6a1819Smrg  ;;
675ba6a1819Smrg
676ba6a1819Smrgcpp)
677ba6a1819Smrg  # Important note: in order to support this mode, a compiler *must*
678ba6a1819Smrg  # always write the preprocessed file to stdout.
679ba6a1819Smrg  "$@" || exit $?
680ba6a1819Smrg
681ba6a1819Smrg  # Remove the call to Libtool.
682ba6a1819Smrg  if test "$libtool" = yes; then
683549e21daSmrg    while test "X$1" != 'X--mode=compile'; do
684ba6a1819Smrg      shift
685ba6a1819Smrg    done
686ba6a1819Smrg    shift
687ba6a1819Smrg  fi
688ba6a1819Smrg
6891bedbe3fSmrg  # Remove '-o $object'.
690ba6a1819Smrg  IFS=" "
691ba6a1819Smrg  for arg
692ba6a1819Smrg  do
693ba6a1819Smrg    case $arg in
694ba6a1819Smrg    -o)
695ba6a1819Smrg      shift
696ba6a1819Smrg      ;;
697ba6a1819Smrg    $object)
698ba6a1819Smrg      shift
699ba6a1819Smrg      ;;
700ba6a1819Smrg    *)
701ba6a1819Smrg      set fnord "$@" "$arg"
702ba6a1819Smrg      shift # fnord
703ba6a1819Smrg      shift # $arg
704ba6a1819Smrg      ;;
705ba6a1819Smrg    esac
706ba6a1819Smrg  done
707ba6a1819Smrg
7081bedbe3fSmrg  "$@" -E \
7091bedbe3fSmrg    | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
7101bedbe3fSmrg             -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
7111bedbe3fSmrg    | sed '$ s: \\$::' > "$tmpdepfile"
712ba6a1819Smrg  rm -f "$depfile"
713ba6a1819Smrg  echo "$object : \\" > "$depfile"
714ba6a1819Smrg  cat < "$tmpdepfile" >> "$depfile"
715ba6a1819Smrg  sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
716ba6a1819Smrg  rm -f "$tmpdepfile"
717ba6a1819Smrg  ;;
718ba6a1819Smrg
719ba6a1819Smrgmsvisualcpp)
720ba6a1819Smrg  # Important note: in order to support this mode, a compiler *must*
721549e21daSmrg  # always write the preprocessed file to stdout.
722ba6a1819Smrg  "$@" || exit $?
723549e21daSmrg
724549e21daSmrg  # Remove the call to Libtool.
725549e21daSmrg  if test "$libtool" = yes; then
726549e21daSmrg    while test "X$1" != 'X--mode=compile'; do
727549e21daSmrg      shift
728549e21daSmrg    done
729549e21daSmrg    shift
730549e21daSmrg  fi
731549e21daSmrg
732ba6a1819Smrg  IFS=" "
733ba6a1819Smrg  for arg
734ba6a1819Smrg  do
735ba6a1819Smrg    case "$arg" in
736549e21daSmrg    -o)
737549e21daSmrg      shift
738549e21daSmrg      ;;
739549e21daSmrg    $object)
740549e21daSmrg      shift
741549e21daSmrg      ;;
742ba6a1819Smrg    "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
7431bedbe3fSmrg        set fnord "$@"
7441bedbe3fSmrg        shift
7451bedbe3fSmrg        shift
7461bedbe3fSmrg        ;;
747ba6a1819Smrg    *)
7481bedbe3fSmrg        set fnord "$@" "$arg"
7491bedbe3fSmrg        shift
7501bedbe3fSmrg        shift
7511bedbe3fSmrg        ;;
752ba6a1819Smrg    esac
753ba6a1819Smrg  done
754549e21daSmrg  "$@" -E 2>/dev/null |
755549e21daSmrg  sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile"
756ba6a1819Smrg  rm -f "$depfile"
757ba6a1819Smrg  echo "$object : \\" > "$depfile"
7581bedbe3fSmrg  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile"
7591bedbe3fSmrg  echo "$tab" >> "$depfile"
760549e21daSmrg  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile"
761ba6a1819Smrg  rm -f "$tmpdepfile"
762ba6a1819Smrg  ;;
763ba6a1819Smrg
764549e21daSmrgmsvcmsys)
765549e21daSmrg  # This case exists only to let depend.m4 do its work.  It works by
766549e21daSmrg  # looking at the text of this script.  This case will never be run,
767549e21daSmrg  # since it is checked for above.
768549e21daSmrg  exit 1
769549e21daSmrg  ;;
770549e21daSmrg
771ba6a1819Smrgnone)
772ba6a1819Smrg  exec "$@"
773ba6a1819Smrg  ;;
774ba6a1819Smrg
775ba6a1819Smrg*)
776ba6a1819Smrg  echo "Unknown depmode $depmode" 1>&2
777ba6a1819Smrg  exit 1
778ba6a1819Smrg  ;;
779ba6a1819Smrgesac
780ba6a1819Smrg
781ba6a1819Smrgexit 0
782ba6a1819Smrg
783ba6a1819Smrg# Local Variables:
784ba6a1819Smrg# mode: shell-script
785ba6a1819Smrg# sh-indentation: 2
786ba6a1819Smrg# eval: (add-hook 'write-file-hooks 'time-stamp)
787ba6a1819Smrg# time-stamp-start: "scriptversion="
788ba6a1819Smrg# time-stamp-format: "%:y-%02m-%02d.%02H"
789549e21daSmrg# time-stamp-time-zone: "UTC"
790549e21daSmrg# time-stamp-end: "; # UTC"
791ba6a1819Smrg# End:
792