1444c061aSmrg#! /bin/sh 2444c061aSmrg# depcomp - compile a program generating dependencies as side-effects 3444c061aSmrg 40568f49bSmrgscriptversion=2018-03-07.03; # UTC 5444c061aSmrg 6fdf6a26fSmrg# Copyright (C) 1999-2021 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 190568f49bSmrg# along with this program. If not, see <https://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" 555339a7c43Smrg echo >> "$depfile" # make sure the fragment doesn't end with a backslash 5569e7bcd65Smrg rm -f "$tmpdepfile" 5579e7bcd65Smrg ;; 5589e7bcd65Smrg 5599e7bcd65Smrgmsvc7msys) 5609e7bcd65Smrg # This case exists only to let depend.m4 do its work. It works by 5619e7bcd65Smrg # looking at the text of this script. This case will never be run, 5629e7bcd65Smrg # since it is checked for above. 5639e7bcd65Smrg exit 1 5649e7bcd65Smrg ;; 565444c061aSmrg 566444c061aSmrg#nosideeffect) 567444c061aSmrg # This comment above is used by automake to tell side-effect 568444c061aSmrg # dependency tracking mechanisms from slower ones. 569444c061aSmrg 570444c061aSmrgdashmstdout) 571444c061aSmrg # Important note: in order to support this mode, a compiler *must* 572444c061aSmrg # always write the preprocessed file to stdout, regardless of -o. 573444c061aSmrg "$@" || exit $? 574444c061aSmrg 575444c061aSmrg # Remove the call to Libtool. 576444c061aSmrg if test "$libtool" = yes; then 5772ae83157Smrg while test "X$1" != 'X--mode=compile'; do 578444c061aSmrg shift 579444c061aSmrg done 580444c061aSmrg shift 581444c061aSmrg fi 582444c061aSmrg 5839e7bcd65Smrg # Remove '-o $object'. 584444c061aSmrg IFS=" " 585444c061aSmrg for arg 586444c061aSmrg do 587444c061aSmrg case $arg in 588444c061aSmrg -o) 589444c061aSmrg shift 590444c061aSmrg ;; 591444c061aSmrg $object) 592444c061aSmrg shift 593444c061aSmrg ;; 594444c061aSmrg *) 595444c061aSmrg set fnord "$@" "$arg" 596444c061aSmrg shift # fnord 597444c061aSmrg shift # $arg 598444c061aSmrg ;; 599444c061aSmrg esac 600444c061aSmrg done 601444c061aSmrg 602444c061aSmrg test -z "$dashmflag" && dashmflag=-M 6039e7bcd65Smrg # Require at least two characters before searching for ':' 604444c061aSmrg # in the target name. This is to cope with DOS-style filenames: 6059e7bcd65Smrg # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. 606444c061aSmrg "$@" $dashmflag | 6079e7bcd65Smrg sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile" 608444c061aSmrg rm -f "$depfile" 609444c061aSmrg cat < "$tmpdepfile" > "$depfile" 6109e7bcd65Smrg # Some versions of the HPUX 10.20 sed can't process this sed invocation 6119e7bcd65Smrg # correctly. Breaking it into two sed invocations is a workaround. 6129e7bcd65Smrg tr ' ' "$nl" < "$tmpdepfile" \ 6139e7bcd65Smrg | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ 6149e7bcd65Smrg | sed -e 's/$/ :/' >> "$depfile" 615444c061aSmrg rm -f "$tmpdepfile" 616444c061aSmrg ;; 617444c061aSmrg 618444c061aSmrgdashXmstdout) 619444c061aSmrg # This case only exists to satisfy depend.m4. It is never actually 620444c061aSmrg # run, as this mode is specially recognized in the preamble. 621444c061aSmrg exit 1 622444c061aSmrg ;; 623444c061aSmrg 624444c061aSmrgmakedepend) 625444c061aSmrg "$@" || exit $? 626444c061aSmrg # Remove any Libtool call 627444c061aSmrg if test "$libtool" = yes; then 6282ae83157Smrg while test "X$1" != 'X--mode=compile'; do 629444c061aSmrg shift 630444c061aSmrg done 631444c061aSmrg shift 632444c061aSmrg fi 633444c061aSmrg # X makedepend 634444c061aSmrg shift 6352ae83157Smrg cleared=no eat=no 6362ae83157Smrg for arg 6372ae83157Smrg do 638444c061aSmrg case $cleared in 639444c061aSmrg no) 640444c061aSmrg set ""; shift 641444c061aSmrg cleared=yes ;; 642444c061aSmrg esac 6432ae83157Smrg if test $eat = yes; then 6442ae83157Smrg eat=no 6452ae83157Smrg continue 6462ae83157Smrg fi 647444c061aSmrg case "$arg" in 648444c061aSmrg -D*|-I*) 649444c061aSmrg set fnord "$@" "$arg"; shift ;; 650444c061aSmrg # Strip any option that makedepend may not understand. Remove 651444c061aSmrg # the object too, otherwise makedepend will parse it as a source file. 6522ae83157Smrg -arch) 6532ae83157Smrg eat=yes ;; 654444c061aSmrg -*|$object) 655444c061aSmrg ;; 656444c061aSmrg *) 657444c061aSmrg set fnord "$@" "$arg"; shift ;; 658444c061aSmrg esac 659444c061aSmrg done 6602ae83157Smrg obj_suffix=`echo "$object" | sed 's/^.*\././'` 661444c061aSmrg touch "$tmpdepfile" 662444c061aSmrg ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" 663444c061aSmrg rm -f "$depfile" 6649e7bcd65Smrg # makedepend may prepend the VPATH from the source file name to the object. 6659e7bcd65Smrg # No need to regex-escape $object, excess matching of '.' is harmless. 6669e7bcd65Smrg sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" 6679e7bcd65Smrg # Some versions of the HPUX 10.20 sed can't process the last invocation 6689e7bcd65Smrg # correctly. Breaking it into two sed invocations is a workaround. 6699e7bcd65Smrg sed '1,2d' "$tmpdepfile" \ 6709e7bcd65Smrg | tr ' ' "$nl" \ 6719e7bcd65Smrg | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ 6729e7bcd65Smrg | sed -e 's/$/ :/' >> "$depfile" 673444c061aSmrg rm -f "$tmpdepfile" "$tmpdepfile".bak 674444c061aSmrg ;; 675444c061aSmrg 676444c061aSmrgcpp) 677444c061aSmrg # Important note: in order to support this mode, a compiler *must* 678444c061aSmrg # always write the preprocessed file to stdout. 679444c061aSmrg "$@" || exit $? 680444c061aSmrg 681444c061aSmrg # Remove the call to Libtool. 682444c061aSmrg if test "$libtool" = yes; then 6832ae83157Smrg while test "X$1" != 'X--mode=compile'; do 684444c061aSmrg shift 685444c061aSmrg done 686444c061aSmrg shift 687444c061aSmrg fi 688444c061aSmrg 6899e7bcd65Smrg # Remove '-o $object'. 690444c061aSmrg IFS=" " 691444c061aSmrg for arg 692444c061aSmrg do 693444c061aSmrg case $arg in 694444c061aSmrg -o) 695444c061aSmrg shift 696444c061aSmrg ;; 697444c061aSmrg $object) 698444c061aSmrg shift 699444c061aSmrg ;; 700444c061aSmrg *) 701444c061aSmrg set fnord "$@" "$arg" 702444c061aSmrg shift # fnord 703444c061aSmrg shift # $arg 704444c061aSmrg ;; 705444c061aSmrg esac 706444c061aSmrg done 707444c061aSmrg 7089e7bcd65Smrg "$@" -E \ 7099e7bcd65Smrg | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ 7109e7bcd65Smrg -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ 7119e7bcd65Smrg | sed '$ s: \\$::' > "$tmpdepfile" 712444c061aSmrg rm -f "$depfile" 713444c061aSmrg echo "$object : \\" > "$depfile" 714444c061aSmrg cat < "$tmpdepfile" >> "$depfile" 715444c061aSmrg sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" 716444c061aSmrg rm -f "$tmpdepfile" 717444c061aSmrg ;; 718444c061aSmrg 719444c061aSmrgmsvisualcpp) 720444c061aSmrg # Important note: in order to support this mode, a compiler *must* 7212ae83157Smrg # always write the preprocessed file to stdout. 722444c061aSmrg "$@" || exit $? 7232ae83157Smrg 7242ae83157Smrg # Remove the call to Libtool. 7252ae83157Smrg if test "$libtool" = yes; then 7262ae83157Smrg while test "X$1" != 'X--mode=compile'; do 7272ae83157Smrg shift 7282ae83157Smrg done 7292ae83157Smrg shift 7302ae83157Smrg fi 7312ae83157Smrg 732444c061aSmrg IFS=" " 733444c061aSmrg for arg 734444c061aSmrg do 735444c061aSmrg case "$arg" in 7362ae83157Smrg -o) 7372ae83157Smrg shift 7382ae83157Smrg ;; 7392ae83157Smrg $object) 7402ae83157Smrg shift 7412ae83157Smrg ;; 742444c061aSmrg "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") 7439e7bcd65Smrg set fnord "$@" 7449e7bcd65Smrg shift 7459e7bcd65Smrg shift 7469e7bcd65Smrg ;; 747444c061aSmrg *) 7489e7bcd65Smrg set fnord "$@" "$arg" 7499e7bcd65Smrg shift 7509e7bcd65Smrg shift 7519e7bcd65Smrg ;; 752444c061aSmrg esac 753444c061aSmrg done 7542ae83157Smrg "$@" -E 2>/dev/null | 7552ae83157Smrg sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" 756444c061aSmrg rm -f "$depfile" 757444c061aSmrg echo "$object : \\" > "$depfile" 7589e7bcd65Smrg sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" 7599e7bcd65Smrg echo "$tab" >> "$depfile" 7602ae83157Smrg sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" 761444c061aSmrg rm -f "$tmpdepfile" 762444c061aSmrg ;; 763444c061aSmrg 7642ae83157Smrgmsvcmsys) 7652ae83157Smrg # This case exists only to let depend.m4 do its work. It works by 7662ae83157Smrg # looking at the text of this script. This case will never be run, 7672ae83157Smrg # since it is checked for above. 7682ae83157Smrg exit 1 7692ae83157Smrg ;; 7702ae83157Smrg 771444c061aSmrgnone) 772444c061aSmrg exec "$@" 773444c061aSmrg ;; 774444c061aSmrg 775444c061aSmrg*) 776444c061aSmrg echo "Unknown depmode $depmode" 1>&2 777444c061aSmrg exit 1 778444c061aSmrg ;; 779444c061aSmrgesac 780444c061aSmrg 781444c061aSmrgexit 0 782444c061aSmrg 783444c061aSmrg# Local Variables: 784444c061aSmrg# mode: shell-script 785444c061aSmrg# sh-indentation: 2 7860568f49bSmrg# eval: (add-hook 'before-save-hook 'time-stamp) 787444c061aSmrg# time-stamp-start: "scriptversion=" 788444c061aSmrg# time-stamp-format: "%:y-%02m-%02d.%02H" 7890568f49bSmrg# time-stamp-time-zone: "UTC0" 7902ae83157Smrg# time-stamp-end: "; # UTC" 791444c061aSmrg# End: 792