depcomp revision 68af480f
197e8a2e8Smrg#! /bin/sh 297e8a2e8Smrg# depcomp - compile a program generating dependencies as side-effects 3d7accfefSmrg 468af480fSmrgscriptversion=2013-05-30.07; # UTC 5d7accfefSmrg 668af480fSmrg# Copyright (C) 1999-2013 Free Software Foundation, Inc. 797e8a2e8Smrg 897e8a2e8Smrg# This program is free software; you can redistribute it and/or modify 997e8a2e8Smrg# it under the terms of the GNU General Public License as published by 1097e8a2e8Smrg# the Free Software Foundation; either version 2, or (at your option) 1197e8a2e8Smrg# any later version. 1297e8a2e8Smrg 1397e8a2e8Smrg# This program is distributed in the hope that it will be useful, 1497e8a2e8Smrg# but WITHOUT ANY WARRANTY; without even the implied warranty of 1597e8a2e8Smrg# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1697e8a2e8Smrg# GNU General Public License for more details. 1797e8a2e8Smrg 1897e8a2e8Smrg# You should have received a copy of the GNU General Public License 19d7accfefSmrg# along with this program. If not, see <http://www.gnu.org/licenses/>. 2097e8a2e8Smrg 2197e8a2e8Smrg# As a special exception to the GNU General Public License, if you 2297e8a2e8Smrg# distribute this file as part of a program that contains a 2397e8a2e8Smrg# configuration script generated by Autoconf, you may include it under 2497e8a2e8Smrg# the same distribution terms that you use for the rest of that program. 2597e8a2e8Smrg 2697e8a2e8Smrg# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>. 2797e8a2e8Smrg 28d7accfefSmrgcase $1 in 29d7accfefSmrg '') 3068af480fSmrg echo "$0: No command. Try '$0 --help' for more information." 1>&2 3168af480fSmrg exit 1; 3268af480fSmrg ;; 33d7accfefSmrg -h | --h*) 34d7accfefSmrg cat <<\EOF 35d7accfefSmrgUsage: depcomp [--help] [--version] PROGRAM [ARGS] 36d7accfefSmrg 37d7accfefSmrgRun PROGRAMS ARGS to compile a file, generating dependencies 38d7accfefSmrgas side-effects. 39d7accfefSmrg 40d7accfefSmrgEnvironment variables: 41d7accfefSmrg depmode Dependency tracking mode. 4268af480fSmrg source Source file read by 'PROGRAMS ARGS'. 4368af480fSmrg object Object file output by 'PROGRAMS ARGS'. 44d7accfefSmrg DEPDIR directory where to store dependencies. 45d7accfefSmrg depfile Dependency file to output. 4668af480fSmrg tmpdepfile Temporary file to use when outputting dependencies. 47d7accfefSmrg libtool Whether libtool is used (yes/no). 48d7accfefSmrg 49d7accfefSmrgReport bugs to <bug-automake@gnu.org>. 50d7accfefSmrgEOF 51d7accfefSmrg exit $? 52d7accfefSmrg ;; 53d7accfefSmrg -v | --v*) 54d7accfefSmrg echo "depcomp $scriptversion" 55d7accfefSmrg exit $? 56d7accfefSmrg ;; 57d7accfefSmrgesac 58d7accfefSmrg 5968af480fSmrg# Get the directory component of the given path, and save it in the 6068af480fSmrg# global variables '$dir'. Note that this directory component will 6168af480fSmrg# be either empty or ending with a '/' character. This is deliberate. 6268af480fSmrgset_dir_from () 6368af480fSmrg{ 6468af480fSmrg case $1 in 6568af480fSmrg */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;; 6668af480fSmrg *) dir=;; 6768af480fSmrg esac 6868af480fSmrg} 6968af480fSmrg 7068af480fSmrg# Get the suffix-stripped basename of the given path, and save it the 7168af480fSmrg# global variable '$base'. 7268af480fSmrgset_base_from () 7368af480fSmrg{ 7468af480fSmrg base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'` 7568af480fSmrg} 7668af480fSmrg 7768af480fSmrg# If no dependency file was actually created by the compiler invocation, 7868af480fSmrg# we still have to create a dummy depfile, to avoid errors with the 7968af480fSmrg# Makefile "include basename.Plo" scheme. 8068af480fSmrgmake_dummy_depfile () 8168af480fSmrg{ 8268af480fSmrg echo "#dummy" > "$depfile" 8368af480fSmrg} 8468af480fSmrg 8568af480fSmrg# Factor out some common post-processing of the generated depfile. 8668af480fSmrg# Requires the auxiliary global variable '$tmpdepfile' to be set. 8768af480fSmrgaix_post_process_depfile () 8868af480fSmrg{ 8968af480fSmrg # If the compiler actually managed to produce a dependency file, 9068af480fSmrg # post-process it. 9168af480fSmrg if test -f "$tmpdepfile"; then 9268af480fSmrg # Each line is of the form 'foo.o: dependency.h'. 9368af480fSmrg # Do two passes, one to just change these to 9468af480fSmrg # $object: dependency.h 9568af480fSmrg # and one to simply output 9668af480fSmrg # dependency.h: 9768af480fSmrg # which is needed to avoid the deleted-header problem. 9868af480fSmrg { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile" 9968af480fSmrg sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile" 10068af480fSmrg } > "$depfile" 10168af480fSmrg rm -f "$tmpdepfile" 10268af480fSmrg else 10368af480fSmrg make_dummy_depfile 10468af480fSmrg fi 10568af480fSmrg} 10668af480fSmrg 10768af480fSmrg# A tabulation character. 10868af480fSmrgtab=' ' 10968af480fSmrg# A newline character. 11068af480fSmrgnl=' 11168af480fSmrg' 11268af480fSmrg# Character ranges might be problematic outside the C locale. 11368af480fSmrg# These definitions help. 11468af480fSmrgupper=ABCDEFGHIJKLMNOPQRSTUVWXYZ 11568af480fSmrglower=abcdefghijklmnopqrstuvwxyz 11668af480fSmrgdigits=0123456789 11768af480fSmrgalpha=${upper}${lower} 11868af480fSmrg 11997e8a2e8Smrgif test -z "$depmode" || test -z "$source" || test -z "$object"; then 12097e8a2e8Smrg echo "depcomp: Variables source, object and depmode must be set" 1>&2 12197e8a2e8Smrg exit 1 12297e8a2e8Smrgfi 12397e8a2e8Smrg 124d7accfefSmrg# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. 125d7accfefSmrgdepfile=${depfile-`echo "$object" | 126d7accfefSmrg sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} 12797e8a2e8Smrgtmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} 12897e8a2e8Smrg 12997e8a2e8Smrgrm -f "$tmpdepfile" 13097e8a2e8Smrg 13168af480fSmrg# Avoid interferences from the environment. 13268af480fSmrggccflag= dashmflag= 13368af480fSmrg 13497e8a2e8Smrg# Some modes work just like other modes, but use different flags. We 13597e8a2e8Smrg# parameterize here, but still list the modes in the big case below, 13697e8a2e8Smrg# to make depend.m4 easier to write. Note that we *cannot* use a case 13797e8a2e8Smrg# here, because this file can only contain one case statement. 13897e8a2e8Smrgif test "$depmode" = hp; then 13997e8a2e8Smrg # HP compiler uses -M and no extra arg. 14097e8a2e8Smrg gccflag=-M 14197e8a2e8Smrg depmode=gcc 14297e8a2e8Smrgfi 14397e8a2e8Smrg 14497e8a2e8Smrgif test "$depmode" = dashXmstdout; then 14568af480fSmrg # This is just like dashmstdout with a different argument. 14668af480fSmrg dashmflag=-xM 14768af480fSmrg depmode=dashmstdout 14897e8a2e8Smrgfi 14997e8a2e8Smrg 150d7accfefSmrgcygpath_u="cygpath -u -f -" 151d7accfefSmrgif test "$depmode" = msvcmsys; then 15268af480fSmrg # This is just like msvisualcpp but w/o cygpath translation. 15368af480fSmrg # Just convert the backslash-escaped backslashes to single forward 15468af480fSmrg # slashes to satisfy depend.m4 15568af480fSmrg cygpath_u='sed s,\\\\,/,g' 15668af480fSmrg depmode=msvisualcpp 15768af480fSmrgfi 15868af480fSmrg 15968af480fSmrgif test "$depmode" = msvc7msys; then 16068af480fSmrg # This is just like msvc7 but w/o cygpath translation. 16168af480fSmrg # Just convert the backslash-escaped backslashes to single forward 16268af480fSmrg # slashes to satisfy depend.m4 16368af480fSmrg cygpath_u='sed s,\\\\,/,g' 16468af480fSmrg depmode=msvc7 16568af480fSmrgfi 16668af480fSmrg 16768af480fSmrgif test "$depmode" = xlc; then 16868af480fSmrg # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information. 16968af480fSmrg gccflag=-qmakedep=gcc,-MF 17068af480fSmrg depmode=gcc 171d7accfefSmrgfi 172d7accfefSmrg 17397e8a2e8Smrgcase "$depmode" in 17497e8a2e8Smrggcc3) 17597e8a2e8Smrg## gcc 3 implements dependency tracking that does exactly what 17697e8a2e8Smrg## we want. Yay! Note: for some reason libtool 1.4 doesn't like 17797e8a2e8Smrg## it if -MD -MP comes after the -MF stuff. Hmm. 178d7accfefSmrg## Unfortunately, FreeBSD c89 acceptance of flags depends upon 179d7accfefSmrg## the command line argument order; so add the flags where they 180d7accfefSmrg## appear in depend2.am. Note that the slowdown incurred here 181d7accfefSmrg## affects only configure: in makefiles, %FASTDEP% shortcuts this. 182d7accfefSmrg for arg 183d7accfefSmrg do 184d7accfefSmrg case $arg in 185d7accfefSmrg -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; 186d7accfefSmrg *) set fnord "$@" "$arg" ;; 187d7accfefSmrg esac 188d7accfefSmrg shift # fnord 189d7accfefSmrg shift # $arg 190d7accfefSmrg done 191d7accfefSmrg "$@" 19297e8a2e8Smrg stat=$? 19368af480fSmrg if test $stat -ne 0; then 19497e8a2e8Smrg rm -f "$tmpdepfile" 19597e8a2e8Smrg exit $stat 19697e8a2e8Smrg fi 19797e8a2e8Smrg mv "$tmpdepfile" "$depfile" 19897e8a2e8Smrg ;; 19997e8a2e8Smrg 20097e8a2e8Smrggcc) 20168af480fSmrg## Note that this doesn't just cater to obsosete pre-3.x GCC compilers. 20268af480fSmrg## but also to in-use compilers like IMB xlc/xlC and the HP C compiler. 20368af480fSmrg## (see the conditional assignment to $gccflag above). 20497e8a2e8Smrg## There are various ways to get dependency output from gcc. Here's 20597e8a2e8Smrg## why we pick this rather obscure method: 20697e8a2e8Smrg## - Don't want to use -MD because we'd like the dependencies to end 20797e8a2e8Smrg## up in a subdir. Having to rename by hand is ugly. 20897e8a2e8Smrg## (We might end up doing this anyway to support other compilers.) 20997e8a2e8Smrg## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like 21068af480fSmrg## -MM, not -M (despite what the docs say). Also, it might not be 21168af480fSmrg## supported by the other compilers which use the 'gcc' depmode. 21297e8a2e8Smrg## - Using -M directly means running the compiler twice (even worse 21397e8a2e8Smrg## than renaming). 21497e8a2e8Smrg if test -z "$gccflag"; then 21597e8a2e8Smrg gccflag=-MD, 21697e8a2e8Smrg fi 21797e8a2e8Smrg "$@" -Wp,"$gccflag$tmpdepfile" 21897e8a2e8Smrg stat=$? 21968af480fSmrg if test $stat -ne 0; then 22097e8a2e8Smrg rm -f "$tmpdepfile" 22197e8a2e8Smrg exit $stat 22297e8a2e8Smrg fi 22397e8a2e8Smrg rm -f "$depfile" 22497e8a2e8Smrg echo "$object : \\" > "$depfile" 22568af480fSmrg # The second -e expression handles DOS-style file names with drive 22668af480fSmrg # letters. 22797e8a2e8Smrg sed -e 's/^[^:]*: / /' \ 22897e8a2e8Smrg -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" 22968af480fSmrg## This next piece of magic avoids the "deleted header file" problem. 23097e8a2e8Smrg## The problem is that when a header file which appears in a .P file 23197e8a2e8Smrg## is deleted, the dependency causes make to die (because there is 23297e8a2e8Smrg## typically no way to rebuild the header). We avoid this by adding 23397e8a2e8Smrg## dummy dependencies for each header file. Too bad gcc doesn't do 23497e8a2e8Smrg## this for us directly. 23568af480fSmrg## Some versions of gcc put a space before the ':'. On the theory 23697e8a2e8Smrg## that the space means something, we add a space to the output as 23768af480fSmrg## well. hp depmode also adds that space, but also prefixes the VPATH 23868af480fSmrg## to the object. Take care to not repeat it in the output. 23997e8a2e8Smrg## Some versions of the HPUX 10.20 sed can't process this invocation 24097e8a2e8Smrg## correctly. Breaking it into two sed invocations is a workaround. 24168af480fSmrg tr ' ' "$nl" < "$tmpdepfile" \ 24268af480fSmrg | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ 24368af480fSmrg | sed -e 's/$/ :/' >> "$depfile" 24497e8a2e8Smrg rm -f "$tmpdepfile" 24597e8a2e8Smrg ;; 24697e8a2e8Smrg 24797e8a2e8Smrghp) 24897e8a2e8Smrg # This case exists only to let depend.m4 do its work. It works by 24997e8a2e8Smrg # looking at the text of this script. This case will never be run, 25097e8a2e8Smrg # since it is checked for above. 25197e8a2e8Smrg exit 1 25297e8a2e8Smrg ;; 25397e8a2e8Smrg 25497e8a2e8Smrgsgi) 25597e8a2e8Smrg if test "$libtool" = yes; then 25697e8a2e8Smrg "$@" "-Wp,-MDupdate,$tmpdepfile" 25797e8a2e8Smrg else 25897e8a2e8Smrg "$@" -MDupdate "$tmpdepfile" 25997e8a2e8Smrg fi 26097e8a2e8Smrg stat=$? 26168af480fSmrg if test $stat -ne 0; then 26297e8a2e8Smrg rm -f "$tmpdepfile" 26397e8a2e8Smrg exit $stat 26497e8a2e8Smrg fi 26597e8a2e8Smrg rm -f "$depfile" 26697e8a2e8Smrg 26797e8a2e8Smrg if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files 26897e8a2e8Smrg echo "$object : \\" > "$depfile" 26997e8a2e8Smrg # Clip off the initial element (the dependent). Don't try to be 27097e8a2e8Smrg # clever and replace this with sed code, as IRIX sed won't handle 27197e8a2e8Smrg # lines with more than a fixed number of characters (4096 in 27297e8a2e8Smrg # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; 27368af480fSmrg # the IRIX cc adds comments like '#:fec' to the end of the 27497e8a2e8Smrg # dependency line. 27568af480fSmrg tr ' ' "$nl" < "$tmpdepfile" \ 27668af480fSmrg | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \ 27768af480fSmrg | tr "$nl" ' ' >> "$depfile" 278d7accfefSmrg echo >> "$depfile" 27997e8a2e8Smrg # The second pass generates a dummy entry for each header file. 28068af480fSmrg tr ' ' "$nl" < "$tmpdepfile" \ 28168af480fSmrg | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ 28268af480fSmrg >> "$depfile" 28397e8a2e8Smrg else 28468af480fSmrg make_dummy_depfile 28597e8a2e8Smrg fi 28697e8a2e8Smrg rm -f "$tmpdepfile" 28797e8a2e8Smrg ;; 28897e8a2e8Smrg 28968af480fSmrgxlc) 29068af480fSmrg # This case exists only to let depend.m4 do its work. It works by 29168af480fSmrg # looking at the text of this script. This case will never be run, 29268af480fSmrg # since it is checked for above. 29368af480fSmrg exit 1 29468af480fSmrg ;; 29568af480fSmrg 29697e8a2e8Smrgaix) 29797e8a2e8Smrg # The C for AIX Compiler uses -M and outputs the dependencies 29897e8a2e8Smrg # in a .u file. In older versions, this file always lives in the 29968af480fSmrg # current directory. Also, the AIX compiler puts '$object:' at the 30097e8a2e8Smrg # start of each line; $object doesn't have directory information. 30197e8a2e8Smrg # Version 6 uses the directory in both cases. 30268af480fSmrg set_dir_from "$object" 30368af480fSmrg set_base_from "$object" 30497e8a2e8Smrg if test "$libtool" = yes; then 305d7accfefSmrg tmpdepfile1=$dir$base.u 306d7accfefSmrg tmpdepfile2=$base.u 307d7accfefSmrg tmpdepfile3=$dir.libs/$base.u 30897e8a2e8Smrg "$@" -Wc,-M 30997e8a2e8Smrg else 310d7accfefSmrg tmpdepfile1=$dir$base.u 311d7accfefSmrg tmpdepfile2=$dir$base.u 312d7accfefSmrg tmpdepfile3=$dir$base.u 31397e8a2e8Smrg "$@" -M 31497e8a2e8Smrg fi 31597e8a2e8Smrg stat=$? 31668af480fSmrg if test $stat -ne 0; then 317d7accfefSmrg rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 31897e8a2e8Smrg exit $stat 31997e8a2e8Smrg fi 32097e8a2e8Smrg 321d7accfefSmrg for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 322d7accfefSmrg do 323d7accfefSmrg test -f "$tmpdepfile" && break 324d7accfefSmrg done 32568af480fSmrg aix_post_process_depfile 32668af480fSmrg ;; 32768af480fSmrg 32868af480fSmrgtcc) 32968af480fSmrg # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26 33068af480fSmrg # FIXME: That version still under development at the moment of writing. 33168af480fSmrg # Make that this statement remains true also for stable, released 33268af480fSmrg # versions. 33368af480fSmrg # It will wrap lines (doesn't matter whether long or short) with a 33468af480fSmrg # trailing '\', as in: 33568af480fSmrg # 33668af480fSmrg # foo.o : \ 33768af480fSmrg # foo.c \ 33868af480fSmrg # foo.h \ 33968af480fSmrg # 34068af480fSmrg # It will put a trailing '\' even on the last line, and will use leading 34168af480fSmrg # spaces rather than leading tabs (at least since its commit 0394caf7 34268af480fSmrg # "Emit spaces for -MD"). 34368af480fSmrg "$@" -MD -MF "$tmpdepfile" 34468af480fSmrg stat=$? 34568af480fSmrg if test $stat -ne 0; then 34668af480fSmrg rm -f "$tmpdepfile" 34768af480fSmrg exit $stat 34897e8a2e8Smrg fi 34968af480fSmrg rm -f "$depfile" 35068af480fSmrg # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'. 35168af480fSmrg # We have to change lines of the first kind to '$object: \'. 35268af480fSmrg sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile" 35368af480fSmrg # And for each line of the second kind, we have to emit a 'dep.h:' 35468af480fSmrg # dummy dependency, to avoid the deleted-header problem. 35568af480fSmrg sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile" 35697e8a2e8Smrg rm -f "$tmpdepfile" 35797e8a2e8Smrg ;; 35897e8a2e8Smrg 35968af480fSmrg## The order of this option in the case statement is important, since the 36068af480fSmrg## shell code in configure will try each of these formats in the order 36168af480fSmrg## listed in this file. A plain '-MD' option would be understood by many 36268af480fSmrg## compilers, so we must ensure this comes after the gcc and icc options. 36368af480fSmrgpgcc) 36468af480fSmrg # Portland's C compiler understands '-MD'. 36568af480fSmrg # Will always output deps to 'file.d' where file is the root name of the 36668af480fSmrg # source file under compilation, even if file resides in a subdirectory. 36768af480fSmrg # The object file name does not affect the name of the '.d' file. 36868af480fSmrg # pgcc 10.2 will output 36997e8a2e8Smrg # foo.o: sub/foo.c sub/foo.h 37068af480fSmrg # and will wrap long lines using '\' : 37197e8a2e8Smrg # foo.o: sub/foo.c ... \ 37297e8a2e8Smrg # sub/foo.h ... \ 37397e8a2e8Smrg # ... 37468af480fSmrg set_dir_from "$object" 37568af480fSmrg # Use the source, not the object, to determine the base name, since 37668af480fSmrg # that's sadly what pgcc will do too. 37768af480fSmrg set_base_from "$source" 37868af480fSmrg tmpdepfile=$base.d 37968af480fSmrg 38068af480fSmrg # For projects that build the same source file twice into different object 38168af480fSmrg # files, the pgcc approach of using the *source* file root name can cause 38268af480fSmrg # problems in parallel builds. Use a locking strategy to avoid stomping on 38368af480fSmrg # the same $tmpdepfile. 38468af480fSmrg lockdir=$base.d-lock 38568af480fSmrg trap " 38668af480fSmrg echo '$0: caught signal, cleaning up...' >&2 38768af480fSmrg rmdir '$lockdir' 38868af480fSmrg exit 1 38968af480fSmrg " 1 2 13 15 39068af480fSmrg numtries=100 39168af480fSmrg i=$numtries 39268af480fSmrg while test $i -gt 0; do 39368af480fSmrg # mkdir is a portable test-and-set. 39468af480fSmrg if mkdir "$lockdir" 2>/dev/null; then 39568af480fSmrg # This process acquired the lock. 39668af480fSmrg "$@" -MD 39768af480fSmrg stat=$? 39868af480fSmrg # Release the lock. 39968af480fSmrg rmdir "$lockdir" 40068af480fSmrg break 40168af480fSmrg else 40268af480fSmrg # If the lock is being held by a different process, wait 40368af480fSmrg # until the winning process is done or we timeout. 40468af480fSmrg while test -d "$lockdir" && test $i -gt 0; do 40568af480fSmrg sleep 1 40668af480fSmrg i=`expr $i - 1` 40768af480fSmrg done 40868af480fSmrg fi 40968af480fSmrg i=`expr $i - 1` 41068af480fSmrg done 41168af480fSmrg trap - 1 2 13 15 41268af480fSmrg if test $i -le 0; then 41368af480fSmrg echo "$0: failed to acquire lock after $numtries attempts" >&2 41468af480fSmrg echo "$0: check lockdir '$lockdir'" >&2 41568af480fSmrg exit 1 41668af480fSmrg fi 41797e8a2e8Smrg 41868af480fSmrg if test $stat -ne 0; then 41997e8a2e8Smrg rm -f "$tmpdepfile" 42097e8a2e8Smrg exit $stat 42197e8a2e8Smrg fi 42297e8a2e8Smrg rm -f "$depfile" 42397e8a2e8Smrg # Each line is of the form `foo.o: dependent.h', 42497e8a2e8Smrg # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. 42597e8a2e8Smrg # Do two passes, one to just change these to 42697e8a2e8Smrg # `$object: dependent.h' and one to simply `dependent.h:'. 42797e8a2e8Smrg sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" 42897e8a2e8Smrg # Some versions of the HPUX 10.20 sed can't process this invocation 42997e8a2e8Smrg # correctly. Breaking it into two sed invocations is a workaround. 43068af480fSmrg sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \ 43168af480fSmrg | sed -e 's/$/ :/' >> "$depfile" 43297e8a2e8Smrg rm -f "$tmpdepfile" 43397e8a2e8Smrg ;; 43497e8a2e8Smrg 435d7accfefSmrghp2) 436d7accfefSmrg # The "hp" stanza above does not work with aCC (C++) and HP's ia64 437d7accfefSmrg # compilers, which have integrated preprocessors. The correct option 438d7accfefSmrg # to use with these is +Maked; it writes dependencies to a file named 439d7accfefSmrg # 'foo.d', which lands next to the object file, wherever that 440d7accfefSmrg # happens to be. 441d7accfefSmrg # Much of this is similar to the tru64 case; see comments there. 44268af480fSmrg set_dir_from "$object" 44368af480fSmrg set_base_from "$object" 444d7accfefSmrg if test "$libtool" = yes; then 445d7accfefSmrg tmpdepfile1=$dir$base.d 446d7accfefSmrg tmpdepfile2=$dir.libs/$base.d 447d7accfefSmrg "$@" -Wc,+Maked 448d7accfefSmrg else 449d7accfefSmrg tmpdepfile1=$dir$base.d 450d7accfefSmrg tmpdepfile2=$dir$base.d 451d7accfefSmrg "$@" +Maked 452d7accfefSmrg fi 453d7accfefSmrg stat=$? 45468af480fSmrg if test $stat -ne 0; then 455d7accfefSmrg rm -f "$tmpdepfile1" "$tmpdepfile2" 456d7accfefSmrg exit $stat 457d7accfefSmrg fi 458d7accfefSmrg 459d7accfefSmrg for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" 460d7accfefSmrg do 461d7accfefSmrg test -f "$tmpdepfile" && break 462d7accfefSmrg done 463d7accfefSmrg if test -f "$tmpdepfile"; then 46468af480fSmrg sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile" 46568af480fSmrg # Add 'dependent.h:' lines. 466d7accfefSmrg sed -ne '2,${ 46768af480fSmrg s/^ *// 46868af480fSmrg s/ \\*$// 46968af480fSmrg s/$/:/ 47068af480fSmrg p 47168af480fSmrg }' "$tmpdepfile" >> "$depfile" 472d7accfefSmrg else 47368af480fSmrg make_dummy_depfile 474d7accfefSmrg fi 475d7accfefSmrg rm -f "$tmpdepfile" "$tmpdepfile2" 476d7accfefSmrg ;; 477d7accfefSmrg 47897e8a2e8Smrgtru64) 47968af480fSmrg # The Tru64 compiler uses -MD to generate dependencies as a side 48068af480fSmrg # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. 48168af480fSmrg # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put 48268af480fSmrg # dependencies in 'foo.d' instead, so we check for that too. 48368af480fSmrg # Subdirectories are respected. 48468af480fSmrg set_dir_from "$object" 48568af480fSmrg set_base_from "$object" 48668af480fSmrg 48768af480fSmrg if test "$libtool" = yes; then 48868af480fSmrg # Libtool generates 2 separate objects for the 2 libraries. These 48968af480fSmrg # two compilations output dependencies in $dir.libs/$base.o.d and 49068af480fSmrg # in $dir$base.o.d. We have to check for both files, because 49168af480fSmrg # one of the two compilations can be disabled. We should prefer 49268af480fSmrg # $dir$base.o.d over $dir.libs/$base.o.d because the latter is 49368af480fSmrg # automatically cleaned when .libs/ is deleted, while ignoring 49468af480fSmrg # the former would cause a distcleancheck panic. 49568af480fSmrg tmpdepfile1=$dir$base.o.d # libtool 1.5 49668af480fSmrg tmpdepfile2=$dir.libs/$base.o.d # Likewise. 49768af480fSmrg tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504 49868af480fSmrg "$@" -Wc,-MD 49968af480fSmrg else 50068af480fSmrg tmpdepfile1=$dir$base.d 50168af480fSmrg tmpdepfile2=$dir$base.d 50268af480fSmrg tmpdepfile3=$dir$base.d 50368af480fSmrg "$@" -MD 50468af480fSmrg fi 50568af480fSmrg 50668af480fSmrg stat=$? 50768af480fSmrg if test $stat -ne 0; then 50868af480fSmrg rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 50968af480fSmrg exit $stat 51068af480fSmrg fi 51168af480fSmrg 51268af480fSmrg for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 51368af480fSmrg do 51468af480fSmrg test -f "$tmpdepfile" && break 51568af480fSmrg done 51668af480fSmrg # Same post-processing that is required for AIX mode. 51768af480fSmrg aix_post_process_depfile 51868af480fSmrg ;; 51968af480fSmrg 52068af480fSmrgmsvc7) 52168af480fSmrg if test "$libtool" = yes; then 52268af480fSmrg showIncludes=-Wc,-showIncludes 52368af480fSmrg else 52468af480fSmrg showIncludes=-showIncludes 52568af480fSmrg fi 52668af480fSmrg "$@" $showIncludes > "$tmpdepfile" 52768af480fSmrg stat=$? 52868af480fSmrg grep -v '^Note: including file: ' "$tmpdepfile" 52968af480fSmrg if test $stat -ne 0; then 53068af480fSmrg rm -f "$tmpdepfile" 53168af480fSmrg exit $stat 53268af480fSmrg fi 53368af480fSmrg rm -f "$depfile" 53468af480fSmrg echo "$object : \\" > "$depfile" 53568af480fSmrg # The first sed program below extracts the file names and escapes 53668af480fSmrg # backslashes for cygpath. The second sed program outputs the file 53768af480fSmrg # name when reading, but also accumulates all include files in the 53868af480fSmrg # hold buffer in order to output them again at the end. This only 53968af480fSmrg # works with sed implementations that can handle large buffers. 54068af480fSmrg sed < "$tmpdepfile" -n ' 54168af480fSmrg/^Note: including file: *\(.*\)/ { 54268af480fSmrg s//\1/ 54368af480fSmrg s/\\/\\\\/g 54468af480fSmrg p 54568af480fSmrg}' | $cygpath_u | sort -u | sed -n ' 54668af480fSmrgs/ /\\ /g 54768af480fSmrgs/\(.*\)/'"$tab"'\1 \\/p 54868af480fSmrgs/.\(.*\) \\/\1:/ 54968af480fSmrgH 55068af480fSmrg$ { 55168af480fSmrg s/.*/'"$tab"'/ 55268af480fSmrg G 55368af480fSmrg p 55468af480fSmrg}' >> "$depfile" 55568af480fSmrg echo >> "$depfile" # make sure the fragment doesn't end with a backslash 55668af480fSmrg rm -f "$tmpdepfile" 55768af480fSmrg ;; 55868af480fSmrg 55968af480fSmrgmsvc7msys) 56068af480fSmrg # This case exists only to let depend.m4 do its work. It works by 56168af480fSmrg # looking at the text of this script. This case will never be run, 56268af480fSmrg # since it is checked for above. 56368af480fSmrg exit 1 56468af480fSmrg ;; 56597e8a2e8Smrg 56697e8a2e8Smrg#nosideeffect) 56797e8a2e8Smrg # This comment above is used by automake to tell side-effect 56897e8a2e8Smrg # dependency tracking mechanisms from slower ones. 56997e8a2e8Smrg 57097e8a2e8Smrgdashmstdout) 57197e8a2e8Smrg # Important note: in order to support this mode, a compiler *must* 57297e8a2e8Smrg # always write the preprocessed file to stdout, regardless of -o. 57397e8a2e8Smrg "$@" || exit $? 57497e8a2e8Smrg 57597e8a2e8Smrg # Remove the call to Libtool. 57697e8a2e8Smrg if test "$libtool" = yes; then 577d7accfefSmrg while test "X$1" != 'X--mode=compile'; do 57897e8a2e8Smrg shift 57997e8a2e8Smrg done 58097e8a2e8Smrg shift 58197e8a2e8Smrg fi 58297e8a2e8Smrg 58368af480fSmrg # Remove '-o $object'. 58497e8a2e8Smrg IFS=" " 58597e8a2e8Smrg for arg 58697e8a2e8Smrg do 58797e8a2e8Smrg case $arg in 58897e8a2e8Smrg -o) 58997e8a2e8Smrg shift 59097e8a2e8Smrg ;; 59197e8a2e8Smrg $object) 59297e8a2e8Smrg shift 59397e8a2e8Smrg ;; 59497e8a2e8Smrg *) 59597e8a2e8Smrg set fnord "$@" "$arg" 59697e8a2e8Smrg shift # fnord 59797e8a2e8Smrg shift # $arg 59897e8a2e8Smrg ;; 59997e8a2e8Smrg esac 60097e8a2e8Smrg done 60197e8a2e8Smrg 60297e8a2e8Smrg test -z "$dashmflag" && dashmflag=-M 60368af480fSmrg # Require at least two characters before searching for ':' 60497e8a2e8Smrg # in the target name. This is to cope with DOS-style filenames: 60568af480fSmrg # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. 60697e8a2e8Smrg "$@" $dashmflag | 60768af480fSmrg sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile" 60897e8a2e8Smrg rm -f "$depfile" 60997e8a2e8Smrg cat < "$tmpdepfile" > "$depfile" 61068af480fSmrg # Some versions of the HPUX 10.20 sed can't process this sed invocation 61168af480fSmrg # correctly. Breaking it into two sed invocations is a workaround. 61268af480fSmrg tr ' ' "$nl" < "$tmpdepfile" \ 61368af480fSmrg | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ 61468af480fSmrg | sed -e 's/$/ :/' >> "$depfile" 61597e8a2e8Smrg rm -f "$tmpdepfile" 61697e8a2e8Smrg ;; 61797e8a2e8Smrg 61897e8a2e8SmrgdashXmstdout) 61997e8a2e8Smrg # This case only exists to satisfy depend.m4. It is never actually 62097e8a2e8Smrg # run, as this mode is specially recognized in the preamble. 62197e8a2e8Smrg exit 1 62297e8a2e8Smrg ;; 62397e8a2e8Smrg 62497e8a2e8Smrgmakedepend) 62597e8a2e8Smrg "$@" || exit $? 62697e8a2e8Smrg # Remove any Libtool call 62797e8a2e8Smrg if test "$libtool" = yes; then 628d7accfefSmrg while test "X$1" != 'X--mode=compile'; do 62997e8a2e8Smrg shift 63097e8a2e8Smrg done 63197e8a2e8Smrg shift 63297e8a2e8Smrg fi 63397e8a2e8Smrg # X makedepend 63497e8a2e8Smrg shift 635d7accfefSmrg cleared=no eat=no 636d7accfefSmrg for arg 637d7accfefSmrg do 63897e8a2e8Smrg case $cleared in 63997e8a2e8Smrg no) 64097e8a2e8Smrg set ""; shift 64197e8a2e8Smrg cleared=yes ;; 64297e8a2e8Smrg esac 643d7accfefSmrg if test $eat = yes; then 644d7accfefSmrg eat=no 645d7accfefSmrg continue 646d7accfefSmrg fi 64797e8a2e8Smrg case "$arg" in 64897e8a2e8Smrg -D*|-I*) 64997e8a2e8Smrg set fnord "$@" "$arg"; shift ;; 65097e8a2e8Smrg # Strip any option that makedepend may not understand. Remove 65197e8a2e8Smrg # the object too, otherwise makedepend will parse it as a source file. 652d7accfefSmrg -arch) 653d7accfefSmrg eat=yes ;; 65497e8a2e8Smrg -*|$object) 65597e8a2e8Smrg ;; 65697e8a2e8Smrg *) 65797e8a2e8Smrg set fnord "$@" "$arg"; shift ;; 65897e8a2e8Smrg esac 65997e8a2e8Smrg done 660d7accfefSmrg obj_suffix=`echo "$object" | sed 's/^.*\././'` 66197e8a2e8Smrg touch "$tmpdepfile" 66297e8a2e8Smrg ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" 66397e8a2e8Smrg rm -f "$depfile" 66468af480fSmrg # makedepend may prepend the VPATH from the source file name to the object. 66568af480fSmrg # No need to regex-escape $object, excess matching of '.' is harmless. 66668af480fSmrg sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" 66768af480fSmrg # Some versions of the HPUX 10.20 sed can't process the last invocation 66868af480fSmrg # correctly. Breaking it into two sed invocations is a workaround. 66968af480fSmrg sed '1,2d' "$tmpdepfile" \ 67068af480fSmrg | tr ' ' "$nl" \ 67168af480fSmrg | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ 67268af480fSmrg | sed -e 's/$/ :/' >> "$depfile" 67397e8a2e8Smrg rm -f "$tmpdepfile" "$tmpdepfile".bak 67497e8a2e8Smrg ;; 67597e8a2e8Smrg 67697e8a2e8Smrgcpp) 67797e8a2e8Smrg # Important note: in order to support this mode, a compiler *must* 67897e8a2e8Smrg # always write the preprocessed file to stdout. 67997e8a2e8Smrg "$@" || exit $? 68097e8a2e8Smrg 68197e8a2e8Smrg # Remove the call to Libtool. 68297e8a2e8Smrg if test "$libtool" = yes; then 683d7accfefSmrg while test "X$1" != 'X--mode=compile'; do 68497e8a2e8Smrg shift 68597e8a2e8Smrg done 68697e8a2e8Smrg shift 68797e8a2e8Smrg fi 68897e8a2e8Smrg 68968af480fSmrg # Remove '-o $object'. 69097e8a2e8Smrg IFS=" " 69197e8a2e8Smrg for arg 69297e8a2e8Smrg do 69397e8a2e8Smrg case $arg in 69497e8a2e8Smrg -o) 69597e8a2e8Smrg shift 69697e8a2e8Smrg ;; 69797e8a2e8Smrg $object) 69897e8a2e8Smrg shift 69997e8a2e8Smrg ;; 70097e8a2e8Smrg *) 70197e8a2e8Smrg set fnord "$@" "$arg" 70297e8a2e8Smrg shift # fnord 70397e8a2e8Smrg shift # $arg 70497e8a2e8Smrg ;; 70597e8a2e8Smrg esac 70697e8a2e8Smrg done 70797e8a2e8Smrg 70868af480fSmrg "$@" -E \ 70968af480fSmrg | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ 71068af480fSmrg -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ 71168af480fSmrg | sed '$ s: \\$::' > "$tmpdepfile" 71297e8a2e8Smrg rm -f "$depfile" 71397e8a2e8Smrg echo "$object : \\" > "$depfile" 71497e8a2e8Smrg cat < "$tmpdepfile" >> "$depfile" 71597e8a2e8Smrg sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" 71697e8a2e8Smrg rm -f "$tmpdepfile" 71797e8a2e8Smrg ;; 71897e8a2e8Smrg 71997e8a2e8Smrgmsvisualcpp) 72097e8a2e8Smrg # Important note: in order to support this mode, a compiler *must* 721d7accfefSmrg # always write the preprocessed file to stdout. 72297e8a2e8Smrg "$@" || exit $? 723d7accfefSmrg 724d7accfefSmrg # Remove the call to Libtool. 725d7accfefSmrg if test "$libtool" = yes; then 726d7accfefSmrg while test "X$1" != 'X--mode=compile'; do 727d7accfefSmrg shift 728d7accfefSmrg done 729d7accfefSmrg shift 730d7accfefSmrg fi 731d7accfefSmrg 73297e8a2e8Smrg IFS=" " 73397e8a2e8Smrg for arg 73497e8a2e8Smrg do 73597e8a2e8Smrg case "$arg" in 736d7accfefSmrg -o) 737d7accfefSmrg shift 738d7accfefSmrg ;; 739d7accfefSmrg $object) 740d7accfefSmrg shift 741d7accfefSmrg ;; 74297e8a2e8Smrg "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") 74368af480fSmrg set fnord "$@" 74468af480fSmrg shift 74568af480fSmrg shift 74668af480fSmrg ;; 74797e8a2e8Smrg *) 74868af480fSmrg set fnord "$@" "$arg" 74968af480fSmrg shift 75068af480fSmrg shift 75168af480fSmrg ;; 75297e8a2e8Smrg esac 75397e8a2e8Smrg done 754d7accfefSmrg "$@" -E 2>/dev/null | 755d7accfefSmrg sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" 75697e8a2e8Smrg rm -f "$depfile" 75797e8a2e8Smrg echo "$object : \\" > "$depfile" 75868af480fSmrg sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" 75968af480fSmrg echo "$tab" >> "$depfile" 760d7accfefSmrg sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" 76197e8a2e8Smrg rm -f "$tmpdepfile" 76297e8a2e8Smrg ;; 76397e8a2e8Smrg 764d7accfefSmrgmsvcmsys) 765d7accfefSmrg # This case exists only to let depend.m4 do its work. It works by 766d7accfefSmrg # looking at the text of this script. This case will never be run, 767d7accfefSmrg # since it is checked for above. 768d7accfefSmrg exit 1 769d7accfefSmrg ;; 770d7accfefSmrg 77197e8a2e8Smrgnone) 77297e8a2e8Smrg exec "$@" 77397e8a2e8Smrg ;; 77497e8a2e8Smrg 77597e8a2e8Smrg*) 77697e8a2e8Smrg echo "Unknown depmode $depmode" 1>&2 77797e8a2e8Smrg exit 1 77897e8a2e8Smrg ;; 77997e8a2e8Smrgesac 78097e8a2e8Smrg 78197e8a2e8Smrgexit 0 782d7accfefSmrg 783d7accfefSmrg# Local Variables: 784d7accfefSmrg# mode: shell-script 785d7accfefSmrg# sh-indentation: 2 786d7accfefSmrg# eval: (add-hook 'write-file-hooks 'time-stamp) 787d7accfefSmrg# time-stamp-start: "scriptversion=" 788d7accfefSmrg# time-stamp-format: "%:y-%02m-%02d.%02H" 789d7accfefSmrg# time-stamp-time-zone: "UTC" 790d7accfefSmrg# time-stamp-end: "; # UTC" 791d7accfefSmrg# End: 792