15dfecf96Smrg#! /bin/sh 25dfecf96Smrg# depcomp - compile a program generating dependencies as side-effects 35dfecf96Smrg 496d43ffdSmrgscriptversion=2018-03-07.03; # UTC 55dfecf96Smrg 696d43ffdSmrg# Copyright (C) 1999-2021 Free Software Foundation, Inc. 75dfecf96Smrg 85dfecf96Smrg# This program is free software; you can redistribute it and/or modify 95dfecf96Smrg# it under the terms of the GNU General Public License as published by 105dfecf96Smrg# the Free Software Foundation; either version 2, or (at your option) 115dfecf96Smrg# any later version. 125dfecf96Smrg 135dfecf96Smrg# This program is distributed in the hope that it will be useful, 145dfecf96Smrg# but WITHOUT ANY WARRANTY; without even the implied warranty of 155dfecf96Smrg# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 165dfecf96Smrg# GNU General Public License for more details. 175dfecf96Smrg 185dfecf96Smrg# You should have received a copy of the GNU General Public License 1996d43ffdSmrg# along with this program. If not, see <https://www.gnu.org/licenses/>. 205dfecf96Smrg 215dfecf96Smrg# As a special exception to the GNU General Public License, if you 225dfecf96Smrg# distribute this file as part of a program that contains a 235dfecf96Smrg# configuration script generated by Autoconf, you may include it under 245dfecf96Smrg# the same distribution terms that you use for the rest of that program. 255dfecf96Smrg 265dfecf96Smrg# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>. 275dfecf96Smrg 285dfecf96Smrgcase $1 in 295dfecf96Smrg '') 30f765521fSmrg echo "$0: No command. Try '$0 --help' for more information." 1>&2 31f765521fSmrg exit 1; 32f765521fSmrg ;; 335dfecf96Smrg -h | --h*) 345dfecf96Smrg cat <<\EOF 355dfecf96SmrgUsage: depcomp [--help] [--version] PROGRAM [ARGS] 365dfecf96Smrg 375dfecf96SmrgRun PROGRAMS ARGS to compile a file, generating dependencies 385dfecf96Smrgas side-effects. 395dfecf96Smrg 405dfecf96SmrgEnvironment variables: 415dfecf96Smrg depmode Dependency tracking mode. 42f765521fSmrg source Source file read by 'PROGRAMS ARGS'. 43f765521fSmrg object Object file output by 'PROGRAMS ARGS'. 445dfecf96Smrg DEPDIR directory where to store dependencies. 455dfecf96Smrg depfile Dependency file to output. 4631de2854Smrg tmpdepfile Temporary file to use when outputting dependencies. 475dfecf96Smrg libtool Whether libtool is used (yes/no). 485dfecf96Smrg 495dfecf96SmrgReport bugs to <bug-automake@gnu.org>. 505dfecf96SmrgEOF 515dfecf96Smrg exit $? 525dfecf96Smrg ;; 535dfecf96Smrg -v | --v*) 545dfecf96Smrg echo "depcomp $scriptversion" 555dfecf96Smrg exit $? 565dfecf96Smrg ;; 575dfecf96Smrgesac 585dfecf96Smrg 59f765521fSmrg# Get the directory component of the given path, and save it in the 60f765521fSmrg# global variables '$dir'. Note that this directory component will 61f765521fSmrg# be either empty or ending with a '/' character. This is deliberate. 62f765521fSmrgset_dir_from () 63f765521fSmrg{ 64f765521fSmrg case $1 in 65f765521fSmrg */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;; 66f765521fSmrg *) dir=;; 67f765521fSmrg esac 68f765521fSmrg} 69f765521fSmrg 70f765521fSmrg# Get the suffix-stripped basename of the given path, and save it the 71f765521fSmrg# global variable '$base'. 72f765521fSmrgset_base_from () 73f765521fSmrg{ 74f765521fSmrg base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'` 75f765521fSmrg} 76f765521fSmrg 77f765521fSmrg# If no dependency file was actually created by the compiler invocation, 78f765521fSmrg# we still have to create a dummy depfile, to avoid errors with the 79f765521fSmrg# Makefile "include basename.Plo" scheme. 80f765521fSmrgmake_dummy_depfile () 81f765521fSmrg{ 82f765521fSmrg echo "#dummy" > "$depfile" 83f765521fSmrg} 84f765521fSmrg 85f765521fSmrg# Factor out some common post-processing of the generated depfile. 86f765521fSmrg# Requires the auxiliary global variable '$tmpdepfile' to be set. 87f765521fSmrgaix_post_process_depfile () 88f765521fSmrg{ 89f765521fSmrg # If the compiler actually managed to produce a dependency file, 90f765521fSmrg # post-process it. 91f765521fSmrg if test -f "$tmpdepfile"; then 92f765521fSmrg # Each line is of the form 'foo.o: dependency.h'. 93f765521fSmrg # Do two passes, one to just change these to 94f765521fSmrg # $object: dependency.h 95f765521fSmrg # and one to simply output 96f765521fSmrg # dependency.h: 97f765521fSmrg # which is needed to avoid the deleted-header problem. 98f765521fSmrg { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile" 99f765521fSmrg sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile" 100f765521fSmrg } > "$depfile" 101f765521fSmrg rm -f "$tmpdepfile" 102f765521fSmrg else 103f765521fSmrg make_dummy_depfile 104f765521fSmrg fi 105f765521fSmrg} 106f765521fSmrg 107f765521fSmrg# A tabulation character. 108f765521fSmrgtab=' ' 109f765521fSmrg# A newline character. 110f765521fSmrgnl=' 111f765521fSmrg' 112f765521fSmrg# Character ranges might be problematic outside the C locale. 113f765521fSmrg# These definitions help. 114f765521fSmrgupper=ABCDEFGHIJKLMNOPQRSTUVWXYZ 115f765521fSmrglower=abcdefghijklmnopqrstuvwxyz 116f765521fSmrgdigits=0123456789 117f765521fSmrgalpha=${upper}${lower} 118f765521fSmrg 1195dfecf96Smrgif test -z "$depmode" || test -z "$source" || test -z "$object"; then 1205dfecf96Smrg echo "depcomp: Variables source, object and depmode must be set" 1>&2 1215dfecf96Smrg exit 1 1225dfecf96Smrgfi 1235dfecf96Smrg 1245dfecf96Smrg# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. 1255dfecf96Smrgdepfile=${depfile-`echo "$object" | 1265dfecf96Smrg sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} 1275dfecf96Smrgtmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} 1285dfecf96Smrg 1295dfecf96Smrgrm -f "$tmpdepfile" 1305dfecf96Smrg 131f765521fSmrg# Avoid interferences from the environment. 132f765521fSmrggccflag= dashmflag= 133f765521fSmrg 1345dfecf96Smrg# Some modes work just like other modes, but use different flags. We 1355dfecf96Smrg# parameterize here, but still list the modes in the big case below, 1365dfecf96Smrg# to make depend.m4 easier to write. Note that we *cannot* use a case 1375dfecf96Smrg# here, because this file can only contain one case statement. 1385dfecf96Smrgif test "$depmode" = hp; then 1395dfecf96Smrg # HP compiler uses -M and no extra arg. 1405dfecf96Smrg gccflag=-M 1415dfecf96Smrg depmode=gcc 1425dfecf96Smrgfi 1435dfecf96Smrg 1445dfecf96Smrgif test "$depmode" = dashXmstdout; then 145f765521fSmrg # This is just like dashmstdout with a different argument. 146f765521fSmrg dashmflag=-xM 147f765521fSmrg depmode=dashmstdout 1485dfecf96Smrgfi 1495dfecf96Smrg 150c05e22d7Smrgcygpath_u="cygpath -u -f -" 151c05e22d7Smrgif test "$depmode" = msvcmsys; then 152f765521fSmrg # This is just like msvisualcpp but w/o cygpath translation. 153f765521fSmrg # Just convert the backslash-escaped backslashes to single forward 154f765521fSmrg # slashes to satisfy depend.m4 155f765521fSmrg cygpath_u='sed s,\\\\,/,g' 156f765521fSmrg depmode=msvisualcpp 157c05e22d7Smrgfi 158c05e22d7Smrg 15931de2854Smrgif test "$depmode" = msvc7msys; then 160f765521fSmrg # This is just like msvc7 but w/o cygpath translation. 161f765521fSmrg # Just convert the backslash-escaped backslashes to single forward 162f765521fSmrg # slashes to satisfy depend.m4 163f765521fSmrg cygpath_u='sed s,\\\\,/,g' 164f765521fSmrg depmode=msvc7 165f765521fSmrgfi 166f765521fSmrg 167f765521fSmrgif test "$depmode" = xlc; then 168f765521fSmrg # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information. 169f765521fSmrg gccflag=-qmakedep=gcc,-MF 170f765521fSmrg depmode=gcc 17131de2854Smrgfi 17231de2854Smrg 1735dfecf96Smrgcase "$depmode" in 1745dfecf96Smrggcc3) 1755dfecf96Smrg## gcc 3 implements dependency tracking that does exactly what 1765dfecf96Smrg## we want. Yay! Note: for some reason libtool 1.4 doesn't like 1775dfecf96Smrg## it if -MD -MP comes after the -MF stuff. Hmm. 178f14f4646Smrg## Unfortunately, FreeBSD c89 acceptance of flags depends upon 179f14f4646Smrg## the command line argument order; so add the flags where they 180f14f4646Smrg## appear in depend2.am. Note that the slowdown incurred here 181f14f4646Smrg## affects only configure: in makefiles, %FASTDEP% shortcuts this. 182f14f4646Smrg for arg 183f14f4646Smrg do 184f14f4646Smrg case $arg in 185f14f4646Smrg -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; 186f14f4646Smrg *) set fnord "$@" "$arg" ;; 187f14f4646Smrg esac 188f14f4646Smrg shift # fnord 189f14f4646Smrg shift # $arg 190f14f4646Smrg done 191f14f4646Smrg "$@" 1925dfecf96Smrg stat=$? 193f765521fSmrg if test $stat -ne 0; then 1945dfecf96Smrg rm -f "$tmpdepfile" 1955dfecf96Smrg exit $stat 1965dfecf96Smrg fi 1975dfecf96Smrg mv "$tmpdepfile" "$depfile" 1985dfecf96Smrg ;; 1995dfecf96Smrg 2005dfecf96Smrggcc) 201f765521fSmrg## Note that this doesn't just cater to obsosete pre-3.x GCC compilers. 202f765521fSmrg## but also to in-use compilers like IMB xlc/xlC and the HP C compiler. 203f765521fSmrg## (see the conditional assignment to $gccflag above). 2045dfecf96Smrg## There are various ways to get dependency output from gcc. Here's 2055dfecf96Smrg## why we pick this rather obscure method: 2065dfecf96Smrg## - Don't want to use -MD because we'd like the dependencies to end 2075dfecf96Smrg## up in a subdir. Having to rename by hand is ugly. 2085dfecf96Smrg## (We might end up doing this anyway to support other compilers.) 2095dfecf96Smrg## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like 210f765521fSmrg## -MM, not -M (despite what the docs say). Also, it might not be 211f765521fSmrg## supported by the other compilers which use the 'gcc' depmode. 2125dfecf96Smrg## - Using -M directly means running the compiler twice (even worse 2135dfecf96Smrg## than renaming). 2145dfecf96Smrg if test -z "$gccflag"; then 2155dfecf96Smrg gccflag=-MD, 2165dfecf96Smrg fi 2175dfecf96Smrg "$@" -Wp,"$gccflag$tmpdepfile" 2185dfecf96Smrg stat=$? 219f765521fSmrg if test $stat -ne 0; then 2205dfecf96Smrg rm -f "$tmpdepfile" 2215dfecf96Smrg exit $stat 2225dfecf96Smrg fi 2235dfecf96Smrg rm -f "$depfile" 2245dfecf96Smrg echo "$object : \\" > "$depfile" 225f765521fSmrg # The second -e expression handles DOS-style file names with drive 226f765521fSmrg # letters. 2275dfecf96Smrg sed -e 's/^[^:]*: / /' \ 2285dfecf96Smrg -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" 229f765521fSmrg## This next piece of magic avoids the "deleted header file" problem. 2305dfecf96Smrg## The problem is that when a header file which appears in a .P file 2315dfecf96Smrg## is deleted, the dependency causes make to die (because there is 2325dfecf96Smrg## typically no way to rebuild the header). We avoid this by adding 2335dfecf96Smrg## dummy dependencies for each header file. Too bad gcc doesn't do 2345dfecf96Smrg## this for us directly. 235f765521fSmrg## Some versions of gcc put a space before the ':'. On the theory 2365dfecf96Smrg## that the space means something, we add a space to the output as 23731de2854Smrg## well. hp depmode also adds that space, but also prefixes the VPATH 23831de2854Smrg## to the object. Take care to not repeat it in the output. 2395dfecf96Smrg## Some versions of the HPUX 10.20 sed can't process this invocation 2405dfecf96Smrg## correctly. Breaking it into two sed invocations is a workaround. 241f765521fSmrg tr ' ' "$nl" < "$tmpdepfile" \ 242f765521fSmrg | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ 243f765521fSmrg | sed -e 's/$/ :/' >> "$depfile" 2445dfecf96Smrg rm -f "$tmpdepfile" 2455dfecf96Smrg ;; 2465dfecf96Smrg 2475dfecf96Smrghp) 2485dfecf96Smrg # This case exists only to let depend.m4 do its work. It works by 2495dfecf96Smrg # looking at the text of this script. This case will never be run, 2505dfecf96Smrg # since it is checked for above. 2515dfecf96Smrg exit 1 2525dfecf96Smrg ;; 2535dfecf96Smrg 2545dfecf96Smrgsgi) 2555dfecf96Smrg if test "$libtool" = yes; then 2565dfecf96Smrg "$@" "-Wp,-MDupdate,$tmpdepfile" 2575dfecf96Smrg else 2585dfecf96Smrg "$@" -MDupdate "$tmpdepfile" 2595dfecf96Smrg fi 2605dfecf96Smrg stat=$? 261f765521fSmrg if test $stat -ne 0; then 2625dfecf96Smrg rm -f "$tmpdepfile" 2635dfecf96Smrg exit $stat 2645dfecf96Smrg fi 2655dfecf96Smrg rm -f "$depfile" 2665dfecf96Smrg 2675dfecf96Smrg if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files 2685dfecf96Smrg echo "$object : \\" > "$depfile" 2695dfecf96Smrg # Clip off the initial element (the dependent). Don't try to be 2705dfecf96Smrg # clever and replace this with sed code, as IRIX sed won't handle 2715dfecf96Smrg # lines with more than a fixed number of characters (4096 in 2725dfecf96Smrg # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; 273f765521fSmrg # the IRIX cc adds comments like '#:fec' to the end of the 2745dfecf96Smrg # dependency line. 275f765521fSmrg tr ' ' "$nl" < "$tmpdepfile" \ 276f765521fSmrg | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \ 277f765521fSmrg | tr "$nl" ' ' >> "$depfile" 278c05e22d7Smrg echo >> "$depfile" 2795dfecf96Smrg # The second pass generates a dummy entry for each header file. 280f765521fSmrg tr ' ' "$nl" < "$tmpdepfile" \ 281f765521fSmrg | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ 282f765521fSmrg >> "$depfile" 2835dfecf96Smrg else 284f765521fSmrg make_dummy_depfile 2855dfecf96Smrg fi 2865dfecf96Smrg rm -f "$tmpdepfile" 2875dfecf96Smrg ;; 2885dfecf96Smrg 289f765521fSmrgxlc) 290f765521fSmrg # This case exists only to let depend.m4 do its work. It works by 291f765521fSmrg # looking at the text of this script. This case will never be run, 292f765521fSmrg # since it is checked for above. 293f765521fSmrg exit 1 294f765521fSmrg ;; 295f765521fSmrg 2965dfecf96Smrgaix) 2975dfecf96Smrg # The C for AIX Compiler uses -M and outputs the dependencies 2985dfecf96Smrg # in a .u file. In older versions, this file always lives in the 299f765521fSmrg # current directory. Also, the AIX compiler puts '$object:' at the 3005dfecf96Smrg # start of each line; $object doesn't have directory information. 3015dfecf96Smrg # Version 6 uses the directory in both cases. 302f765521fSmrg set_dir_from "$object" 303f765521fSmrg set_base_from "$object" 3045dfecf96Smrg if test "$libtool" = yes; then 305f14f4646Smrg tmpdepfile1=$dir$base.u 306f14f4646Smrg tmpdepfile2=$base.u 307f14f4646Smrg tmpdepfile3=$dir.libs/$base.u 3085dfecf96Smrg "$@" -Wc,-M 3095dfecf96Smrg else 310f14f4646Smrg tmpdepfile1=$dir$base.u 311f14f4646Smrg tmpdepfile2=$dir$base.u 312f14f4646Smrg tmpdepfile3=$dir$base.u 3135dfecf96Smrg "$@" -M 3145dfecf96Smrg fi 3155dfecf96Smrg stat=$? 316f765521fSmrg if test $stat -ne 0; then 317f14f4646Smrg rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 3185dfecf96Smrg exit $stat 3195dfecf96Smrg fi 3205dfecf96Smrg 321f14f4646Smrg for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 322f14f4646Smrg do 323f14f4646Smrg test -f "$tmpdepfile" && break 324f14f4646Smrg done 325f765521fSmrg aix_post_process_depfile 326f765521fSmrg ;; 327f765521fSmrg 328f765521fSmrgtcc) 329f765521fSmrg # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26 330f765521fSmrg # FIXME: That version still under development at the moment of writing. 331f765521fSmrg # Make that this statement remains true also for stable, released 332f765521fSmrg # versions. 333f765521fSmrg # It will wrap lines (doesn't matter whether long or short) with a 334f765521fSmrg # trailing '\', as in: 335f765521fSmrg # 336f765521fSmrg # foo.o : \ 337f765521fSmrg # foo.c \ 338f765521fSmrg # foo.h \ 339f765521fSmrg # 340f765521fSmrg # It will put a trailing '\' even on the last line, and will use leading 341f765521fSmrg # spaces rather than leading tabs (at least since its commit 0394caf7 342f765521fSmrg # "Emit spaces for -MD"). 343f765521fSmrg "$@" -MD -MF "$tmpdepfile" 344f765521fSmrg stat=$? 345f765521fSmrg if test $stat -ne 0; then 346f765521fSmrg rm -f "$tmpdepfile" 347f765521fSmrg exit $stat 3485dfecf96Smrg fi 349f765521fSmrg rm -f "$depfile" 350f765521fSmrg # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'. 351f765521fSmrg # We have to change lines of the first kind to '$object: \'. 352f765521fSmrg sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile" 353f765521fSmrg # And for each line of the second kind, we have to emit a 'dep.h:' 354f765521fSmrg # dummy dependency, to avoid the deleted-header problem. 355f765521fSmrg sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile" 3565dfecf96Smrg rm -f "$tmpdepfile" 3575dfecf96Smrg ;; 3585dfecf96Smrg 359f765521fSmrg## The order of this option in the case statement is important, since the 360f765521fSmrg## shell code in configure will try each of these formats in the order 361f765521fSmrg## listed in this file. A plain '-MD' option would be understood by many 362f765521fSmrg## compilers, so we must ensure this comes after the gcc and icc options. 363f765521fSmrgpgcc) 364f765521fSmrg # Portland's C compiler understands '-MD'. 365f765521fSmrg # Will always output deps to 'file.d' where file is the root name of the 366f765521fSmrg # source file under compilation, even if file resides in a subdirectory. 367f765521fSmrg # The object file name does not affect the name of the '.d' file. 368f765521fSmrg # pgcc 10.2 will output 3695dfecf96Smrg # foo.o: sub/foo.c sub/foo.h 370f765521fSmrg # and will wrap long lines using '\' : 3715dfecf96Smrg # foo.o: sub/foo.c ... \ 3725dfecf96Smrg # sub/foo.h ... \ 3735dfecf96Smrg # ... 374f765521fSmrg set_dir_from "$object" 375f765521fSmrg # Use the source, not the object, to determine the base name, since 376f765521fSmrg # that's sadly what pgcc will do too. 377f765521fSmrg set_base_from "$source" 378f765521fSmrg tmpdepfile=$base.d 379f765521fSmrg 380f765521fSmrg # For projects that build the same source file twice into different object 381f765521fSmrg # files, the pgcc approach of using the *source* file root name can cause 382f765521fSmrg # problems in parallel builds. Use a locking strategy to avoid stomping on 383f765521fSmrg # the same $tmpdepfile. 384f765521fSmrg lockdir=$base.d-lock 385f765521fSmrg trap " 386f765521fSmrg echo '$0: caught signal, cleaning up...' >&2 387f765521fSmrg rmdir '$lockdir' 388f765521fSmrg exit 1 389f765521fSmrg " 1 2 13 15 390f765521fSmrg numtries=100 391f765521fSmrg i=$numtries 392f765521fSmrg while test $i -gt 0; do 393f765521fSmrg # mkdir is a portable test-and-set. 394f765521fSmrg if mkdir "$lockdir" 2>/dev/null; then 395f765521fSmrg # This process acquired the lock. 396f765521fSmrg "$@" -MD 397f765521fSmrg stat=$? 398f765521fSmrg # Release the lock. 399f765521fSmrg rmdir "$lockdir" 400f765521fSmrg break 401f765521fSmrg else 402f765521fSmrg # If the lock is being held by a different process, wait 403f765521fSmrg # until the winning process is done or we timeout. 404f765521fSmrg while test -d "$lockdir" && test $i -gt 0; do 405f765521fSmrg sleep 1 406f765521fSmrg i=`expr $i - 1` 407f765521fSmrg done 408f765521fSmrg fi 409f765521fSmrg i=`expr $i - 1` 410f765521fSmrg done 411f765521fSmrg trap - 1 2 13 15 412f765521fSmrg if test $i -le 0; then 413f765521fSmrg echo "$0: failed to acquire lock after $numtries attempts" >&2 414f765521fSmrg echo "$0: check lockdir '$lockdir'" >&2 415f765521fSmrg exit 1 416f765521fSmrg fi 4175dfecf96Smrg 418f765521fSmrg if test $stat -ne 0; then 4195dfecf96Smrg rm -f "$tmpdepfile" 4205dfecf96Smrg exit $stat 4215dfecf96Smrg fi 4225dfecf96Smrg rm -f "$depfile" 4235dfecf96Smrg # Each line is of the form `foo.o: dependent.h', 4245dfecf96Smrg # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. 4255dfecf96Smrg # Do two passes, one to just change these to 4265dfecf96Smrg # `$object: dependent.h' and one to simply `dependent.h:'. 4275dfecf96Smrg sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" 4285dfecf96Smrg # Some versions of the HPUX 10.20 sed can't process this invocation 4295dfecf96Smrg # correctly. Breaking it into two sed invocations is a workaround. 430f765521fSmrg sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \ 431f765521fSmrg | sed -e 's/$/ :/' >> "$depfile" 4325dfecf96Smrg rm -f "$tmpdepfile" 4335dfecf96Smrg ;; 4345dfecf96Smrg 435f14f4646Smrghp2) 436f14f4646Smrg # The "hp" stanza above does not work with aCC (C++) and HP's ia64 437f14f4646Smrg # compilers, which have integrated preprocessors. The correct option 438f14f4646Smrg # to use with these is +Maked; it writes dependencies to a file named 439f14f4646Smrg # 'foo.d', which lands next to the object file, wherever that 440f14f4646Smrg # happens to be. 441f14f4646Smrg # Much of this is similar to the tru64 case; see comments there. 442f765521fSmrg set_dir_from "$object" 443f765521fSmrg set_base_from "$object" 444f14f4646Smrg if test "$libtool" = yes; then 445f14f4646Smrg tmpdepfile1=$dir$base.d 446f14f4646Smrg tmpdepfile2=$dir.libs/$base.d 447f14f4646Smrg "$@" -Wc,+Maked 448f14f4646Smrg else 449f14f4646Smrg tmpdepfile1=$dir$base.d 450f14f4646Smrg tmpdepfile2=$dir$base.d 451f14f4646Smrg "$@" +Maked 452f14f4646Smrg fi 453f14f4646Smrg stat=$? 454f765521fSmrg if test $stat -ne 0; then 455f14f4646Smrg rm -f "$tmpdepfile1" "$tmpdepfile2" 456f14f4646Smrg exit $stat 457f14f4646Smrg fi 458f14f4646Smrg 459f14f4646Smrg for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" 460f14f4646Smrg do 461f14f4646Smrg test -f "$tmpdepfile" && break 462f14f4646Smrg done 463f14f4646Smrg if test -f "$tmpdepfile"; then 464f765521fSmrg sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile" 465f765521fSmrg # Add 'dependent.h:' lines. 466c05e22d7Smrg sed -ne '2,${ 467f765521fSmrg s/^ *// 468f765521fSmrg s/ \\*$// 469f765521fSmrg s/$/:/ 470f765521fSmrg p 471f765521fSmrg }' "$tmpdepfile" >> "$depfile" 472f14f4646Smrg else 473f765521fSmrg make_dummy_depfile 474f14f4646Smrg fi 475f14f4646Smrg rm -f "$tmpdepfile" "$tmpdepfile2" 476f14f4646Smrg ;; 477f14f4646Smrg 4785dfecf96Smrgtru64) 479f765521fSmrg # The Tru64 compiler uses -MD to generate dependencies as a side 480f765521fSmrg # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. 481f765521fSmrg # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put 482f765521fSmrg # dependencies in 'foo.d' instead, so we check for that too. 483f765521fSmrg # Subdirectories are respected. 484f765521fSmrg set_dir_from "$object" 485f765521fSmrg set_base_from "$object" 486f765521fSmrg 487f765521fSmrg if test "$libtool" = yes; then 488f765521fSmrg # Libtool generates 2 separate objects for the 2 libraries. These 489f765521fSmrg # two compilations output dependencies in $dir.libs/$base.o.d and 490f765521fSmrg # in $dir$base.o.d. We have to check for both files, because 491f765521fSmrg # one of the two compilations can be disabled. We should prefer 492f765521fSmrg # $dir$base.o.d over $dir.libs/$base.o.d because the latter is 493f765521fSmrg # automatically cleaned when .libs/ is deleted, while ignoring 494f765521fSmrg # the former would cause a distcleancheck panic. 495f765521fSmrg tmpdepfile1=$dir$base.o.d # libtool 1.5 496f765521fSmrg tmpdepfile2=$dir.libs/$base.o.d # Likewise. 497f765521fSmrg tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504 498f765521fSmrg "$@" -Wc,-MD 499f765521fSmrg else 500f765521fSmrg tmpdepfile1=$dir$base.d 501f765521fSmrg tmpdepfile2=$dir$base.d 502f765521fSmrg tmpdepfile3=$dir$base.d 503f765521fSmrg "$@" -MD 504f765521fSmrg fi 505f765521fSmrg 506f765521fSmrg stat=$? 507f765521fSmrg if test $stat -ne 0; then 508f765521fSmrg rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 509f765521fSmrg exit $stat 510f765521fSmrg fi 511f765521fSmrg 512f765521fSmrg for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 513f765521fSmrg do 514f765521fSmrg test -f "$tmpdepfile" && break 515f765521fSmrg done 516f765521fSmrg # Same post-processing that is required for AIX mode. 517f765521fSmrg aix_post_process_depfile 518f765521fSmrg ;; 5195dfecf96Smrg 52031de2854Smrgmsvc7) 52131de2854Smrg if test "$libtool" = yes; then 52231de2854Smrg showIncludes=-Wc,-showIncludes 52331de2854Smrg else 52431de2854Smrg showIncludes=-showIncludes 52531de2854Smrg fi 52631de2854Smrg "$@" $showIncludes > "$tmpdepfile" 52731de2854Smrg stat=$? 52831de2854Smrg grep -v '^Note: including file: ' "$tmpdepfile" 529f765521fSmrg if test $stat -ne 0; then 53031de2854Smrg rm -f "$tmpdepfile" 53131de2854Smrg exit $stat 53231de2854Smrg fi 53331de2854Smrg rm -f "$depfile" 53431de2854Smrg echo "$object : \\" > "$depfile" 53531de2854Smrg # The first sed program below extracts the file names and escapes 53631de2854Smrg # backslashes for cygpath. The second sed program outputs the file 53731de2854Smrg # name when reading, but also accumulates all include files in the 53831de2854Smrg # hold buffer in order to output them again at the end. This only 53931de2854Smrg # works with sed implementations that can handle large buffers. 54031de2854Smrg sed < "$tmpdepfile" -n ' 54131de2854Smrg/^Note: including file: *\(.*\)/ { 54231de2854Smrg s//\1/ 54331de2854Smrg s/\\/\\\\/g 54431de2854Smrg p 54531de2854Smrg}' | $cygpath_u | sort -u | sed -n ' 54631de2854Smrgs/ /\\ /g 547f765521fSmrgs/\(.*\)/'"$tab"'\1 \\/p 54831de2854Smrgs/.\(.*\) \\/\1:/ 54931de2854SmrgH 55031de2854Smrg$ { 551f765521fSmrg s/.*/'"$tab"'/ 55231de2854Smrg G 55331de2854Smrg p 55431de2854Smrg}' >> "$depfile" 555f765521fSmrg echo >> "$depfile" # make sure the fragment doesn't end with a backslash 55631de2854Smrg rm -f "$tmpdepfile" 55731de2854Smrg ;; 55831de2854Smrg 55931de2854Smrgmsvc7msys) 56031de2854Smrg # This case exists only to let depend.m4 do its work. It works by 56131de2854Smrg # looking at the text of this script. This case will never be run, 56231de2854Smrg # since it is checked for above. 56331de2854Smrg exit 1 56431de2854Smrg ;; 56531de2854Smrg 5665dfecf96Smrg#nosideeffect) 5675dfecf96Smrg # This comment above is used by automake to tell side-effect 5685dfecf96Smrg # dependency tracking mechanisms from slower ones. 5695dfecf96Smrg 5705dfecf96Smrgdashmstdout) 5715dfecf96Smrg # Important note: in order to support this mode, a compiler *must* 5725dfecf96Smrg # always write the preprocessed file to stdout, regardless of -o. 5735dfecf96Smrg "$@" || exit $? 5745dfecf96Smrg 5755dfecf96Smrg # Remove the call to Libtool. 5765dfecf96Smrg if test "$libtool" = yes; then 577c05e22d7Smrg while test "X$1" != 'X--mode=compile'; do 5785dfecf96Smrg shift 5795dfecf96Smrg done 5805dfecf96Smrg shift 5815dfecf96Smrg fi 5825dfecf96Smrg 583f765521fSmrg # Remove '-o $object'. 5845dfecf96Smrg IFS=" " 5855dfecf96Smrg for arg 5865dfecf96Smrg do 5875dfecf96Smrg case $arg in 5885dfecf96Smrg -o) 5895dfecf96Smrg shift 5905dfecf96Smrg ;; 5915dfecf96Smrg $object) 5925dfecf96Smrg shift 5935dfecf96Smrg ;; 5945dfecf96Smrg *) 5955dfecf96Smrg set fnord "$@" "$arg" 5965dfecf96Smrg shift # fnord 5975dfecf96Smrg shift # $arg 5985dfecf96Smrg ;; 5995dfecf96Smrg esac 6005dfecf96Smrg done 6015dfecf96Smrg 6025dfecf96Smrg test -z "$dashmflag" && dashmflag=-M 603f765521fSmrg # Require at least two characters before searching for ':' 6045dfecf96Smrg # in the target name. This is to cope with DOS-style filenames: 605f765521fSmrg # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. 6065dfecf96Smrg "$@" $dashmflag | 607f765521fSmrg sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile" 6085dfecf96Smrg rm -f "$depfile" 6095dfecf96Smrg cat < "$tmpdepfile" > "$depfile" 610f765521fSmrg # Some versions of the HPUX 10.20 sed can't process this sed invocation 611f765521fSmrg # correctly. Breaking it into two sed invocations is a workaround. 612f765521fSmrg tr ' ' "$nl" < "$tmpdepfile" \ 613f765521fSmrg | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ 614f765521fSmrg | sed -e 's/$/ :/' >> "$depfile" 6155dfecf96Smrg rm -f "$tmpdepfile" 6165dfecf96Smrg ;; 6175dfecf96Smrg 6185dfecf96SmrgdashXmstdout) 6195dfecf96Smrg # This case only exists to satisfy depend.m4. It is never actually 6205dfecf96Smrg # run, as this mode is specially recognized in the preamble. 6215dfecf96Smrg exit 1 6225dfecf96Smrg ;; 6235dfecf96Smrg 6245dfecf96Smrgmakedepend) 6255dfecf96Smrg "$@" || exit $? 6265dfecf96Smrg # Remove any Libtool call 6275dfecf96Smrg if test "$libtool" = yes; then 628c05e22d7Smrg while test "X$1" != 'X--mode=compile'; do 6295dfecf96Smrg shift 6305dfecf96Smrg done 6315dfecf96Smrg shift 6325dfecf96Smrg fi 6335dfecf96Smrg # X makedepend 6345dfecf96Smrg shift 635c05e22d7Smrg cleared=no eat=no 636c05e22d7Smrg for arg 637c05e22d7Smrg do 6385dfecf96Smrg case $cleared in 6395dfecf96Smrg no) 6405dfecf96Smrg set ""; shift 6415dfecf96Smrg cleared=yes ;; 6425dfecf96Smrg esac 643c05e22d7Smrg if test $eat = yes; then 644c05e22d7Smrg eat=no 645c05e22d7Smrg continue 646c05e22d7Smrg fi 6475dfecf96Smrg case "$arg" in 6485dfecf96Smrg -D*|-I*) 6495dfecf96Smrg set fnord "$@" "$arg"; shift ;; 6505dfecf96Smrg # Strip any option that makedepend may not understand. Remove 6515dfecf96Smrg # the object too, otherwise makedepend will parse it as a source file. 652c05e22d7Smrg -arch) 653c05e22d7Smrg eat=yes ;; 6545dfecf96Smrg -*|$object) 6555dfecf96Smrg ;; 6565dfecf96Smrg *) 6575dfecf96Smrg set fnord "$@" "$arg"; shift ;; 6585dfecf96Smrg esac 6595dfecf96Smrg done 660c05e22d7Smrg obj_suffix=`echo "$object" | sed 's/^.*\././'` 6615dfecf96Smrg touch "$tmpdepfile" 6625dfecf96Smrg ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" 6635dfecf96Smrg rm -f "$depfile" 66431de2854Smrg # makedepend may prepend the VPATH from the source file name to the object. 66531de2854Smrg # No need to regex-escape $object, excess matching of '.' is harmless. 66631de2854Smrg sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" 667f765521fSmrg # Some versions of the HPUX 10.20 sed can't process the last invocation 668f765521fSmrg # correctly. Breaking it into two sed invocations is a workaround. 669f765521fSmrg sed '1,2d' "$tmpdepfile" \ 670f765521fSmrg | tr ' ' "$nl" \ 671f765521fSmrg | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ 672f765521fSmrg | sed -e 's/$/ :/' >> "$depfile" 6735dfecf96Smrg rm -f "$tmpdepfile" "$tmpdepfile".bak 6745dfecf96Smrg ;; 6755dfecf96Smrg 6765dfecf96Smrgcpp) 6775dfecf96Smrg # Important note: in order to support this mode, a compiler *must* 6785dfecf96Smrg # always write the preprocessed file to stdout. 6795dfecf96Smrg "$@" || exit $? 6805dfecf96Smrg 6815dfecf96Smrg # Remove the call to Libtool. 6825dfecf96Smrg if test "$libtool" = yes; then 683c05e22d7Smrg while test "X$1" != 'X--mode=compile'; do 6845dfecf96Smrg shift 6855dfecf96Smrg done 6865dfecf96Smrg shift 6875dfecf96Smrg fi 6885dfecf96Smrg 689f765521fSmrg # Remove '-o $object'. 6905dfecf96Smrg IFS=" " 6915dfecf96Smrg for arg 6925dfecf96Smrg do 6935dfecf96Smrg case $arg in 6945dfecf96Smrg -o) 6955dfecf96Smrg shift 6965dfecf96Smrg ;; 6975dfecf96Smrg $object) 6985dfecf96Smrg shift 6995dfecf96Smrg ;; 7005dfecf96Smrg *) 7015dfecf96Smrg set fnord "$@" "$arg" 7025dfecf96Smrg shift # fnord 7035dfecf96Smrg shift # $arg 7045dfecf96Smrg ;; 7055dfecf96Smrg esac 7065dfecf96Smrg done 7075dfecf96Smrg 708f765521fSmrg "$@" -E \ 709f765521fSmrg | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ 710f765521fSmrg -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ 711f765521fSmrg | sed '$ s: \\$::' > "$tmpdepfile" 7125dfecf96Smrg rm -f "$depfile" 7135dfecf96Smrg echo "$object : \\" > "$depfile" 7145dfecf96Smrg cat < "$tmpdepfile" >> "$depfile" 7155dfecf96Smrg sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" 7165dfecf96Smrg rm -f "$tmpdepfile" 7175dfecf96Smrg ;; 7185dfecf96Smrg 7195dfecf96Smrgmsvisualcpp) 7205dfecf96Smrg # Important note: in order to support this mode, a compiler *must* 721c05e22d7Smrg # always write the preprocessed file to stdout. 7225dfecf96Smrg "$@" || exit $? 723c05e22d7Smrg 724c05e22d7Smrg # Remove the call to Libtool. 725c05e22d7Smrg if test "$libtool" = yes; then 726c05e22d7Smrg while test "X$1" != 'X--mode=compile'; do 727c05e22d7Smrg shift 728c05e22d7Smrg done 729c05e22d7Smrg shift 730c05e22d7Smrg fi 731c05e22d7Smrg 7325dfecf96Smrg IFS=" " 7335dfecf96Smrg for arg 7345dfecf96Smrg do 7355dfecf96Smrg case "$arg" in 736c05e22d7Smrg -o) 737c05e22d7Smrg shift 738c05e22d7Smrg ;; 739c05e22d7Smrg $object) 740c05e22d7Smrg shift 741c05e22d7Smrg ;; 7425dfecf96Smrg "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") 743f765521fSmrg set fnord "$@" 744f765521fSmrg shift 745f765521fSmrg shift 746f765521fSmrg ;; 7475dfecf96Smrg *) 748f765521fSmrg set fnord "$@" "$arg" 749f765521fSmrg shift 750f765521fSmrg shift 751f765521fSmrg ;; 7525dfecf96Smrg esac 7535dfecf96Smrg done 754c05e22d7Smrg "$@" -E 2>/dev/null | 755c05e22d7Smrg sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" 7565dfecf96Smrg rm -f "$depfile" 7575dfecf96Smrg echo "$object : \\" > "$depfile" 758f765521fSmrg sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" 759f765521fSmrg echo "$tab" >> "$depfile" 760c05e22d7Smrg sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" 7615dfecf96Smrg rm -f "$tmpdepfile" 7625dfecf96Smrg ;; 7635dfecf96Smrg 764c05e22d7Smrgmsvcmsys) 765c05e22d7Smrg # This case exists only to let depend.m4 do its work. It works by 766c05e22d7Smrg # looking at the text of this script. This case will never be run, 767c05e22d7Smrg # since it is checked for above. 768c05e22d7Smrg exit 1 769c05e22d7Smrg ;; 770c05e22d7Smrg 7715dfecf96Smrgnone) 7725dfecf96Smrg exec "$@" 7735dfecf96Smrg ;; 7745dfecf96Smrg 7755dfecf96Smrg*) 7765dfecf96Smrg echo "Unknown depmode $depmode" 1>&2 7775dfecf96Smrg exit 1 7785dfecf96Smrg ;; 7795dfecf96Smrgesac 7805dfecf96Smrg 7815dfecf96Smrgexit 0 7825dfecf96Smrg 7835dfecf96Smrg# Local Variables: 7845dfecf96Smrg# mode: shell-script 7855dfecf96Smrg# sh-indentation: 2 78696d43ffdSmrg# eval: (add-hook 'before-save-hook 'time-stamp) 7875dfecf96Smrg# time-stamp-start: "scriptversion=" 7885dfecf96Smrg# time-stamp-format: "%:y-%02m-%02d.%02H" 78996d43ffdSmrg# time-stamp-time-zone: "UTC0" 790c05e22d7Smrg# time-stamp-end: "; # UTC" 7915dfecf96Smrg# End: 792