13da7aff1Smrg#! /bin/sh 23da7aff1Smrg# depcomp - compile a program generating dependencies as side-effects 3e531b1a7Smrg 41e42c052Smrgscriptversion=2024-06-19.01; # UTC 5e531b1a7Smrg 61e42c052Smrg# Copyright (C) 1999-2024 Free Software Foundation, Inc. 73da7aff1Smrg 83da7aff1Smrg# This program is free software; you can redistribute it and/or modify 93da7aff1Smrg# it under the terms of the GNU General Public License as published by 103da7aff1Smrg# the Free Software Foundation; either version 2, or (at your option) 113da7aff1Smrg# any later version. 123da7aff1Smrg 133da7aff1Smrg# This program is distributed in the hope that it will be useful, 143da7aff1Smrg# but WITHOUT ANY WARRANTY; without even the implied warranty of 153da7aff1Smrg# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 163da7aff1Smrg# GNU General Public License for more details. 173da7aff1Smrg 183da7aff1Smrg# You should have received a copy of the GNU General Public License 193a99fc18Smrg# along with this program. If not, see <https://www.gnu.org/licenses/>. 203da7aff1Smrg 213da7aff1Smrg# As a special exception to the GNU General Public License, if you 223da7aff1Smrg# distribute this file as part of a program that contains a 233da7aff1Smrg# configuration script generated by Autoconf, you may include it under 243da7aff1Smrg# the same distribution terms that you use for the rest of that program. 253da7aff1Smrg 263da7aff1Smrg# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>. 273da7aff1Smrg 28e531b1a7Smrgcase $1 in 29e531b1a7Smrg '') 303e999d35Smrg echo "$0: No command. Try '$0 --help' for more information." 1>&2 313e999d35Smrg exit 1; 323e999d35Smrg ;; 33e531b1a7Smrg -h | --h*) 34e531b1a7Smrg cat <<\EOF 35e531b1a7SmrgUsage: depcomp [--help] [--version] PROGRAM [ARGS] 36e531b1a7Smrg 37e531b1a7SmrgRun PROGRAMS ARGS to compile a file, generating dependencies 38e531b1a7Smrgas side-effects. 39e531b1a7Smrg 40e531b1a7SmrgEnvironment variables: 41e531b1a7Smrg depmode Dependency tracking mode. 423e999d35Smrg source Source file read by 'PROGRAMS ARGS'. 433e999d35Smrg object Object file output by 'PROGRAMS ARGS'. 44e531b1a7Smrg DEPDIR directory where to store dependencies. 45e531b1a7Smrg depfile Dependency file to output. 463e999d35Smrg tmpdepfile Temporary file to use when outputting dependencies. 47e531b1a7Smrg libtool Whether libtool is used (yes/no). 48e531b1a7Smrg 49e531b1a7SmrgReport bugs to <bug-automake@gnu.org>. 501e42c052SmrgGNU Automake home page: <https://www.gnu.org/software/automake/>. 511e42c052SmrgGeneral help using GNU software: <https://www.gnu.org/gethelp/>. 52e531b1a7SmrgEOF 53e531b1a7Smrg exit $? 54e531b1a7Smrg ;; 55e531b1a7Smrg -v | --v*) 561e42c052Smrg echo "depcomp (GNU Automake) $scriptversion" 57e531b1a7Smrg exit $? 58e531b1a7Smrg ;; 59e531b1a7Smrgesac 60e531b1a7Smrg 613e999d35Smrg# Get the directory component of the given path, and save it in the 623e999d35Smrg# global variables '$dir'. Note that this directory component will 633e999d35Smrg# be either empty or ending with a '/' character. This is deliberate. 643e999d35Smrgset_dir_from () 653e999d35Smrg{ 663e999d35Smrg case $1 in 673e999d35Smrg */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;; 683e999d35Smrg *) dir=;; 693e999d35Smrg esac 703e999d35Smrg} 713e999d35Smrg 723e999d35Smrg# Get the suffix-stripped basename of the given path, and save it the 733e999d35Smrg# global variable '$base'. 743e999d35Smrgset_base_from () 753e999d35Smrg{ 763e999d35Smrg base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'` 773e999d35Smrg} 783e999d35Smrg 793e999d35Smrg# If no dependency file was actually created by the compiler invocation, 803e999d35Smrg# we still have to create a dummy depfile, to avoid errors with the 813e999d35Smrg# Makefile "include basename.Plo" scheme. 823e999d35Smrgmake_dummy_depfile () 833e999d35Smrg{ 843e999d35Smrg echo "#dummy" > "$depfile" 853e999d35Smrg} 863e999d35Smrg 873e999d35Smrg# Factor out some common post-processing of the generated depfile. 883e999d35Smrg# Requires the auxiliary global variable '$tmpdepfile' to be set. 893e999d35Smrgaix_post_process_depfile () 903e999d35Smrg{ 913e999d35Smrg # If the compiler actually managed to produce a dependency file, 923e999d35Smrg # post-process it. 933e999d35Smrg if test -f "$tmpdepfile"; then 943e999d35Smrg # Each line is of the form 'foo.o: dependency.h'. 953e999d35Smrg # Do two passes, one to just change these to 963e999d35Smrg # $object: dependency.h 973e999d35Smrg # and one to simply output 983e999d35Smrg # dependency.h: 993e999d35Smrg # which is needed to avoid the deleted-header problem. 1003e999d35Smrg { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile" 1013e999d35Smrg sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile" 1023e999d35Smrg } > "$depfile" 1033e999d35Smrg rm -f "$tmpdepfile" 1043e999d35Smrg else 1053e999d35Smrg make_dummy_depfile 1063e999d35Smrg fi 1073e999d35Smrg} 1083e999d35Smrg 1093e999d35Smrg# A tabulation character. 1103e999d35Smrgtab=' ' 1113e999d35Smrg# A newline character. 1123e999d35Smrgnl=' 1133e999d35Smrg' 1143e999d35Smrg# Character ranges might be problematic outside the C locale. 1153e999d35Smrg# These definitions help. 1163e999d35Smrgupper=ABCDEFGHIJKLMNOPQRSTUVWXYZ 1173e999d35Smrglower=abcdefghijklmnopqrstuvwxyz 1183e999d35Smrgalpha=${upper}${lower} 1193e999d35Smrg 1203da7aff1Smrgif test -z "$depmode" || test -z "$source" || test -z "$object"; then 1213da7aff1Smrg echo "depcomp: Variables source, object and depmode must be set" 1>&2 1223da7aff1Smrg exit 1 1233da7aff1Smrgfi 1243da7aff1Smrg 125e531b1a7Smrg# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. 126e531b1a7Smrgdepfile=${depfile-`echo "$object" | 127e531b1a7Smrg sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} 1283da7aff1Smrgtmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} 1293da7aff1Smrg 1303da7aff1Smrgrm -f "$tmpdepfile" 1313da7aff1Smrg 1321e42c052Smrg# Avoid interference from the environment. 1333e999d35Smrggccflag= dashmflag= 1343e999d35Smrg 1353da7aff1Smrg# Some modes work just like other modes, but use different flags. We 1363da7aff1Smrg# parameterize here, but still list the modes in the big case below, 1373da7aff1Smrg# to make depend.m4 easier to write. Note that we *cannot* use a case 1383da7aff1Smrg# here, because this file can only contain one case statement. 1393da7aff1Smrgif test "$depmode" = hp; then 1403da7aff1Smrg # HP compiler uses -M and no extra arg. 1413da7aff1Smrg gccflag=-M 1423da7aff1Smrg depmode=gcc 1433da7aff1Smrgfi 1443da7aff1Smrg 1453da7aff1Smrgif test "$depmode" = dashXmstdout; then 1463e999d35Smrg # This is just like dashmstdout with a different argument. 1473e999d35Smrg dashmflag=-xM 1483e999d35Smrg depmode=dashmstdout 1493da7aff1Smrgfi 1503da7aff1Smrg 151e531b1a7Smrgcygpath_u="cygpath -u -f -" 152e531b1a7Smrgif test "$depmode" = msvcmsys; then 1533e999d35Smrg # This is just like msvisualcpp but w/o cygpath translation. 1543e999d35Smrg # Just convert the backslash-escaped backslashes to single forward 1553e999d35Smrg # slashes to satisfy depend.m4 1563e999d35Smrg cygpath_u='sed s,\\\\,/,g' 1573e999d35Smrg depmode=msvisualcpp 1583e999d35Smrgfi 1593e999d35Smrg 1603e999d35Smrgif test "$depmode" = msvc7msys; then 1613e999d35Smrg # This is just like msvc7 but w/o cygpath translation. 1623e999d35Smrg # Just convert the backslash-escaped backslashes to single forward 1633e999d35Smrg # slashes to satisfy depend.m4 1643e999d35Smrg cygpath_u='sed s,\\\\,/,g' 1653e999d35Smrg depmode=msvc7 1663e999d35Smrgfi 1673e999d35Smrg 1683e999d35Smrgif test "$depmode" = xlc; then 1693e999d35Smrg # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information. 1703e999d35Smrg gccflag=-qmakedep=gcc,-MF 1713e999d35Smrg depmode=gcc 172e531b1a7Smrgfi 173e531b1a7Smrg 1743da7aff1Smrgcase "$depmode" in 1753da7aff1Smrggcc3) 1763da7aff1Smrg## gcc 3 implements dependency tracking that does exactly what 1773da7aff1Smrg## we want. Yay! Note: for some reason libtool 1.4 doesn't like 1783da7aff1Smrg## it if -MD -MP comes after the -MF stuff. Hmm. 179e531b1a7Smrg## Unfortunately, FreeBSD c89 acceptance of flags depends upon 180e531b1a7Smrg## the command line argument order; so add the flags where they 181e531b1a7Smrg## appear in depend2.am. Note that the slowdown incurred here 182e531b1a7Smrg## affects only configure: in makefiles, %FASTDEP% shortcuts this. 183e531b1a7Smrg for arg 184e531b1a7Smrg do 185e531b1a7Smrg case $arg in 186e531b1a7Smrg -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; 187e531b1a7Smrg *) set fnord "$@" "$arg" ;; 188e531b1a7Smrg esac 189e531b1a7Smrg shift # fnord 190e531b1a7Smrg shift # $arg 191e531b1a7Smrg done 192e531b1a7Smrg "$@" 1933da7aff1Smrg stat=$? 1943e999d35Smrg if test $stat -ne 0; then 1953da7aff1Smrg rm -f "$tmpdepfile" 1963da7aff1Smrg exit $stat 1973da7aff1Smrg fi 1983da7aff1Smrg mv "$tmpdepfile" "$depfile" 1993da7aff1Smrg ;; 2003da7aff1Smrg 2013da7aff1Smrggcc) 2021e42c052Smrg## Note that this doesn't just cater to obsolete pre-3.x GCC compilers. 2031e42c052Smrg## but also to in-use compilers like IBM xlc/xlC and the HP C compiler. 2043e999d35Smrg## (see the conditional assignment to $gccflag above). 2053da7aff1Smrg## There are various ways to get dependency output from gcc. Here's 2063da7aff1Smrg## why we pick this rather obscure method: 2073da7aff1Smrg## - Don't want to use -MD because we'd like the dependencies to end 2083da7aff1Smrg## up in a subdir. Having to rename by hand is ugly. 2093da7aff1Smrg## (We might end up doing this anyway to support other compilers.) 2103da7aff1Smrg## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like 2113e999d35Smrg## -MM, not -M (despite what the docs say). Also, it might not be 2123e999d35Smrg## supported by the other compilers which use the 'gcc' depmode. 2133da7aff1Smrg## - Using -M directly means running the compiler twice (even worse 2143da7aff1Smrg## than renaming). 2153da7aff1Smrg if test -z "$gccflag"; then 2163da7aff1Smrg gccflag=-MD, 2173da7aff1Smrg fi 2183da7aff1Smrg "$@" -Wp,"$gccflag$tmpdepfile" 2193da7aff1Smrg stat=$? 2203e999d35Smrg if test $stat -ne 0; then 2213da7aff1Smrg rm -f "$tmpdepfile" 2223da7aff1Smrg exit $stat 2233da7aff1Smrg fi 2243da7aff1Smrg rm -f "$depfile" 2253da7aff1Smrg echo "$object : \\" > "$depfile" 2263e999d35Smrg # The second -e expression handles DOS-style file names with drive 2273e999d35Smrg # letters. 2283da7aff1Smrg sed -e 's/^[^:]*: / /' \ 2293da7aff1Smrg -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" 2303e999d35Smrg## This next piece of magic avoids the "deleted header file" problem. 2313da7aff1Smrg## The problem is that when a header file which appears in a .P file 2323da7aff1Smrg## is deleted, the dependency causes make to die (because there is 2333da7aff1Smrg## typically no way to rebuild the header). We avoid this by adding 2343da7aff1Smrg## dummy dependencies for each header file. Too bad gcc doesn't do 2353da7aff1Smrg## this for us directly. 2363e999d35Smrg## Some versions of gcc put a space before the ':'. On the theory 2373da7aff1Smrg## that the space means something, we add a space to the output as 2383e999d35Smrg## well. hp depmode also adds that space, but also prefixes the VPATH 2393e999d35Smrg## to the object. Take care to not repeat it in the output. 2403da7aff1Smrg## Some versions of the HPUX 10.20 sed can't process this invocation 2413da7aff1Smrg## correctly. Breaking it into two sed invocations is a workaround. 2423e999d35Smrg tr ' ' "$nl" < "$tmpdepfile" \ 2433e999d35Smrg | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ 2443e999d35Smrg | sed -e 's/$/ :/' >> "$depfile" 2453da7aff1Smrg rm -f "$tmpdepfile" 2463da7aff1Smrg ;; 2473da7aff1Smrg 2483da7aff1Smrghp) 2493da7aff1Smrg # This case exists only to let depend.m4 do its work. It works by 2503da7aff1Smrg # looking at the text of this script. This case will never be run, 2513da7aff1Smrg # since it is checked for above. 2523da7aff1Smrg exit 1 2533da7aff1Smrg ;; 2543da7aff1Smrg 2553da7aff1Smrgsgi) 2563da7aff1Smrg if test "$libtool" = yes; then 2573da7aff1Smrg "$@" "-Wp,-MDupdate,$tmpdepfile" 2583da7aff1Smrg else 2593da7aff1Smrg "$@" -MDupdate "$tmpdepfile" 2603da7aff1Smrg fi 2613da7aff1Smrg stat=$? 2623e999d35Smrg if test $stat -ne 0; then 2633da7aff1Smrg rm -f "$tmpdepfile" 2643da7aff1Smrg exit $stat 2653da7aff1Smrg fi 2663da7aff1Smrg rm -f "$depfile" 2673da7aff1Smrg 2683da7aff1Smrg if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files 2693da7aff1Smrg echo "$object : \\" > "$depfile" 2703da7aff1Smrg # Clip off the initial element (the dependent). Don't try to be 2713da7aff1Smrg # clever and replace this with sed code, as IRIX sed won't handle 2723da7aff1Smrg # lines with more than a fixed number of characters (4096 in 2733da7aff1Smrg # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; 2743e999d35Smrg # the IRIX cc adds comments like '#:fec' to the end of the 2753da7aff1Smrg # dependency line. 2763e999d35Smrg tr ' ' "$nl" < "$tmpdepfile" \ 2773e999d35Smrg | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \ 2783e999d35Smrg | tr "$nl" ' ' >> "$depfile" 279e531b1a7Smrg echo >> "$depfile" 2803da7aff1Smrg # The second pass generates a dummy entry for each header file. 2813e999d35Smrg tr ' ' "$nl" < "$tmpdepfile" \ 2823e999d35Smrg | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ 2833e999d35Smrg >> "$depfile" 2843da7aff1Smrg else 2853e999d35Smrg make_dummy_depfile 2863da7aff1Smrg fi 2873da7aff1Smrg rm -f "$tmpdepfile" 2883da7aff1Smrg ;; 2893da7aff1Smrg 2903e999d35Smrgxlc) 2913e999d35Smrg # This case exists only to let depend.m4 do its work. It works by 2923e999d35Smrg # looking at the text of this script. This case will never be run, 2933e999d35Smrg # since it is checked for above. 2943e999d35Smrg exit 1 2953e999d35Smrg ;; 2963e999d35Smrg 2973da7aff1Smrgaix) 2983da7aff1Smrg # The C for AIX Compiler uses -M and outputs the dependencies 2993da7aff1Smrg # in a .u file. In older versions, this file always lives in the 3003e999d35Smrg # current directory. Also, the AIX compiler puts '$object:' at the 3013da7aff1Smrg # start of each line; $object doesn't have directory information. 3023da7aff1Smrg # Version 6 uses the directory in both cases. 3033e999d35Smrg set_dir_from "$object" 3043e999d35Smrg set_base_from "$object" 3053da7aff1Smrg if test "$libtool" = yes; then 306e531b1a7Smrg tmpdepfile1=$dir$base.u 307e531b1a7Smrg tmpdepfile2=$base.u 308e531b1a7Smrg tmpdepfile3=$dir.libs/$base.u 3093da7aff1Smrg "$@" -Wc,-M 3103da7aff1Smrg else 311e531b1a7Smrg tmpdepfile1=$dir$base.u 312e531b1a7Smrg tmpdepfile2=$dir$base.u 313e531b1a7Smrg tmpdepfile3=$dir$base.u 3143da7aff1Smrg "$@" -M 3153da7aff1Smrg fi 3163da7aff1Smrg stat=$? 3173e999d35Smrg if test $stat -ne 0; then 318e531b1a7Smrg rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 3193da7aff1Smrg exit $stat 3203da7aff1Smrg fi 3213da7aff1Smrg 322e531b1a7Smrg for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 323e531b1a7Smrg do 324e531b1a7Smrg test -f "$tmpdepfile" && break 325e531b1a7Smrg done 3263e999d35Smrg aix_post_process_depfile 3273e999d35Smrg ;; 3283e999d35Smrg 3293e999d35Smrgtcc) 3303e999d35Smrg # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26 3313e999d35Smrg # FIXME: That version still under development at the moment of writing. 3323e999d35Smrg # Make that this statement remains true also for stable, released 3333e999d35Smrg # versions. 3343e999d35Smrg # It will wrap lines (doesn't matter whether long or short) with a 3353e999d35Smrg # trailing '\', as in: 3363e999d35Smrg # 3373e999d35Smrg # foo.o : \ 3383e999d35Smrg # foo.c \ 3393e999d35Smrg # foo.h \ 3403e999d35Smrg # 3413e999d35Smrg # It will put a trailing '\' even on the last line, and will use leading 3423e999d35Smrg # spaces rather than leading tabs (at least since its commit 0394caf7 3433e999d35Smrg # "Emit spaces for -MD"). 3443e999d35Smrg "$@" -MD -MF "$tmpdepfile" 3453e999d35Smrg stat=$? 3463e999d35Smrg if test $stat -ne 0; then 3473e999d35Smrg rm -f "$tmpdepfile" 3483e999d35Smrg exit $stat 3493da7aff1Smrg fi 3503e999d35Smrg rm -f "$depfile" 3513e999d35Smrg # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'. 3523e999d35Smrg # We have to change lines of the first kind to '$object: \'. 3533e999d35Smrg sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile" 3543e999d35Smrg # And for each line of the second kind, we have to emit a 'dep.h:' 3553e999d35Smrg # dummy dependency, to avoid the deleted-header problem. 3563e999d35Smrg sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile" 3573da7aff1Smrg rm -f "$tmpdepfile" 3583da7aff1Smrg ;; 3593da7aff1Smrg 3603e999d35Smrg## The order of this option in the case statement is important, since the 3613e999d35Smrg## shell code in configure will try each of these formats in the order 3623e999d35Smrg## listed in this file. A plain '-MD' option would be understood by many 3633e999d35Smrg## compilers, so we must ensure this comes after the gcc and icc options. 3643e999d35Smrgpgcc) 3653e999d35Smrg # Portland's C compiler understands '-MD'. 3663e999d35Smrg # Will always output deps to 'file.d' where file is the root name of the 3673e999d35Smrg # source file under compilation, even if file resides in a subdirectory. 3683e999d35Smrg # The object file name does not affect the name of the '.d' file. 3693e999d35Smrg # pgcc 10.2 will output 3703da7aff1Smrg # foo.o: sub/foo.c sub/foo.h 3713e999d35Smrg # and will wrap long lines using '\' : 3723da7aff1Smrg # foo.o: sub/foo.c ... \ 3733da7aff1Smrg # sub/foo.h ... \ 3743da7aff1Smrg # ... 3753e999d35Smrg set_dir_from "$object" 3763e999d35Smrg # Use the source, not the object, to determine the base name, since 3773e999d35Smrg # that's sadly what pgcc will do too. 3783e999d35Smrg set_base_from "$source" 3793e999d35Smrg tmpdepfile=$base.d 3803e999d35Smrg 3813e999d35Smrg # For projects that build the same source file twice into different object 3823e999d35Smrg # files, the pgcc approach of using the *source* file root name can cause 3833e999d35Smrg # problems in parallel builds. Use a locking strategy to avoid stomping on 3843e999d35Smrg # the same $tmpdepfile. 3853e999d35Smrg lockdir=$base.d-lock 3863e999d35Smrg trap " 3873e999d35Smrg echo '$0: caught signal, cleaning up...' >&2 3883e999d35Smrg rmdir '$lockdir' 3893e999d35Smrg exit 1 3903e999d35Smrg " 1 2 13 15 3913e999d35Smrg numtries=100 3923e999d35Smrg i=$numtries 3933e999d35Smrg while test $i -gt 0; do 3943e999d35Smrg # mkdir is a portable test-and-set. 3953e999d35Smrg if mkdir "$lockdir" 2>/dev/null; then 3963e999d35Smrg # This process acquired the lock. 3973e999d35Smrg "$@" -MD 3983e999d35Smrg stat=$? 3993e999d35Smrg # Release the lock. 4003e999d35Smrg rmdir "$lockdir" 4013e999d35Smrg break 4023e999d35Smrg else 4033e999d35Smrg # If the lock is being held by a different process, wait 4043e999d35Smrg # until the winning process is done or we timeout. 4053e999d35Smrg while test -d "$lockdir" && test $i -gt 0; do 4063e999d35Smrg sleep 1 4073e999d35Smrg i=`expr $i - 1` 4083e999d35Smrg done 4093e999d35Smrg fi 4103e999d35Smrg i=`expr $i - 1` 4113e999d35Smrg done 4123e999d35Smrg trap - 1 2 13 15 4133e999d35Smrg if test $i -le 0; then 4143e999d35Smrg echo "$0: failed to acquire lock after $numtries attempts" >&2 4153e999d35Smrg echo "$0: check lockdir '$lockdir'" >&2 4163e999d35Smrg exit 1 4173e999d35Smrg fi 4183da7aff1Smrg 4193e999d35Smrg if test $stat -ne 0; then 4203da7aff1Smrg rm -f "$tmpdepfile" 4213da7aff1Smrg exit $stat 4223da7aff1Smrg fi 4233da7aff1Smrg rm -f "$depfile" 4243da7aff1Smrg # Each line is of the form `foo.o: dependent.h', 4253da7aff1Smrg # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. 4263da7aff1Smrg # Do two passes, one to just change these to 4273da7aff1Smrg # `$object: dependent.h' and one to simply `dependent.h:'. 4283da7aff1Smrg sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" 4293da7aff1Smrg # Some versions of the HPUX 10.20 sed can't process this invocation 4303da7aff1Smrg # correctly. Breaking it into two sed invocations is a workaround. 4313e999d35Smrg sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \ 4323e999d35Smrg | sed -e 's/$/ :/' >> "$depfile" 4333da7aff1Smrg rm -f "$tmpdepfile" 4343da7aff1Smrg ;; 4353da7aff1Smrg 436e531b1a7Smrghp2) 437e531b1a7Smrg # The "hp" stanza above does not work with aCC (C++) and HP's ia64 438e531b1a7Smrg # compilers, which have integrated preprocessors. The correct option 439e531b1a7Smrg # to use with these is +Maked; it writes dependencies to a file named 440e531b1a7Smrg # 'foo.d', which lands next to the object file, wherever that 441e531b1a7Smrg # happens to be. 442e531b1a7Smrg # Much of this is similar to the tru64 case; see comments there. 4433e999d35Smrg set_dir_from "$object" 4443e999d35Smrg set_base_from "$object" 445e531b1a7Smrg if test "$libtool" = yes; then 446e531b1a7Smrg tmpdepfile1=$dir$base.d 447e531b1a7Smrg tmpdepfile2=$dir.libs/$base.d 448e531b1a7Smrg "$@" -Wc,+Maked 449e531b1a7Smrg else 450e531b1a7Smrg tmpdepfile1=$dir$base.d 451e531b1a7Smrg tmpdepfile2=$dir$base.d 452e531b1a7Smrg "$@" +Maked 453e531b1a7Smrg fi 454e531b1a7Smrg stat=$? 4553e999d35Smrg if test $stat -ne 0; then 456e531b1a7Smrg rm -f "$tmpdepfile1" "$tmpdepfile2" 457e531b1a7Smrg exit $stat 458e531b1a7Smrg fi 459e531b1a7Smrg 460e531b1a7Smrg for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" 461e531b1a7Smrg do 462e531b1a7Smrg test -f "$tmpdepfile" && break 463e531b1a7Smrg done 464e531b1a7Smrg if test -f "$tmpdepfile"; then 4653e999d35Smrg sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile" 4663e999d35Smrg # Add 'dependent.h:' lines. 467e531b1a7Smrg sed -ne '2,${ 4683e999d35Smrg s/^ *// 4693e999d35Smrg s/ \\*$// 4703e999d35Smrg s/$/:/ 4713e999d35Smrg p 4723e999d35Smrg }' "$tmpdepfile" >> "$depfile" 473e531b1a7Smrg else 4743e999d35Smrg make_dummy_depfile 475e531b1a7Smrg fi 476e531b1a7Smrg rm -f "$tmpdepfile" "$tmpdepfile2" 477e531b1a7Smrg ;; 478e531b1a7Smrg 4793da7aff1Smrgtru64) 4803e999d35Smrg # The Tru64 compiler uses -MD to generate dependencies as a side 4813e999d35Smrg # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. 4823e999d35Smrg # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put 4833e999d35Smrg # dependencies in 'foo.d' instead, so we check for that too. 4843e999d35Smrg # Subdirectories are respected. 4853e999d35Smrg set_dir_from "$object" 4863e999d35Smrg set_base_from "$object" 4873e999d35Smrg 4883e999d35Smrg if test "$libtool" = yes; then 4893e999d35Smrg # Libtool generates 2 separate objects for the 2 libraries. These 4903e999d35Smrg # two compilations output dependencies in $dir.libs/$base.o.d and 4913e999d35Smrg # in $dir$base.o.d. We have to check for both files, because 4923e999d35Smrg # one of the two compilations can be disabled. We should prefer 4933e999d35Smrg # $dir$base.o.d over $dir.libs/$base.o.d because the latter is 4943e999d35Smrg # automatically cleaned when .libs/ is deleted, while ignoring 4953e999d35Smrg # the former would cause a distcleancheck panic. 4963e999d35Smrg tmpdepfile1=$dir$base.o.d # libtool 1.5 4973e999d35Smrg tmpdepfile2=$dir.libs/$base.o.d # Likewise. 4983e999d35Smrg tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504 4993e999d35Smrg "$@" -Wc,-MD 5003e999d35Smrg else 5013e999d35Smrg tmpdepfile1=$dir$base.d 5023e999d35Smrg tmpdepfile2=$dir$base.d 5033e999d35Smrg tmpdepfile3=$dir$base.d 5043e999d35Smrg "$@" -MD 5053e999d35Smrg fi 5063e999d35Smrg 5073e999d35Smrg stat=$? 5083e999d35Smrg if test $stat -ne 0; then 5093e999d35Smrg rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 5103e999d35Smrg exit $stat 5113e999d35Smrg fi 5123e999d35Smrg 5133e999d35Smrg for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 5143e999d35Smrg do 5153e999d35Smrg test -f "$tmpdepfile" && break 5163e999d35Smrg done 5173e999d35Smrg # Same post-processing that is required for AIX mode. 5183e999d35Smrg aix_post_process_depfile 5193e999d35Smrg ;; 5203e999d35Smrg 5213e999d35Smrgmsvc7) 5223e999d35Smrg if test "$libtool" = yes; then 5233e999d35Smrg showIncludes=-Wc,-showIncludes 5243e999d35Smrg else 5253e999d35Smrg showIncludes=-showIncludes 5263e999d35Smrg fi 5273e999d35Smrg "$@" $showIncludes > "$tmpdepfile" 5283e999d35Smrg stat=$? 5293e999d35Smrg grep -v '^Note: including file: ' "$tmpdepfile" 5303e999d35Smrg if test $stat -ne 0; then 5313e999d35Smrg rm -f "$tmpdepfile" 5323e999d35Smrg exit $stat 5333e999d35Smrg fi 5343e999d35Smrg rm -f "$depfile" 5353e999d35Smrg echo "$object : \\" > "$depfile" 5363e999d35Smrg # The first sed program below extracts the file names and escapes 5373e999d35Smrg # backslashes for cygpath. The second sed program outputs the file 5383e999d35Smrg # name when reading, but also accumulates all include files in the 5393e999d35Smrg # hold buffer in order to output them again at the end. This only 5403e999d35Smrg # works with sed implementations that can handle large buffers. 5413e999d35Smrg sed < "$tmpdepfile" -n ' 5423e999d35Smrg/^Note: including file: *\(.*\)/ { 5433e999d35Smrg s//\1/ 5443e999d35Smrg s/\\/\\\\/g 5453e999d35Smrg p 5463e999d35Smrg}' | $cygpath_u | sort -u | sed -n ' 5473e999d35Smrgs/ /\\ /g 5483e999d35Smrgs/\(.*\)/'"$tab"'\1 \\/p 5493e999d35Smrgs/.\(.*\) \\/\1:/ 5503e999d35SmrgH 5513e999d35Smrg$ { 5523e999d35Smrg s/.*/'"$tab"'/ 5533e999d35Smrg G 5543e999d35Smrg p 5553e999d35Smrg}' >> "$depfile" 5563e999d35Smrg echo >> "$depfile" # make sure the fragment doesn't end with a backslash 5573e999d35Smrg rm -f "$tmpdepfile" 5583e999d35Smrg ;; 5593e999d35Smrg 5603e999d35Smrgmsvc7msys) 5613e999d35Smrg # This case exists only to let depend.m4 do its work. It works by 5623e999d35Smrg # looking at the text of this script. This case will never be run, 5633e999d35Smrg # since it is checked for above. 5643e999d35Smrg exit 1 5653e999d35Smrg ;; 5663da7aff1Smrg 5673da7aff1Smrg#nosideeffect) 5683da7aff1Smrg # This comment above is used by automake to tell side-effect 5693da7aff1Smrg # dependency tracking mechanisms from slower ones. 5703da7aff1Smrg 5713da7aff1Smrgdashmstdout) 5723da7aff1Smrg # Important note: in order to support this mode, a compiler *must* 5733da7aff1Smrg # always write the preprocessed file to stdout, regardless of -o. 5743da7aff1Smrg "$@" || exit $? 5753da7aff1Smrg 5763da7aff1Smrg # Remove the call to Libtool. 5773da7aff1Smrg if test "$libtool" = yes; then 578e531b1a7Smrg while test "X$1" != 'X--mode=compile'; do 5793da7aff1Smrg shift 5803da7aff1Smrg done 5813da7aff1Smrg shift 5823da7aff1Smrg fi 5833da7aff1Smrg 5843e999d35Smrg # Remove '-o $object'. 5853da7aff1Smrg IFS=" " 5863da7aff1Smrg for arg 5873da7aff1Smrg do 5883da7aff1Smrg case $arg in 5893da7aff1Smrg -o) 5903da7aff1Smrg shift 5913da7aff1Smrg ;; 5923da7aff1Smrg $object) 5933da7aff1Smrg shift 5943da7aff1Smrg ;; 5953da7aff1Smrg *) 5963da7aff1Smrg set fnord "$@" "$arg" 5973da7aff1Smrg shift # fnord 5983da7aff1Smrg shift # $arg 5993da7aff1Smrg ;; 6003da7aff1Smrg esac 6013da7aff1Smrg done 6023da7aff1Smrg 6033da7aff1Smrg test -z "$dashmflag" && dashmflag=-M 6043e999d35Smrg # Require at least two characters before searching for ':' 6053da7aff1Smrg # in the target name. This is to cope with DOS-style filenames: 6063e999d35Smrg # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. 6073da7aff1Smrg "$@" $dashmflag | 6083e999d35Smrg sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile" 6093da7aff1Smrg rm -f "$depfile" 6103da7aff1Smrg cat < "$tmpdepfile" > "$depfile" 6113e999d35Smrg # Some versions of the HPUX 10.20 sed can't process this sed invocation 6123e999d35Smrg # correctly. Breaking it into two sed invocations is a workaround. 6133e999d35Smrg tr ' ' "$nl" < "$tmpdepfile" \ 6143e999d35Smrg | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ 6153e999d35Smrg | sed -e 's/$/ :/' >> "$depfile" 6163da7aff1Smrg rm -f "$tmpdepfile" 6173da7aff1Smrg ;; 6183da7aff1Smrg 6193da7aff1SmrgdashXmstdout) 6203da7aff1Smrg # This case only exists to satisfy depend.m4. It is never actually 6213da7aff1Smrg # run, as this mode is specially recognized in the preamble. 6223da7aff1Smrg exit 1 6233da7aff1Smrg ;; 6243da7aff1Smrg 6253da7aff1Smrgmakedepend) 6263da7aff1Smrg "$@" || exit $? 6273da7aff1Smrg # Remove any Libtool call 6283da7aff1Smrg if test "$libtool" = yes; then 629e531b1a7Smrg while test "X$1" != 'X--mode=compile'; do 6303da7aff1Smrg shift 6313da7aff1Smrg done 6323da7aff1Smrg shift 6333da7aff1Smrg fi 6343da7aff1Smrg # X makedepend 6353da7aff1Smrg shift 636e531b1a7Smrg cleared=no eat=no 637e531b1a7Smrg for arg 638e531b1a7Smrg do 6393da7aff1Smrg case $cleared in 6403da7aff1Smrg no) 6413da7aff1Smrg set ""; shift 6423da7aff1Smrg cleared=yes ;; 6433da7aff1Smrg esac 644e531b1a7Smrg if test $eat = yes; then 645e531b1a7Smrg eat=no 646e531b1a7Smrg continue 647e531b1a7Smrg fi 6483da7aff1Smrg case "$arg" in 6493da7aff1Smrg -D*|-I*) 6503da7aff1Smrg set fnord "$@" "$arg"; shift ;; 6513da7aff1Smrg # Strip any option that makedepend may not understand. Remove 6523da7aff1Smrg # the object too, otherwise makedepend will parse it as a source file. 653e531b1a7Smrg -arch) 654e531b1a7Smrg eat=yes ;; 6553da7aff1Smrg -*|$object) 6563da7aff1Smrg ;; 6573da7aff1Smrg *) 6583da7aff1Smrg set fnord "$@" "$arg"; shift ;; 6593da7aff1Smrg esac 6603da7aff1Smrg done 661e531b1a7Smrg obj_suffix=`echo "$object" | sed 's/^.*\././'` 6623da7aff1Smrg touch "$tmpdepfile" 6633da7aff1Smrg ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" 6643da7aff1Smrg rm -f "$depfile" 6653e999d35Smrg # makedepend may prepend the VPATH from the source file name to the object. 6663e999d35Smrg # No need to regex-escape $object, excess matching of '.' is harmless. 6673e999d35Smrg sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" 6683e999d35Smrg # Some versions of the HPUX 10.20 sed can't process the last invocation 6693e999d35Smrg # correctly. Breaking it into two sed invocations is a workaround. 6703e999d35Smrg sed '1,2d' "$tmpdepfile" \ 6713e999d35Smrg | tr ' ' "$nl" \ 6723e999d35Smrg | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ 6733e999d35Smrg | sed -e 's/$/ :/' >> "$depfile" 6743da7aff1Smrg rm -f "$tmpdepfile" "$tmpdepfile".bak 6753da7aff1Smrg ;; 6763da7aff1Smrg 6773da7aff1Smrgcpp) 6783da7aff1Smrg # Important note: in order to support this mode, a compiler *must* 6793da7aff1Smrg # always write the preprocessed file to stdout. 6803da7aff1Smrg "$@" || exit $? 6813da7aff1Smrg 6823da7aff1Smrg # Remove the call to Libtool. 6833da7aff1Smrg if test "$libtool" = yes; then 684e531b1a7Smrg while test "X$1" != 'X--mode=compile'; do 6853da7aff1Smrg shift 6863da7aff1Smrg done 6873da7aff1Smrg shift 6883da7aff1Smrg fi 6893da7aff1Smrg 6903e999d35Smrg # Remove '-o $object'. 6913da7aff1Smrg IFS=" " 6923da7aff1Smrg for arg 6933da7aff1Smrg do 6943da7aff1Smrg case $arg in 6953da7aff1Smrg -o) 6963da7aff1Smrg shift 6973da7aff1Smrg ;; 6983da7aff1Smrg $object) 6993da7aff1Smrg shift 7003da7aff1Smrg ;; 7013da7aff1Smrg *) 7023da7aff1Smrg set fnord "$@" "$arg" 7033da7aff1Smrg shift # fnord 7043da7aff1Smrg shift # $arg 7053da7aff1Smrg ;; 7063da7aff1Smrg esac 7073da7aff1Smrg done 7083da7aff1Smrg 7093e999d35Smrg "$@" -E \ 7103e999d35Smrg | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ 7113e999d35Smrg -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ 7123e999d35Smrg | sed '$ s: \\$::' > "$tmpdepfile" 7133da7aff1Smrg rm -f "$depfile" 7143da7aff1Smrg echo "$object : \\" > "$depfile" 7153da7aff1Smrg cat < "$tmpdepfile" >> "$depfile" 7163da7aff1Smrg sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" 7173da7aff1Smrg rm -f "$tmpdepfile" 7183da7aff1Smrg ;; 7193da7aff1Smrg 7203da7aff1Smrgmsvisualcpp) 7213da7aff1Smrg # Important note: in order to support this mode, a compiler *must* 722e531b1a7Smrg # always write the preprocessed file to stdout. 7233da7aff1Smrg "$@" || exit $? 724e531b1a7Smrg 725e531b1a7Smrg # Remove the call to Libtool. 726e531b1a7Smrg if test "$libtool" = yes; then 727e531b1a7Smrg while test "X$1" != 'X--mode=compile'; do 728e531b1a7Smrg shift 729e531b1a7Smrg done 730e531b1a7Smrg shift 731e531b1a7Smrg fi 732e531b1a7Smrg 7333da7aff1Smrg IFS=" " 7343da7aff1Smrg for arg 7353da7aff1Smrg do 7363da7aff1Smrg case "$arg" in 737e531b1a7Smrg -o) 738e531b1a7Smrg shift 739e531b1a7Smrg ;; 740e531b1a7Smrg $object) 741e531b1a7Smrg shift 742e531b1a7Smrg ;; 7433da7aff1Smrg "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") 7443e999d35Smrg set fnord "$@" 7453e999d35Smrg shift 7463e999d35Smrg shift 7473e999d35Smrg ;; 7483da7aff1Smrg *) 7493e999d35Smrg set fnord "$@" "$arg" 7503e999d35Smrg shift 7513e999d35Smrg shift 7523e999d35Smrg ;; 7533da7aff1Smrg esac 7543da7aff1Smrg done 755e531b1a7Smrg "$@" -E 2>/dev/null | 756e531b1a7Smrg sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" 7573da7aff1Smrg rm -f "$depfile" 7583da7aff1Smrg echo "$object : \\" > "$depfile" 7593e999d35Smrg sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" 7603e999d35Smrg echo "$tab" >> "$depfile" 761e531b1a7Smrg sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" 7623da7aff1Smrg rm -f "$tmpdepfile" 7633da7aff1Smrg ;; 7643da7aff1Smrg 765e531b1a7Smrgmsvcmsys) 766e531b1a7Smrg # This case exists only to let depend.m4 do its work. It works by 767e531b1a7Smrg # looking at the text of this script. This case will never be run, 768e531b1a7Smrg # since it is checked for above. 769e531b1a7Smrg exit 1 770e531b1a7Smrg ;; 771e531b1a7Smrg 7723da7aff1Smrgnone) 7733da7aff1Smrg exec "$@" 7743da7aff1Smrg ;; 7753da7aff1Smrg 7763da7aff1Smrg*) 7773da7aff1Smrg echo "Unknown depmode $depmode" 1>&2 7783da7aff1Smrg exit 1 7793da7aff1Smrg ;; 7803da7aff1Smrgesac 7813da7aff1Smrg 7823da7aff1Smrgexit 0 783e531b1a7Smrg 784e531b1a7Smrg# Local Variables: 785e531b1a7Smrg# mode: shell-script 786e531b1a7Smrg# sh-indentation: 2 7873a99fc18Smrg# eval: (add-hook 'before-save-hook 'time-stamp) 788e531b1a7Smrg# time-stamp-start: "scriptversion=" 789e531b1a7Smrg# time-stamp-format: "%:y-%02m-%02d.%02H" 7903a99fc18Smrg# time-stamp-time-zone: "UTC0" 791e531b1a7Smrg# time-stamp-end: "; # UTC" 792e531b1a7Smrg# End: 793