12c7c4e3dSmrg#! /bin/sh 22c7c4e3dSmrg# depcomp - compile a program generating dependencies as side-effects 38650bb69Smrg 4c1e8faa6Smrgscriptversion=2024-06-19.01; # UTC 58650bb69Smrg 6c1e8faa6Smrg# Copyright (C) 1999-2024 Free Software Foundation, Inc. 72c7c4e3dSmrg 82c7c4e3dSmrg# This program is free software; you can redistribute it and/or modify 92c7c4e3dSmrg# it under the terms of the GNU General Public License as published by 102c7c4e3dSmrg# the Free Software Foundation; either version 2, or (at your option) 112c7c4e3dSmrg# any later version. 122c7c4e3dSmrg 132c7c4e3dSmrg# This program is distributed in the hope that it will be useful, 142c7c4e3dSmrg# but WITHOUT ANY WARRANTY; without even the implied warranty of 152c7c4e3dSmrg# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 162c7c4e3dSmrg# GNU General Public License for more details. 172c7c4e3dSmrg 182c7c4e3dSmrg# You should have received a copy of the GNU General Public License 193458e6c2Smrg# along with this program. If not, see <https://www.gnu.org/licenses/>. 202c7c4e3dSmrg 212c7c4e3dSmrg# As a special exception to the GNU General Public License, if you 222c7c4e3dSmrg# distribute this file as part of a program that contains a 232c7c4e3dSmrg# configuration script generated by Autoconf, you may include it under 242c7c4e3dSmrg# the same distribution terms that you use for the rest of that program. 252c7c4e3dSmrg 262c7c4e3dSmrg# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>. 272c7c4e3dSmrg 288650bb69Smrgcase $1 in 298650bb69Smrg '') 302becc446Smrg echo "$0: No command. Try '$0 --help' for more information." 1>&2 312becc446Smrg exit 1; 322becc446Smrg ;; 338650bb69Smrg -h | --h*) 348650bb69Smrg cat <<\EOF 358650bb69SmrgUsage: depcomp [--help] [--version] PROGRAM [ARGS] 368650bb69Smrg 378650bb69SmrgRun PROGRAMS ARGS to compile a file, generating dependencies 388650bb69Smrgas side-effects. 398650bb69Smrg 408650bb69SmrgEnvironment variables: 418650bb69Smrg depmode Dependency tracking mode. 422becc446Smrg source Source file read by 'PROGRAMS ARGS'. 432becc446Smrg object Object file output by 'PROGRAMS ARGS'. 448650bb69Smrg DEPDIR directory where to store dependencies. 458650bb69Smrg depfile Dependency file to output. 462becc446Smrg tmpdepfile Temporary file to use when outputting dependencies. 478650bb69Smrg libtool Whether libtool is used (yes/no). 488650bb69Smrg 498650bb69SmrgReport bugs to <bug-automake@gnu.org>. 50c1e8faa6SmrgGNU Automake home page: <https://www.gnu.org/software/automake/>. 51c1e8faa6SmrgGeneral help using GNU software: <https://www.gnu.org/gethelp/>. 528650bb69SmrgEOF 538650bb69Smrg exit $? 548650bb69Smrg ;; 558650bb69Smrg -v | --v*) 56c1e8faa6Smrg echo "depcomp (GNU Automake) $scriptversion" 578650bb69Smrg exit $? 588650bb69Smrg ;; 598650bb69Smrgesac 608650bb69Smrg 612becc446Smrg# Get the directory component of the given path, and save it in the 622becc446Smrg# global variables '$dir'. Note that this directory component will 632becc446Smrg# be either empty or ending with a '/' character. This is deliberate. 642becc446Smrgset_dir_from () 652becc446Smrg{ 662becc446Smrg case $1 in 672becc446Smrg */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;; 682becc446Smrg *) dir=;; 692becc446Smrg esac 702becc446Smrg} 712becc446Smrg 722becc446Smrg# Get the suffix-stripped basename of the given path, and save it the 732becc446Smrg# global variable '$base'. 742becc446Smrgset_base_from () 752becc446Smrg{ 762becc446Smrg base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'` 772becc446Smrg} 782becc446Smrg 792becc446Smrg# If no dependency file was actually created by the compiler invocation, 802becc446Smrg# we still have to create a dummy depfile, to avoid errors with the 812becc446Smrg# Makefile "include basename.Plo" scheme. 822becc446Smrgmake_dummy_depfile () 832becc446Smrg{ 842becc446Smrg echo "#dummy" > "$depfile" 852becc446Smrg} 862becc446Smrg 872becc446Smrg# Factor out some common post-processing of the generated depfile. 882becc446Smrg# Requires the auxiliary global variable '$tmpdepfile' to be set. 892becc446Smrgaix_post_process_depfile () 902becc446Smrg{ 912becc446Smrg # If the compiler actually managed to produce a dependency file, 922becc446Smrg # post-process it. 932becc446Smrg if test -f "$tmpdepfile"; then 942becc446Smrg # Each line is of the form 'foo.o: dependency.h'. 952becc446Smrg # Do two passes, one to just change these to 962becc446Smrg # $object: dependency.h 972becc446Smrg # and one to simply output 982becc446Smrg # dependency.h: 992becc446Smrg # which is needed to avoid the deleted-header problem. 1002becc446Smrg { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile" 1012becc446Smrg sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile" 1022becc446Smrg } > "$depfile" 1032becc446Smrg rm -f "$tmpdepfile" 1042becc446Smrg else 1052becc446Smrg make_dummy_depfile 1062becc446Smrg fi 1072becc446Smrg} 1082becc446Smrg 1092becc446Smrg# A tabulation character. 1102becc446Smrgtab=' ' 1112becc446Smrg# A newline character. 1122becc446Smrgnl=' 1132becc446Smrg' 1142becc446Smrg# Character ranges might be problematic outside the C locale. 1152becc446Smrg# These definitions help. 1162becc446Smrgupper=ABCDEFGHIJKLMNOPQRSTUVWXYZ 1172becc446Smrglower=abcdefghijklmnopqrstuvwxyz 1182becc446Smrgalpha=${upper}${lower} 1192becc446Smrg 1202c7c4e3dSmrgif test -z "$depmode" || test -z "$source" || test -z "$object"; then 1212c7c4e3dSmrg echo "depcomp: Variables source, object and depmode must be set" 1>&2 1222c7c4e3dSmrg exit 1 1232c7c4e3dSmrgfi 1242c7c4e3dSmrg 1258650bb69Smrg# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. 1268650bb69Smrgdepfile=${depfile-`echo "$object" | 1278650bb69Smrg sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} 1282c7c4e3dSmrgtmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} 1292c7c4e3dSmrg 1302c7c4e3dSmrgrm -f "$tmpdepfile" 1312c7c4e3dSmrg 132c1e8faa6Smrg# Avoid interference from the environment. 1332becc446Smrggccflag= dashmflag= 1342becc446Smrg 1352c7c4e3dSmrg# Some modes work just like other modes, but use different flags. We 1362c7c4e3dSmrg# parameterize here, but still list the modes in the big case below, 1372c7c4e3dSmrg# to make depend.m4 easier to write. Note that we *cannot* use a case 1382c7c4e3dSmrg# here, because this file can only contain one case statement. 1392c7c4e3dSmrgif test "$depmode" = hp; then 1402c7c4e3dSmrg # HP compiler uses -M and no extra arg. 1412c7c4e3dSmrg gccflag=-M 1422c7c4e3dSmrg depmode=gcc 1432c7c4e3dSmrgfi 1442c7c4e3dSmrg 1452c7c4e3dSmrgif test "$depmode" = dashXmstdout; then 1462becc446Smrg # This is just like dashmstdout with a different argument. 1472becc446Smrg dashmflag=-xM 1482becc446Smrg depmode=dashmstdout 1492c7c4e3dSmrgfi 1502c7c4e3dSmrg 1518650bb69Smrgcygpath_u="cygpath -u -f -" 1528650bb69Smrgif test "$depmode" = msvcmsys; then 1532becc446Smrg # This is just like msvisualcpp but w/o cygpath translation. 1542becc446Smrg # Just convert the backslash-escaped backslashes to single forward 1552becc446Smrg # slashes to satisfy depend.m4 1562becc446Smrg cygpath_u='sed s,\\\\,/,g' 1572becc446Smrg depmode=msvisualcpp 1582becc446Smrgfi 1592becc446Smrg 1602becc446Smrgif test "$depmode" = msvc7msys; then 1612becc446Smrg # This is just like msvc7 but w/o cygpath translation. 1622becc446Smrg # Just convert the backslash-escaped backslashes to single forward 1632becc446Smrg # slashes to satisfy depend.m4 1642becc446Smrg cygpath_u='sed s,\\\\,/,g' 1652becc446Smrg depmode=msvc7 1662becc446Smrgfi 1672becc446Smrg 1682becc446Smrgif test "$depmode" = xlc; then 1692becc446Smrg # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information. 1702becc446Smrg gccflag=-qmakedep=gcc,-MF 1712becc446Smrg depmode=gcc 1728650bb69Smrgfi 1738650bb69Smrg 1742c7c4e3dSmrgcase "$depmode" in 1752c7c4e3dSmrggcc3) 1762c7c4e3dSmrg## gcc 3 implements dependency tracking that does exactly what 1772c7c4e3dSmrg## we want. Yay! Note: for some reason libtool 1.4 doesn't like 1782c7c4e3dSmrg## it if -MD -MP comes after the -MF stuff. Hmm. 1798650bb69Smrg## Unfortunately, FreeBSD c89 acceptance of flags depends upon 1808650bb69Smrg## the command line argument order; so add the flags where they 1818650bb69Smrg## appear in depend2.am. Note that the slowdown incurred here 1828650bb69Smrg## affects only configure: in makefiles, %FASTDEP% shortcuts this. 1838650bb69Smrg for arg 1848650bb69Smrg do 1858650bb69Smrg case $arg in 1868650bb69Smrg -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; 1878650bb69Smrg *) set fnord "$@" "$arg" ;; 1888650bb69Smrg esac 1898650bb69Smrg shift # fnord 1908650bb69Smrg shift # $arg 1918650bb69Smrg done 1928650bb69Smrg "$@" 1932c7c4e3dSmrg stat=$? 1942becc446Smrg if test $stat -ne 0; then 1952c7c4e3dSmrg rm -f "$tmpdepfile" 1962c7c4e3dSmrg exit $stat 1972c7c4e3dSmrg fi 1982c7c4e3dSmrg mv "$tmpdepfile" "$depfile" 1992c7c4e3dSmrg ;; 2002c7c4e3dSmrg 2012c7c4e3dSmrggcc) 202c1e8faa6Smrg## Note that this doesn't just cater to obsolete pre-3.x GCC compilers. 203c1e8faa6Smrg## but also to in-use compilers like IBM xlc/xlC and the HP C compiler. 2042becc446Smrg## (see the conditional assignment to $gccflag above). 2052c7c4e3dSmrg## There are various ways to get dependency output from gcc. Here's 2062c7c4e3dSmrg## why we pick this rather obscure method: 2072c7c4e3dSmrg## - Don't want to use -MD because we'd like the dependencies to end 2082c7c4e3dSmrg## up in a subdir. Having to rename by hand is ugly. 2092c7c4e3dSmrg## (We might end up doing this anyway to support other compilers.) 2102c7c4e3dSmrg## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like 2112becc446Smrg## -MM, not -M (despite what the docs say). Also, it might not be 2122becc446Smrg## supported by the other compilers which use the 'gcc' depmode. 2132c7c4e3dSmrg## - Using -M directly means running the compiler twice (even worse 2142c7c4e3dSmrg## than renaming). 2152c7c4e3dSmrg if test -z "$gccflag"; then 2162c7c4e3dSmrg gccflag=-MD, 2172c7c4e3dSmrg fi 2182c7c4e3dSmrg "$@" -Wp,"$gccflag$tmpdepfile" 2192c7c4e3dSmrg stat=$? 2202becc446Smrg if test $stat -ne 0; then 2212c7c4e3dSmrg rm -f "$tmpdepfile" 2222c7c4e3dSmrg exit $stat 2232c7c4e3dSmrg fi 2242c7c4e3dSmrg rm -f "$depfile" 2252c7c4e3dSmrg echo "$object : \\" > "$depfile" 2262becc446Smrg # The second -e expression handles DOS-style file names with drive 2272becc446Smrg # letters. 2282c7c4e3dSmrg sed -e 's/^[^:]*: / /' \ 2292c7c4e3dSmrg -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" 2302becc446Smrg## This next piece of magic avoids the "deleted header file" problem. 2312c7c4e3dSmrg## The problem is that when a header file which appears in a .P file 2322c7c4e3dSmrg## is deleted, the dependency causes make to die (because there is 2332c7c4e3dSmrg## typically no way to rebuild the header). We avoid this by adding 2342c7c4e3dSmrg## dummy dependencies for each header file. Too bad gcc doesn't do 2352c7c4e3dSmrg## this for us directly. 2362becc446Smrg## Some versions of gcc put a space before the ':'. On the theory 2372c7c4e3dSmrg## that the space means something, we add a space to the output as 2382becc446Smrg## well. hp depmode also adds that space, but also prefixes the VPATH 2392becc446Smrg## to the object. Take care to not repeat it in the output. 2402c7c4e3dSmrg## Some versions of the HPUX 10.20 sed can't process this invocation 2412c7c4e3dSmrg## correctly. Breaking it into two sed invocations is a workaround. 2422becc446Smrg tr ' ' "$nl" < "$tmpdepfile" \ 2432becc446Smrg | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ 2442becc446Smrg | sed -e 's/$/ :/' >> "$depfile" 2452c7c4e3dSmrg rm -f "$tmpdepfile" 2462c7c4e3dSmrg ;; 2472c7c4e3dSmrg 2482c7c4e3dSmrghp) 2492c7c4e3dSmrg # This case exists only to let depend.m4 do its work. It works by 2502c7c4e3dSmrg # looking at the text of this script. This case will never be run, 2512c7c4e3dSmrg # since it is checked for above. 2522c7c4e3dSmrg exit 1 2532c7c4e3dSmrg ;; 2542c7c4e3dSmrg 2552c7c4e3dSmrgsgi) 2562c7c4e3dSmrg if test "$libtool" = yes; then 2572c7c4e3dSmrg "$@" "-Wp,-MDupdate,$tmpdepfile" 2582c7c4e3dSmrg else 2592c7c4e3dSmrg "$@" -MDupdate "$tmpdepfile" 2602c7c4e3dSmrg fi 2612c7c4e3dSmrg stat=$? 2622becc446Smrg if test $stat -ne 0; then 2632c7c4e3dSmrg rm -f "$tmpdepfile" 2642c7c4e3dSmrg exit $stat 2652c7c4e3dSmrg fi 2662c7c4e3dSmrg rm -f "$depfile" 2672c7c4e3dSmrg 2682c7c4e3dSmrg if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files 2692c7c4e3dSmrg echo "$object : \\" > "$depfile" 2702c7c4e3dSmrg # Clip off the initial element (the dependent). Don't try to be 2712c7c4e3dSmrg # clever and replace this with sed code, as IRIX sed won't handle 2722c7c4e3dSmrg # lines with more than a fixed number of characters (4096 in 2732c7c4e3dSmrg # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; 2742becc446Smrg # the IRIX cc adds comments like '#:fec' to the end of the 2752c7c4e3dSmrg # dependency line. 2762becc446Smrg tr ' ' "$nl" < "$tmpdepfile" \ 2772becc446Smrg | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \ 2782becc446Smrg | tr "$nl" ' ' >> "$depfile" 2798650bb69Smrg echo >> "$depfile" 2802c7c4e3dSmrg # The second pass generates a dummy entry for each header file. 2812becc446Smrg tr ' ' "$nl" < "$tmpdepfile" \ 2822becc446Smrg | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ 2832becc446Smrg >> "$depfile" 2842c7c4e3dSmrg else 2852becc446Smrg make_dummy_depfile 2862c7c4e3dSmrg fi 2872c7c4e3dSmrg rm -f "$tmpdepfile" 2882c7c4e3dSmrg ;; 2892c7c4e3dSmrg 2902becc446Smrgxlc) 2912becc446Smrg # This case exists only to let depend.m4 do its work. It works by 2922becc446Smrg # looking at the text of this script. This case will never be run, 2932becc446Smrg # since it is checked for above. 2942becc446Smrg exit 1 2952becc446Smrg ;; 2962becc446Smrg 2972c7c4e3dSmrgaix) 2982c7c4e3dSmrg # The C for AIX Compiler uses -M and outputs the dependencies 2992c7c4e3dSmrg # in a .u file. In older versions, this file always lives in the 3002becc446Smrg # current directory. Also, the AIX compiler puts '$object:' at the 3012c7c4e3dSmrg # start of each line; $object doesn't have directory information. 3022c7c4e3dSmrg # Version 6 uses the directory in both cases. 3032becc446Smrg set_dir_from "$object" 3042becc446Smrg set_base_from "$object" 3052c7c4e3dSmrg if test "$libtool" = yes; then 3068650bb69Smrg tmpdepfile1=$dir$base.u 3078650bb69Smrg tmpdepfile2=$base.u 3088650bb69Smrg tmpdepfile3=$dir.libs/$base.u 3092c7c4e3dSmrg "$@" -Wc,-M 3102c7c4e3dSmrg else 3118650bb69Smrg tmpdepfile1=$dir$base.u 3128650bb69Smrg tmpdepfile2=$dir$base.u 3138650bb69Smrg tmpdepfile3=$dir$base.u 3142c7c4e3dSmrg "$@" -M 3152c7c4e3dSmrg fi 3162c7c4e3dSmrg stat=$? 3172becc446Smrg if test $stat -ne 0; then 3188650bb69Smrg rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 3192c7c4e3dSmrg exit $stat 3202c7c4e3dSmrg fi 3212c7c4e3dSmrg 3228650bb69Smrg for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 3238650bb69Smrg do 3248650bb69Smrg test -f "$tmpdepfile" && break 3258650bb69Smrg done 3262becc446Smrg aix_post_process_depfile 3272becc446Smrg ;; 3282becc446Smrg 3292becc446Smrgtcc) 3302becc446Smrg # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26 3312becc446Smrg # FIXME: That version still under development at the moment of writing. 3322becc446Smrg # Make that this statement remains true also for stable, released 3332becc446Smrg # versions. 3342becc446Smrg # It will wrap lines (doesn't matter whether long or short) with a 3352becc446Smrg # trailing '\', as in: 3362becc446Smrg # 3372becc446Smrg # foo.o : \ 3382becc446Smrg # foo.c \ 3392becc446Smrg # foo.h \ 3402becc446Smrg # 3412becc446Smrg # It will put a trailing '\' even on the last line, and will use leading 3422becc446Smrg # spaces rather than leading tabs (at least since its commit 0394caf7 3432becc446Smrg # "Emit spaces for -MD"). 3442becc446Smrg "$@" -MD -MF "$tmpdepfile" 3452becc446Smrg stat=$? 3462becc446Smrg if test $stat -ne 0; then 3472becc446Smrg rm -f "$tmpdepfile" 3482becc446Smrg exit $stat 3492c7c4e3dSmrg fi 3502becc446Smrg rm -f "$depfile" 3512becc446Smrg # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'. 3522becc446Smrg # We have to change lines of the first kind to '$object: \'. 3532becc446Smrg sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile" 3542becc446Smrg # And for each line of the second kind, we have to emit a 'dep.h:' 3552becc446Smrg # dummy dependency, to avoid the deleted-header problem. 3562becc446Smrg sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile" 3572c7c4e3dSmrg rm -f "$tmpdepfile" 3582c7c4e3dSmrg ;; 3592c7c4e3dSmrg 3602becc446Smrg## The order of this option in the case statement is important, since the 3612becc446Smrg## shell code in configure will try each of these formats in the order 3622becc446Smrg## listed in this file. A plain '-MD' option would be understood by many 3632becc446Smrg## compilers, so we must ensure this comes after the gcc and icc options. 3642becc446Smrgpgcc) 3652becc446Smrg # Portland's C compiler understands '-MD'. 3662becc446Smrg # Will always output deps to 'file.d' where file is the root name of the 3672becc446Smrg # source file under compilation, even if file resides in a subdirectory. 3682becc446Smrg # The object file name does not affect the name of the '.d' file. 3692becc446Smrg # pgcc 10.2 will output 3702c7c4e3dSmrg # foo.o: sub/foo.c sub/foo.h 3712becc446Smrg # and will wrap long lines using '\' : 3722c7c4e3dSmrg # foo.o: sub/foo.c ... \ 3732c7c4e3dSmrg # sub/foo.h ... \ 3742c7c4e3dSmrg # ... 3752becc446Smrg set_dir_from "$object" 3762becc446Smrg # Use the source, not the object, to determine the base name, since 3772becc446Smrg # that's sadly what pgcc will do too. 3782becc446Smrg set_base_from "$source" 3792becc446Smrg tmpdepfile=$base.d 3802becc446Smrg 3812becc446Smrg # For projects that build the same source file twice into different object 3822becc446Smrg # files, the pgcc approach of using the *source* file root name can cause 3832becc446Smrg # problems in parallel builds. Use a locking strategy to avoid stomping on 3842becc446Smrg # the same $tmpdepfile. 3852becc446Smrg lockdir=$base.d-lock 3862becc446Smrg trap " 3872becc446Smrg echo '$0: caught signal, cleaning up...' >&2 3882becc446Smrg rmdir '$lockdir' 3892becc446Smrg exit 1 3902becc446Smrg " 1 2 13 15 3912becc446Smrg numtries=100 3922becc446Smrg i=$numtries 3932becc446Smrg while test $i -gt 0; do 3942becc446Smrg # mkdir is a portable test-and-set. 3952becc446Smrg if mkdir "$lockdir" 2>/dev/null; then 3962becc446Smrg # This process acquired the lock. 3972becc446Smrg "$@" -MD 3982becc446Smrg stat=$? 3992becc446Smrg # Release the lock. 4002becc446Smrg rmdir "$lockdir" 4012becc446Smrg break 4022becc446Smrg else 4032becc446Smrg # If the lock is being held by a different process, wait 4042becc446Smrg # until the winning process is done or we timeout. 4052becc446Smrg while test -d "$lockdir" && test $i -gt 0; do 4062becc446Smrg sleep 1 4072becc446Smrg i=`expr $i - 1` 4082becc446Smrg done 4092becc446Smrg fi 4102becc446Smrg i=`expr $i - 1` 4112becc446Smrg done 4122becc446Smrg trap - 1 2 13 15 4132becc446Smrg if test $i -le 0; then 4142becc446Smrg echo "$0: failed to acquire lock after $numtries attempts" >&2 4152becc446Smrg echo "$0: check lockdir '$lockdir'" >&2 4162becc446Smrg exit 1 4172becc446Smrg fi 4182c7c4e3dSmrg 4192becc446Smrg if test $stat -ne 0; then 4202c7c4e3dSmrg rm -f "$tmpdepfile" 4212c7c4e3dSmrg exit $stat 4222c7c4e3dSmrg fi 4232c7c4e3dSmrg rm -f "$depfile" 4242c7c4e3dSmrg # Each line is of the form `foo.o: dependent.h', 4252c7c4e3dSmrg # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. 4262c7c4e3dSmrg # Do two passes, one to just change these to 4272c7c4e3dSmrg # `$object: dependent.h' and one to simply `dependent.h:'. 4282c7c4e3dSmrg sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" 4292c7c4e3dSmrg # Some versions of the HPUX 10.20 sed can't process this invocation 4302c7c4e3dSmrg # correctly. Breaking it into two sed invocations is a workaround. 4312becc446Smrg sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \ 4322becc446Smrg | sed -e 's/$/ :/' >> "$depfile" 4332c7c4e3dSmrg rm -f "$tmpdepfile" 4342c7c4e3dSmrg ;; 4352c7c4e3dSmrg 4368650bb69Smrghp2) 4378650bb69Smrg # The "hp" stanza above does not work with aCC (C++) and HP's ia64 4388650bb69Smrg # compilers, which have integrated preprocessors. The correct option 4398650bb69Smrg # to use with these is +Maked; it writes dependencies to a file named 4408650bb69Smrg # 'foo.d', which lands next to the object file, wherever that 4418650bb69Smrg # happens to be. 4428650bb69Smrg # Much of this is similar to the tru64 case; see comments there. 4432becc446Smrg set_dir_from "$object" 4442becc446Smrg set_base_from "$object" 4458650bb69Smrg if test "$libtool" = yes; then 4468650bb69Smrg tmpdepfile1=$dir$base.d 4478650bb69Smrg tmpdepfile2=$dir.libs/$base.d 4488650bb69Smrg "$@" -Wc,+Maked 4498650bb69Smrg else 4508650bb69Smrg tmpdepfile1=$dir$base.d 4518650bb69Smrg tmpdepfile2=$dir$base.d 4528650bb69Smrg "$@" +Maked 4538650bb69Smrg fi 4548650bb69Smrg stat=$? 4552becc446Smrg if test $stat -ne 0; then 4568650bb69Smrg rm -f "$tmpdepfile1" "$tmpdepfile2" 4578650bb69Smrg exit $stat 4588650bb69Smrg fi 4598650bb69Smrg 4608650bb69Smrg for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" 4618650bb69Smrg do 4628650bb69Smrg test -f "$tmpdepfile" && break 4638650bb69Smrg done 4648650bb69Smrg if test -f "$tmpdepfile"; then 4652becc446Smrg sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile" 4662becc446Smrg # Add 'dependent.h:' lines. 4678650bb69Smrg sed -ne '2,${ 4682becc446Smrg s/^ *// 4692becc446Smrg s/ \\*$// 4702becc446Smrg s/$/:/ 4712becc446Smrg p 4722becc446Smrg }' "$tmpdepfile" >> "$depfile" 4738650bb69Smrg else 4742becc446Smrg make_dummy_depfile 4758650bb69Smrg fi 4768650bb69Smrg rm -f "$tmpdepfile" "$tmpdepfile2" 4778650bb69Smrg ;; 4788650bb69Smrg 4792c7c4e3dSmrgtru64) 4802becc446Smrg # The Tru64 compiler uses -MD to generate dependencies as a side 4812becc446Smrg # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. 4822becc446Smrg # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put 4832becc446Smrg # dependencies in 'foo.d' instead, so we check for that too. 4842becc446Smrg # Subdirectories are respected. 4852becc446Smrg set_dir_from "$object" 4862becc446Smrg set_base_from "$object" 4872becc446Smrg 4882becc446Smrg if test "$libtool" = yes; then 4892becc446Smrg # Libtool generates 2 separate objects for the 2 libraries. These 4902becc446Smrg # two compilations output dependencies in $dir.libs/$base.o.d and 4912becc446Smrg # in $dir$base.o.d. We have to check for both files, because 4922becc446Smrg # one of the two compilations can be disabled. We should prefer 4932becc446Smrg # $dir$base.o.d over $dir.libs/$base.o.d because the latter is 4942becc446Smrg # automatically cleaned when .libs/ is deleted, while ignoring 4952becc446Smrg # the former would cause a distcleancheck panic. 4962becc446Smrg tmpdepfile1=$dir$base.o.d # libtool 1.5 4972becc446Smrg tmpdepfile2=$dir.libs/$base.o.d # Likewise. 4982becc446Smrg tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504 4992becc446Smrg "$@" -Wc,-MD 5002becc446Smrg else 5012becc446Smrg tmpdepfile1=$dir$base.d 5022becc446Smrg tmpdepfile2=$dir$base.d 5032becc446Smrg tmpdepfile3=$dir$base.d 5042becc446Smrg "$@" -MD 5052becc446Smrg fi 5062becc446Smrg 5072becc446Smrg stat=$? 5082becc446Smrg if test $stat -ne 0; then 5092becc446Smrg rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 5102becc446Smrg exit $stat 5112becc446Smrg fi 5122becc446Smrg 5132becc446Smrg for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 5142becc446Smrg do 5152becc446Smrg test -f "$tmpdepfile" && break 5162becc446Smrg done 5172becc446Smrg # Same post-processing that is required for AIX mode. 5182becc446Smrg aix_post_process_depfile 5192becc446Smrg ;; 5202becc446Smrg 5212becc446Smrgmsvc7) 5222becc446Smrg if test "$libtool" = yes; then 5232becc446Smrg showIncludes=-Wc,-showIncludes 5242becc446Smrg else 5252becc446Smrg showIncludes=-showIncludes 5262becc446Smrg fi 5272becc446Smrg "$@" $showIncludes > "$tmpdepfile" 5282becc446Smrg stat=$? 5292becc446Smrg grep -v '^Note: including file: ' "$tmpdepfile" 5302becc446Smrg if test $stat -ne 0; then 5312becc446Smrg rm -f "$tmpdepfile" 5322becc446Smrg exit $stat 5332becc446Smrg fi 5342becc446Smrg rm -f "$depfile" 5352becc446Smrg echo "$object : \\" > "$depfile" 5362becc446Smrg # The first sed program below extracts the file names and escapes 5372becc446Smrg # backslashes for cygpath. The second sed program outputs the file 5382becc446Smrg # name when reading, but also accumulates all include files in the 5392becc446Smrg # hold buffer in order to output them again at the end. This only 5402becc446Smrg # works with sed implementations that can handle large buffers. 5412becc446Smrg sed < "$tmpdepfile" -n ' 5422becc446Smrg/^Note: including file: *\(.*\)/ { 5432becc446Smrg s//\1/ 5442becc446Smrg s/\\/\\\\/g 5452becc446Smrg p 5462becc446Smrg}' | $cygpath_u | sort -u | sed -n ' 5472becc446Smrgs/ /\\ /g 5482becc446Smrgs/\(.*\)/'"$tab"'\1 \\/p 5492becc446Smrgs/.\(.*\) \\/\1:/ 5502becc446SmrgH 5512becc446Smrg$ { 5522becc446Smrg s/.*/'"$tab"'/ 5532becc446Smrg G 5542becc446Smrg p 5552becc446Smrg}' >> "$depfile" 5562becc446Smrg echo >> "$depfile" # make sure the fragment doesn't end with a backslash 5572becc446Smrg rm -f "$tmpdepfile" 5582becc446Smrg ;; 5592becc446Smrg 5602becc446Smrgmsvc7msys) 5612becc446Smrg # This case exists only to let depend.m4 do its work. It works by 5622becc446Smrg # looking at the text of this script. This case will never be run, 5632becc446Smrg # since it is checked for above. 5642becc446Smrg exit 1 5652becc446Smrg ;; 5662c7c4e3dSmrg 5672c7c4e3dSmrg#nosideeffect) 5682c7c4e3dSmrg # This comment above is used by automake to tell side-effect 5692c7c4e3dSmrg # dependency tracking mechanisms from slower ones. 5702c7c4e3dSmrg 5712c7c4e3dSmrgdashmstdout) 5722c7c4e3dSmrg # Important note: in order to support this mode, a compiler *must* 5732c7c4e3dSmrg # always write the preprocessed file to stdout, regardless of -o. 5742c7c4e3dSmrg "$@" || exit $? 5752c7c4e3dSmrg 5762c7c4e3dSmrg # Remove the call to Libtool. 5772c7c4e3dSmrg if test "$libtool" = yes; then 5788650bb69Smrg while test "X$1" != 'X--mode=compile'; do 5792c7c4e3dSmrg shift 5802c7c4e3dSmrg done 5812c7c4e3dSmrg shift 5822c7c4e3dSmrg fi 5832c7c4e3dSmrg 5842becc446Smrg # Remove '-o $object'. 5852c7c4e3dSmrg IFS=" " 5862c7c4e3dSmrg for arg 5872c7c4e3dSmrg do 5882c7c4e3dSmrg case $arg in 5892c7c4e3dSmrg -o) 5902c7c4e3dSmrg shift 5912c7c4e3dSmrg ;; 5922c7c4e3dSmrg $object) 5932c7c4e3dSmrg shift 5942c7c4e3dSmrg ;; 5952c7c4e3dSmrg *) 5962c7c4e3dSmrg set fnord "$@" "$arg" 5972c7c4e3dSmrg shift # fnord 5982c7c4e3dSmrg shift # $arg 5992c7c4e3dSmrg ;; 6002c7c4e3dSmrg esac 6012c7c4e3dSmrg done 6022c7c4e3dSmrg 6032c7c4e3dSmrg test -z "$dashmflag" && dashmflag=-M 6042becc446Smrg # Require at least two characters before searching for ':' 6052c7c4e3dSmrg # in the target name. This is to cope with DOS-style filenames: 6062becc446Smrg # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. 6072c7c4e3dSmrg "$@" $dashmflag | 6082becc446Smrg sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile" 6092c7c4e3dSmrg rm -f "$depfile" 6102c7c4e3dSmrg cat < "$tmpdepfile" > "$depfile" 6112becc446Smrg # Some versions of the HPUX 10.20 sed can't process this sed invocation 6122becc446Smrg # correctly. Breaking it into two sed invocations is a workaround. 6132becc446Smrg tr ' ' "$nl" < "$tmpdepfile" \ 6142becc446Smrg | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ 6152becc446Smrg | sed -e 's/$/ :/' >> "$depfile" 6162c7c4e3dSmrg rm -f "$tmpdepfile" 6172c7c4e3dSmrg ;; 6182c7c4e3dSmrg 6192c7c4e3dSmrgdashXmstdout) 6202c7c4e3dSmrg # This case only exists to satisfy depend.m4. It is never actually 6212c7c4e3dSmrg # run, as this mode is specially recognized in the preamble. 6222c7c4e3dSmrg exit 1 6232c7c4e3dSmrg ;; 6242c7c4e3dSmrg 6252c7c4e3dSmrgmakedepend) 6262c7c4e3dSmrg "$@" || exit $? 6272c7c4e3dSmrg # Remove any Libtool call 6282c7c4e3dSmrg if test "$libtool" = yes; then 6298650bb69Smrg while test "X$1" != 'X--mode=compile'; do 6302c7c4e3dSmrg shift 6312c7c4e3dSmrg done 6322c7c4e3dSmrg shift 6332c7c4e3dSmrg fi 6342c7c4e3dSmrg # X makedepend 6352c7c4e3dSmrg shift 6368650bb69Smrg cleared=no eat=no 6378650bb69Smrg for arg 6388650bb69Smrg do 6392c7c4e3dSmrg case $cleared in 6402c7c4e3dSmrg no) 6412c7c4e3dSmrg set ""; shift 6422c7c4e3dSmrg cleared=yes ;; 6432c7c4e3dSmrg esac 6448650bb69Smrg if test $eat = yes; then 6458650bb69Smrg eat=no 6468650bb69Smrg continue 6478650bb69Smrg fi 6482c7c4e3dSmrg case "$arg" in 6492c7c4e3dSmrg -D*|-I*) 6502c7c4e3dSmrg set fnord "$@" "$arg"; shift ;; 6512c7c4e3dSmrg # Strip any option that makedepend may not understand. Remove 6522c7c4e3dSmrg # the object too, otherwise makedepend will parse it as a source file. 6538650bb69Smrg -arch) 6548650bb69Smrg eat=yes ;; 6552c7c4e3dSmrg -*|$object) 6562c7c4e3dSmrg ;; 6572c7c4e3dSmrg *) 6582c7c4e3dSmrg set fnord "$@" "$arg"; shift ;; 6592c7c4e3dSmrg esac 6602c7c4e3dSmrg done 6618650bb69Smrg obj_suffix=`echo "$object" | sed 's/^.*\././'` 6622c7c4e3dSmrg touch "$tmpdepfile" 6632c7c4e3dSmrg ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" 6642c7c4e3dSmrg rm -f "$depfile" 6652becc446Smrg # makedepend may prepend the VPATH from the source file name to the object. 6662becc446Smrg # No need to regex-escape $object, excess matching of '.' is harmless. 6672becc446Smrg sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" 6682becc446Smrg # Some versions of the HPUX 10.20 sed can't process the last invocation 6692becc446Smrg # correctly. Breaking it into two sed invocations is a workaround. 6702becc446Smrg sed '1,2d' "$tmpdepfile" \ 6712becc446Smrg | tr ' ' "$nl" \ 6722becc446Smrg | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ 6732becc446Smrg | sed -e 's/$/ :/' >> "$depfile" 6742c7c4e3dSmrg rm -f "$tmpdepfile" "$tmpdepfile".bak 6752c7c4e3dSmrg ;; 6762c7c4e3dSmrg 6772c7c4e3dSmrgcpp) 6782c7c4e3dSmrg # Important note: in order to support this mode, a compiler *must* 6792c7c4e3dSmrg # always write the preprocessed file to stdout. 6802c7c4e3dSmrg "$@" || exit $? 6812c7c4e3dSmrg 6822c7c4e3dSmrg # Remove the call to Libtool. 6832c7c4e3dSmrg if test "$libtool" = yes; then 6848650bb69Smrg while test "X$1" != 'X--mode=compile'; do 6852c7c4e3dSmrg shift 6862c7c4e3dSmrg done 6872c7c4e3dSmrg shift 6882c7c4e3dSmrg fi 6892c7c4e3dSmrg 6902becc446Smrg # Remove '-o $object'. 6912c7c4e3dSmrg IFS=" " 6922c7c4e3dSmrg for arg 6932c7c4e3dSmrg do 6942c7c4e3dSmrg case $arg in 6952c7c4e3dSmrg -o) 6962c7c4e3dSmrg shift 6972c7c4e3dSmrg ;; 6982c7c4e3dSmrg $object) 6992c7c4e3dSmrg shift 7002c7c4e3dSmrg ;; 7012c7c4e3dSmrg *) 7022c7c4e3dSmrg set fnord "$@" "$arg" 7032c7c4e3dSmrg shift # fnord 7042c7c4e3dSmrg shift # $arg 7052c7c4e3dSmrg ;; 7062c7c4e3dSmrg esac 7072c7c4e3dSmrg done 7082c7c4e3dSmrg 7092becc446Smrg "$@" -E \ 7102becc446Smrg | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ 7112becc446Smrg -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ 7122becc446Smrg | sed '$ s: \\$::' > "$tmpdepfile" 7132c7c4e3dSmrg rm -f "$depfile" 7142c7c4e3dSmrg echo "$object : \\" > "$depfile" 7152c7c4e3dSmrg cat < "$tmpdepfile" >> "$depfile" 7162c7c4e3dSmrg sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" 7172c7c4e3dSmrg rm -f "$tmpdepfile" 7182c7c4e3dSmrg ;; 7192c7c4e3dSmrg 7202c7c4e3dSmrgmsvisualcpp) 7212c7c4e3dSmrg # Important note: in order to support this mode, a compiler *must* 7228650bb69Smrg # always write the preprocessed file to stdout. 7232c7c4e3dSmrg "$@" || exit $? 7248650bb69Smrg 7258650bb69Smrg # Remove the call to Libtool. 7268650bb69Smrg if test "$libtool" = yes; then 7278650bb69Smrg while test "X$1" != 'X--mode=compile'; do 7288650bb69Smrg shift 7298650bb69Smrg done 7308650bb69Smrg shift 7318650bb69Smrg fi 7328650bb69Smrg 7332c7c4e3dSmrg IFS=" " 7342c7c4e3dSmrg for arg 7352c7c4e3dSmrg do 7362c7c4e3dSmrg case "$arg" in 7378650bb69Smrg -o) 7388650bb69Smrg shift 7398650bb69Smrg ;; 7408650bb69Smrg $object) 7418650bb69Smrg shift 7428650bb69Smrg ;; 7432c7c4e3dSmrg "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") 7442becc446Smrg set fnord "$@" 7452becc446Smrg shift 7462becc446Smrg shift 7472becc446Smrg ;; 7482c7c4e3dSmrg *) 7492becc446Smrg set fnord "$@" "$arg" 7502becc446Smrg shift 7512becc446Smrg shift 7522becc446Smrg ;; 7532c7c4e3dSmrg esac 7542c7c4e3dSmrg done 7558650bb69Smrg "$@" -E 2>/dev/null | 7568650bb69Smrg sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" 7572c7c4e3dSmrg rm -f "$depfile" 7582c7c4e3dSmrg echo "$object : \\" > "$depfile" 7592becc446Smrg sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" 7602becc446Smrg echo "$tab" >> "$depfile" 7618650bb69Smrg sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" 7622c7c4e3dSmrg rm -f "$tmpdepfile" 7632c7c4e3dSmrg ;; 7642c7c4e3dSmrg 7658650bb69Smrgmsvcmsys) 7668650bb69Smrg # This case exists only to let depend.m4 do its work. It works by 7678650bb69Smrg # looking at the text of this script. This case will never be run, 7688650bb69Smrg # since it is checked for above. 7698650bb69Smrg exit 1 7708650bb69Smrg ;; 7718650bb69Smrg 7722c7c4e3dSmrgnone) 7732c7c4e3dSmrg exec "$@" 7742c7c4e3dSmrg ;; 7752c7c4e3dSmrg 7762c7c4e3dSmrg*) 7772c7c4e3dSmrg echo "Unknown depmode $depmode" 1>&2 7782c7c4e3dSmrg exit 1 7792c7c4e3dSmrg ;; 7802c7c4e3dSmrgesac 7812c7c4e3dSmrg 7822c7c4e3dSmrgexit 0 7838650bb69Smrg 7848650bb69Smrg# Local Variables: 7858650bb69Smrg# mode: shell-script 7868650bb69Smrg# sh-indentation: 2 7873458e6c2Smrg# eval: (add-hook 'before-save-hook 'time-stamp) 7888650bb69Smrg# time-stamp-start: "scriptversion=" 7898650bb69Smrg# time-stamp-format: "%:y-%02m-%02d.%02H" 7903458e6c2Smrg# time-stamp-time-zone: "UTC0" 7918650bb69Smrg# time-stamp-end: "; # UTC" 7928650bb69Smrg# End: 793