depcomp revision 0d16fef4
1de2362d3Smrg#! /bin/sh 2de2362d3Smrg# depcomp - compile a program generating dependencies as side-effects 3de2362d3Smrg 40d16fef4Smrgscriptversion=2013-05-30.07; # UTC 5de2362d3Smrg 60d16fef4Smrg# Copyright (C) 1999-2014 Free Software Foundation, Inc. 7de2362d3Smrg 8de2362d3Smrg# This program is free software; you can redistribute it and/or modify 9de2362d3Smrg# it under the terms of the GNU General Public License as published by 10de2362d3Smrg# the Free Software Foundation; either version 2, or (at your option) 11de2362d3Smrg# any later version. 12de2362d3Smrg 13de2362d3Smrg# This program is distributed in the hope that it will be useful, 14de2362d3Smrg# but WITHOUT ANY WARRANTY; without even the implied warranty of 15de2362d3Smrg# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16de2362d3Smrg# GNU General Public License for more details. 17de2362d3Smrg 18de2362d3Smrg# You should have received a copy of the GNU General Public License 190d16fef4Smrg# along with this program. If not, see <http://www.gnu.org/licenses/>. 20de2362d3Smrg 21de2362d3Smrg# As a special exception to the GNU General Public License, if you 22de2362d3Smrg# distribute this file as part of a program that contains a 23de2362d3Smrg# configuration script generated by Autoconf, you may include it under 24de2362d3Smrg# the same distribution terms that you use for the rest of that program. 25de2362d3Smrg 26de2362d3Smrg# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>. 27de2362d3Smrg 28de2362d3Smrgcase $1 in 29de2362d3Smrg '') 300d16fef4Smrg echo "$0: No command. Try '$0 --help' for more information." 1>&2 310d16fef4Smrg exit 1; 320d16fef4Smrg ;; 33de2362d3Smrg -h | --h*) 34de2362d3Smrg cat <<\EOF 35de2362d3SmrgUsage: depcomp [--help] [--version] PROGRAM [ARGS] 36de2362d3Smrg 37de2362d3SmrgRun PROGRAMS ARGS to compile a file, generating dependencies 38de2362d3Smrgas side-effects. 39de2362d3Smrg 40de2362d3SmrgEnvironment variables: 41de2362d3Smrg depmode Dependency tracking mode. 420d16fef4Smrg source Source file read by 'PROGRAMS ARGS'. 430d16fef4Smrg object Object file output by 'PROGRAMS ARGS'. 44de2362d3Smrg DEPDIR directory where to store dependencies. 45de2362d3Smrg depfile Dependency file to output. 460d16fef4Smrg tmpdepfile Temporary file to use when outputting dependencies. 47de2362d3Smrg libtool Whether libtool is used (yes/no). 48de2362d3Smrg 49de2362d3SmrgReport bugs to <bug-automake@gnu.org>. 50de2362d3SmrgEOF 51de2362d3Smrg exit $? 52de2362d3Smrg ;; 53de2362d3Smrg -v | --v*) 54de2362d3Smrg echo "depcomp $scriptversion" 55de2362d3Smrg exit $? 56de2362d3Smrg ;; 57de2362d3Smrgesac 58de2362d3Smrg 590d16fef4Smrg# Get the directory component of the given path, and save it in the 600d16fef4Smrg# global variables '$dir'. Note that this directory component will 610d16fef4Smrg# be either empty or ending with a '/' character. This is deliberate. 620d16fef4Smrgset_dir_from () 630d16fef4Smrg{ 640d16fef4Smrg case $1 in 650d16fef4Smrg */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;; 660d16fef4Smrg *) dir=;; 670d16fef4Smrg esac 680d16fef4Smrg} 690d16fef4Smrg 700d16fef4Smrg# Get the suffix-stripped basename of the given path, and save it the 710d16fef4Smrg# global variable '$base'. 720d16fef4Smrgset_base_from () 730d16fef4Smrg{ 740d16fef4Smrg base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'` 750d16fef4Smrg} 760d16fef4Smrg 770d16fef4Smrg# If no dependency file was actually created by the compiler invocation, 780d16fef4Smrg# we still have to create a dummy depfile, to avoid errors with the 790d16fef4Smrg# Makefile "include basename.Plo" scheme. 800d16fef4Smrgmake_dummy_depfile () 810d16fef4Smrg{ 820d16fef4Smrg echo "#dummy" > "$depfile" 830d16fef4Smrg} 840d16fef4Smrg 850d16fef4Smrg# Factor out some common post-processing of the generated depfile. 860d16fef4Smrg# Requires the auxiliary global variable '$tmpdepfile' to be set. 870d16fef4Smrgaix_post_process_depfile () 880d16fef4Smrg{ 890d16fef4Smrg # If the compiler actually managed to produce a dependency file, 900d16fef4Smrg # post-process it. 910d16fef4Smrg if test -f "$tmpdepfile"; then 920d16fef4Smrg # Each line is of the form 'foo.o: dependency.h'. 930d16fef4Smrg # Do two passes, one to just change these to 940d16fef4Smrg # $object: dependency.h 950d16fef4Smrg # and one to simply output 960d16fef4Smrg # dependency.h: 970d16fef4Smrg # which is needed to avoid the deleted-header problem. 980d16fef4Smrg { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile" 990d16fef4Smrg sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile" 1000d16fef4Smrg } > "$depfile" 1010d16fef4Smrg rm -f "$tmpdepfile" 1020d16fef4Smrg else 1030d16fef4Smrg make_dummy_depfile 1040d16fef4Smrg fi 1050d16fef4Smrg} 1060d16fef4Smrg 1070d16fef4Smrg# A tabulation character. 1080d16fef4Smrgtab=' ' 1090d16fef4Smrg# A newline character. 1100d16fef4Smrgnl=' 1110d16fef4Smrg' 1120d16fef4Smrg# Character ranges might be problematic outside the C locale. 1130d16fef4Smrg# These definitions help. 1140d16fef4Smrgupper=ABCDEFGHIJKLMNOPQRSTUVWXYZ 1150d16fef4Smrglower=abcdefghijklmnopqrstuvwxyz 1160d16fef4Smrgdigits=0123456789 1170d16fef4Smrgalpha=${upper}${lower} 1180d16fef4Smrg 119de2362d3Smrgif test -z "$depmode" || test -z "$source" || test -z "$object"; then 120de2362d3Smrg echo "depcomp: Variables source, object and depmode must be set" 1>&2 121de2362d3Smrg exit 1 122de2362d3Smrgfi 123de2362d3Smrg 124de2362d3Smrg# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. 125de2362d3Smrgdepfile=${depfile-`echo "$object" | 126de2362d3Smrg sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} 127de2362d3Smrgtmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} 128de2362d3Smrg 129de2362d3Smrgrm -f "$tmpdepfile" 130de2362d3Smrg 1310d16fef4Smrg# Avoid interferences from the environment. 1320d16fef4Smrggccflag= dashmflag= 1330d16fef4Smrg 134de2362d3Smrg# Some modes work just like other modes, but use different flags. We 135de2362d3Smrg# parameterize here, but still list the modes in the big case below, 136de2362d3Smrg# to make depend.m4 easier to write. Note that we *cannot* use a case 137de2362d3Smrg# here, because this file can only contain one case statement. 138de2362d3Smrgif test "$depmode" = hp; then 139de2362d3Smrg # HP compiler uses -M and no extra arg. 140de2362d3Smrg gccflag=-M 141de2362d3Smrg depmode=gcc 142de2362d3Smrgfi 143de2362d3Smrg 144de2362d3Smrgif test "$depmode" = dashXmstdout; then 1450d16fef4Smrg # This is just like dashmstdout with a different argument. 1460d16fef4Smrg dashmflag=-xM 1470d16fef4Smrg depmode=dashmstdout 1480d16fef4Smrgfi 1490d16fef4Smrg 1500d16fef4Smrgcygpath_u="cygpath -u -f -" 1510d16fef4Smrgif test "$depmode" = msvcmsys; then 1520d16fef4Smrg # This is just like msvisualcpp but w/o cygpath translation. 1530d16fef4Smrg # Just convert the backslash-escaped backslashes to single forward 1540d16fef4Smrg # slashes to satisfy depend.m4 1550d16fef4Smrg cygpath_u='sed s,\\\\,/,g' 1560d16fef4Smrg depmode=msvisualcpp 1570d16fef4Smrgfi 1580d16fef4Smrg 1590d16fef4Smrgif test "$depmode" = msvc7msys; then 1600d16fef4Smrg # This is just like msvc7 but w/o cygpath translation. 1610d16fef4Smrg # Just convert the backslash-escaped backslashes to single forward 1620d16fef4Smrg # slashes to satisfy depend.m4 1630d16fef4Smrg cygpath_u='sed s,\\\\,/,g' 1640d16fef4Smrg depmode=msvc7 1650d16fef4Smrgfi 1660d16fef4Smrg 1670d16fef4Smrgif test "$depmode" = xlc; then 1680d16fef4Smrg # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information. 1690d16fef4Smrg gccflag=-qmakedep=gcc,-MF 1700d16fef4Smrg depmode=gcc 171de2362d3Smrgfi 172de2362d3Smrg 173de2362d3Smrgcase "$depmode" in 174de2362d3Smrggcc3) 175de2362d3Smrg## gcc 3 implements dependency tracking that does exactly what 176de2362d3Smrg## we want. Yay! Note: for some reason libtool 1.4 doesn't like 177de2362d3Smrg## it if -MD -MP comes after the -MF stuff. Hmm. 178de2362d3Smrg## Unfortunately, FreeBSD c89 acceptance of flags depends upon 179de2362d3Smrg## the command line argument order; so add the flags where they 180de2362d3Smrg## appear in depend2.am. Note that the slowdown incurred here 181de2362d3Smrg## affects only configure: in makefiles, %FASTDEP% shortcuts this. 182de2362d3Smrg for arg 183de2362d3Smrg do 184de2362d3Smrg case $arg in 185de2362d3Smrg -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; 186de2362d3Smrg *) set fnord "$@" "$arg" ;; 187de2362d3Smrg esac 188de2362d3Smrg shift # fnord 189de2362d3Smrg shift # $arg 190de2362d3Smrg done 191de2362d3Smrg "$@" 192de2362d3Smrg stat=$? 1930d16fef4Smrg if test $stat -ne 0; then 194de2362d3Smrg rm -f "$tmpdepfile" 195de2362d3Smrg exit $stat 196de2362d3Smrg fi 197de2362d3Smrg mv "$tmpdepfile" "$depfile" 198de2362d3Smrg ;; 199de2362d3Smrg 200de2362d3Smrggcc) 2010d16fef4Smrg## Note that this doesn't just cater to obsosete pre-3.x GCC compilers. 2020d16fef4Smrg## but also to in-use compilers like IMB xlc/xlC and the HP C compiler. 2030d16fef4Smrg## (see the conditional assignment to $gccflag above). 204de2362d3Smrg## There are various ways to get dependency output from gcc. Here's 205de2362d3Smrg## why we pick this rather obscure method: 206de2362d3Smrg## - Don't want to use -MD because we'd like the dependencies to end 207de2362d3Smrg## up in a subdir. Having to rename by hand is ugly. 208de2362d3Smrg## (We might end up doing this anyway to support other compilers.) 209de2362d3Smrg## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like 2100d16fef4Smrg## -MM, not -M (despite what the docs say). Also, it might not be 2110d16fef4Smrg## supported by the other compilers which use the 'gcc' depmode. 212de2362d3Smrg## - Using -M directly means running the compiler twice (even worse 213de2362d3Smrg## than renaming). 214de2362d3Smrg if test -z "$gccflag"; then 215de2362d3Smrg gccflag=-MD, 216de2362d3Smrg fi 217de2362d3Smrg "$@" -Wp,"$gccflag$tmpdepfile" 218de2362d3Smrg stat=$? 2190d16fef4Smrg if test $stat -ne 0; then 220de2362d3Smrg rm -f "$tmpdepfile" 221de2362d3Smrg exit $stat 222de2362d3Smrg fi 223de2362d3Smrg rm -f "$depfile" 224de2362d3Smrg echo "$object : \\" > "$depfile" 2250d16fef4Smrg # The second -e expression handles DOS-style file names with drive 2260d16fef4Smrg # letters. 227de2362d3Smrg sed -e 's/^[^:]*: / /' \ 228de2362d3Smrg -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" 2290d16fef4Smrg## This next piece of magic avoids the "deleted header file" problem. 230de2362d3Smrg## The problem is that when a header file which appears in a .P file 231de2362d3Smrg## is deleted, the dependency causes make to die (because there is 232de2362d3Smrg## typically no way to rebuild the header). We avoid this by adding 233de2362d3Smrg## dummy dependencies for each header file. Too bad gcc doesn't do 234de2362d3Smrg## this for us directly. 2350d16fef4Smrg## Some versions of gcc put a space before the ':'. On the theory 236de2362d3Smrg## that the space means something, we add a space to the output as 2370d16fef4Smrg## well. hp depmode also adds that space, but also prefixes the VPATH 2380d16fef4Smrg## to the object. Take care to not repeat it in the output. 239de2362d3Smrg## Some versions of the HPUX 10.20 sed can't process this invocation 240de2362d3Smrg## correctly. Breaking it into two sed invocations is a workaround. 2410d16fef4Smrg tr ' ' "$nl" < "$tmpdepfile" \ 2420d16fef4Smrg | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ 2430d16fef4Smrg | sed -e 's/$/ :/' >> "$depfile" 244de2362d3Smrg rm -f "$tmpdepfile" 245de2362d3Smrg ;; 246de2362d3Smrg 247de2362d3Smrghp) 248de2362d3Smrg # This case exists only to let depend.m4 do its work. It works by 249de2362d3Smrg # looking at the text of this script. This case will never be run, 250de2362d3Smrg # since it is checked for above. 251de2362d3Smrg exit 1 252de2362d3Smrg ;; 253de2362d3Smrg 254de2362d3Smrgsgi) 255de2362d3Smrg if test "$libtool" = yes; then 256de2362d3Smrg "$@" "-Wp,-MDupdate,$tmpdepfile" 257de2362d3Smrg else 258de2362d3Smrg "$@" -MDupdate "$tmpdepfile" 259de2362d3Smrg fi 260de2362d3Smrg stat=$? 2610d16fef4Smrg if test $stat -ne 0; then 262de2362d3Smrg rm -f "$tmpdepfile" 263de2362d3Smrg exit $stat 264de2362d3Smrg fi 265de2362d3Smrg rm -f "$depfile" 266de2362d3Smrg 267de2362d3Smrg if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files 268de2362d3Smrg echo "$object : \\" > "$depfile" 269de2362d3Smrg # Clip off the initial element (the dependent). Don't try to be 270de2362d3Smrg # clever and replace this with sed code, as IRIX sed won't handle 271de2362d3Smrg # lines with more than a fixed number of characters (4096 in 272de2362d3Smrg # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; 2730d16fef4Smrg # the IRIX cc adds comments like '#:fec' to the end of the 274de2362d3Smrg # dependency line. 2750d16fef4Smrg tr ' ' "$nl" < "$tmpdepfile" \ 2760d16fef4Smrg | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \ 2770d16fef4Smrg | tr "$nl" ' ' >> "$depfile" 2780d16fef4Smrg echo >> "$depfile" 279de2362d3Smrg # The second pass generates a dummy entry for each header file. 2800d16fef4Smrg tr ' ' "$nl" < "$tmpdepfile" \ 2810d16fef4Smrg | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ 2820d16fef4Smrg >> "$depfile" 283de2362d3Smrg else 2840d16fef4Smrg make_dummy_depfile 285de2362d3Smrg fi 286de2362d3Smrg rm -f "$tmpdepfile" 287de2362d3Smrg ;; 288de2362d3Smrg 2890d16fef4Smrgxlc) 2900d16fef4Smrg # This case exists only to let depend.m4 do its work. It works by 2910d16fef4Smrg # looking at the text of this script. This case will never be run, 2920d16fef4Smrg # since it is checked for above. 2930d16fef4Smrg exit 1 2940d16fef4Smrg ;; 2950d16fef4Smrg 296de2362d3Smrgaix) 297de2362d3Smrg # The C for AIX Compiler uses -M and outputs the dependencies 298de2362d3Smrg # in a .u file. In older versions, this file always lives in the 2990d16fef4Smrg # current directory. Also, the AIX compiler puts '$object:' at the 300de2362d3Smrg # start of each line; $object doesn't have directory information. 301de2362d3Smrg # Version 6 uses the directory in both cases. 3020d16fef4Smrg set_dir_from "$object" 3030d16fef4Smrg set_base_from "$object" 304de2362d3Smrg if test "$libtool" = yes; then 305de2362d3Smrg tmpdepfile1=$dir$base.u 306de2362d3Smrg tmpdepfile2=$base.u 307de2362d3Smrg tmpdepfile3=$dir.libs/$base.u 308de2362d3Smrg "$@" -Wc,-M 309de2362d3Smrg else 310de2362d3Smrg tmpdepfile1=$dir$base.u 311de2362d3Smrg tmpdepfile2=$dir$base.u 312de2362d3Smrg tmpdepfile3=$dir$base.u 313de2362d3Smrg "$@" -M 314de2362d3Smrg fi 315de2362d3Smrg stat=$? 3160d16fef4Smrg if test $stat -ne 0; then 317de2362d3Smrg rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 318de2362d3Smrg exit $stat 319de2362d3Smrg fi 320de2362d3Smrg 321de2362d3Smrg for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 322de2362d3Smrg do 323de2362d3Smrg test -f "$tmpdepfile" && break 324de2362d3Smrg done 3250d16fef4Smrg aix_post_process_depfile 3260d16fef4Smrg ;; 3270d16fef4Smrg 3280d16fef4Smrgtcc) 3290d16fef4Smrg # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26 3300d16fef4Smrg # FIXME: That version still under development at the moment of writing. 3310d16fef4Smrg # Make that this statement remains true also for stable, released 3320d16fef4Smrg # versions. 3330d16fef4Smrg # It will wrap lines (doesn't matter whether long or short) with a 3340d16fef4Smrg # trailing '\', as in: 3350d16fef4Smrg # 3360d16fef4Smrg # foo.o : \ 3370d16fef4Smrg # foo.c \ 3380d16fef4Smrg # foo.h \ 3390d16fef4Smrg # 3400d16fef4Smrg # It will put a trailing '\' even on the last line, and will use leading 3410d16fef4Smrg # spaces rather than leading tabs (at least since its commit 0394caf7 3420d16fef4Smrg # "Emit spaces for -MD"). 3430d16fef4Smrg "$@" -MD -MF "$tmpdepfile" 3440d16fef4Smrg stat=$? 3450d16fef4Smrg if test $stat -ne 0; then 3460d16fef4Smrg rm -f "$tmpdepfile" 3470d16fef4Smrg exit $stat 348de2362d3Smrg fi 3490d16fef4Smrg rm -f "$depfile" 3500d16fef4Smrg # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'. 3510d16fef4Smrg # We have to change lines of the first kind to '$object: \'. 3520d16fef4Smrg sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile" 3530d16fef4Smrg # And for each line of the second kind, we have to emit a 'dep.h:' 3540d16fef4Smrg # dummy dependency, to avoid the deleted-header problem. 3550d16fef4Smrg sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile" 356de2362d3Smrg rm -f "$tmpdepfile" 357de2362d3Smrg ;; 358de2362d3Smrg 3590d16fef4Smrg## The order of this option in the case statement is important, since the 3600d16fef4Smrg## shell code in configure will try each of these formats in the order 3610d16fef4Smrg## listed in this file. A plain '-MD' option would be understood by many 3620d16fef4Smrg## compilers, so we must ensure this comes after the gcc and icc options. 3630d16fef4Smrgpgcc) 3640d16fef4Smrg # Portland's C compiler understands '-MD'. 3650d16fef4Smrg # Will always output deps to 'file.d' where file is the root name of the 3660d16fef4Smrg # source file under compilation, even if file resides in a subdirectory. 3670d16fef4Smrg # The object file name does not affect the name of the '.d' file. 3680d16fef4Smrg # pgcc 10.2 will output 369de2362d3Smrg # foo.o: sub/foo.c sub/foo.h 3700d16fef4Smrg # and will wrap long lines using '\' : 371de2362d3Smrg # foo.o: sub/foo.c ... \ 372de2362d3Smrg # sub/foo.h ... \ 373de2362d3Smrg # ... 3740d16fef4Smrg set_dir_from "$object" 3750d16fef4Smrg # Use the source, not the object, to determine the base name, since 3760d16fef4Smrg # that's sadly what pgcc will do too. 3770d16fef4Smrg set_base_from "$source" 3780d16fef4Smrg tmpdepfile=$base.d 3790d16fef4Smrg 3800d16fef4Smrg # For projects that build the same source file twice into different object 3810d16fef4Smrg # files, the pgcc approach of using the *source* file root name can cause 3820d16fef4Smrg # problems in parallel builds. Use a locking strategy to avoid stomping on 3830d16fef4Smrg # the same $tmpdepfile. 3840d16fef4Smrg lockdir=$base.d-lock 3850d16fef4Smrg trap " 3860d16fef4Smrg echo '$0: caught signal, cleaning up...' >&2 3870d16fef4Smrg rmdir '$lockdir' 3880d16fef4Smrg exit 1 3890d16fef4Smrg " 1 2 13 15 3900d16fef4Smrg numtries=100 3910d16fef4Smrg i=$numtries 3920d16fef4Smrg while test $i -gt 0; do 3930d16fef4Smrg # mkdir is a portable test-and-set. 3940d16fef4Smrg if mkdir "$lockdir" 2>/dev/null; then 3950d16fef4Smrg # This process acquired the lock. 3960d16fef4Smrg "$@" -MD 3970d16fef4Smrg stat=$? 3980d16fef4Smrg # Release the lock. 3990d16fef4Smrg rmdir "$lockdir" 4000d16fef4Smrg break 4010d16fef4Smrg else 4020d16fef4Smrg # If the lock is being held by a different process, wait 4030d16fef4Smrg # until the winning process is done or we timeout. 4040d16fef4Smrg while test -d "$lockdir" && test $i -gt 0; do 4050d16fef4Smrg sleep 1 4060d16fef4Smrg i=`expr $i - 1` 4070d16fef4Smrg done 4080d16fef4Smrg fi 4090d16fef4Smrg i=`expr $i - 1` 4100d16fef4Smrg done 4110d16fef4Smrg trap - 1 2 13 15 4120d16fef4Smrg if test $i -le 0; then 4130d16fef4Smrg echo "$0: failed to acquire lock after $numtries attempts" >&2 4140d16fef4Smrg echo "$0: check lockdir '$lockdir'" >&2 4150d16fef4Smrg exit 1 4160d16fef4Smrg fi 417de2362d3Smrg 4180d16fef4Smrg if test $stat -ne 0; then 419de2362d3Smrg rm -f "$tmpdepfile" 420de2362d3Smrg exit $stat 421de2362d3Smrg fi 422de2362d3Smrg rm -f "$depfile" 423de2362d3Smrg # Each line is of the form `foo.o: dependent.h', 424de2362d3Smrg # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. 425de2362d3Smrg # Do two passes, one to just change these to 426de2362d3Smrg # `$object: dependent.h' and one to simply `dependent.h:'. 427de2362d3Smrg sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" 428de2362d3Smrg # Some versions of the HPUX 10.20 sed can't process this invocation 429de2362d3Smrg # correctly. Breaking it into two sed invocations is a workaround. 4300d16fef4Smrg sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \ 4310d16fef4Smrg | sed -e 's/$/ :/' >> "$depfile" 432de2362d3Smrg rm -f "$tmpdepfile" 433de2362d3Smrg ;; 434de2362d3Smrg 435de2362d3Smrghp2) 436de2362d3Smrg # The "hp" stanza above does not work with aCC (C++) and HP's ia64 437de2362d3Smrg # compilers, which have integrated preprocessors. The correct option 438de2362d3Smrg # to use with these is +Maked; it writes dependencies to a file named 439de2362d3Smrg # 'foo.d', which lands next to the object file, wherever that 440de2362d3Smrg # happens to be. 441de2362d3Smrg # Much of this is similar to the tru64 case; see comments there. 4420d16fef4Smrg set_dir_from "$object" 4430d16fef4Smrg set_base_from "$object" 444de2362d3Smrg if test "$libtool" = yes; then 445de2362d3Smrg tmpdepfile1=$dir$base.d 446de2362d3Smrg tmpdepfile2=$dir.libs/$base.d 447de2362d3Smrg "$@" -Wc,+Maked 448de2362d3Smrg else 449de2362d3Smrg tmpdepfile1=$dir$base.d 450de2362d3Smrg tmpdepfile2=$dir$base.d 451de2362d3Smrg "$@" +Maked 452de2362d3Smrg fi 453de2362d3Smrg stat=$? 4540d16fef4Smrg if test $stat -ne 0; then 455de2362d3Smrg rm -f "$tmpdepfile1" "$tmpdepfile2" 456de2362d3Smrg exit $stat 457de2362d3Smrg fi 458de2362d3Smrg 459de2362d3Smrg for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" 460de2362d3Smrg do 461de2362d3Smrg test -f "$tmpdepfile" && break 462de2362d3Smrg done 463de2362d3Smrg if test -f "$tmpdepfile"; then 4640d16fef4Smrg sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile" 4650d16fef4Smrg # Add 'dependent.h:' lines. 4660d16fef4Smrg sed -ne '2,${ 4670d16fef4Smrg s/^ *// 4680d16fef4Smrg s/ \\*$// 4690d16fef4Smrg s/$/:/ 4700d16fef4Smrg p 4710d16fef4Smrg }' "$tmpdepfile" >> "$depfile" 472de2362d3Smrg else 4730d16fef4Smrg make_dummy_depfile 474de2362d3Smrg fi 475de2362d3Smrg rm -f "$tmpdepfile" "$tmpdepfile2" 476de2362d3Smrg ;; 477de2362d3Smrg 478de2362d3Smrgtru64) 4790d16fef4Smrg # The Tru64 compiler uses -MD to generate dependencies as a side 4800d16fef4Smrg # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. 4810d16fef4Smrg # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put 4820d16fef4Smrg # dependencies in 'foo.d' instead, so we check for that too. 4830d16fef4Smrg # Subdirectories are respected. 4840d16fef4Smrg set_dir_from "$object" 4850d16fef4Smrg set_base_from "$object" 4860d16fef4Smrg 4870d16fef4Smrg if test "$libtool" = yes; then 4880d16fef4Smrg # Libtool generates 2 separate objects for the 2 libraries. These 4890d16fef4Smrg # two compilations output dependencies in $dir.libs/$base.o.d and 4900d16fef4Smrg # in $dir$base.o.d. We have to check for both files, because 4910d16fef4Smrg # one of the two compilations can be disabled. We should prefer 4920d16fef4Smrg # $dir$base.o.d over $dir.libs/$base.o.d because the latter is 4930d16fef4Smrg # automatically cleaned when .libs/ is deleted, while ignoring 4940d16fef4Smrg # the former would cause a distcleancheck panic. 4950d16fef4Smrg tmpdepfile1=$dir$base.o.d # libtool 1.5 4960d16fef4Smrg tmpdepfile2=$dir.libs/$base.o.d # Likewise. 4970d16fef4Smrg tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504 4980d16fef4Smrg "$@" -Wc,-MD 4990d16fef4Smrg else 5000d16fef4Smrg tmpdepfile1=$dir$base.d 5010d16fef4Smrg tmpdepfile2=$dir$base.d 5020d16fef4Smrg tmpdepfile3=$dir$base.d 5030d16fef4Smrg "$@" -MD 5040d16fef4Smrg fi 5050d16fef4Smrg 5060d16fef4Smrg stat=$? 5070d16fef4Smrg if test $stat -ne 0; then 5080d16fef4Smrg rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 5090d16fef4Smrg exit $stat 5100d16fef4Smrg fi 5110d16fef4Smrg 5120d16fef4Smrg for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 5130d16fef4Smrg do 5140d16fef4Smrg test -f "$tmpdepfile" && break 5150d16fef4Smrg done 5160d16fef4Smrg # Same post-processing that is required for AIX mode. 5170d16fef4Smrg aix_post_process_depfile 5180d16fef4Smrg ;; 5190d16fef4Smrg 5200d16fef4Smrgmsvc7) 5210d16fef4Smrg if test "$libtool" = yes; then 5220d16fef4Smrg showIncludes=-Wc,-showIncludes 5230d16fef4Smrg else 5240d16fef4Smrg showIncludes=-showIncludes 5250d16fef4Smrg fi 5260d16fef4Smrg "$@" $showIncludes > "$tmpdepfile" 5270d16fef4Smrg stat=$? 5280d16fef4Smrg grep -v '^Note: including file: ' "$tmpdepfile" 5290d16fef4Smrg if test $stat -ne 0; then 5300d16fef4Smrg rm -f "$tmpdepfile" 5310d16fef4Smrg exit $stat 5320d16fef4Smrg fi 5330d16fef4Smrg rm -f "$depfile" 5340d16fef4Smrg echo "$object : \\" > "$depfile" 5350d16fef4Smrg # The first sed program below extracts the file names and escapes 5360d16fef4Smrg # backslashes for cygpath. The second sed program outputs the file 5370d16fef4Smrg # name when reading, but also accumulates all include files in the 5380d16fef4Smrg # hold buffer in order to output them again at the end. This only 5390d16fef4Smrg # works with sed implementations that can handle large buffers. 5400d16fef4Smrg sed < "$tmpdepfile" -n ' 5410d16fef4Smrg/^Note: including file: *\(.*\)/ { 5420d16fef4Smrg s//\1/ 5430d16fef4Smrg s/\\/\\\\/g 5440d16fef4Smrg p 5450d16fef4Smrg}' | $cygpath_u | sort -u | sed -n ' 5460d16fef4Smrgs/ /\\ /g 5470d16fef4Smrgs/\(.*\)/'"$tab"'\1 \\/p 5480d16fef4Smrgs/.\(.*\) \\/\1:/ 5490d16fef4SmrgH 5500d16fef4Smrg$ { 5510d16fef4Smrg s/.*/'"$tab"'/ 5520d16fef4Smrg G 5530d16fef4Smrg p 5540d16fef4Smrg}' >> "$depfile" 5550d16fef4Smrg echo >> "$depfile" # make sure the fragment doesn't end with a backslash 5560d16fef4Smrg rm -f "$tmpdepfile" 5570d16fef4Smrg ;; 5580d16fef4Smrg 5590d16fef4Smrgmsvc7msys) 5600d16fef4Smrg # This case exists only to let depend.m4 do its work. It works by 5610d16fef4Smrg # looking at the text of this script. This case will never be run, 5620d16fef4Smrg # since it is checked for above. 5630d16fef4Smrg exit 1 5640d16fef4Smrg ;; 565de2362d3Smrg 566de2362d3Smrg#nosideeffect) 567de2362d3Smrg # This comment above is used by automake to tell side-effect 568de2362d3Smrg # dependency tracking mechanisms from slower ones. 569de2362d3Smrg 570de2362d3Smrgdashmstdout) 571de2362d3Smrg # Important note: in order to support this mode, a compiler *must* 572de2362d3Smrg # always write the preprocessed file to stdout, regardless of -o. 573de2362d3Smrg "$@" || exit $? 574de2362d3Smrg 575de2362d3Smrg # Remove the call to Libtool. 576de2362d3Smrg if test "$libtool" = yes; then 5770d16fef4Smrg while test "X$1" != 'X--mode=compile'; do 578de2362d3Smrg shift 579de2362d3Smrg done 580de2362d3Smrg shift 581de2362d3Smrg fi 582de2362d3Smrg 5830d16fef4Smrg # Remove '-o $object'. 584de2362d3Smrg IFS=" " 585de2362d3Smrg for arg 586de2362d3Smrg do 587de2362d3Smrg case $arg in 588de2362d3Smrg -o) 589de2362d3Smrg shift 590de2362d3Smrg ;; 591de2362d3Smrg $object) 592de2362d3Smrg shift 593de2362d3Smrg ;; 594de2362d3Smrg *) 595de2362d3Smrg set fnord "$@" "$arg" 596de2362d3Smrg shift # fnord 597de2362d3Smrg shift # $arg 598de2362d3Smrg ;; 599de2362d3Smrg esac 600de2362d3Smrg done 601de2362d3Smrg 602de2362d3Smrg test -z "$dashmflag" && dashmflag=-M 6030d16fef4Smrg # Require at least two characters before searching for ':' 604de2362d3Smrg # in the target name. This is to cope with DOS-style filenames: 6050d16fef4Smrg # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. 606de2362d3Smrg "$@" $dashmflag | 6070d16fef4Smrg sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile" 608de2362d3Smrg rm -f "$depfile" 609de2362d3Smrg cat < "$tmpdepfile" > "$depfile" 6100d16fef4Smrg # Some versions of the HPUX 10.20 sed can't process this sed invocation 6110d16fef4Smrg # correctly. Breaking it into two sed invocations is a workaround. 6120d16fef4Smrg tr ' ' "$nl" < "$tmpdepfile" \ 6130d16fef4Smrg | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ 6140d16fef4Smrg | sed -e 's/$/ :/' >> "$depfile" 615de2362d3Smrg rm -f "$tmpdepfile" 616de2362d3Smrg ;; 617de2362d3Smrg 618de2362d3SmrgdashXmstdout) 619de2362d3Smrg # This case only exists to satisfy depend.m4. It is never actually 620de2362d3Smrg # run, as this mode is specially recognized in the preamble. 621de2362d3Smrg exit 1 622de2362d3Smrg ;; 623de2362d3Smrg 624de2362d3Smrgmakedepend) 625de2362d3Smrg "$@" || exit $? 626de2362d3Smrg # Remove any Libtool call 627de2362d3Smrg if test "$libtool" = yes; then 6280d16fef4Smrg while test "X$1" != 'X--mode=compile'; do 629de2362d3Smrg shift 630de2362d3Smrg done 631de2362d3Smrg shift 632de2362d3Smrg fi 633de2362d3Smrg # X makedepend 634de2362d3Smrg shift 6350d16fef4Smrg cleared=no eat=no 6360d16fef4Smrg for arg 6370d16fef4Smrg do 638de2362d3Smrg case $cleared in 639de2362d3Smrg no) 640de2362d3Smrg set ""; shift 641de2362d3Smrg cleared=yes ;; 642de2362d3Smrg esac 6430d16fef4Smrg if test $eat = yes; then 6440d16fef4Smrg eat=no 6450d16fef4Smrg continue 6460d16fef4Smrg fi 647de2362d3Smrg case "$arg" in 648de2362d3Smrg -D*|-I*) 649de2362d3Smrg set fnord "$@" "$arg"; shift ;; 650de2362d3Smrg # Strip any option that makedepend may not understand. Remove 651de2362d3Smrg # the object too, otherwise makedepend will parse it as a source file. 6520d16fef4Smrg -arch) 6530d16fef4Smrg eat=yes ;; 654de2362d3Smrg -*|$object) 655de2362d3Smrg ;; 656de2362d3Smrg *) 657de2362d3Smrg set fnord "$@" "$arg"; shift ;; 658de2362d3Smrg esac 659de2362d3Smrg done 6600d16fef4Smrg obj_suffix=`echo "$object" | sed 's/^.*\././'` 661de2362d3Smrg touch "$tmpdepfile" 662de2362d3Smrg ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" 663de2362d3Smrg rm -f "$depfile" 6640d16fef4Smrg # makedepend may prepend the VPATH from the source file name to the object. 6650d16fef4Smrg # No need to regex-escape $object, excess matching of '.' is harmless. 6660d16fef4Smrg sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" 6670d16fef4Smrg # Some versions of the HPUX 10.20 sed can't process the last invocation 6680d16fef4Smrg # correctly. Breaking it into two sed invocations is a workaround. 6690d16fef4Smrg sed '1,2d' "$tmpdepfile" \ 6700d16fef4Smrg | tr ' ' "$nl" \ 6710d16fef4Smrg | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ 6720d16fef4Smrg | sed -e 's/$/ :/' >> "$depfile" 673de2362d3Smrg rm -f "$tmpdepfile" "$tmpdepfile".bak 674de2362d3Smrg ;; 675de2362d3Smrg 676de2362d3Smrgcpp) 677de2362d3Smrg # Important note: in order to support this mode, a compiler *must* 678de2362d3Smrg # always write the preprocessed file to stdout. 679de2362d3Smrg "$@" || exit $? 680de2362d3Smrg 681de2362d3Smrg # Remove the call to Libtool. 682de2362d3Smrg if test "$libtool" = yes; then 6830d16fef4Smrg while test "X$1" != 'X--mode=compile'; do 684de2362d3Smrg shift 685de2362d3Smrg done 686de2362d3Smrg shift 687de2362d3Smrg fi 688de2362d3Smrg 6890d16fef4Smrg # Remove '-o $object'. 690de2362d3Smrg IFS=" " 691de2362d3Smrg for arg 692de2362d3Smrg do 693de2362d3Smrg case $arg in 694de2362d3Smrg -o) 695de2362d3Smrg shift 696de2362d3Smrg ;; 697de2362d3Smrg $object) 698de2362d3Smrg shift 699de2362d3Smrg ;; 700de2362d3Smrg *) 701de2362d3Smrg set fnord "$@" "$arg" 702de2362d3Smrg shift # fnord 703de2362d3Smrg shift # $arg 704de2362d3Smrg ;; 705de2362d3Smrg esac 706de2362d3Smrg done 707de2362d3Smrg 7080d16fef4Smrg "$@" -E \ 7090d16fef4Smrg | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ 7100d16fef4Smrg -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ 7110d16fef4Smrg | sed '$ s: \\$::' > "$tmpdepfile" 712de2362d3Smrg rm -f "$depfile" 713de2362d3Smrg echo "$object : \\" > "$depfile" 714de2362d3Smrg cat < "$tmpdepfile" >> "$depfile" 715de2362d3Smrg sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" 716de2362d3Smrg rm -f "$tmpdepfile" 717de2362d3Smrg ;; 718de2362d3Smrg 719de2362d3Smrgmsvisualcpp) 720de2362d3Smrg # Important note: in order to support this mode, a compiler *must* 7210d16fef4Smrg # always write the preprocessed file to stdout. 722de2362d3Smrg "$@" || exit $? 7230d16fef4Smrg 7240d16fef4Smrg # Remove the call to Libtool. 7250d16fef4Smrg if test "$libtool" = yes; then 7260d16fef4Smrg while test "X$1" != 'X--mode=compile'; do 7270d16fef4Smrg shift 7280d16fef4Smrg done 7290d16fef4Smrg shift 7300d16fef4Smrg fi 7310d16fef4Smrg 732de2362d3Smrg IFS=" " 733de2362d3Smrg for arg 734de2362d3Smrg do 735de2362d3Smrg case "$arg" in 7360d16fef4Smrg -o) 7370d16fef4Smrg shift 7380d16fef4Smrg ;; 7390d16fef4Smrg $object) 7400d16fef4Smrg shift 7410d16fef4Smrg ;; 742de2362d3Smrg "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") 7430d16fef4Smrg set fnord "$@" 7440d16fef4Smrg shift 7450d16fef4Smrg shift 7460d16fef4Smrg ;; 747de2362d3Smrg *) 7480d16fef4Smrg set fnord "$@" "$arg" 7490d16fef4Smrg shift 7500d16fef4Smrg shift 7510d16fef4Smrg ;; 752de2362d3Smrg esac 753de2362d3Smrg done 7540d16fef4Smrg "$@" -E 2>/dev/null | 7550d16fef4Smrg sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" 756de2362d3Smrg rm -f "$depfile" 757de2362d3Smrg echo "$object : \\" > "$depfile" 7580d16fef4Smrg sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" 7590d16fef4Smrg echo "$tab" >> "$depfile" 7600d16fef4Smrg sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" 761de2362d3Smrg rm -f "$tmpdepfile" 762de2362d3Smrg ;; 763de2362d3Smrg 7640d16fef4Smrgmsvcmsys) 7650d16fef4Smrg # This case exists only to let depend.m4 do its work. It works by 7660d16fef4Smrg # looking at the text of this script. This case will never be run, 7670d16fef4Smrg # since it is checked for above. 7680d16fef4Smrg exit 1 7690d16fef4Smrg ;; 7700d16fef4Smrg 771de2362d3Smrgnone) 772de2362d3Smrg exec "$@" 773de2362d3Smrg ;; 774de2362d3Smrg 775de2362d3Smrg*) 776de2362d3Smrg echo "Unknown depmode $depmode" 1>&2 777de2362d3Smrg exit 1 778de2362d3Smrg ;; 779de2362d3Smrgesac 780de2362d3Smrg 781de2362d3Smrgexit 0 782de2362d3Smrg 783de2362d3Smrg# Local Variables: 784de2362d3Smrg# mode: shell-script 785de2362d3Smrg# sh-indentation: 2 786de2362d3Smrg# eval: (add-hook 'write-file-hooks 'time-stamp) 787de2362d3Smrg# time-stamp-start: "scriptversion=" 788de2362d3Smrg# time-stamp-format: "%:y-%02m-%02d.%02H" 7890d16fef4Smrg# time-stamp-time-zone: "UTC" 7900d16fef4Smrg# time-stamp-end: "; # UTC" 791de2362d3Smrg# End: 792