version 1.1.1.3, 2012/10/09 09:22:28
|
version 1.1.1.4, 2013/07/21 23:54:37
|
Line 1
|
Line 1
|
#! /bin/sh |
#! /bin/sh |
# depcomp - compile a program generating dependencies as side-effects |
# depcomp - compile a program generating dependencies as side-effects |
|
|
scriptversion=2012-03-27.16; # UTC | scriptversion=2012-07-12.20; # UTC |
|
|
# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007, 2009, 2010, | # Copyright (C) 1999-2012 Free Software Foundation, Inc. |
# 2011, 2012 Free Software Foundation, Inc. | |
|
|
# This program is free software; you can redistribute it and/or modify |
# This program is free software; you can redistribute it and/or modify |
# it under the terms of the GNU General Public License as published by |
# it under the terms of the GNU General Public License as published by |
Line 75 tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\(
|
Line 74 tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\(
|
|
|
rm -f "$tmpdepfile" |
rm -f "$tmpdepfile" |
|
|
|
# Avoid interferences from the environment. |
|
gccflag= dashmflag= |
|
|
# Some modes work just like other modes, but use different flags. We |
# Some modes work just like other modes, but use different flags. We |
# parameterize here, but still list the modes in the big case below, |
# parameterize here, but still list the modes in the big case below, |
# to make depend.m4 easier to write. Note that we *cannot* use a case |
# to make depend.m4 easier to write. Note that we *cannot* use a case |
Line 109 if test "$depmode" = msvc7msys; then
|
Line 111 if test "$depmode" = msvc7msys; then
|
fi |
fi |
|
|
if test "$depmode" = xlc; then |
if test "$depmode" = xlc; then |
# IBM C/C++ Compilers xlc/xlC can output gcc-like dependency informations. | # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information. |
gccflag=-qmakedep=gcc,-MF |
gccflag=-qmakedep=gcc,-MF |
depmode=gcc |
depmode=gcc |
fi |
fi |
Line 143 gcc3)
|
Line 145 gcc3)
|
;; |
;; |
|
|
gcc) |
gcc) |
|
## Note that this doesn't just cater to obsosete pre-3.x GCC compilers. |
|
## but also to in-use compilers like IMB xlc/xlC and the HP C compiler. |
|
## (see the conditional assignment to $gccflag above). |
## There are various ways to get dependency output from gcc. Here's |
## There are various ways to get dependency output from gcc. Here's |
## why we pick this rather obscure method: |
## why we pick this rather obscure method: |
## - Don't want to use -MD because we'd like the dependencies to end |
## - Don't want to use -MD because we'd like the dependencies to end |
## up in a subdir. Having to rename by hand is ugly. |
## up in a subdir. Having to rename by hand is ugly. |
## (We might end up doing this anyway to support other compilers.) |
## (We might end up doing this anyway to support other compilers.) |
## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like |
## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like |
## -MM, not -M (despite what the docs say). | ## -MM, not -M (despite what the docs say). Also, it might not be |
| ## supported by the other compilers which use the 'gcc' depmode. |
## - Using -M directly means running the compiler twice (even worse |
## - Using -M directly means running the compiler twice (even worse |
## than renaming). |
## than renaming). |
if test -z "$gccflag"; then |
if test -z "$gccflag"; then |
Line 332 icc)
|
Line 338 icc)
|
/:$/d |
/:$/d |
s/$/ :/ |
s/$/ :/ |
' < "$tmpdepfile" >> "$depfile" |
' < "$tmpdepfile" >> "$depfile" |
|
rm -f "$tmpdepfile" |
|
;; |
|
|
|
## The order of this option in the case statement is important, since the |
|
## shell code in configure will try each of these formats in the order |
|
## listed in this file. A plain '-MD' option would be understood by many |
|
## compilers, so we must ensure this comes after the gcc and icc options. |
|
pgcc) |
|
# Portland's C compiler understands '-MD'. |
|
# Will always output deps to 'file.d' where file is the root name of the |
|
# source file under compilation, even if file resides in a subdirectory. |
|
# The object file name does not affect the name of the '.d' file. |
|
# pgcc 10.2 will output |
|
# foo.o: sub/foo.c sub/foo.h |
|
# and will wrap long lines using '\' : |
|
# foo.o: sub/foo.c ... \ |
|
# sub/foo.h ... \ |
|
# ... |
|
dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` |
|
test "x$dir" = "x$object" && dir= |
|
# Use the source, not the object, to determine the base name, since |
|
# that's sadly what pgcc will do too. |
|
base=`echo "$source" | sed -e 's|^.*/||' -e 's/\.[-_a-zA-Z0-9]*$//'` |
|
tmpdepfile="$base.d" |
|
|
|
# For projects that build the same source file twice into different object |
|
# files, the pgcc approach of using the *source* file root name can cause |
|
# problems in parallel builds. Use a locking strategy to avoid stomping on |
|
# the same $tmpdepfile. |
|
lockdir="$base.d-lock" |
|
trap "echo '$0: caught signal, cleaning up...' >&2; rm -rf $lockdir" 1 2 13 15 |
|
numtries=100 |
|
i=$numtries |
|
while test $i -gt 0 ; do |
|
# mkdir is a portable test-and-set. |
|
if mkdir $lockdir 2>/dev/null; then |
|
# This process acquired the lock. |
|
"$@" -MD |
|
stat=$? |
|
# Release the lock. |
|
rm -rf $lockdir |
|
break |
|
else |
|
## the lock is being held by a different process, |
|
## wait until the winning process is done or we timeout |
|
while test -d $lockdir && test $i -gt 0; do |
|
sleep 1 |
|
i=`expr $i - 1` |
|
done |
|
fi |
|
i=`expr $i - 1` |
|
done |
|
trap - 1 2 13 15 |
|
if test $i -le 0; then |
|
echo "$0: failed to acquire lock after $numtries attempts" >&2 |
|
echo "$0: check lockdir '$lockdir'" >&2 |
|
exit 1 |
|
fi |
|
|
|
if test $stat -ne 0; then |
|
rm -f "$tmpdepfile" |
|
exit $stat |
|
fi |
|
rm -f "$depfile" |
|
# Each line is of the form `foo.o: dependent.h', |
|
# or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. |
|
# Do two passes, one to just change these to |
|
# `$object: dependent.h' and one to simply `dependent.h:'. |
|
sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" |
|
# Some versions of the HPUX 10.20 sed can't process this invocation |
|
# correctly. Breaking it into two sed invocations is a workaround. |
|
sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" | |
|
sed -e 's/$/ :/' >> "$depfile" |
rm -f "$tmpdepfile" |
rm -f "$tmpdepfile" |
;; |
;; |
|
|