depcomp revision 2f167a42
10e20ee16Smrg#! /bin/sh 20e20ee16Smrg# depcomp - compile a program generating dependencies as side-effects 33e6697d4Smrg 42f167a42Smrgscriptversion=2013-05-30.07; # UTC 53e6697d4Smrg 62f167a42Smrg# Copyright (C) 1999-2014 Free Software Foundation, Inc. 70e20ee16Smrg 80e20ee16Smrg# This program is free software; you can redistribute it and/or modify 90e20ee16Smrg# it under the terms of the GNU General Public License as published by 100e20ee16Smrg# the Free Software Foundation; either version 2, or (at your option) 110e20ee16Smrg# any later version. 120e20ee16Smrg 130e20ee16Smrg# This program is distributed in the hope that it will be useful, 140e20ee16Smrg# but WITHOUT ANY WARRANTY; without even the implied warranty of 150e20ee16Smrg# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 160e20ee16Smrg# GNU General Public License for more details. 170e20ee16Smrg 180e20ee16Smrg# You should have received a copy of the GNU General Public License 193e6697d4Smrg# along with this program. If not, see <http://www.gnu.org/licenses/>. 200e20ee16Smrg 210e20ee16Smrg# As a special exception to the GNU General Public License, if you 220e20ee16Smrg# distribute this file as part of a program that contains a 230e20ee16Smrg# configuration script generated by Autoconf, you may include it under 240e20ee16Smrg# the same distribution terms that you use for the rest of that program. 250e20ee16Smrg 260e20ee16Smrg# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>. 270e20ee16Smrg 283e6697d4Smrgcase $1 in 293e6697d4Smrg '') 302f167a42Smrg echo "$0: No command. Try '$0 --help' for more information." 1>&2 312f167a42Smrg exit 1; 322f167a42Smrg ;; 333e6697d4Smrg -h | --h*) 343e6697d4Smrg cat <<\EOF 353e6697d4SmrgUsage: depcomp [--help] [--version] PROGRAM [ARGS] 363e6697d4Smrg 373e6697d4SmrgRun PROGRAMS ARGS to compile a file, generating dependencies 383e6697d4Smrgas side-effects. 393e6697d4Smrg 403e6697d4SmrgEnvironment variables: 413e6697d4Smrg depmode Dependency tracking mode. 422f167a42Smrg source Source file read by 'PROGRAMS ARGS'. 432f167a42Smrg object Object file output by 'PROGRAMS ARGS'. 443e6697d4Smrg DEPDIR directory where to store dependencies. 453e6697d4Smrg depfile Dependency file to output. 462f167a42Smrg tmpdepfile Temporary file to use when outputting dependencies. 473e6697d4Smrg libtool Whether libtool is used (yes/no). 483e6697d4Smrg 493e6697d4SmrgReport bugs to <bug-automake@gnu.org>. 503e6697d4SmrgEOF 513e6697d4Smrg exit $? 523e6697d4Smrg ;; 533e6697d4Smrg -v | --v*) 543e6697d4Smrg echo "depcomp $scriptversion" 553e6697d4Smrg exit $? 563e6697d4Smrg ;; 573e6697d4Smrgesac 583e6697d4Smrg 592f167a42Smrg# Get the directory component of the given path, and save it in the 602f167a42Smrg# global variables '$dir'. Note that this directory component will 612f167a42Smrg# be either empty or ending with a '/' character. This is deliberate. 622f167a42Smrgset_dir_from () 632f167a42Smrg{ 642f167a42Smrg case $1 in 652f167a42Smrg */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;; 662f167a42Smrg *) dir=;; 672f167a42Smrg esac 682f167a42Smrg} 692f167a42Smrg 702f167a42Smrg# Get the suffix-stripped basename of the given path, and save it the 712f167a42Smrg# global variable '$base'. 722f167a42Smrgset_base_from () 732f167a42Smrg{ 742f167a42Smrg base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'` 752f167a42Smrg} 762f167a42Smrg 772f167a42Smrg# If no dependency file was actually created by the compiler invocation, 782f167a42Smrg# we still have to create a dummy depfile, to avoid errors with the 792f167a42Smrg# Makefile "include basename.Plo" scheme. 802f167a42Smrgmake_dummy_depfile () 812f167a42Smrg{ 822f167a42Smrg echo "#dummy" > "$depfile" 832f167a42Smrg} 842f167a42Smrg 852f167a42Smrg# Factor out some common post-processing of the generated depfile. 862f167a42Smrg# Requires the auxiliary global variable '$tmpdepfile' to be set. 872f167a42Smrgaix_post_process_depfile () 882f167a42Smrg{ 892f167a42Smrg # If the compiler actually managed to produce a dependency file, 902f167a42Smrg # post-process it. 912f167a42Smrg if test -f "$tmpdepfile"; then 922f167a42Smrg # Each line is of the form 'foo.o: dependency.h'. 932f167a42Smrg # Do two passes, one to just change these to 942f167a42Smrg # $object: dependency.h 952f167a42Smrg # and one to simply output 962f167a42Smrg # dependency.h: 972f167a42Smrg # which is needed to avoid the deleted-header problem. 982f167a42Smrg { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile" 992f167a42Smrg sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile" 1002f167a42Smrg } > "$depfile" 1012f167a42Smrg rm -f "$tmpdepfile" 1022f167a42Smrg else 1032f167a42Smrg make_dummy_depfile 1042f167a42Smrg fi 1052f167a42Smrg} 1062f167a42Smrg 1072f167a42Smrg# A tabulation character. 1082f167a42Smrgtab=' ' 1092f167a42Smrg# A newline character. 1102f167a42Smrgnl=' 1112f167a42Smrg' 1122f167a42Smrg# Character ranges might be problematic outside the C locale. 1132f167a42Smrg# These definitions help. 1142f167a42Smrgupper=ABCDEFGHIJKLMNOPQRSTUVWXYZ 1152f167a42Smrglower=abcdefghijklmnopqrstuvwxyz 1162f167a42Smrgdigits=0123456789 1172f167a42Smrgalpha=${upper}${lower} 1182f167a42Smrg 1190e20ee16Smrgif test -z "$depmode" || test -z "$source" || test -z "$object"; then 1200e20ee16Smrg echo "depcomp: Variables source, object and depmode must be set" 1>&2 1210e20ee16Smrg exit 1 1220e20ee16Smrgfi 1230e20ee16Smrg 1243e6697d4Smrg# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. 1253e6697d4Smrgdepfile=${depfile-`echo "$object" | 1263e6697d4Smrg sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} 1270e20ee16Smrgtmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} 1280e20ee16Smrg 1290e20ee16Smrgrm -f "$tmpdepfile" 1300e20ee16Smrg 1312f167a42Smrg# Avoid interferences from the environment. 1322f167a42Smrggccflag= dashmflag= 1332f167a42Smrg 1340e20ee16Smrg# Some modes work just like other modes, but use different flags. We 1350e20ee16Smrg# parameterize here, but still list the modes in the big case below, 1360e20ee16Smrg# to make depend.m4 easier to write. Note that we *cannot* use a case 1370e20ee16Smrg# here, because this file can only contain one case statement. 1380e20ee16Smrgif test "$depmode" = hp; then 1390e20ee16Smrg # HP compiler uses -M and no extra arg. 1400e20ee16Smrg gccflag=-M 1410e20ee16Smrg depmode=gcc 1420e20ee16Smrgfi 1430e20ee16Smrg 1440e20ee16Smrgif test "$depmode" = dashXmstdout; then 1452f167a42Smrg # This is just like dashmstdout with a different argument. 1462f167a42Smrg dashmflag=-xM 1472f167a42Smrg depmode=dashmstdout 1480e20ee16Smrgfi 1490e20ee16Smrg 1503e6697d4Smrgcygpath_u="cygpath -u -f -" 1513e6697d4Smrgif test "$depmode" = msvcmsys; then 1522f167a42Smrg # This is just like msvisualcpp but w/o cygpath translation. 1532f167a42Smrg # Just convert the backslash-escaped backslashes to single forward 1542f167a42Smrg # slashes to satisfy depend.m4 1552f167a42Smrg cygpath_u='sed s,\\\\,/,g' 1562f167a42Smrg depmode=msvisualcpp 1572f167a42Smrgfi 1582f167a42Smrg 1592f167a42Smrgif test "$depmode" = msvc7msys; then 1602f167a42Smrg # This is just like msvc7 but w/o cygpath translation. 1612f167a42Smrg # Just convert the backslash-escaped backslashes to single forward 1622f167a42Smrg # slashes to satisfy depend.m4 1632f167a42Smrg cygpath_u='sed s,\\\\,/,g' 1642f167a42Smrg depmode=msvc7 1652f167a42Smrgfi 1662f167a42Smrg 1672f167a42Smrgif test "$depmode" = xlc; then 1682f167a42Smrg # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information. 1692f167a42Smrg gccflag=-qmakedep=gcc,-MF 1702f167a42Smrg depmode=gcc 1713e6697d4Smrgfi 1723e6697d4Smrg 1730e20ee16Smrgcase "$depmode" in 1740e20ee16Smrggcc3) 1750e20ee16Smrg## gcc 3 implements dependency tracking that does exactly what 1760e20ee16Smrg## we want. Yay! Note: for some reason libtool 1.4 doesn't like 1770e20ee16Smrg## it if -MD -MP comes after the -MF stuff. Hmm. 1783e6697d4Smrg## Unfortunately, FreeBSD c89 acceptance of flags depends upon 1793e6697d4Smrg## the command line argument order; so add the flags where they 1803e6697d4Smrg## appear in depend2.am. Note that the slowdown incurred here 1813e6697d4Smrg## affects only configure: in makefiles, %FASTDEP% shortcuts this. 1823e6697d4Smrg for arg 1833e6697d4Smrg do 1843e6697d4Smrg case $arg in 1853e6697d4Smrg -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; 1863e6697d4Smrg *) set fnord "$@" "$arg" ;; 1873e6697d4Smrg esac 1883e6697d4Smrg shift # fnord 1893e6697d4Smrg shift # $arg 1903e6697d4Smrg done 1913e6697d4Smrg "$@" 1920e20ee16Smrg stat=$? 1932f167a42Smrg if test $stat -ne 0; then 1940e20ee16Smrg rm -f "$tmpdepfile" 1950e20ee16Smrg exit $stat 1960e20ee16Smrg fi 1970e20ee16Smrg mv "$tmpdepfile" "$depfile" 1980e20ee16Smrg ;; 1990e20ee16Smrg 2000e20ee16Smrggcc) 2012f167a42Smrg## Note that this doesn't just cater to obsosete pre-3.x GCC compilers. 2022f167a42Smrg## but also to in-use compilers like IMB xlc/xlC and the HP C compiler. 2032f167a42Smrg## (see the conditional assignment to $gccflag above). 2040e20ee16Smrg## There are various ways to get dependency output from gcc. Here's 2050e20ee16Smrg## why we pick this rather obscure method: 2060e20ee16Smrg## - Don't want to use -MD because we'd like the dependencies to end 2070e20ee16Smrg## up in a subdir. Having to rename by hand is ugly. 2080e20ee16Smrg## (We might end up doing this anyway to support other compilers.) 2090e20ee16Smrg## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like 2102f167a42Smrg## -MM, not -M (despite what the docs say). Also, it might not be 2112f167a42Smrg## supported by the other compilers which use the 'gcc' depmode. 2120e20ee16Smrg## - Using -M directly means running the compiler twice (even worse 2130e20ee16Smrg## than renaming). 2140e20ee16Smrg if test -z "$gccflag"; then 2150e20ee16Smrg gccflag=-MD, 2160e20ee16Smrg fi 2170e20ee16Smrg "$@" -Wp,"$gccflag$tmpdepfile" 2180e20ee16Smrg stat=$? 2192f167a42Smrg if test $stat -ne 0; then 2200e20ee16Smrg rm -f "$tmpdepfile" 2210e20ee16Smrg exit $stat 2220e20ee16Smrg fi 2230e20ee16Smrg rm -f "$depfile" 2240e20ee16Smrg echo "$object : \\" > "$depfile" 2252f167a42Smrg # The second -e expression handles DOS-style file names with drive 2262f167a42Smrg # letters. 2270e20ee16Smrg sed -e 's/^[^:]*: / /' \ 2280e20ee16Smrg -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" 2292f167a42Smrg## This next piece of magic avoids the "deleted header file" problem. 2300e20ee16Smrg## The problem is that when a header file which appears in a .P file 2310e20ee16Smrg## is deleted, the dependency causes make to die (because there is 2320e20ee16Smrg## typically no way to rebuild the header). We avoid this by adding 2330e20ee16Smrg## dummy dependencies for each header file. Too bad gcc doesn't do 2340e20ee16Smrg## this for us directly. 2352f167a42Smrg## Some versions of gcc put a space before the ':'. On the theory 2360e20ee16Smrg## that the space means something, we add a space to the output as 2372f167a42Smrg## well. hp depmode also adds that space, but also prefixes the VPATH 2382f167a42Smrg## to the object. Take care to not repeat it in the output. 2390e20ee16Smrg## Some versions of the HPUX 10.20 sed can't process this invocation 2400e20ee16Smrg## correctly. Breaking it into two sed invocations is a workaround. 2412f167a42Smrg tr ' ' "$nl" < "$tmpdepfile" \ 2422f167a42Smrg | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ 2432f167a42Smrg | sed -e 's/$/ :/' >> "$depfile" 2440e20ee16Smrg rm -f "$tmpdepfile" 2450e20ee16Smrg ;; 2460e20ee16Smrg 2470e20ee16Smrghp) 2480e20ee16Smrg # This case exists only to let depend.m4 do its work. It works by 2490e20ee16Smrg # looking at the text of this script. This case will never be run, 2500e20ee16Smrg # since it is checked for above. 2510e20ee16Smrg exit 1 2520e20ee16Smrg ;; 2530e20ee16Smrg 2540e20ee16Smrgsgi) 2550e20ee16Smrg if test "$libtool" = yes; then 2560e20ee16Smrg "$@" "-Wp,-MDupdate,$tmpdepfile" 2570e20ee16Smrg else 2580e20ee16Smrg "$@" -MDupdate "$tmpdepfile" 2590e20ee16Smrg fi 2600e20ee16Smrg stat=$? 2612f167a42Smrg if test $stat -ne 0; then 2620e20ee16Smrg rm -f "$tmpdepfile" 2630e20ee16Smrg exit $stat 2640e20ee16Smrg fi 2650e20ee16Smrg rm -f "$depfile" 2660e20ee16Smrg 2670e20ee16Smrg if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files 2680e20ee16Smrg echo "$object : \\" > "$depfile" 2690e20ee16Smrg # Clip off the initial element (the dependent). Don't try to be 2700e20ee16Smrg # clever and replace this with sed code, as IRIX sed won't handle 2710e20ee16Smrg # lines with more than a fixed number of characters (4096 in 2720e20ee16Smrg # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; 2732f167a42Smrg # the IRIX cc adds comments like '#:fec' to the end of the 2740e20ee16Smrg # dependency line. 2752f167a42Smrg tr ' ' "$nl" < "$tmpdepfile" \ 2762f167a42Smrg | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \ 2772f167a42Smrg | tr "$nl" ' ' >> "$depfile" 2783e6697d4Smrg echo >> "$depfile" 2790e20ee16Smrg # The second pass generates a dummy entry for each header file. 2802f167a42Smrg tr ' ' "$nl" < "$tmpdepfile" \ 2812f167a42Smrg | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ 2822f167a42Smrg >> "$depfile" 2830e20ee16Smrg else 2842f167a42Smrg make_dummy_depfile 2850e20ee16Smrg fi 2860e20ee16Smrg rm -f "$tmpdepfile" 2870e20ee16Smrg ;; 2880e20ee16Smrg 2892f167a42Smrgxlc) 2902f167a42Smrg # This case exists only to let depend.m4 do its work. It works by 2912f167a42Smrg # looking at the text of this script. This case will never be run, 2922f167a42Smrg # since it is checked for above. 2932f167a42Smrg exit 1 2942f167a42Smrg ;; 2952f167a42Smrg 2960e20ee16Smrgaix) 2970e20ee16Smrg # The C for AIX Compiler uses -M and outputs the dependencies 2980e20ee16Smrg # in a .u file. In older versions, this file always lives in the 2992f167a42Smrg # current directory. Also, the AIX compiler puts '$object:' at the 3000e20ee16Smrg # start of each line; $object doesn't have directory information. 3010e20ee16Smrg # Version 6 uses the directory in both cases. 3022f167a42Smrg set_dir_from "$object" 3032f167a42Smrg set_base_from "$object" 3040e20ee16Smrg if test "$libtool" = yes; then 3053e6697d4Smrg tmpdepfile1=$dir$base.u 3063e6697d4Smrg tmpdepfile2=$base.u 3073e6697d4Smrg tmpdepfile3=$dir.libs/$base.u 3080e20ee16Smrg "$@" -Wc,-M 3090e20ee16Smrg else 3103e6697d4Smrg tmpdepfile1=$dir$base.u 3113e6697d4Smrg tmpdepfile2=$dir$base.u 3123e6697d4Smrg tmpdepfile3=$dir$base.u 3130e20ee16Smrg "$@" -M 3140e20ee16Smrg fi 3150e20ee16Smrg stat=$? 3162f167a42Smrg if test $stat -ne 0; then 3173e6697d4Smrg rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 3180e20ee16Smrg exit $stat 3190e20ee16Smrg fi 3200e20ee16Smrg 3213e6697d4Smrg for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 3223e6697d4Smrg do 3233e6697d4Smrg test -f "$tmpdepfile" && break 3243e6697d4Smrg done 3252f167a42Smrg aix_post_process_depfile 3262f167a42Smrg ;; 3272f167a42Smrg 3282f167a42Smrgtcc) 3292f167a42Smrg # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26 3302f167a42Smrg # FIXME: That version still under development at the moment of writing. 3312f167a42Smrg # Make that this statement remains true also for stable, released 3322f167a42Smrg # versions. 3332f167a42Smrg # It will wrap lines (doesn't matter whether long or short) with a 3342f167a42Smrg # trailing '\', as in: 3352f167a42Smrg # 3362f167a42Smrg # foo.o : \ 3372f167a42Smrg # foo.c \ 3382f167a42Smrg # foo.h \ 3392f167a42Smrg # 3402f167a42Smrg # It will put a trailing '\' even on the last line, and will use leading 3412f167a42Smrg # spaces rather than leading tabs (at least since its commit 0394caf7 3422f167a42Smrg # "Emit spaces for -MD"). 3432f167a42Smrg "$@" -MD -MF "$tmpdepfile" 3442f167a42Smrg stat=$? 3452f167a42Smrg if test $stat -ne 0; then 3462f167a42Smrg rm -f "$tmpdepfile" 3472f167a42Smrg exit $stat 3480e20ee16Smrg fi 3492f167a42Smrg rm -f "$depfile" 3502f167a42Smrg # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'. 3512f167a42Smrg # We have to change lines of the first kind to '$object: \'. 3522f167a42Smrg sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile" 3532f167a42Smrg # And for each line of the second kind, we have to emit a 'dep.h:' 3542f167a42Smrg # dummy dependency, to avoid the deleted-header problem. 3552f167a42Smrg sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile" 3560e20ee16Smrg rm -f "$tmpdepfile" 3570e20ee16Smrg ;; 3580e20ee16Smrg 3592f167a42Smrg## The order of this option in the case statement is important, since the 3602f167a42Smrg## shell code in configure will try each of these formats in the order 3612f167a42Smrg## listed in this file. A plain '-MD' option would be understood by many 3622f167a42Smrg## compilers, so we must ensure this comes after the gcc and icc options. 3632f167a42Smrgpgcc) 3642f167a42Smrg # Portland's C compiler understands '-MD'. 3652f167a42Smrg # Will always output deps to 'file.d' where file is the root name of the 3662f167a42Smrg # source file under compilation, even if file resides in a subdirectory. 3672f167a42Smrg # The object file name does not affect the name of the '.d' file. 3682f167a42Smrg # pgcc 10.2 will output 3690e20ee16Smrg # foo.o: sub/foo.c sub/foo.h 3702f167a42Smrg # and will wrap long lines using '\' : 3710e20ee16Smrg # foo.o: sub/foo.c ... \ 3720e20ee16Smrg # sub/foo.h ... \ 3730e20ee16Smrg # ... 3742f167a42Smrg set_dir_from "$object" 3752f167a42Smrg # Use the source, not the object, to determine the base name, since 3762f167a42Smrg # that's sadly what pgcc will do too. 3772f167a42Smrg set_base_from "$source" 3782f167a42Smrg tmpdepfile=$base.d 3792f167a42Smrg 3802f167a42Smrg # For projects that build the same source file twice into different object 3812f167a42Smrg # files, the pgcc approach of using the *source* file root name can cause 3822f167a42Smrg # problems in parallel builds. Use a locking strategy to avoid stomping on 3832f167a42Smrg # the same $tmpdepfile. 3842f167a42Smrg lockdir=$base.d-lock 3852f167a42Smrg trap " 3862f167a42Smrg echo '$0: caught signal, cleaning up...' >&2 3872f167a42Smrg rmdir '$lockdir' 3882f167a42Smrg exit 1 3892f167a42Smrg " 1 2 13 15 3902f167a42Smrg numtries=100 3912f167a42Smrg i=$numtries 3922f167a42Smrg while test $i -gt 0; do 3932f167a42Smrg # mkdir is a portable test-and-set. 3942f167a42Smrg if mkdir "$lockdir" 2>/dev/null; then 3952f167a42Smrg # This process acquired the lock. 3962f167a42Smrg "$@" -MD 3972f167a42Smrg stat=$? 3982f167a42Smrg # Release the lock. 3992f167a42Smrg rmdir "$lockdir" 4002f167a42Smrg break 4012f167a42Smrg else 4022f167a42Smrg # If the lock is being held by a different process, wait 4032f167a42Smrg # until the winning process is done or we timeout. 4042f167a42Smrg while test -d "$lockdir" && test $i -gt 0; do 4052f167a42Smrg sleep 1 4062f167a42Smrg i=`expr $i - 1` 4072f167a42Smrg done 4082f167a42Smrg fi 4092f167a42Smrg i=`expr $i - 1` 4102f167a42Smrg done 4112f167a42Smrg trap - 1 2 13 15 4122f167a42Smrg if test $i -le 0; then 4132f167a42Smrg echo "$0: failed to acquire lock after $numtries attempts" >&2 4142f167a42Smrg echo "$0: check lockdir '$lockdir'" >&2 4152f167a42Smrg exit 1 4162f167a42Smrg fi 4170e20ee16Smrg 4182f167a42Smrg if test $stat -ne 0; then 4190e20ee16Smrg rm -f "$tmpdepfile" 4200e20ee16Smrg exit $stat 4210e20ee16Smrg fi 4220e20ee16Smrg rm -f "$depfile" 4230e20ee16Smrg # Each line is of the form `foo.o: dependent.h', 4240e20ee16Smrg # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. 4250e20ee16Smrg # Do two passes, one to just change these to 4260e20ee16Smrg # `$object: dependent.h' and one to simply `dependent.h:'. 4270e20ee16Smrg sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" 4280e20ee16Smrg # Some versions of the HPUX 10.20 sed can't process this invocation 4290e20ee16Smrg # correctly. Breaking it into two sed invocations is a workaround. 4302f167a42Smrg sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \ 4312f167a42Smrg | sed -e 's/$/ :/' >> "$depfile" 4320e20ee16Smrg rm -f "$tmpdepfile" 4330e20ee16Smrg ;; 4340e20ee16Smrg 4353e6697d4Smrghp2) 4363e6697d4Smrg # The "hp" stanza above does not work with aCC (C++) and HP's ia64 4373e6697d4Smrg # compilers, which have integrated preprocessors. The correct option 4383e6697d4Smrg # to use with these is +Maked; it writes dependencies to a file named 4393e6697d4Smrg # 'foo.d', which lands next to the object file, wherever that 4403e6697d4Smrg # happens to be. 4413e6697d4Smrg # Much of this is similar to the tru64 case; see comments there. 4422f167a42Smrg set_dir_from "$object" 4432f167a42Smrg set_base_from "$object" 4443e6697d4Smrg if test "$libtool" = yes; then 4453e6697d4Smrg tmpdepfile1=$dir$base.d 4463e6697d4Smrg tmpdepfile2=$dir.libs/$base.d 4473e6697d4Smrg "$@" -Wc,+Maked 4483e6697d4Smrg else 4493e6697d4Smrg tmpdepfile1=$dir$base.d 4503e6697d4Smrg tmpdepfile2=$dir$base.d 4513e6697d4Smrg "$@" +Maked 4523e6697d4Smrg fi 4533e6697d4Smrg stat=$? 4542f167a42Smrg if test $stat -ne 0; then 4553e6697d4Smrg rm -f "$tmpdepfile1" "$tmpdepfile2" 4563e6697d4Smrg exit $stat 4573e6697d4Smrg fi 4583e6697d4Smrg 4593e6697d4Smrg for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" 4603e6697d4Smrg do 4613e6697d4Smrg test -f "$tmpdepfile" && break 4623e6697d4Smrg done 4633e6697d4Smrg if test -f "$tmpdepfile"; then 4642f167a42Smrg sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile" 4652f167a42Smrg # Add 'dependent.h:' lines. 4663e6697d4Smrg sed -ne '2,${ 4672f167a42Smrg s/^ *// 4682f167a42Smrg s/ \\*$// 4692f167a42Smrg s/$/:/ 4702f167a42Smrg p 4712f167a42Smrg }' "$tmpdepfile" >> "$depfile" 4723e6697d4Smrg else 4732f167a42Smrg make_dummy_depfile 4743e6697d4Smrg fi 4753e6697d4Smrg rm -f "$tmpdepfile" "$tmpdepfile2" 4763e6697d4Smrg ;; 4773e6697d4Smrg 4780e20ee16Smrgtru64) 4792f167a42Smrg # The Tru64 compiler uses -MD to generate dependencies as a side 4802f167a42Smrg # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. 4812f167a42Smrg # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put 4822f167a42Smrg # dependencies in 'foo.d' instead, so we check for that too. 4832f167a42Smrg # Subdirectories are respected. 4842f167a42Smrg set_dir_from "$object" 4852f167a42Smrg set_base_from "$object" 4862f167a42Smrg 4872f167a42Smrg if test "$libtool" = yes; then 4882f167a42Smrg # Libtool generates 2 separate objects for the 2 libraries. These 4892f167a42Smrg # two compilations output dependencies in $dir.libs/$base.o.d and 4902f167a42Smrg # in $dir$base.o.d. We have to check for both files, because 4912f167a42Smrg # one of the two compilations can be disabled. We should prefer 4922f167a42Smrg # $dir$base.o.d over $dir.libs/$base.o.d because the latter is 4932f167a42Smrg # automatically cleaned when .libs/ is deleted, while ignoring 4942f167a42Smrg # the former would cause a distcleancheck panic. 4952f167a42Smrg tmpdepfile1=$dir$base.o.d # libtool 1.5 4962f167a42Smrg tmpdepfile2=$dir.libs/$base.o.d # Likewise. 4972f167a42Smrg tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504 4982f167a42Smrg "$@" -Wc,-MD 4992f167a42Smrg else 5002f167a42Smrg tmpdepfile1=$dir$base.d 5012f167a42Smrg tmpdepfile2=$dir$base.d 5022f167a42Smrg tmpdepfile3=$dir$base.d 5032f167a42Smrg "$@" -MD 5042f167a42Smrg fi 5052f167a42Smrg 5062f167a42Smrg stat=$? 5072f167a42Smrg if test $stat -ne 0; then 5082f167a42Smrg rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 5092f167a42Smrg exit $stat 5102f167a42Smrg fi 5112f167a42Smrg 5122f167a42Smrg for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 5132f167a42Smrg do 5142f167a42Smrg test -f "$tmpdepfile" && break 5152f167a42Smrg done 5162f167a42Smrg # Same post-processing that is required for AIX mode. 5172f167a42Smrg aix_post_process_depfile 5182f167a42Smrg ;; 5192f167a42Smrg 5202f167a42Smrgmsvc7) 5212f167a42Smrg if test "$libtool" = yes; then 5222f167a42Smrg showIncludes=-Wc,-showIncludes 5232f167a42Smrg else 5242f167a42Smrg showIncludes=-showIncludes 5252f167a42Smrg fi 5262f167a42Smrg "$@" $showIncludes > "$tmpdepfile" 5272f167a42Smrg stat=$? 5282f167a42Smrg grep -v '^Note: including file: ' "$tmpdepfile" 5292f167a42Smrg if test $stat -ne 0; then 5302f167a42Smrg rm -f "$tmpdepfile" 5312f167a42Smrg exit $stat 5322f167a42Smrg fi 5332f167a42Smrg rm -f "$depfile" 5342f167a42Smrg echo "$object : \\" > "$depfile" 5352f167a42Smrg # The first sed program below extracts the file names and escapes 5362f167a42Smrg # backslashes for cygpath. The second sed program outputs the file 5372f167a42Smrg # name when reading, but also accumulates all include files in the 5382f167a42Smrg # hold buffer in order to output them again at the end. This only 5392f167a42Smrg # works with sed implementations that can handle large buffers. 5402f167a42Smrg sed < "$tmpdepfile" -n ' 5412f167a42Smrg/^Note: including file: *\(.*\)/ { 5422f167a42Smrg s//\1/ 5432f167a42Smrg s/\\/\\\\/g 5442f167a42Smrg p 5452f167a42Smrg}' | $cygpath_u | sort -u | sed -n ' 5462f167a42Smrgs/ /\\ /g 5472f167a42Smrgs/\(.*\)/'"$tab"'\1 \\/p 5482f167a42Smrgs/.\(.*\) \\/\1:/ 5492f167a42SmrgH 5502f167a42Smrg$ { 5512f167a42Smrg s/.*/'"$tab"'/ 5522f167a42Smrg G 5532f167a42Smrg p 5542f167a42Smrg}' >> "$depfile" 5552f167a42Smrg echo >> "$depfile" # make sure the fragment doesn't end with a backslash 5562f167a42Smrg rm -f "$tmpdepfile" 5572f167a42Smrg ;; 5582f167a42Smrg 5592f167a42Smrgmsvc7msys) 5602f167a42Smrg # This case exists only to let depend.m4 do its work. It works by 5612f167a42Smrg # looking at the text of this script. This case will never be run, 5622f167a42Smrg # since it is checked for above. 5632f167a42Smrg exit 1 5642f167a42Smrg ;; 5650e20ee16Smrg 5660e20ee16Smrg#nosideeffect) 5670e20ee16Smrg # This comment above is used by automake to tell side-effect 5680e20ee16Smrg # dependency tracking mechanisms from slower ones. 5690e20ee16Smrg 5700e20ee16Smrgdashmstdout) 5710e20ee16Smrg # Important note: in order to support this mode, a compiler *must* 5720e20ee16Smrg # always write the preprocessed file to stdout, regardless of -o. 5730e20ee16Smrg "$@" || exit $? 5740e20ee16Smrg 5750e20ee16Smrg # Remove the call to Libtool. 5760e20ee16Smrg if test "$libtool" = yes; then 5773e6697d4Smrg while test "X$1" != 'X--mode=compile'; do 5780e20ee16Smrg shift 5790e20ee16Smrg done 5800e20ee16Smrg shift 5810e20ee16Smrg fi 5820e20ee16Smrg 5832f167a42Smrg # Remove '-o $object'. 5840e20ee16Smrg IFS=" " 5850e20ee16Smrg for arg 5860e20ee16Smrg do 5870e20ee16Smrg case $arg in 5880e20ee16Smrg -o) 5890e20ee16Smrg shift 5900e20ee16Smrg ;; 5910e20ee16Smrg $object) 5920e20ee16Smrg shift 5930e20ee16Smrg ;; 5940e20ee16Smrg *) 5950e20ee16Smrg set fnord "$@" "$arg" 5960e20ee16Smrg shift # fnord 5970e20ee16Smrg shift # $arg 5980e20ee16Smrg ;; 5990e20ee16Smrg esac 6000e20ee16Smrg done 6010e20ee16Smrg 6020e20ee16Smrg test -z "$dashmflag" && dashmflag=-M 6032f167a42Smrg # Require at least two characters before searching for ':' 6040e20ee16Smrg # in the target name. This is to cope with DOS-style filenames: 6052f167a42Smrg # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. 6060e20ee16Smrg "$@" $dashmflag | 6072f167a42Smrg sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile" 6080e20ee16Smrg rm -f "$depfile" 6090e20ee16Smrg cat < "$tmpdepfile" > "$depfile" 6102f167a42Smrg # Some versions of the HPUX 10.20 sed can't process this sed invocation 6112f167a42Smrg # correctly. Breaking it into two sed invocations is a workaround. 6122f167a42Smrg tr ' ' "$nl" < "$tmpdepfile" \ 6132f167a42Smrg | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ 6142f167a42Smrg | sed -e 's/$/ :/' >> "$depfile" 6150e20ee16Smrg rm -f "$tmpdepfile" 6160e20ee16Smrg ;; 6170e20ee16Smrg 6180e20ee16SmrgdashXmstdout) 6190e20ee16Smrg # This case only exists to satisfy depend.m4. It is never actually 6200e20ee16Smrg # run, as this mode is specially recognized in the preamble. 6210e20ee16Smrg exit 1 6220e20ee16Smrg ;; 6230e20ee16Smrg 6240e20ee16Smrgmakedepend) 6250e20ee16Smrg "$@" || exit $? 6260e20ee16Smrg # Remove any Libtool call 6270e20ee16Smrg if test "$libtool" = yes; then 6283e6697d4Smrg while test "X$1" != 'X--mode=compile'; do 6290e20ee16Smrg shift 6300e20ee16Smrg done 6310e20ee16Smrg shift 6320e20ee16Smrg fi 6330e20ee16Smrg # X makedepend 6340e20ee16Smrg shift 6353e6697d4Smrg cleared=no eat=no 6363e6697d4Smrg for arg 6373e6697d4Smrg do 6380e20ee16Smrg case $cleared in 6390e20ee16Smrg no) 6400e20ee16Smrg set ""; shift 6410e20ee16Smrg cleared=yes ;; 6420e20ee16Smrg esac 6433e6697d4Smrg if test $eat = yes; then 6443e6697d4Smrg eat=no 6453e6697d4Smrg continue 6463e6697d4Smrg fi 6470e20ee16Smrg case "$arg" in 6480e20ee16Smrg -D*|-I*) 6490e20ee16Smrg set fnord "$@" "$arg"; shift ;; 6500e20ee16Smrg # Strip any option that makedepend may not understand. Remove 6510e20ee16Smrg # the object too, otherwise makedepend will parse it as a source file. 6523e6697d4Smrg -arch) 6533e6697d4Smrg eat=yes ;; 6540e20ee16Smrg -*|$object) 6550e20ee16Smrg ;; 6560e20ee16Smrg *) 6570e20ee16Smrg set fnord "$@" "$arg"; shift ;; 6580e20ee16Smrg esac 6590e20ee16Smrg done 6603e6697d4Smrg obj_suffix=`echo "$object" | sed 's/^.*\././'` 6610e20ee16Smrg touch "$tmpdepfile" 6620e20ee16Smrg ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" 6630e20ee16Smrg rm -f "$depfile" 6642f167a42Smrg # makedepend may prepend the VPATH from the source file name to the object. 6652f167a42Smrg # No need to regex-escape $object, excess matching of '.' is harmless. 6662f167a42Smrg sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" 6672f167a42Smrg # Some versions of the HPUX 10.20 sed can't process the last invocation 6682f167a42Smrg # correctly. Breaking it into two sed invocations is a workaround. 6692f167a42Smrg sed '1,2d' "$tmpdepfile" \ 6702f167a42Smrg | tr ' ' "$nl" \ 6712f167a42Smrg | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ 6722f167a42Smrg | sed -e 's/$/ :/' >> "$depfile" 6730e20ee16Smrg rm -f "$tmpdepfile" "$tmpdepfile".bak 6740e20ee16Smrg ;; 6750e20ee16Smrg 6760e20ee16Smrgcpp) 6770e20ee16Smrg # Important note: in order to support this mode, a compiler *must* 6780e20ee16Smrg # always write the preprocessed file to stdout. 6790e20ee16Smrg "$@" || exit $? 6800e20ee16Smrg 6810e20ee16Smrg # Remove the call to Libtool. 6820e20ee16Smrg if test "$libtool" = yes; then 6833e6697d4Smrg while test "X$1" != 'X--mode=compile'; do 6840e20ee16Smrg shift 6850e20ee16Smrg done 6860e20ee16Smrg shift 6870e20ee16Smrg fi 6880e20ee16Smrg 6892f167a42Smrg # Remove '-o $object'. 6900e20ee16Smrg IFS=" " 6910e20ee16Smrg for arg 6920e20ee16Smrg do 6930e20ee16Smrg case $arg in 6940e20ee16Smrg -o) 6950e20ee16Smrg shift 6960e20ee16Smrg ;; 6970e20ee16Smrg $object) 6980e20ee16Smrg shift 6990e20ee16Smrg ;; 7000e20ee16Smrg *) 7010e20ee16Smrg set fnord "$@" "$arg" 7020e20ee16Smrg shift # fnord 7030e20ee16Smrg shift # $arg 7040e20ee16Smrg ;; 7050e20ee16Smrg esac 7060e20ee16Smrg done 7070e20ee16Smrg 7082f167a42Smrg "$@" -E \ 7092f167a42Smrg | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ 7102f167a42Smrg -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ 7112f167a42Smrg | sed '$ s: \\$::' > "$tmpdepfile" 7120e20ee16Smrg rm -f "$depfile" 7130e20ee16Smrg echo "$object : \\" > "$depfile" 7140e20ee16Smrg cat < "$tmpdepfile" >> "$depfile" 7150e20ee16Smrg sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" 7160e20ee16Smrg rm -f "$tmpdepfile" 7170e20ee16Smrg ;; 7180e20ee16Smrg 7190e20ee16Smrgmsvisualcpp) 7200e20ee16Smrg # Important note: in order to support this mode, a compiler *must* 7213e6697d4Smrg # always write the preprocessed file to stdout. 7220e20ee16Smrg "$@" || exit $? 7233e6697d4Smrg 7243e6697d4Smrg # Remove the call to Libtool. 7253e6697d4Smrg if test "$libtool" = yes; then 7263e6697d4Smrg while test "X$1" != 'X--mode=compile'; do 7273e6697d4Smrg shift 7283e6697d4Smrg done 7293e6697d4Smrg shift 7303e6697d4Smrg fi 7313e6697d4Smrg 7320e20ee16Smrg IFS=" " 7330e20ee16Smrg for arg 7340e20ee16Smrg do 7350e20ee16Smrg case "$arg" in 7363e6697d4Smrg -o) 7373e6697d4Smrg shift 7383e6697d4Smrg ;; 7393e6697d4Smrg $object) 7403e6697d4Smrg shift 7413e6697d4Smrg ;; 7420e20ee16Smrg "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") 7432f167a42Smrg set fnord "$@" 7442f167a42Smrg shift 7452f167a42Smrg shift 7462f167a42Smrg ;; 7470e20ee16Smrg *) 7482f167a42Smrg set fnord "$@" "$arg" 7492f167a42Smrg shift 7502f167a42Smrg shift 7512f167a42Smrg ;; 7520e20ee16Smrg esac 7530e20ee16Smrg done 7543e6697d4Smrg "$@" -E 2>/dev/null | 7553e6697d4Smrg sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" 7560e20ee16Smrg rm -f "$depfile" 7570e20ee16Smrg echo "$object : \\" > "$depfile" 7582f167a42Smrg sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" 7592f167a42Smrg echo "$tab" >> "$depfile" 7603e6697d4Smrg sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" 7610e20ee16Smrg rm -f "$tmpdepfile" 7620e20ee16Smrg ;; 7630e20ee16Smrg 7643e6697d4Smrgmsvcmsys) 7653e6697d4Smrg # This case exists only to let depend.m4 do its work. It works by 7663e6697d4Smrg # looking at the text of this script. This case will never be run, 7673e6697d4Smrg # since it is checked for above. 7683e6697d4Smrg exit 1 7693e6697d4Smrg ;; 7703e6697d4Smrg 7710e20ee16Smrgnone) 7720e20ee16Smrg exec "$@" 7730e20ee16Smrg ;; 7740e20ee16Smrg 7750e20ee16Smrg*) 7760e20ee16Smrg echo "Unknown depmode $depmode" 1>&2 7770e20ee16Smrg exit 1 7780e20ee16Smrg ;; 7790e20ee16Smrgesac 7800e20ee16Smrg 7810e20ee16Smrgexit 0 7823e6697d4Smrg 7833e6697d4Smrg# Local Variables: 7843e6697d4Smrg# mode: shell-script 7853e6697d4Smrg# sh-indentation: 2 7863e6697d4Smrg# eval: (add-hook 'write-file-hooks 'time-stamp) 7873e6697d4Smrg# time-stamp-start: "scriptversion=" 7883e6697d4Smrg# time-stamp-format: "%:y-%02m-%02d.%02H" 7893e6697d4Smrg# time-stamp-time-zone: "UTC" 7903e6697d4Smrg# time-stamp-end: "; # UTC" 7913e6697d4Smrg# End: 792