depcomp revision 9e7bcd65
1444c061aSmrg#! /bin/sh 2444c061aSmrg# depcomp - compile a program generating dependencies as side-effects 3444c061aSmrg 49e7bcd65Smrgscriptversion=2012-10-18.11; # UTC 5444c061aSmrg 69e7bcd65Smrg# Copyright (C) 1999-2013 Free Software Foundation, Inc. 7444c061aSmrg 8444c061aSmrg# This program is free software; you can redistribute it and/or modify 9444c061aSmrg# it under the terms of the GNU General Public License as published by 10444c061aSmrg# the Free Software Foundation; either version 2, or (at your option) 11444c061aSmrg# any later version. 12444c061aSmrg 13444c061aSmrg# This program is distributed in the hope that it will be useful, 14444c061aSmrg# but WITHOUT ANY WARRANTY; without even the implied warranty of 15444c061aSmrg# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16444c061aSmrg# GNU General Public License for more details. 17444c061aSmrg 18444c061aSmrg# You should have received a copy of the GNU General Public License 192ae83157Smrg# along with this program. If not, see <http://www.gnu.org/licenses/>. 20444c061aSmrg 21444c061aSmrg# As a special exception to the GNU General Public License, if you 22444c061aSmrg# distribute this file as part of a program that contains a 23444c061aSmrg# configuration script generated by Autoconf, you may include it under 24444c061aSmrg# the same distribution terms that you use for the rest of that program. 25444c061aSmrg 26444c061aSmrg# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>. 27444c061aSmrg 28444c061aSmrgcase $1 in 29444c061aSmrg '') 309e7bcd65Smrg echo "$0: No command. Try '$0 --help' for more information." 1>&2 319e7bcd65Smrg exit 1; 329e7bcd65Smrg ;; 33444c061aSmrg -h | --h*) 34444c061aSmrg cat <<\EOF 35444c061aSmrgUsage: depcomp [--help] [--version] PROGRAM [ARGS] 36444c061aSmrg 37444c061aSmrgRun PROGRAMS ARGS to compile a file, generating dependencies 38444c061aSmrgas side-effects. 39444c061aSmrg 40444c061aSmrgEnvironment variables: 41444c061aSmrg depmode Dependency tracking mode. 429e7bcd65Smrg source Source file read by 'PROGRAMS ARGS'. 439e7bcd65Smrg object Object file output by 'PROGRAMS ARGS'. 44444c061aSmrg DEPDIR directory where to store dependencies. 45444c061aSmrg depfile Dependency file to output. 469e7bcd65Smrg tmpdepfile Temporary file to use when outputting dependencies. 47444c061aSmrg libtool Whether libtool is used (yes/no). 48444c061aSmrg 49444c061aSmrgReport bugs to <bug-automake@gnu.org>. 50444c061aSmrgEOF 51444c061aSmrg exit $? 52444c061aSmrg ;; 53444c061aSmrg -v | --v*) 54444c061aSmrg echo "depcomp $scriptversion" 55444c061aSmrg exit $? 56444c061aSmrg ;; 57444c061aSmrgesac 58444c061aSmrg 599e7bcd65Smrg# Get the directory component of the given path, and save it in the 609e7bcd65Smrg# global variables '$dir'. Note that this directory component will 619e7bcd65Smrg# be either empty or ending with a '/' character. This is deliberate. 629e7bcd65Smrgset_dir_from () 639e7bcd65Smrg{ 649e7bcd65Smrg case $1 in 659e7bcd65Smrg */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;; 669e7bcd65Smrg *) dir=;; 679e7bcd65Smrg esac 689e7bcd65Smrg} 699e7bcd65Smrg 709e7bcd65Smrg# Get the suffix-stripped basename of the given path, and save it the 719e7bcd65Smrg# global variable '$base'. 729e7bcd65Smrgset_base_from () 739e7bcd65Smrg{ 749e7bcd65Smrg base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'` 759e7bcd65Smrg} 769e7bcd65Smrg 779e7bcd65Smrg# If no dependency file was actually created by the compiler invocation, 789e7bcd65Smrg# we still have to create a dummy depfile, to avoid errors with the 799e7bcd65Smrg# Makefile "include basename.Plo" scheme. 809e7bcd65Smrgmake_dummy_depfile () 819e7bcd65Smrg{ 829e7bcd65Smrg echo "#dummy" > "$depfile" 839e7bcd65Smrg} 849e7bcd65Smrg 859e7bcd65Smrg# Factor out some common post-processing of the generated depfile. 869e7bcd65Smrg# Requires the auxiliary global variable '$tmpdepfile' to be set. 879e7bcd65Smrgaix_post_process_depfile () 889e7bcd65Smrg{ 899e7bcd65Smrg # If the compiler actually managed to produce a dependency file, 909e7bcd65Smrg # post-process it. 919e7bcd65Smrg if test -f "$tmpdepfile"; then 929e7bcd65Smrg # Each line is of the form 'foo.o: dependency.h'. 939e7bcd65Smrg # Do two passes, one to just change these to 949e7bcd65Smrg # $object: dependency.h 959e7bcd65Smrg # and one to simply output 969e7bcd65Smrg # dependency.h: 979e7bcd65Smrg # which is needed to avoid the deleted-header problem. 989e7bcd65Smrg { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile" 999e7bcd65Smrg sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile" 1009e7bcd65Smrg } > "$depfile" 1019e7bcd65Smrg rm -f "$tmpdepfile" 1029e7bcd65Smrg else 1039e7bcd65Smrg make_dummy_depfile 1049e7bcd65Smrg fi 1059e7bcd65Smrg} 1069e7bcd65Smrg 1079e7bcd65Smrg# A tabulation character. 1089e7bcd65Smrgtab=' ' 1099e7bcd65Smrg# A newline character. 1109e7bcd65Smrgnl=' 1119e7bcd65Smrg' 1129e7bcd65Smrg# Character ranges might be problematic outside the C locale. 1139e7bcd65Smrg# These definitions help. 1149e7bcd65Smrgupper=ABCDEFGHIJKLMNOPQRSTUVWXYZ 1159e7bcd65Smrglower=abcdefghijklmnopqrstuvwxyz 1169e7bcd65Smrgdigits=0123456789 1179e7bcd65Smrgalpha=${upper}${lower} 1189e7bcd65Smrg 119444c061aSmrgif test -z "$depmode" || test -z "$source" || test -z "$object"; then 120444c061aSmrg echo "depcomp: Variables source, object and depmode must be set" 1>&2 121444c061aSmrg exit 1 122444c061aSmrgfi 123444c061aSmrg 124444c061aSmrg# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. 125444c061aSmrgdepfile=${depfile-`echo "$object" | 126444c061aSmrg sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} 127444c061aSmrgtmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} 128444c061aSmrg 129444c061aSmrgrm -f "$tmpdepfile" 130444c061aSmrg 1319e7bcd65Smrg# Avoid interferences from the environment. 1329e7bcd65Smrggccflag= dashmflag= 1339e7bcd65Smrg 134444c061aSmrg# Some modes work just like other modes, but use different flags. We 135444c061aSmrg# parameterize here, but still list the modes in the big case below, 136444c061aSmrg# to make depend.m4 easier to write. Note that we *cannot* use a case 137444c061aSmrg# here, because this file can only contain one case statement. 138444c061aSmrgif test "$depmode" = hp; then 139444c061aSmrg # HP compiler uses -M and no extra arg. 140444c061aSmrg gccflag=-M 141444c061aSmrg depmode=gcc 142444c061aSmrgfi 143444c061aSmrg 144444c061aSmrgif test "$depmode" = dashXmstdout; then 1459e7bcd65Smrg # This is just like dashmstdout with a different argument. 1469e7bcd65Smrg dashmflag=-xM 1479e7bcd65Smrg depmode=dashmstdout 148444c061aSmrgfi 149444c061aSmrg 1502ae83157Smrgcygpath_u="cygpath -u -f -" 1512ae83157Smrgif test "$depmode" = msvcmsys; then 1529e7bcd65Smrg # This is just like msvisualcpp but w/o cygpath translation. 1539e7bcd65Smrg # Just convert the backslash-escaped backslashes to single forward 1549e7bcd65Smrg # slashes to satisfy depend.m4 1559e7bcd65Smrg cygpath_u='sed s,\\\\,/,g' 1569e7bcd65Smrg depmode=msvisualcpp 1579e7bcd65Smrgfi 1589e7bcd65Smrg 1599e7bcd65Smrgif test "$depmode" = msvc7msys; then 1609e7bcd65Smrg # This is just like msvc7 but w/o cygpath translation. 1619e7bcd65Smrg # Just convert the backslash-escaped backslashes to single forward 1629e7bcd65Smrg # slashes to satisfy depend.m4 1639e7bcd65Smrg cygpath_u='sed s,\\\\,/,g' 1649e7bcd65Smrg depmode=msvc7 1659e7bcd65Smrgfi 1669e7bcd65Smrg 1679e7bcd65Smrgif test "$depmode" = xlc; then 1689e7bcd65Smrg # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information. 1699e7bcd65Smrg gccflag=-qmakedep=gcc,-MF 1709e7bcd65Smrg depmode=gcc 1712ae83157Smrgfi 1722ae83157Smrg 173444c061aSmrgcase "$depmode" in 174444c061aSmrggcc3) 175444c061aSmrg## gcc 3 implements dependency tracking that does exactly what 176444c061aSmrg## we want. Yay! Note: for some reason libtool 1.4 doesn't like 177444c061aSmrg## it if -MD -MP comes after the -MF stuff. Hmm. 1782265a131Smrg## Unfortunately, FreeBSD c89 acceptance of flags depends upon 1792265a131Smrg## the command line argument order; so add the flags where they 1802265a131Smrg## appear in depend2.am. Note that the slowdown incurred here 1812265a131Smrg## affects only configure: in makefiles, %FASTDEP% shortcuts this. 1822265a131Smrg for arg 1832265a131Smrg do 1842265a131Smrg case $arg in 1852265a131Smrg -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; 1862265a131Smrg *) set fnord "$@" "$arg" ;; 1872265a131Smrg esac 1882265a131Smrg shift # fnord 1892265a131Smrg shift # $arg 1902265a131Smrg done 1912265a131Smrg "$@" 192444c061aSmrg stat=$? 1939e7bcd65Smrg if test $stat -ne 0; then 194444c061aSmrg rm -f "$tmpdepfile" 195444c061aSmrg exit $stat 196444c061aSmrg fi 197444c061aSmrg mv "$tmpdepfile" "$depfile" 198444c061aSmrg ;; 199444c061aSmrg 200444c061aSmrggcc) 2019e7bcd65Smrg## Note that this doesn't just cater to obsosete pre-3.x GCC compilers. 2029e7bcd65Smrg## but also to in-use compilers like IMB xlc/xlC and the HP C compiler. 2039e7bcd65Smrg## (see the conditional assignment to $gccflag above). 204444c061aSmrg## There are various ways to get dependency output from gcc. Here's 205444c061aSmrg## why we pick this rather obscure method: 206444c061aSmrg## - Don't want to use -MD because we'd like the dependencies to end 207444c061aSmrg## up in a subdir. Having to rename by hand is ugly. 208444c061aSmrg## (We might end up doing this anyway to support other compilers.) 209444c061aSmrg## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like 2109e7bcd65Smrg## -MM, not -M (despite what the docs say). Also, it might not be 2119e7bcd65Smrg## supported by the other compilers which use the 'gcc' depmode. 212444c061aSmrg## - Using -M directly means running the compiler twice (even worse 213444c061aSmrg## than renaming). 214444c061aSmrg if test -z "$gccflag"; then 215444c061aSmrg gccflag=-MD, 216444c061aSmrg fi 217444c061aSmrg "$@" -Wp,"$gccflag$tmpdepfile" 218444c061aSmrg stat=$? 2199e7bcd65Smrg if test $stat -ne 0; then 220444c061aSmrg rm -f "$tmpdepfile" 221444c061aSmrg exit $stat 222444c061aSmrg fi 223444c061aSmrg rm -f "$depfile" 224444c061aSmrg echo "$object : \\" > "$depfile" 2259e7bcd65Smrg # The second -e expression handles DOS-style file names with drive 2269e7bcd65Smrg # letters. 227444c061aSmrg sed -e 's/^[^:]*: / /' \ 228444c061aSmrg -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" 2299e7bcd65Smrg## This next piece of magic avoids the "deleted header file" problem. 230444c061aSmrg## The problem is that when a header file which appears in a .P file 231444c061aSmrg## is deleted, the dependency causes make to die (because there is 232444c061aSmrg## typically no way to rebuild the header). We avoid this by adding 233444c061aSmrg## dummy dependencies for each header file. Too bad gcc doesn't do 234444c061aSmrg## this for us directly. 2359e7bcd65Smrg## Some versions of gcc put a space before the ':'. On the theory 236444c061aSmrg## that the space means something, we add a space to the output as 2379e7bcd65Smrg## well. hp depmode also adds that space, but also prefixes the VPATH 2389e7bcd65Smrg## to the object. Take care to not repeat it in the output. 239444c061aSmrg## Some versions of the HPUX 10.20 sed can't process this invocation 240444c061aSmrg## correctly. Breaking it into two sed invocations is a workaround. 2419e7bcd65Smrg tr ' ' "$nl" < "$tmpdepfile" \ 2429e7bcd65Smrg | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ 2439e7bcd65Smrg | sed -e 's/$/ :/' >> "$depfile" 244444c061aSmrg rm -f "$tmpdepfile" 245444c061aSmrg ;; 246444c061aSmrg 247444c061aSmrghp) 248444c061aSmrg # This case exists only to let depend.m4 do its work. It works by 249444c061aSmrg # looking at the text of this script. This case will never be run, 250444c061aSmrg # since it is checked for above. 251444c061aSmrg exit 1 252444c061aSmrg ;; 253444c061aSmrg 254444c061aSmrgsgi) 255444c061aSmrg if test "$libtool" = yes; then 256444c061aSmrg "$@" "-Wp,-MDupdate,$tmpdepfile" 257444c061aSmrg else 258444c061aSmrg "$@" -MDupdate "$tmpdepfile" 259444c061aSmrg fi 260444c061aSmrg stat=$? 2619e7bcd65Smrg if test $stat -ne 0; then 262444c061aSmrg rm -f "$tmpdepfile" 263444c061aSmrg exit $stat 264444c061aSmrg fi 265444c061aSmrg rm -f "$depfile" 266444c061aSmrg 267444c061aSmrg if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files 268444c061aSmrg echo "$object : \\" > "$depfile" 269444c061aSmrg # Clip off the initial element (the dependent). Don't try to be 270444c061aSmrg # clever and replace this with sed code, as IRIX sed won't handle 271444c061aSmrg # lines with more than a fixed number of characters (4096 in 272444c061aSmrg # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; 2739e7bcd65Smrg # the IRIX cc adds comments like '#:fec' to the end of the 274444c061aSmrg # dependency line. 2759e7bcd65Smrg tr ' ' "$nl" < "$tmpdepfile" \ 2769e7bcd65Smrg | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \ 2779e7bcd65Smrg | tr "$nl" ' ' >> "$depfile" 2782ae83157Smrg echo >> "$depfile" 279444c061aSmrg # The second pass generates a dummy entry for each header file. 2809e7bcd65Smrg tr ' ' "$nl" < "$tmpdepfile" \ 2819e7bcd65Smrg | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ 2829e7bcd65Smrg >> "$depfile" 283444c061aSmrg else 2849e7bcd65Smrg make_dummy_depfile 285444c061aSmrg fi 286444c061aSmrg rm -f "$tmpdepfile" 287444c061aSmrg ;; 288444c061aSmrg 2899e7bcd65Smrgxlc) 2909e7bcd65Smrg # This case exists only to let depend.m4 do its work. It works by 2919e7bcd65Smrg # looking at the text of this script. This case will never be run, 2929e7bcd65Smrg # since it is checked for above. 2939e7bcd65Smrg exit 1 2949e7bcd65Smrg ;; 2959e7bcd65Smrg 296444c061aSmrgaix) 297444c061aSmrg # The C for AIX Compiler uses -M and outputs the dependencies 298444c061aSmrg # in a .u file. In older versions, this file always lives in the 2999e7bcd65Smrg # current directory. Also, the AIX compiler puts '$object:' at the 300444c061aSmrg # start of each line; $object doesn't have directory information. 301444c061aSmrg # Version 6 uses the directory in both cases. 3029e7bcd65Smrg set_dir_from "$object" 3039e7bcd65Smrg set_base_from "$object" 304444c061aSmrg if test "$libtool" = yes; then 3052265a131Smrg tmpdepfile1=$dir$base.u 3062265a131Smrg tmpdepfile2=$base.u 3072265a131Smrg tmpdepfile3=$dir.libs/$base.u 308444c061aSmrg "$@" -Wc,-M 309444c061aSmrg else 3102265a131Smrg tmpdepfile1=$dir$base.u 3112265a131Smrg tmpdepfile2=$dir$base.u 3122265a131Smrg tmpdepfile3=$dir$base.u 313444c061aSmrg "$@" -M 314444c061aSmrg fi 315444c061aSmrg stat=$? 3169e7bcd65Smrg if test $stat -ne 0; then 3172265a131Smrg rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 318444c061aSmrg exit $stat 319444c061aSmrg fi 320444c061aSmrg 3212265a131Smrg for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 3222265a131Smrg do 3232265a131Smrg test -f "$tmpdepfile" && break 3242265a131Smrg done 3259e7bcd65Smrg aix_post_process_depfile 3269e7bcd65Smrg ;; 3279e7bcd65Smrg 3289e7bcd65Smrgtcc) 3299e7bcd65Smrg # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26 3309e7bcd65Smrg # FIXME: That version still under development at the moment of writing. 3319e7bcd65Smrg # Make that this statement remains true also for stable, released 3329e7bcd65Smrg # versions. 3339e7bcd65Smrg # It will wrap lines (doesn't matter whether long or short) with a 3349e7bcd65Smrg # trailing '\', as in: 3359e7bcd65Smrg # 3369e7bcd65Smrg # foo.o : \ 3379e7bcd65Smrg # foo.c \ 3389e7bcd65Smrg # foo.h \ 3399e7bcd65Smrg # 3409e7bcd65Smrg # It will put a trailing '\' even on the last line, and will use leading 3419e7bcd65Smrg # spaces rather than leading tabs (at least since its commit 0394caf7 3429e7bcd65Smrg # "Emit spaces for -MD"). 3439e7bcd65Smrg "$@" -MD -MF "$tmpdepfile" 3449e7bcd65Smrg stat=$? 3459e7bcd65Smrg if test $stat -ne 0; then 3469e7bcd65Smrg rm -f "$tmpdepfile" 3479e7bcd65Smrg exit $stat 348444c061aSmrg fi 3499e7bcd65Smrg rm -f "$depfile" 3509e7bcd65Smrg # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'. 3519e7bcd65Smrg # We have to change lines of the first kind to '$object: \'. 3529e7bcd65Smrg sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile" 3539e7bcd65Smrg # And for each line of the second kind, we have to emit a 'dep.h:' 3549e7bcd65Smrg # dummy dependency, to avoid the deleted-header problem. 3559e7bcd65Smrg sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile" 356444c061aSmrg rm -f "$tmpdepfile" 357444c061aSmrg ;; 358444c061aSmrg 3599e7bcd65Smrg## The order of this option in the case statement is important, since the 3609e7bcd65Smrg## shell code in configure will try each of these formats in the order 3619e7bcd65Smrg## listed in this file. A plain '-MD' option would be understood by many 3629e7bcd65Smrg## compilers, so we must ensure this comes after the gcc and icc options. 3639e7bcd65Smrgpgcc) 3649e7bcd65Smrg # Portland's C compiler understands '-MD'. 3659e7bcd65Smrg # Will always output deps to 'file.d' where file is the root name of the 3669e7bcd65Smrg # source file under compilation, even if file resides in a subdirectory. 3679e7bcd65Smrg # The object file name does not affect the name of the '.d' file. 3689e7bcd65Smrg # pgcc 10.2 will output 369444c061aSmrg # foo.o: sub/foo.c sub/foo.h 3709e7bcd65Smrg # and will wrap long lines using '\' : 371444c061aSmrg # foo.o: sub/foo.c ... \ 372444c061aSmrg # sub/foo.h ... \ 373444c061aSmrg # ... 3749e7bcd65Smrg set_dir_from "$object" 3759e7bcd65Smrg # Use the source, not the object, to determine the base name, since 3769e7bcd65Smrg # that's sadly what pgcc will do too. 3779e7bcd65Smrg set_base_from "$source" 3789e7bcd65Smrg tmpdepfile=$base.d 3799e7bcd65Smrg 3809e7bcd65Smrg # For projects that build the same source file twice into different object 3819e7bcd65Smrg # files, the pgcc approach of using the *source* file root name can cause 3829e7bcd65Smrg # problems in parallel builds. Use a locking strategy to avoid stomping on 3839e7bcd65Smrg # the same $tmpdepfile. 3849e7bcd65Smrg lockdir=$base.d-lock 3859e7bcd65Smrg trap " 3869e7bcd65Smrg echo '$0: caught signal, cleaning up...' >&2 3879e7bcd65Smrg rmdir '$lockdir' 3889e7bcd65Smrg exit 1 3899e7bcd65Smrg " 1 2 13 15 3909e7bcd65Smrg numtries=100 3919e7bcd65Smrg i=$numtries 3929e7bcd65Smrg while test $i -gt 0; do 3939e7bcd65Smrg # mkdir is a portable test-and-set. 3949e7bcd65Smrg if mkdir "$lockdir" 2>/dev/null; then 3959e7bcd65Smrg # This process acquired the lock. 3969e7bcd65Smrg "$@" -MD 3979e7bcd65Smrg stat=$? 3989e7bcd65Smrg # Release the lock. 3999e7bcd65Smrg rmdir "$lockdir" 4009e7bcd65Smrg break 4019e7bcd65Smrg else 4029e7bcd65Smrg # If the lock is being held by a different process, wait 4039e7bcd65Smrg # until the winning process is done or we timeout. 4049e7bcd65Smrg while test -d "$lockdir" && test $i -gt 0; do 4059e7bcd65Smrg sleep 1 4069e7bcd65Smrg i=`expr $i - 1` 4079e7bcd65Smrg done 4089e7bcd65Smrg fi 4099e7bcd65Smrg i=`expr $i - 1` 4109e7bcd65Smrg done 4119e7bcd65Smrg trap - 1 2 13 15 4129e7bcd65Smrg if test $i -le 0; then 4139e7bcd65Smrg echo "$0: failed to acquire lock after $numtries attempts" >&2 4149e7bcd65Smrg echo "$0: check lockdir '$lockdir'" >&2 4159e7bcd65Smrg exit 1 4169e7bcd65Smrg fi 417444c061aSmrg 4189e7bcd65Smrg if test $stat -ne 0; then 419444c061aSmrg rm -f "$tmpdepfile" 420444c061aSmrg exit $stat 421444c061aSmrg fi 422444c061aSmrg rm -f "$depfile" 423444c061aSmrg # Each line is of the form `foo.o: dependent.h', 424444c061aSmrg # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. 425444c061aSmrg # Do two passes, one to just change these to 426444c061aSmrg # `$object: dependent.h' and one to simply `dependent.h:'. 427444c061aSmrg sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" 428444c061aSmrg # Some versions of the HPUX 10.20 sed can't process this invocation 429444c061aSmrg # correctly. Breaking it into two sed invocations is a workaround. 4309e7bcd65Smrg sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \ 4319e7bcd65Smrg | sed -e 's/$/ :/' >> "$depfile" 432444c061aSmrg rm -f "$tmpdepfile" 433444c061aSmrg ;; 434444c061aSmrg 4352265a131Smrghp2) 4362265a131Smrg # The "hp" stanza above does not work with aCC (C++) and HP's ia64 4372265a131Smrg # compilers, which have integrated preprocessors. The correct option 4382265a131Smrg # to use with these is +Maked; it writes dependencies to a file named 4392265a131Smrg # 'foo.d', which lands next to the object file, wherever that 4402265a131Smrg # happens to be. 4412265a131Smrg # Much of this is similar to the tru64 case; see comments there. 4429e7bcd65Smrg set_dir_from "$object" 4439e7bcd65Smrg set_base_from "$object" 4442265a131Smrg if test "$libtool" = yes; then 4452265a131Smrg tmpdepfile1=$dir$base.d 4462265a131Smrg tmpdepfile2=$dir.libs/$base.d 4472265a131Smrg "$@" -Wc,+Maked 4482265a131Smrg else 4492265a131Smrg tmpdepfile1=$dir$base.d 4502265a131Smrg tmpdepfile2=$dir$base.d 4512265a131Smrg "$@" +Maked 4522265a131Smrg fi 4532265a131Smrg stat=$? 4549e7bcd65Smrg if test $stat -ne 0; then 4552265a131Smrg rm -f "$tmpdepfile1" "$tmpdepfile2" 4562265a131Smrg exit $stat 4572265a131Smrg fi 4582265a131Smrg 4592265a131Smrg for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" 4602265a131Smrg do 4612265a131Smrg test -f "$tmpdepfile" && break 4622265a131Smrg done 4632265a131Smrg if test -f "$tmpdepfile"; then 4649e7bcd65Smrg sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile" 4659e7bcd65Smrg # Add 'dependent.h:' lines. 4662ae83157Smrg sed -ne '2,${ 4679e7bcd65Smrg s/^ *// 4689e7bcd65Smrg s/ \\*$// 4699e7bcd65Smrg s/$/:/ 4709e7bcd65Smrg p 4719e7bcd65Smrg }' "$tmpdepfile" >> "$depfile" 4722265a131Smrg else 4739e7bcd65Smrg make_dummy_depfile 4742265a131Smrg fi 4752265a131Smrg rm -f "$tmpdepfile" "$tmpdepfile2" 4762265a131Smrg ;; 4772265a131Smrg 478444c061aSmrgtru64) 4799e7bcd65Smrg # The Tru64 compiler uses -MD to generate dependencies as a side 4809e7bcd65Smrg # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. 4819e7bcd65Smrg # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put 4829e7bcd65Smrg # dependencies in 'foo.d' instead, so we check for that too. 4839e7bcd65Smrg # Subdirectories are respected. 4849e7bcd65Smrg set_dir_from "$object" 4859e7bcd65Smrg set_base_from "$object" 4869e7bcd65Smrg 4879e7bcd65Smrg if test "$libtool" = yes; then 4889e7bcd65Smrg # Libtool generates 2 separate objects for the 2 libraries. These 4899e7bcd65Smrg # two compilations output dependencies in $dir.libs/$base.o.d and 4909e7bcd65Smrg # in $dir$base.o.d. We have to check for both files, because 4919e7bcd65Smrg # one of the two compilations can be disabled. We should prefer 4929e7bcd65Smrg # $dir$base.o.d over $dir.libs/$base.o.d because the latter is 4939e7bcd65Smrg # automatically cleaned when .libs/ is deleted, while ignoring 4949e7bcd65Smrg # the former would cause a distcleancheck panic. 4959e7bcd65Smrg tmpdepfile1=$dir$base.o.d # libtool 1.5 4969e7bcd65Smrg tmpdepfile2=$dir.libs/$base.o.d # Likewise. 4979e7bcd65Smrg tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504 4989e7bcd65Smrg "$@" -Wc,-MD 4999e7bcd65Smrg else 5009e7bcd65Smrg tmpdepfile1=$dir$base.d 5019e7bcd65Smrg tmpdepfile2=$dir$base.d 5029e7bcd65Smrg tmpdepfile3=$dir$base.d 5039e7bcd65Smrg "$@" -MD 5049e7bcd65Smrg fi 5059e7bcd65Smrg 5069e7bcd65Smrg stat=$? 5079e7bcd65Smrg if test $stat -ne 0; then 5089e7bcd65Smrg rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 5099e7bcd65Smrg exit $stat 5109e7bcd65Smrg fi 5119e7bcd65Smrg 5129e7bcd65Smrg for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 5139e7bcd65Smrg do 5149e7bcd65Smrg test -f "$tmpdepfile" && break 5159e7bcd65Smrg done 5169e7bcd65Smrg # Same post-processing that is required for AIX mode. 5179e7bcd65Smrg aix_post_process_depfile 5189e7bcd65Smrg ;; 5199e7bcd65Smrg 5209e7bcd65Smrgmsvc7) 5219e7bcd65Smrg if test "$libtool" = yes; then 5229e7bcd65Smrg showIncludes=-Wc,-showIncludes 5239e7bcd65Smrg else 5249e7bcd65Smrg showIncludes=-showIncludes 5259e7bcd65Smrg fi 5269e7bcd65Smrg "$@" $showIncludes > "$tmpdepfile" 5279e7bcd65Smrg stat=$? 5289e7bcd65Smrg grep -v '^Note: including file: ' "$tmpdepfile" 5299e7bcd65Smrg if test $stat -ne 0; then 5309e7bcd65Smrg rm -f "$tmpdepfile" 5319e7bcd65Smrg exit $stat 5329e7bcd65Smrg fi 5339e7bcd65Smrg rm -f "$depfile" 5349e7bcd65Smrg echo "$object : \\" > "$depfile" 5359e7bcd65Smrg # The first sed program below extracts the file names and escapes 5369e7bcd65Smrg # backslashes for cygpath. The second sed program outputs the file 5379e7bcd65Smrg # name when reading, but also accumulates all include files in the 5389e7bcd65Smrg # hold buffer in order to output them again at the end. This only 5399e7bcd65Smrg # works with sed implementations that can handle large buffers. 5409e7bcd65Smrg sed < "$tmpdepfile" -n ' 5419e7bcd65Smrg/^Note: including file: *\(.*\)/ { 5429e7bcd65Smrg s//\1/ 5439e7bcd65Smrg s/\\/\\\\/g 5449e7bcd65Smrg p 5459e7bcd65Smrg}' | $cygpath_u | sort -u | sed -n ' 5469e7bcd65Smrgs/ /\\ /g 5479e7bcd65Smrgs/\(.*\)/'"$tab"'\1 \\/p 5489e7bcd65Smrgs/.\(.*\) \\/\1:/ 5499e7bcd65SmrgH 5509e7bcd65Smrg$ { 5519e7bcd65Smrg s/.*/'"$tab"'/ 5529e7bcd65Smrg G 5539e7bcd65Smrg p 5549e7bcd65Smrg}' >> "$depfile" 5559e7bcd65Smrg rm -f "$tmpdepfile" 5569e7bcd65Smrg ;; 5579e7bcd65Smrg 5589e7bcd65Smrgmsvc7msys) 5599e7bcd65Smrg # This case exists only to let depend.m4 do its work. It works by 5609e7bcd65Smrg # looking at the text of this script. This case will never be run, 5619e7bcd65Smrg # since it is checked for above. 5629e7bcd65Smrg exit 1 5639e7bcd65Smrg ;; 564444c061aSmrg 565444c061aSmrg#nosideeffect) 566444c061aSmrg # This comment above is used by automake to tell side-effect 567444c061aSmrg # dependency tracking mechanisms from slower ones. 568444c061aSmrg 569444c061aSmrgdashmstdout) 570444c061aSmrg # Important note: in order to support this mode, a compiler *must* 571444c061aSmrg # always write the preprocessed file to stdout, regardless of -o. 572444c061aSmrg "$@" || exit $? 573444c061aSmrg 574444c061aSmrg # Remove the call to Libtool. 575444c061aSmrg if test "$libtool" = yes; then 5762ae83157Smrg while test "X$1" != 'X--mode=compile'; do 577444c061aSmrg shift 578444c061aSmrg done 579444c061aSmrg shift 580444c061aSmrg fi 581444c061aSmrg 5829e7bcd65Smrg # Remove '-o $object'. 583444c061aSmrg IFS=" " 584444c061aSmrg for arg 585444c061aSmrg do 586444c061aSmrg case $arg in 587444c061aSmrg -o) 588444c061aSmrg shift 589444c061aSmrg ;; 590444c061aSmrg $object) 591444c061aSmrg shift 592444c061aSmrg ;; 593444c061aSmrg *) 594444c061aSmrg set fnord "$@" "$arg" 595444c061aSmrg shift # fnord 596444c061aSmrg shift # $arg 597444c061aSmrg ;; 598444c061aSmrg esac 599444c061aSmrg done 600444c061aSmrg 601444c061aSmrg test -z "$dashmflag" && dashmflag=-M 6029e7bcd65Smrg # Require at least two characters before searching for ':' 603444c061aSmrg # in the target name. This is to cope with DOS-style filenames: 6049e7bcd65Smrg # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. 605444c061aSmrg "$@" $dashmflag | 6069e7bcd65Smrg sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile" 607444c061aSmrg rm -f "$depfile" 608444c061aSmrg cat < "$tmpdepfile" > "$depfile" 6099e7bcd65Smrg # Some versions of the HPUX 10.20 sed can't process this sed invocation 6109e7bcd65Smrg # correctly. Breaking it into two sed invocations is a workaround. 6119e7bcd65Smrg tr ' ' "$nl" < "$tmpdepfile" \ 6129e7bcd65Smrg | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ 6139e7bcd65Smrg | sed -e 's/$/ :/' >> "$depfile" 614444c061aSmrg rm -f "$tmpdepfile" 615444c061aSmrg ;; 616444c061aSmrg 617444c061aSmrgdashXmstdout) 618444c061aSmrg # This case only exists to satisfy depend.m4. It is never actually 619444c061aSmrg # run, as this mode is specially recognized in the preamble. 620444c061aSmrg exit 1 621444c061aSmrg ;; 622444c061aSmrg 623444c061aSmrgmakedepend) 624444c061aSmrg "$@" || exit $? 625444c061aSmrg # Remove any Libtool call 626444c061aSmrg if test "$libtool" = yes; then 6272ae83157Smrg while test "X$1" != 'X--mode=compile'; do 628444c061aSmrg shift 629444c061aSmrg done 630444c061aSmrg shift 631444c061aSmrg fi 632444c061aSmrg # X makedepend 633444c061aSmrg shift 6342ae83157Smrg cleared=no eat=no 6352ae83157Smrg for arg 6362ae83157Smrg do 637444c061aSmrg case $cleared in 638444c061aSmrg no) 639444c061aSmrg set ""; shift 640444c061aSmrg cleared=yes ;; 641444c061aSmrg esac 6422ae83157Smrg if test $eat = yes; then 6432ae83157Smrg eat=no 6442ae83157Smrg continue 6452ae83157Smrg fi 646444c061aSmrg case "$arg" in 647444c061aSmrg -D*|-I*) 648444c061aSmrg set fnord "$@" "$arg"; shift ;; 649444c061aSmrg # Strip any option that makedepend may not understand. Remove 650444c061aSmrg # the object too, otherwise makedepend will parse it as a source file. 6512ae83157Smrg -arch) 6522ae83157Smrg eat=yes ;; 653444c061aSmrg -*|$object) 654444c061aSmrg ;; 655444c061aSmrg *) 656444c061aSmrg set fnord "$@" "$arg"; shift ;; 657444c061aSmrg esac 658444c061aSmrg done 6592ae83157Smrg obj_suffix=`echo "$object" | sed 's/^.*\././'` 660444c061aSmrg touch "$tmpdepfile" 661444c061aSmrg ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" 662444c061aSmrg rm -f "$depfile" 6639e7bcd65Smrg # makedepend may prepend the VPATH from the source file name to the object. 6649e7bcd65Smrg # No need to regex-escape $object, excess matching of '.' is harmless. 6659e7bcd65Smrg sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" 6669e7bcd65Smrg # Some versions of the HPUX 10.20 sed can't process the last invocation 6679e7bcd65Smrg # correctly. Breaking it into two sed invocations is a workaround. 6689e7bcd65Smrg sed '1,2d' "$tmpdepfile" \ 6699e7bcd65Smrg | tr ' ' "$nl" \ 6709e7bcd65Smrg | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ 6719e7bcd65Smrg | sed -e 's/$/ :/' >> "$depfile" 672444c061aSmrg rm -f "$tmpdepfile" "$tmpdepfile".bak 673444c061aSmrg ;; 674444c061aSmrg 675444c061aSmrgcpp) 676444c061aSmrg # Important note: in order to support this mode, a compiler *must* 677444c061aSmrg # always write the preprocessed file to stdout. 678444c061aSmrg "$@" || exit $? 679444c061aSmrg 680444c061aSmrg # Remove the call to Libtool. 681444c061aSmrg if test "$libtool" = yes; then 6822ae83157Smrg while test "X$1" != 'X--mode=compile'; do 683444c061aSmrg shift 684444c061aSmrg done 685444c061aSmrg shift 686444c061aSmrg fi 687444c061aSmrg 6889e7bcd65Smrg # Remove '-o $object'. 689444c061aSmrg IFS=" " 690444c061aSmrg for arg 691444c061aSmrg do 692444c061aSmrg case $arg in 693444c061aSmrg -o) 694444c061aSmrg shift 695444c061aSmrg ;; 696444c061aSmrg $object) 697444c061aSmrg shift 698444c061aSmrg ;; 699444c061aSmrg *) 700444c061aSmrg set fnord "$@" "$arg" 701444c061aSmrg shift # fnord 702444c061aSmrg shift # $arg 703444c061aSmrg ;; 704444c061aSmrg esac 705444c061aSmrg done 706444c061aSmrg 7079e7bcd65Smrg "$@" -E \ 7089e7bcd65Smrg | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ 7099e7bcd65Smrg -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ 7109e7bcd65Smrg | sed '$ s: \\$::' > "$tmpdepfile" 711444c061aSmrg rm -f "$depfile" 712444c061aSmrg echo "$object : \\" > "$depfile" 713444c061aSmrg cat < "$tmpdepfile" >> "$depfile" 714444c061aSmrg sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" 715444c061aSmrg rm -f "$tmpdepfile" 716444c061aSmrg ;; 717444c061aSmrg 718444c061aSmrgmsvisualcpp) 719444c061aSmrg # Important note: in order to support this mode, a compiler *must* 7202ae83157Smrg # always write the preprocessed file to stdout. 721444c061aSmrg "$@" || exit $? 7222ae83157Smrg 7232ae83157Smrg # Remove the call to Libtool. 7242ae83157Smrg if test "$libtool" = yes; then 7252ae83157Smrg while test "X$1" != 'X--mode=compile'; do 7262ae83157Smrg shift 7272ae83157Smrg done 7282ae83157Smrg shift 7292ae83157Smrg fi 7302ae83157Smrg 731444c061aSmrg IFS=" " 732444c061aSmrg for arg 733444c061aSmrg do 734444c061aSmrg case "$arg" in 7352ae83157Smrg -o) 7362ae83157Smrg shift 7372ae83157Smrg ;; 7382ae83157Smrg $object) 7392ae83157Smrg shift 7402ae83157Smrg ;; 741444c061aSmrg "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") 7429e7bcd65Smrg set fnord "$@" 7439e7bcd65Smrg shift 7449e7bcd65Smrg shift 7459e7bcd65Smrg ;; 746444c061aSmrg *) 7479e7bcd65Smrg set fnord "$@" "$arg" 7489e7bcd65Smrg shift 7499e7bcd65Smrg shift 7509e7bcd65Smrg ;; 751444c061aSmrg esac 752444c061aSmrg done 7532ae83157Smrg "$@" -E 2>/dev/null | 7542ae83157Smrg sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" 755444c061aSmrg rm -f "$depfile" 756444c061aSmrg echo "$object : \\" > "$depfile" 7579e7bcd65Smrg sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" 7589e7bcd65Smrg echo "$tab" >> "$depfile" 7592ae83157Smrg sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" 760444c061aSmrg rm -f "$tmpdepfile" 761444c061aSmrg ;; 762444c061aSmrg 7632ae83157Smrgmsvcmsys) 7642ae83157Smrg # This case exists only to let depend.m4 do its work. It works by 7652ae83157Smrg # looking at the text of this script. This case will never be run, 7662ae83157Smrg # since it is checked for above. 7672ae83157Smrg exit 1 7682ae83157Smrg ;; 7692ae83157Smrg 770444c061aSmrgnone) 771444c061aSmrg exec "$@" 772444c061aSmrg ;; 773444c061aSmrg 774444c061aSmrg*) 775444c061aSmrg echo "Unknown depmode $depmode" 1>&2 776444c061aSmrg exit 1 777444c061aSmrg ;; 778444c061aSmrgesac 779444c061aSmrg 780444c061aSmrgexit 0 781444c061aSmrg 782444c061aSmrg# Local Variables: 783444c061aSmrg# mode: shell-script 784444c061aSmrg# sh-indentation: 2 785444c061aSmrg# eval: (add-hook 'write-file-hooks 'time-stamp) 786444c061aSmrg# time-stamp-start: "scriptversion=" 787444c061aSmrg# time-stamp-format: "%:y-%02m-%02d.%02H" 7882ae83157Smrg# time-stamp-time-zone: "UTC" 7892ae83157Smrg# time-stamp-end: "; # UTC" 790444c061aSmrg# End: 791