depcomp | depcomp | |||
---|---|---|---|---|
#! /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=2013-05-30.07; # UTC | |||
# Copyright (C) 1999-2012 Free Software Foundation, Inc. | # Copyright (C) 1999-2013 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 | |||
# the Free Software Foundation; either version 2, or (at your option) | # the Free Software Foundation; either version 2, or (at your option) | |||
# any later version. | # any later version. | |||
# This program is distributed in the hope that it will be useful, | # This program is distributed in the hope that it will be useful, | |||
# but WITHOUT ANY WARRANTY; without even the implied warranty of | # but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
# GNU General Public License for more details. | # GNU General Public License for more details. | |||
skipping to change at line 30 | skipping to change at line 30 | |||
# As a special exception to the GNU General Public License, if you | # As a special exception to the GNU General Public License, if you | |||
# distribute this file as part of a program that contains a | # distribute this file as part of a program that contains a | |||
# configuration script generated by Autoconf, you may include it under | # configuration script generated by Autoconf, you may include it under | |||
# the same distribution terms that you use for the rest of that program. | # the same distribution terms that you use for the rest of that program. | |||
# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>. | # Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>. | |||
case $1 in | case $1 in | |||
'') | '') | |||
echo "$0: No command. Try '$0 --help' for more information." 1>&2 | echo "$0: No command. Try '$0 --help' for more information." 1>&2 | |||
exit 1; | exit 1; | |||
;; | ;; | |||
-h | --h*) | -h | --h*) | |||
cat <<\EOF | cat <<\EOF | |||
Usage: depcomp [--help] [--version] PROGRAM [ARGS] | Usage: depcomp [--help] [--version] PROGRAM [ARGS] | |||
Run PROGRAMS ARGS to compile a file, generating dependencies | Run PROGRAMS ARGS to compile a file, generating dependencies | |||
as side-effects. | as side-effects. | |||
Environment variables: | Environment variables: | |||
depmode Dependency tracking mode. | depmode Dependency tracking mode. | |||
source Source file read by 'PROGRAMS ARGS'. | source Source file read by 'PROGRAMS ARGS'. | |||
skipping to change at line 59 | skipping to change at line 59 | |||
Report bugs to <bug-automake@gnu.org>. | Report bugs to <bug-automake@gnu.org>. | |||
EOF | EOF | |||
exit $? | exit $? | |||
;; | ;; | |||
-v | --v*) | -v | --v*) | |||
echo "depcomp $scriptversion" | echo "depcomp $scriptversion" | |||
exit $? | exit $? | |||
;; | ;; | |||
esac | esac | |||
# Get the directory component of the given path, and save it in the | ||||
# global variables '$dir'. Note that this directory component will | ||||
# be either empty or ending with a '/' character. This is deliberate. | ||||
set_dir_from () | ||||
{ | ||||
case $1 in | ||||
*/*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;; | ||||
*) dir=;; | ||||
esac | ||||
} | ||||
# Get the suffix-stripped basename of the given path, and save it the | ||||
# global variable '$base'. | ||||
set_base_from () | ||||
{ | ||||
base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'` | ||||
} | ||||
# If no dependency file was actually created by the compiler invocation, | ||||
# we still have to create a dummy depfile, to avoid errors with the | ||||
# Makefile "include basename.Plo" scheme. | ||||
make_dummy_depfile () | ||||
{ | ||||
echo "#dummy" > "$depfile" | ||||
} | ||||
# Factor out some common post-processing of the generated depfile. | ||||
# Requires the auxiliary global variable '$tmpdepfile' to be set. | ||||
aix_post_process_depfile () | ||||
{ | ||||
# If the compiler actually managed to produce a dependency file, | ||||
# post-process it. | ||||
if test -f "$tmpdepfile"; then | ||||
# Each line is of the form 'foo.o: dependency.h'. | ||||
# Do two passes, one to just change these to | ||||
# $object: dependency.h | ||||
# and one to simply output | ||||
# dependency.h: | ||||
# which is needed to avoid the deleted-header problem. | ||||
{ sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile" | ||||
sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile" | ||||
} > "$depfile" | ||||
rm -f "$tmpdepfile" | ||||
else | ||||
make_dummy_depfile | ||||
fi | ||||
} | ||||
# A tabulation character. | # A tabulation character. | |||
tab=' ' | tab=' ' | |||
# A newline character. | # A newline character. | |||
nl=' | nl=' | |||
' | ' | |||
# Character ranges might be problematic outside the C locale. | ||||
# These definitions help. | ||||
upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ | ||||
lower=abcdefghijklmnopqrstuvwxyz | ||||
digits=0123456789 | ||||
alpha=${upper}${lower} | ||||
if test -z "$depmode" || test -z "$source" || test -z "$object"; then | if test -z "$depmode" || test -z "$source" || test -z "$object"; then | |||
echo "depcomp: Variables source, object and depmode must be set" 1>&2 | echo "depcomp: Variables source, object and depmode must be set" 1>&2 | |||
exit 1 | exit 1 | |||
fi | fi | |||
# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. | # Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. | |||
depfile=${depfile-`echo "$object" | | depfile=${depfile-`echo "$object" | | |||
sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} | sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} | |||
tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} | tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} | |||
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 | |||
# here, because this file can only contain one case statement. | # here, because this file can only contain one case statement. | |||
if test "$depmode" = hp; then | if test "$depmode" = hp; then | |||
# HP compiler uses -M and no extra arg. | # HP compiler uses -M and no extra arg. | |||
gccflag=-M | gccflag=-M | |||
depmode=gcc | depmode=gcc | |||
fi | fi | |||
if test "$depmode" = dashXmstdout; then | if test "$depmode" = dashXmstdout; then | |||
# This is just like dashmstdout with a different argument. | # This is just like dashmstdout with a different argument. | |||
dashmflag=-xM | dashmflag=-xM | |||
depmode=dashmstdout | depmode=dashmstdout | |||
fi | fi | |||
cygpath_u="cygpath -u -f -" | cygpath_u="cygpath -u -f -" | |||
if test "$depmode" = msvcmsys; then | if test "$depmode" = msvcmsys; then | |||
# This is just like msvisualcpp but w/o cygpath translation. | # This is just like msvisualcpp but w/o cygpath translation. | |||
# Just convert the backslash-escaped backslashes to single forward | # Just convert the backslash-escaped backslashes to single forward | |||
# slashes to satisfy depend.m4 | # slashes to satisfy depend.m4 | |||
cygpath_u='sed s,\\\\,/,g' | cygpath_u='sed s,\\\\,/,g' | |||
depmode=msvisualcpp | depmode=msvisualcpp | |||
fi | fi | |||
if test "$depmode" = msvc7msys; then | if test "$depmode" = msvc7msys; then | |||
# This is just like msvc7 but w/o cygpath translation. | # This is just like msvc7 but w/o cygpath translation. | |||
# Just convert the backslash-escaped backslashes to single forward | # Just convert the backslash-escaped backslashes to single forward | |||
# slashes to satisfy depend.m4 | # slashes to satisfy depend.m4 | |||
cygpath_u='sed s,\\\\,/,g' | cygpath_u='sed s,\\\\,/,g' | |||
depmode=msvc7 | depmode=msvc7 | |||
fi | fi | |||
if test "$depmode" = xlc; then | if test "$depmode" = xlc; then | |||
# IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information | # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information. | |||
s. | gccflag=-qmakedep=gcc,-MF | |||
gccflag=-qmakedep=gcc,-MF | depmode=gcc | |||
depmode=gcc | ||||
fi | fi | |||
case "$depmode" in | case "$depmode" in | |||
gcc3) | gcc3) | |||
## gcc 3 implements dependency tracking that does exactly what | ## gcc 3 implements dependency tracking that does exactly what | |||
## we want. Yay! Note: for some reason libtool 1.4 doesn't like | ## we want. Yay! Note: for some reason libtool 1.4 doesn't like | |||
## it if -MD -MP comes after the -MF stuff. Hmm. | ## it if -MD -MP comes after the -MF stuff. Hmm. | |||
## Unfortunately, FreeBSD c89 acceptance of flags depends upon | ## Unfortunately, FreeBSD c89 acceptance of flags depends upon | |||
## the command line argument order; so add the flags where they | ## the command line argument order; so add the flags where they | |||
## appear in depend2.am. Note that the slowdown incurred here | ## appear in depend2.am. Note that the slowdown incurred here | |||
skipping to change at line 136 | skipping to change at line 193 | |||
do | do | |||
case $arg in | case $arg in | |||
-c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; | -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; | |||
*) set fnord "$@" "$arg" ;; | *) set fnord "$@" "$arg" ;; | |||
esac | esac | |||
shift # fnord | shift # fnord | |||
shift # $arg | shift # $arg | |||
done | done | |||
"$@" | "$@" | |||
stat=$? | stat=$? | |||
if test $stat -eq 0; then : | if test $stat -ne 0; then | |||
else | ||||
rm -f "$tmpdepfile" | rm -f "$tmpdepfile" | |||
exit $stat | exit $stat | |||
fi | fi | |||
mv "$tmpdepfile" "$depfile" | mv "$tmpdepfile" "$depfile" | |||
;; | ;; | |||
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 | |||
gccflag=-MD, | gccflag=-MD, | |||
fi | fi | |||
"$@" -Wp,"$gccflag$tmpdepfile" | "$@" -Wp,"$gccflag$tmpdepfile" | |||
stat=$? | stat=$? | |||
if test $stat -eq 0; then : | if test $stat -ne 0; then | |||
else | ||||
rm -f "$tmpdepfile" | rm -f "$tmpdepfile" | |||
exit $stat | exit $stat | |||
fi | fi | |||
rm -f "$depfile" | rm -f "$depfile" | |||
echo "$object : \\" > "$depfile" | echo "$object : \\" > "$depfile" | |||
alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz | # The second -e expression handles DOS-style file names with drive | |||
## The second -e expression handles DOS-style file names with drive letters | # letters. | |||
. | ||||
sed -e 's/^[^:]*: / /' \ | sed -e 's/^[^:]*: / /' \ | |||
-e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" | -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" | |||
## This next piece of magic avoids the "deleted header file" problem. | ## This next piece of magic avoids the "deleted header file" problem. | |||
## The problem is that when a header file which appears in a .P file | ## The problem is that when a header file which appears in a .P file | |||
## is deleted, the dependency causes make to die (because there is | ## is deleted, the dependency causes make to die (because there is | |||
## typically no way to rebuild the header). We avoid this by adding | ## typically no way to rebuild the header). We avoid this by adding | |||
## dummy dependencies for each header file. Too bad gcc doesn't do | ## dummy dependencies for each header file. Too bad gcc doesn't do | |||
## this for us directly. | ## this for us directly. | |||
tr ' ' "$nl" < "$tmpdepfile" | | ||||
## Some versions of gcc put a space before the ':'. On the theory | ## Some versions of gcc put a space before the ':'. On the theory | |||
## that the space means something, we add a space to the output as | ## that the space means something, we add a space to the output as | |||
## well. hp depmode also adds that space, but also prefixes the VPATH | ## well. hp depmode also adds that space, but also prefixes the VPATH | |||
## to the object. Take care to not repeat it in the output. | ## to the object. Take care to not repeat it in the output. | |||
## Some versions of the HPUX 10.20 sed can't process this invocation | ## Some versions of the HPUX 10.20 sed can't process this invocation | |||
## correctly. Breaking it into two sed invocations is a workaround. | ## correctly. Breaking it into two sed invocations is a workaround. | |||
sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ | tr ' ' "$nl" < "$tmpdepfile" \ | |||
| sed -e 's/$/ :/' >> "$depfile" | | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ | |||
| sed -e 's/$/ :/' >> "$depfile" | ||||
rm -f "$tmpdepfile" | rm -f "$tmpdepfile" | |||
;; | ;; | |||
hp) | hp) | |||
# This case exists only to let depend.m4 do its work. It works by | # This case exists only to let depend.m4 do its work. It works by | |||
# looking at the text of this script. This case will never be run, | # looking at the text of this script. This case will never be run, | |||
# since it is checked for above. | # since it is checked for above. | |||
exit 1 | exit 1 | |||
;; | ;; | |||
sgi) | sgi) | |||
if test "$libtool" = yes; then | if test "$libtool" = yes; then | |||
"$@" "-Wp,-MDupdate,$tmpdepfile" | "$@" "-Wp,-MDupdate,$tmpdepfile" | |||
else | else | |||
"$@" -MDupdate "$tmpdepfile" | "$@" -MDupdate "$tmpdepfile" | |||
fi | fi | |||
stat=$? | stat=$? | |||
if test $stat -eq 0; then : | if test $stat -ne 0; then | |||
else | ||||
rm -f "$tmpdepfile" | rm -f "$tmpdepfile" | |||
exit $stat | exit $stat | |||
fi | fi | |||
rm -f "$depfile" | rm -f "$depfile" | |||
if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other fil es | if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other fil es | |||
echo "$object : \\" > "$depfile" | echo "$object : \\" > "$depfile" | |||
# Clip off the initial element (the dependent). Don't try to be | # Clip off the initial element (the dependent). Don't try to be | |||
# clever and replace this with sed code, as IRIX sed won't handle | # clever and replace this with sed code, as IRIX sed won't handle | |||
# lines with more than a fixed number of characters (4096 in | # lines with more than a fixed number of characters (4096 in | |||
# IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; | # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; | |||
# the IRIX cc adds comments like '#:fec' to the end of the | # the IRIX cc adds comments like '#:fec' to the end of the | |||
# dependency line. | # dependency line. | |||
tr ' ' "$nl" < "$tmpdepfile" \ | tr ' ' "$nl" < "$tmpdepfile" \ | |||
| sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \ | | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \ | |||
tr "$nl" ' ' >> "$depfile" | | tr "$nl" ' ' >> "$depfile" | |||
echo >> "$depfile" | echo >> "$depfile" | |||
# The second pass generates a dummy entry for each header file. | # The second pass generates a dummy entry for each header file. | |||
tr ' ' "$nl" < "$tmpdepfile" \ | tr ' ' "$nl" < "$tmpdepfile" \ | |||
| sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ | | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ | |||
>> "$depfile" | >> "$depfile" | |||
else | else | |||
# The sourcefile does not contain any dependencies, so just | make_dummy_depfile | |||
# store a dummy comment line, to avoid errors with the Makefile | ||||
# "include basename.Plo" scheme. | ||||
echo "#dummy" > "$depfile" | ||||
fi | fi | |||
rm -f "$tmpdepfile" | rm -f "$tmpdepfile" | |||
;; | ;; | |||
xlc) | xlc) | |||
# This case exists only to let depend.m4 do its work. It works by | # This case exists only to let depend.m4 do its work. It works by | |||
# looking at the text of this script. This case will never be run, | # looking at the text of this script. This case will never be run, | |||
# since it is checked for above. | # since it is checked for above. | |||
exit 1 | exit 1 | |||
;; | ;; | |||
aix) | aix) | |||
# The C for AIX Compiler uses -M and outputs the dependencies | # The C for AIX Compiler uses -M and outputs the dependencies | |||
# in a .u file. In older versions, this file always lives in the | # in a .u file. In older versions, this file always lives in the | |||
# current directory. Also, the AIX compiler puts '$object:' at the | # current directory. Also, the AIX compiler puts '$object:' at the | |||
# start of each line; $object doesn't have directory information. | # start of each line; $object doesn't have directory information. | |||
# Version 6 uses the directory in both cases. | # Version 6 uses the directory in both cases. | |||
dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` | set_dir_from "$object" | |||
test "x$dir" = "x$object" && dir= | set_base_from "$object" | |||
base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` | ||||
if test "$libtool" = yes; then | if test "$libtool" = yes; then | |||
tmpdepfile1=$dir$base.u | tmpdepfile1=$dir$base.u | |||
tmpdepfile2=$base.u | tmpdepfile2=$base.u | |||
tmpdepfile3=$dir.libs/$base.u | tmpdepfile3=$dir.libs/$base.u | |||
"$@" -Wc,-M | "$@" -Wc,-M | |||
else | else | |||
tmpdepfile1=$dir$base.u | tmpdepfile1=$dir$base.u | |||
tmpdepfile2=$dir$base.u | tmpdepfile2=$dir$base.u | |||
tmpdepfile3=$dir$base.u | tmpdepfile3=$dir$base.u | |||
"$@" -M | "$@" -M | |||
fi | fi | |||
stat=$? | stat=$? | |||
if test $stat -ne 0; then | ||||
if test $stat -eq 0; then : | ||||
else | ||||
rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" | rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" | |||
exit $stat | exit $stat | |||
fi | fi | |||
for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" | for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" | |||
do | do | |||
test -f "$tmpdepfile" && break | test -f "$tmpdepfile" && break | |||
done | done | |||
if test -f "$tmpdepfile"; then | aix_post_process_depfile | |||
# Each line is of the form 'foo.o: dependent.h'. | ;; | |||
# Do two passes, one to just change these to | ||||
# '$object: dependent.h' and one to simply 'dependent.h:'. | tcc) | |||
sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" | # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26 | |||
sed -e 's,^.*\.[a-z]*:['"$tab"' ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$ | # FIXME: That version still under development at the moment of writing. | |||
depfile" | # Make that this statement remains true also for stable, released | |||
else | # versions. | |||
# The sourcefile does not contain any dependencies, so just | # It will wrap lines (doesn't matter whether long or short) with a | |||
# store a dummy comment line, to avoid errors with the Makefile | # trailing '\', as in: | |||
# "include basename.Plo" scheme. | # | |||
echo "#dummy" > "$depfile" | # foo.o : \ | |||
# foo.c \ | ||||
# foo.h \ | ||||
# | ||||
# It will put a trailing '\' even on the last line, and will use leading | ||||
# spaces rather than leading tabs (at least since its commit 0394caf7 | ||||
# "Emit spaces for -MD"). | ||||
"$@" -MD -MF "$tmpdepfile" | ||||
stat=$? | ||||
if test $stat -ne 0; then | ||||
rm -f "$tmpdepfile" | ||||
exit $stat | ||||
fi | fi | |||
rm -f "$depfile" | ||||
# Each non-empty line is of the form 'foo.o : \' or ' dep.h \'. | ||||
# We have to change lines of the first kind to '$object: \'. | ||||
sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile" | ||||
# And for each line of the second kind, we have to emit a 'dep.h:' | ||||
# dummy dependency, to avoid the deleted-header problem. | ||||
sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile" | ||||
rm -f "$tmpdepfile" | rm -f "$tmpdepfile" | |||
;; | ;; | |||
icc) | ## The order of this option in the case statement is important, since the | |||
# Intel's C compiler anf tcc (Tiny C Compiler) understand '-MD -MF file'. | ## shell code in configure will try each of these formats in the order | |||
# However on | ## listed in this file. A plain '-MD' option would be understood by many | |||
# $CC -MD -MF foo.d -c -o sub/foo.o sub/foo.c | ## compilers, so we must ensure this comes after the gcc and icc options. | |||
# ICC 7.0 will fill foo.d with something like | pgcc) | |||
# foo.o: sub/foo.c | # Portland's C compiler understands '-MD'. | |||
# foo.o: sub/foo.h | # Will always output deps to 'file.d' where file is the root name of the | |||
# which is wrong. We want | # source file under compilation, even if file resides in a subdirectory. | |||
# sub/foo.o: sub/foo.c | # The object file name does not affect the name of the '.d' file. | |||
# sub/foo.o: sub/foo.h | # pgcc 10.2 will output | |||
# sub/foo.c: | ||||
# sub/foo.h: | ||||
# ICC 7.1 will output | ||||
# foo.o: sub/foo.c sub/foo.h | # foo.o: sub/foo.c sub/foo.h | |||
# and will wrap long lines using '\': | # and will wrap long lines using '\' : | |||
# foo.o: sub/foo.c ... \ | # foo.o: sub/foo.c ... \ | |||
# sub/foo.h ... \ | # sub/foo.h ... \ | |||
# ... | # ... | |||
# tcc 0.9.26 (FIXME still under development at the moment of writing) | set_dir_from "$object" | |||
# will emit a similar output, but also prepend the continuation lines | # Use the source, not the object, to determine the base name, since | |||
# with horizontal tabulation characters. | # that's sadly what pgcc will do too. | |||
"$@" -MD -MF "$tmpdepfile" | set_base_from "$source" | |||
stat=$? | tmpdepfile=$base.d | |||
if test $stat -eq 0; then : | ||||
else | # For projects that build the same source file twice into different objec | |||
t | ||||
# 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 | ||||
rmdir '$lockdir' | ||||
exit 1 | ||||
" 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. | ||||
rmdir "$lockdir" | ||||
break | ||||
else | ||||
# If 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" | rm -f "$tmpdepfile" | |||
exit $stat | exit $stat | |||
fi | fi | |||
rm -f "$depfile" | rm -f "$depfile" | |||
# Each line is of the form 'foo.o: dependent.h', | # Each line is of the form `foo.o: dependent.h', | |||
# or 'foo.o: dep1.h dep2.h \', or ' dep3.h dep4.h \'. | # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. | |||
# Do two passes, one to just change these to | # Do two passes, one to just change these to | |||
# '$object: dependent.h' and one to simply 'dependent.h:'. | # `$object: dependent.h' and one to simply `dependent.h:'. | |||
sed -e "s/^[ $tab][ $tab]*/ /" -e "s,^[^:]*:,$object :," \ | sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" | |||
< "$tmpdepfile" > "$depfile" | # Some versions of the HPUX 10.20 sed can't process this invocation | |||
sed ' | # correctly. Breaking it into two sed invocations is a workaround. | |||
s/[ '"$tab"'][ '"$tab"']*/ /g | sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \ | |||
s/^ *// | | sed -e 's/$/ :/' >> "$depfile" | |||
s/ *\\*$// | ||||
s/^[^:]*: *// | ||||
/^$/d | ||||
/:$/d | ||||
s/$/ :/ | ||||
' < "$tmpdepfile" >> "$depfile" | ||||
rm -f "$tmpdepfile" | rm -f "$tmpdepfile" | |||
;; | ;; | |||
hp2) | hp2) | |||
# The "hp" stanza above does not work with aCC (C++) and HP's ia64 | # The "hp" stanza above does not work with aCC (C++) and HP's ia64 | |||
# compilers, which have integrated preprocessors. The correct option | # compilers, which have integrated preprocessors. The correct option | |||
# to use with these is +Maked; it writes dependencies to a file named | # to use with these is +Maked; it writes dependencies to a file named | |||
# 'foo.d', which lands next to the object file, wherever that | # 'foo.d', which lands next to the object file, wherever that | |||
# happens to be. | # happens to be. | |||
# Much of this is similar to the tru64 case; see comments there. | # Much of this is similar to the tru64 case; see comments there. | |||
dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` | set_dir_from "$object" | |||
test "x$dir" = "x$object" && dir= | set_base_from "$object" | |||
base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` | ||||
if test "$libtool" = yes; then | if test "$libtool" = yes; then | |||
tmpdepfile1=$dir$base.d | tmpdepfile1=$dir$base.d | |||
tmpdepfile2=$dir.libs/$base.d | tmpdepfile2=$dir.libs/$base.d | |||
"$@" -Wc,+Maked | "$@" -Wc,+Maked | |||
else | else | |||
tmpdepfile1=$dir$base.d | tmpdepfile1=$dir$base.d | |||
tmpdepfile2=$dir$base.d | tmpdepfile2=$dir$base.d | |||
"$@" +Maked | "$@" +Maked | |||
fi | fi | |||
stat=$? | stat=$? | |||
if test $stat -eq 0; then : | if test $stat -ne 0; then | |||
else | ||||
rm -f "$tmpdepfile1" "$tmpdepfile2" | rm -f "$tmpdepfile1" "$tmpdepfile2" | |||
exit $stat | exit $stat | |||
fi | fi | |||
for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" | for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" | |||
do | do | |||
test -f "$tmpdepfile" && break | test -f "$tmpdepfile" && break | |||
done | done | |||
if test -f "$tmpdepfile"; then | if test -f "$tmpdepfile"; then | |||
sed -e "s,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile" | sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile" | |||
# Add 'dependent.h:' lines. | # Add 'dependent.h:' lines. | |||
sed -ne '2,${ | sed -ne '2,${ | |||
s/^ *// | s/^ *// | |||
s/ \\*$// | s/ \\*$// | |||
s/$/:/ | s/$/:/ | |||
p | p | |||
}' "$tmpdepfile" >> "$depfile" | }' "$tmpdepfile" >> "$depfile" | |||
else | else | |||
echo "#dummy" > "$depfile" | make_dummy_depfile | |||
fi | fi | |||
rm -f "$tmpdepfile" "$tmpdepfile2" | rm -f "$tmpdepfile" "$tmpdepfile2" | |||
;; | ;; | |||
tru64) | tru64) | |||
# The Tru64 compiler uses -MD to generate dependencies as a side | # The Tru64 compiler uses -MD to generate dependencies as a side | |||
# effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. | # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. | |||
# At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put | # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put | |||
# dependencies in 'foo.d' instead, so we check for that too. | # dependencies in 'foo.d' instead, so we check for that too. | |||
# Subdirectories are respected. | # Subdirectories are respected. | |||
dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` | set_dir_from "$object" | |||
test "x$dir" = "x$object" && dir= | set_base_from "$object" | |||
base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` | ||||
if test "$libtool" = yes; then | ||||
if test "$libtool" = yes; then | # Libtool generates 2 separate objects for the 2 libraries. These | |||
# With Tru64 cc, shared objects can also be used to make a | # two compilations output dependencies in $dir.libs/$base.o.d and | |||
# static library. This mechanism is used in libtool 1.4 series to | # in $dir$base.o.d. We have to check for both files, because | |||
# handle both shared and static libraries in a single compilation. | # one of the two compilations can be disabled. We should prefer | |||
# With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d. | # $dir$base.o.d over $dir.libs/$base.o.d because the latter is | |||
# | # automatically cleaned when .libs/ is deleted, while ignoring | |||
# With libtool 1.5 this exception was removed, and libtool now | # the former would cause a distcleancheck panic. | |||
# generates 2 separate objects for the 2 libraries. These two | tmpdepfile1=$dir$base.o.d # libtool 1.5 | |||
# compilations output dependencies in $dir.libs/$base.o.d and | tmpdepfile2=$dir.libs/$base.o.d # Likewise. | |||
# in $dir$base.o.d. We have to check for both files, because | tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504 | |||
# one of the two compilations can be disabled. We should prefer | "$@" -Wc,-MD | |||
# $dir$base.o.d over $dir.libs/$base.o.d because the latter is | else | |||
# automatically cleaned when .libs/ is deleted, while ignoring | tmpdepfile1=$dir$base.d | |||
# the former would cause a distcleancheck panic. | tmpdepfile2=$dir$base.d | |||
tmpdepfile1=$dir.libs/$base.lo.d # libtool 1.4 | tmpdepfile3=$dir$base.d | |||
tmpdepfile2=$dir$base.o.d # libtool 1.5 | "$@" -MD | |||
tmpdepfile3=$dir.libs/$base.o.d # libtool 1.5 | fi | |||
tmpdepfile4=$dir.libs/$base.d # Compaq CCC V6.2-504 | ||||
"$@" -Wc,-MD | stat=$? | |||
else | if test $stat -ne 0; then | |||
tmpdepfile1=$dir$base.o.d | rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" | |||
tmpdepfile2=$dir$base.d | exit $stat | |||
tmpdepfile3=$dir$base.d | fi | |||
tmpdepfile4=$dir$base.d | ||||
"$@" -MD | ||||
fi | ||||
stat=$? | for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" | |||
if test $stat -eq 0; then : | do | |||
else | test -f "$tmpdepfile" && break | |||
rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" | done | |||
exit $stat | # Same post-processing that is required for AIX mode. | |||
fi | aix_post_process_depfile | |||
;; | ||||
for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepf | ||||
ile4" | ||||
do | ||||
test -f "$tmpdepfile" && break | ||||
done | ||||
if test -f "$tmpdepfile"; then | ||||
sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" | ||||
sed -e 's,^.*\.[a-z]*:['"$tab"' ]*,,' -e 's,$,:,' < "$tmpdepfile" >> | ||||
"$depfile" | ||||
else | ||||
echo "#dummy" > "$depfile" | ||||
fi | ||||
rm -f "$tmpdepfile" | ||||
;; | ||||
msvc7) | msvc7) | |||
if test "$libtool" = yes; then | if test "$libtool" = yes; then | |||
showIncludes=-Wc,-showIncludes | showIncludes=-Wc,-showIncludes | |||
else | else | |||
showIncludes=-showIncludes | showIncludes=-showIncludes | |||
fi | fi | |||
"$@" $showIncludes > "$tmpdepfile" | "$@" $showIncludes > "$tmpdepfile" | |||
stat=$? | stat=$? | |||
grep -v '^Note: including file: ' "$tmpdepfile" | grep -v '^Note: including file: ' "$tmpdepfile" | |||
if test "$stat" = 0; then : | if test $stat -ne 0; then | |||
else | ||||
rm -f "$tmpdepfile" | rm -f "$tmpdepfile" | |||
exit $stat | exit $stat | |||
fi | fi | |||
rm -f "$depfile" | rm -f "$depfile" | |||
echo "$object : \\" > "$depfile" | echo "$object : \\" > "$depfile" | |||
# The first sed program below extracts the file names and escapes | # The first sed program below extracts the file names and escapes | |||
# backslashes for cygpath. The second sed program outputs the file | # backslashes for cygpath. The second sed program outputs the file | |||
# name when reading, but also accumulates all include files in the | # name when reading, but also accumulates all include files in the | |||
# hold buffer in order to output them again at the end. This only | # hold buffer in order to output them again at the end. This only | |||
# works with sed implementations that can handle large buffers. | # works with sed implementations that can handle large buffers. | |||
skipping to change at line 475 | skipping to change at line 555 | |||
}' | $cygpath_u | sort -u | sed -n ' | }' | $cygpath_u | sort -u | sed -n ' | |||
s/ /\\ /g | s/ /\\ /g | |||
s/\(.*\)/'"$tab"'\1 \\/p | s/\(.*\)/'"$tab"'\1 \\/p | |||
s/.\(.*\) \\/\1:/ | s/.\(.*\) \\/\1:/ | |||
H | H | |||
$ { | $ { | |||
s/.*/'"$tab"'/ | s/.*/'"$tab"'/ | |||
G | G | |||
p | p | |||
}' >> "$depfile" | }' >> "$depfile" | |||
echo >> "$depfile" # make sure the fragment doesn't end with a backslash | ||||
rm -f "$tmpdepfile" | rm -f "$tmpdepfile" | |||
;; | ;; | |||
msvc7msys) | msvc7msys) | |||
# This case exists only to let depend.m4 do its work. It works by | # This case exists only to let depend.m4 do its work. It works by | |||
# looking at the text of this script. This case will never be run, | # looking at the text of this script. This case will never be run, | |||
# since it is checked for above. | # since it is checked for above. | |||
exit 1 | exit 1 | |||
;; | ;; | |||
skipping to change at line 526 | skipping to change at line 607 | |||
shift # $arg | shift # $arg | |||
;; | ;; | |||
esac | esac | |||
done | done | |||
test -z "$dashmflag" && dashmflag=-M | test -z "$dashmflag" && dashmflag=-M | |||
# Require at least two characters before searching for ':' | # Require at least two characters before searching for ':' | |||
# in the target name. This is to cope with DOS-style filenames: | # in the target name. This is to cope with DOS-style filenames: | |||
# a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise . | # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise . | |||
"$@" $dashmflag | | "$@" $dashmflag | | |||
sed 's:^['"$tab"' ]*[^:'"$tab"' ][^:][^:]*\:['"$tab"' ]*:'"$object"'\: :' > "$tmpdepfile" | sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile" | |||
rm -f "$depfile" | rm -f "$depfile" | |||
cat < "$tmpdepfile" > "$depfile" | cat < "$tmpdepfile" > "$depfile" | |||
tr ' ' "$nl" < "$tmpdepfile" | \ | # Some versions of the HPUX 10.20 sed can't process this sed invocation | |||
## Some versions of the HPUX 10.20 sed can't process this invocation | # correctly. Breaking it into two sed invocations is a workaround. | |||
## correctly. Breaking it into two sed invocations is a workaround. | tr ' ' "$nl" < "$tmpdepfile" \ | |||
sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile | | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ | |||
" | | sed -e 's/$/ :/' >> "$depfile" | |||
rm -f "$tmpdepfile" | rm -f "$tmpdepfile" | |||
;; | ;; | |||
dashXmstdout) | dashXmstdout) | |||
# This case only exists to satisfy depend.m4. It is never actually | # This case only exists to satisfy depend.m4. It is never actually | |||
# run, as this mode is specially recognized in the preamble. | # run, as this mode is specially recognized in the preamble. | |||
exit 1 | exit 1 | |||
;; | ;; | |||
makedepend) | makedepend) | |||
skipping to change at line 585 | skipping to change at line 667 | |||
set fnord "$@" "$arg"; shift ;; | set fnord "$@" "$arg"; shift ;; | |||
esac | esac | |||
done | done | |||
obj_suffix=`echo "$object" | sed 's/^.*\././'` | obj_suffix=`echo "$object" | sed 's/^.*\././'` | |||
touch "$tmpdepfile" | touch "$tmpdepfile" | |||
${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" | ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" | |||
rm -f "$depfile" | rm -f "$depfile" | |||
# makedepend may prepend the VPATH from the source file name to the objec t. | # makedepend may prepend the VPATH from the source file name to the objec t. | |||
# No need to regex-escape $object, excess matching of '.' is harmless. | # No need to regex-escape $object, excess matching of '.' is harmless. | |||
sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" | sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" | |||
sed '1,2d' "$tmpdepfile" | tr ' ' "$nl" | \ | # Some versions of the HPUX 10.20 sed can't process the last invocation | |||
## Some versions of the HPUX 10.20 sed can't process this invocation | # correctly. Breaking it into two sed invocations is a workaround. | |||
## correctly. Breaking it into two sed invocations is a workaround. | sed '1,2d' "$tmpdepfile" \ | |||
sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile | | tr ' ' "$nl" \ | |||
" | | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ | |||
| sed -e 's/$/ :/' >> "$depfile" | ||||
rm -f "$tmpdepfile" "$tmpdepfile".bak | rm -f "$tmpdepfile" "$tmpdepfile".bak | |||
;; | ;; | |||
cpp) | cpp) | |||
# Important note: in order to support this mode, a compiler *must* | # Important note: in order to support this mode, a compiler *must* | |||
# always write the preprocessed file to stdout. | # always write the preprocessed file to stdout. | |||
"$@" || exit $? | "$@" || exit $? | |||
# Remove the call to Libtool. | # Remove the call to Libtool. | |||
if test "$libtool" = yes; then | if test "$libtool" = yes; then | |||
skipping to change at line 624 | skipping to change at line 708 | |||
shift | shift | |||
;; | ;; | |||
*) | *) | |||
set fnord "$@" "$arg" | set fnord "$@" "$arg" | |||
shift # fnord | shift # fnord | |||
shift # $arg | shift # $arg | |||
;; | ;; | |||
esac | esac | |||
done | done | |||
"$@" -E | | "$@" -E \ | |||
sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ | | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ | |||
-e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' | | -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ | |||
sed '$ s: \\$::' > "$tmpdepfile" | | sed '$ s: \\$::' > "$tmpdepfile" | |||
rm -f "$depfile" | rm -f "$depfile" | |||
echo "$object : \\" > "$depfile" | echo "$object : \\" > "$depfile" | |||
cat < "$tmpdepfile" >> "$depfile" | cat < "$tmpdepfile" >> "$depfile" | |||
sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" | sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" | |||
rm -f "$tmpdepfile" | rm -f "$tmpdepfile" | |||
;; | ;; | |||
msvisualcpp) | msvisualcpp) | |||
# Important note: in order to support this mode, a compiler *must* | # Important note: in order to support this mode, a compiler *must* | |||
# always write the preprocessed file to stdout. | # always write the preprocessed file to stdout. | |||
skipping to change at line 659 | skipping to change at line 743 | |||
for arg | for arg | |||
do | do | |||
case "$arg" in | case "$arg" in | |||
-o) | -o) | |||
shift | shift | |||
;; | ;; | |||
$object) | $object) | |||
shift | shift | |||
;; | ;; | |||
"-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") | "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") | |||
set fnord "$@" | set fnord "$@" | |||
shift | shift | |||
shift | shift | |||
;; | ;; | |||
*) | *) | |||
set fnord "$@" "$arg" | set fnord "$@" "$arg" | |||
shift | shift | |||
shift | shift | |||
;; | ;; | |||
esac | esac | |||
done | done | |||
"$@" -E 2>/dev/null | | "$@" -E 2>/dev/null | | |||
sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" | sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" | |||
rm -f "$depfile" | rm -f "$depfile" | |||
echo "$object : \\" > "$depfile" | echo "$object : \\" > "$depfile" | |||
sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" | sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" | |||
echo "$tab" >> "$depfile" | echo "$tab" >> "$depfile" | |||
sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depf ile" | sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depf ile" | |||
rm -f "$tmpdepfile" | rm -f "$tmpdepfile" | |||
End of changes. 47 change blocks. | ||||
191 lines changed or deleted | 270 lines changed or added | |||
This html diff was produced by rfcdiff 1.41. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ |