18b22bf3fSmrg#! /bin/sh 28b22bf3fSmrg# depcomp - compile a program generating dependencies as side-effects 38b22bf3fSmrg 49e1184feSmrgscriptversion=2018-03-07.03; # UTC 58b22bf3fSmrg 614cde9d3Smrg# Copyright (C) 1999-2021 Free Software Foundation, Inc. 78b22bf3fSmrg 88b22bf3fSmrg# This program is free software; you can redistribute it and/or modify 98b22bf3fSmrg# it under the terms of the GNU General Public License as published by 108b22bf3fSmrg# the Free Software Foundation; either version 2, or (at your option) 118b22bf3fSmrg# any later version. 128b22bf3fSmrg 138b22bf3fSmrg# This program is distributed in the hope that it will be useful, 148b22bf3fSmrg# but WITHOUT ANY WARRANTY; without even the implied warranty of 158b22bf3fSmrg# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 168b22bf3fSmrg# GNU General Public License for more details. 178b22bf3fSmrg 188b22bf3fSmrg# You should have received a copy of the GNU General Public License 199e1184feSmrg# along with this program. If not, see <https://www.gnu.org/licenses/>. 208b22bf3fSmrg 218b22bf3fSmrg# As a special exception to the GNU General Public License, if you 228b22bf3fSmrg# distribute this file as part of a program that contains a 238b22bf3fSmrg# configuration script generated by Autoconf, you may include it under 248b22bf3fSmrg# the same distribution terms that you use for the rest of that program. 258b22bf3fSmrg 268b22bf3fSmrg# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>. 278b22bf3fSmrg 288b22bf3fSmrgcase $1 in 298b22bf3fSmrg '') 30f126e068Smrg echo "$0: No command. Try '$0 --help' for more information." 1>&2 31f126e068Smrg exit 1; 32f126e068Smrg ;; 338b22bf3fSmrg -h | --h*) 348b22bf3fSmrg cat <<\EOF 358b22bf3fSmrgUsage: depcomp [--help] [--version] PROGRAM [ARGS] 368b22bf3fSmrg 378b22bf3fSmrgRun PROGRAMS ARGS to compile a file, generating dependencies 388b22bf3fSmrgas side-effects. 398b22bf3fSmrg 408b22bf3fSmrgEnvironment variables: 418b22bf3fSmrg depmode Dependency tracking mode. 42f126e068Smrg source Source file read by 'PROGRAMS ARGS'. 43f126e068Smrg object Object file output by 'PROGRAMS ARGS'. 448b22bf3fSmrg DEPDIR directory where to store dependencies. 458b22bf3fSmrg depfile Dependency file to output. 46f126e068Smrg tmpdepfile Temporary file to use when outputting dependencies. 478b22bf3fSmrg libtool Whether libtool is used (yes/no). 488b22bf3fSmrg 498b22bf3fSmrgReport bugs to <bug-automake@gnu.org>. 508b22bf3fSmrgEOF 518b22bf3fSmrg exit $? 528b22bf3fSmrg ;; 538b22bf3fSmrg -v | --v*) 548b22bf3fSmrg echo "depcomp $scriptversion" 558b22bf3fSmrg exit $? 568b22bf3fSmrg ;; 578b22bf3fSmrgesac 588b22bf3fSmrg 59f126e068Smrg# Get the directory component of the given path, and save it in the 60f126e068Smrg# global variables '$dir'. Note that this directory component will 61f126e068Smrg# be either empty or ending with a '/' character. This is deliberate. 62f126e068Smrgset_dir_from () 63f126e068Smrg{ 64f126e068Smrg case $1 in 65f126e068Smrg */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;; 66f126e068Smrg *) dir=;; 67f126e068Smrg esac 68f126e068Smrg} 69f126e068Smrg 70f126e068Smrg# Get the suffix-stripped basename of the given path, and save it the 71f126e068Smrg# global variable '$base'. 72f126e068Smrgset_base_from () 73f126e068Smrg{ 74f126e068Smrg base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'` 75f126e068Smrg} 76f126e068Smrg 77f126e068Smrg# If no dependency file was actually created by the compiler invocation, 78f126e068Smrg# we still have to create a dummy depfile, to avoid errors with the 79f126e068Smrg# Makefile "include basename.Plo" scheme. 80f126e068Smrgmake_dummy_depfile () 81f126e068Smrg{ 82f126e068Smrg echo "#dummy" > "$depfile" 83f126e068Smrg} 84f126e068Smrg 85f126e068Smrg# Factor out some common post-processing of the generated depfile. 86f126e068Smrg# Requires the auxiliary global variable '$tmpdepfile' to be set. 87f126e068Smrgaix_post_process_depfile () 88f126e068Smrg{ 89f126e068Smrg # If the compiler actually managed to produce a dependency file, 90f126e068Smrg # post-process it. 91f126e068Smrg if test -f "$tmpdepfile"; then 92f126e068Smrg # Each line is of the form 'foo.o: dependency.h'. 93f126e068Smrg # Do two passes, one to just change these to 94f126e068Smrg # $object: dependency.h 95f126e068Smrg # and one to simply output 96f126e068Smrg # dependency.h: 97f126e068Smrg # which is needed to avoid the deleted-header problem. 98f126e068Smrg { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile" 99f126e068Smrg sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile" 100f126e068Smrg } > "$depfile" 101f126e068Smrg rm -f "$tmpdepfile" 102f126e068Smrg else 103f126e068Smrg make_dummy_depfile 104f126e068Smrg fi 105f126e068Smrg} 106f126e068Smrg 107f126e068Smrg# A tabulation character. 108f126e068Smrgtab=' ' 109f126e068Smrg# A newline character. 110f126e068Smrgnl=' 111f126e068Smrg' 112f126e068Smrg# Character ranges might be problematic outside the C locale. 113f126e068Smrg# These definitions help. 114f126e068Smrgupper=ABCDEFGHIJKLMNOPQRSTUVWXYZ 115f126e068Smrglower=abcdefghijklmnopqrstuvwxyz 116f126e068Smrgdigits=0123456789 117f126e068Smrgalpha=${upper}${lower} 118f126e068Smrg 1198b22bf3fSmrgif test -z "$depmode" || test -z "$source" || test -z "$object"; then 1208b22bf3fSmrg echo "depcomp: Variables source, object and depmode must be set" 1>&2 1218b22bf3fSmrg exit 1 1228b22bf3fSmrgfi 1238b22bf3fSmrg 1248b22bf3fSmrg# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. 1258b22bf3fSmrgdepfile=${depfile-`echo "$object" | 1268b22bf3fSmrg sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} 1278b22bf3fSmrgtmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} 1288b22bf3fSmrg 1298b22bf3fSmrgrm -f "$tmpdepfile" 1308b22bf3fSmrg 131f126e068Smrg# Avoid interferences from the environment. 132f126e068Smrggccflag= dashmflag= 133f126e068Smrg 1348b22bf3fSmrg# Some modes work just like other modes, but use different flags. We 1358b22bf3fSmrg# parameterize here, but still list the modes in the big case below, 1368b22bf3fSmrg# to make depend.m4 easier to write. Note that we *cannot* use a case 1378b22bf3fSmrg# here, because this file can only contain one case statement. 1388b22bf3fSmrgif test "$depmode" = hp; then 1398b22bf3fSmrg # HP compiler uses -M and no extra arg. 1408b22bf3fSmrg gccflag=-M 1418b22bf3fSmrg depmode=gcc 1428b22bf3fSmrgfi 1438b22bf3fSmrg 1448b22bf3fSmrgif test "$depmode" = dashXmstdout; then 145f126e068Smrg # This is just like dashmstdout with a different argument. 146f126e068Smrg dashmflag=-xM 147f126e068Smrg depmode=dashmstdout 1488b22bf3fSmrgfi 1498b22bf3fSmrg 15096a81b41Smrgcygpath_u="cygpath -u -f -" 15196a81b41Smrgif test "$depmode" = msvcmsys; then 152f126e068Smrg # This is just like msvisualcpp but w/o cygpath translation. 153f126e068Smrg # Just convert the backslash-escaped backslashes to single forward 154f126e068Smrg # slashes to satisfy depend.m4 155f126e068Smrg cygpath_u='sed s,\\\\,/,g' 156f126e068Smrg depmode=msvisualcpp 157f126e068Smrgfi 158f126e068Smrg 159f126e068Smrgif test "$depmode" = msvc7msys; then 160f126e068Smrg # This is just like msvc7 but w/o cygpath translation. 161f126e068Smrg # Just convert the backslash-escaped backslashes to single forward 162f126e068Smrg # slashes to satisfy depend.m4 163f126e068Smrg cygpath_u='sed s,\\\\,/,g' 164f126e068Smrg depmode=msvc7 165f126e068Smrgfi 166f126e068Smrg 167f126e068Smrgif test "$depmode" = xlc; then 168f126e068Smrg # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information. 169f126e068Smrg gccflag=-qmakedep=gcc,-MF 170f126e068Smrg depmode=gcc 17196a81b41Smrgfi 17296a81b41Smrg 1738b22bf3fSmrgcase "$depmode" in 1748b22bf3fSmrggcc3) 1758b22bf3fSmrg## gcc 3 implements dependency tracking that does exactly what 1768b22bf3fSmrg## we want. Yay! Note: for some reason libtool 1.4 doesn't like 1778b22bf3fSmrg## it if -MD -MP comes after the -MF stuff. Hmm. 1788b22bf3fSmrg## Unfortunately, FreeBSD c89 acceptance of flags depends upon 1798b22bf3fSmrg## the command line argument order; so add the flags where they 1808b22bf3fSmrg## appear in depend2.am. Note that the slowdown incurred here 1818b22bf3fSmrg## affects only configure: in makefiles, %FASTDEP% shortcuts this. 1828b22bf3fSmrg for arg 1838b22bf3fSmrg do 1848b22bf3fSmrg case $arg in 1858b22bf3fSmrg -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; 1868b22bf3fSmrg *) set fnord "$@" "$arg" ;; 1878b22bf3fSmrg esac 1888b22bf3fSmrg shift # fnord 1898b22bf3fSmrg shift # $arg 1908b22bf3fSmrg done 1918b22bf3fSmrg "$@" 1928b22bf3fSmrg stat=$? 193f126e068Smrg if test $stat -ne 0; then 1948b22bf3fSmrg rm -f "$tmpdepfile" 1958b22bf3fSmrg exit $stat 1968b22bf3fSmrg fi 1978b22bf3fSmrg mv "$tmpdepfile" "$depfile" 1988b22bf3fSmrg ;; 1998b22bf3fSmrg 2008b22bf3fSmrggcc) 201f126e068Smrg## Note that this doesn't just cater to obsosete pre-3.x GCC compilers. 202f126e068Smrg## but also to in-use compilers like IMB xlc/xlC and the HP C compiler. 203f126e068Smrg## (see the conditional assignment to $gccflag above). 2048b22bf3fSmrg## There are various ways to get dependency output from gcc. Here's 2058b22bf3fSmrg## why we pick this rather obscure method: 2068b22bf3fSmrg## - Don't want to use -MD because we'd like the dependencies to end 2078b22bf3fSmrg## up in a subdir. Having to rename by hand is ugly. 2088b22bf3fSmrg## (We might end up doing this anyway to support other compilers.) 2098b22bf3fSmrg## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like 210f126e068Smrg## -MM, not -M (despite what the docs say). Also, it might not be 211f126e068Smrg## supported by the other compilers which use the 'gcc' depmode. 2128b22bf3fSmrg## - Using -M directly means running the compiler twice (even worse 2138b22bf3fSmrg## than renaming). 2148b22bf3fSmrg if test -z "$gccflag"; then 2158b22bf3fSmrg gccflag=-MD, 2168b22bf3fSmrg fi 2178b22bf3fSmrg "$@" -Wp,"$gccflag$tmpdepfile" 2188b22bf3fSmrg stat=$? 219f126e068Smrg if test $stat -ne 0; then 2208b22bf3fSmrg rm -f "$tmpdepfile" 2218b22bf3fSmrg exit $stat 2228b22bf3fSmrg fi 2238b22bf3fSmrg rm -f "$depfile" 2248b22bf3fSmrg echo "$object : \\" > "$depfile" 225f126e068Smrg # The second -e expression handles DOS-style file names with drive 226f126e068Smrg # letters. 2278b22bf3fSmrg sed -e 's/^[^:]*: / /' \ 2288b22bf3fSmrg -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" 229f126e068Smrg## This next piece of magic avoids the "deleted header file" problem. 2308b22bf3fSmrg## The problem is that when a header file which appears in a .P file 2318b22bf3fSmrg## is deleted, the dependency causes make to die (because there is 2328b22bf3fSmrg## typically no way to rebuild the header). We avoid this by adding 2338b22bf3fSmrg## dummy dependencies for each header file. Too bad gcc doesn't do 2348b22bf3fSmrg## this for us directly. 235f126e068Smrg## Some versions of gcc put a space before the ':'. On the theory 2368b22bf3fSmrg## that the space means something, we add a space to the output as 237f126e068Smrg## well. hp depmode also adds that space, but also prefixes the VPATH 238f126e068Smrg## to the object. Take care to not repeat it in the output. 2398b22bf3fSmrg## Some versions of the HPUX 10.20 sed can't process this invocation 2408b22bf3fSmrg## correctly. Breaking it into two sed invocations is a workaround. 241f126e068Smrg tr ' ' "$nl" < "$tmpdepfile" \ 242f126e068Smrg | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ 243f126e068Smrg | sed -e 's/$/ :/' >> "$depfile" 2448b22bf3fSmrg rm -f "$tmpdepfile" 2458b22bf3fSmrg ;; 2468b22bf3fSmrg 2478b22bf3fSmrghp) 2488b22bf3fSmrg # This case exists only to let depend.m4 do its work. It works by 2498b22bf3fSmrg # looking at the text of this script. This case will never be run, 2508b22bf3fSmrg # since it is checked for above. 2518b22bf3fSmrg exit 1 2528b22bf3fSmrg ;; 2538b22bf3fSmrg 2548b22bf3fSmrgsgi) 2558b22bf3fSmrg if test "$libtool" = yes; then 2568b22bf3fSmrg "$@" "-Wp,-MDupdate,$tmpdepfile" 2578b22bf3fSmrg else 2588b22bf3fSmrg "$@" -MDupdate "$tmpdepfile" 2598b22bf3fSmrg fi 2608b22bf3fSmrg stat=$? 261f126e068Smrg if test $stat -ne 0; then 2628b22bf3fSmrg rm -f "$tmpdepfile" 2638b22bf3fSmrg exit $stat 2648b22bf3fSmrg fi 2658b22bf3fSmrg rm -f "$depfile" 2668b22bf3fSmrg 2678b22bf3fSmrg if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files 2688b22bf3fSmrg echo "$object : \\" > "$depfile" 2698b22bf3fSmrg # Clip off the initial element (the dependent). Don't try to be 2708b22bf3fSmrg # clever and replace this with sed code, as IRIX sed won't handle 2718b22bf3fSmrg # lines with more than a fixed number of characters (4096 in 2728b22bf3fSmrg # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; 273f126e068Smrg # the IRIX cc adds comments like '#:fec' to the end of the 2748b22bf3fSmrg # dependency line. 275f126e068Smrg tr ' ' "$nl" < "$tmpdepfile" \ 276f126e068Smrg | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \ 277f126e068Smrg | tr "$nl" ' ' >> "$depfile" 27896a81b41Smrg echo >> "$depfile" 2798b22bf3fSmrg # The second pass generates a dummy entry for each header file. 280f126e068Smrg tr ' ' "$nl" < "$tmpdepfile" \ 281f126e068Smrg | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ 282f126e068Smrg >> "$depfile" 2838b22bf3fSmrg else 284f126e068Smrg make_dummy_depfile 2858b22bf3fSmrg fi 2868b22bf3fSmrg rm -f "$tmpdepfile" 2878b22bf3fSmrg ;; 2888b22bf3fSmrg 289f126e068Smrgxlc) 290f126e068Smrg # This case exists only to let depend.m4 do its work. It works by 291f126e068Smrg # looking at the text of this script. This case will never be run, 292f126e068Smrg # since it is checked for above. 293f126e068Smrg exit 1 294f126e068Smrg ;; 295f126e068Smrg 2968b22bf3fSmrgaix) 2978b22bf3fSmrg # The C for AIX Compiler uses -M and outputs the dependencies 2988b22bf3fSmrg # in a .u file. In older versions, this file always lives in the 299f126e068Smrg # current directory. Also, the AIX compiler puts '$object:' at the 3008b22bf3fSmrg # start of each line; $object doesn't have directory information. 3018b22bf3fSmrg # Version 6 uses the directory in both cases. 302f126e068Smrg set_dir_from "$object" 303f126e068Smrg set_base_from "$object" 3048b22bf3fSmrg if test "$libtool" = yes; then 30596a81b41Smrg tmpdepfile1=$dir$base.u 30696a81b41Smrg tmpdepfile2=$base.u 30796a81b41Smrg tmpdepfile3=$dir.libs/$base.u 3088b22bf3fSmrg "$@" -Wc,-M 3098b22bf3fSmrg else 31096a81b41Smrg tmpdepfile1=$dir$base.u 31196a81b41Smrg tmpdepfile2=$dir$base.u 31296a81b41Smrg tmpdepfile3=$dir$base.u 3138b22bf3fSmrg "$@" -M 3148b22bf3fSmrg fi 3158b22bf3fSmrg stat=$? 316f126e068Smrg if test $stat -ne 0; then 31796a81b41Smrg rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 3188b22bf3fSmrg exit $stat 3198b22bf3fSmrg fi 3208b22bf3fSmrg 32196a81b41Smrg for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 32296a81b41Smrg do 32396a81b41Smrg test -f "$tmpdepfile" && break 32496a81b41Smrg done 325f126e068Smrg aix_post_process_depfile 326f126e068Smrg ;; 327f126e068Smrg 328f126e068Smrgtcc) 329f126e068Smrg # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26 330f126e068Smrg # FIXME: That version still under development at the moment of writing. 331f126e068Smrg # Make that this statement remains true also for stable, released 332f126e068Smrg # versions. 333f126e068Smrg # It will wrap lines (doesn't matter whether long or short) with a 334f126e068Smrg # trailing '\', as in: 335f126e068Smrg # 336f126e068Smrg # foo.o : \ 337f126e068Smrg # foo.c \ 338f126e068Smrg # foo.h \ 339f126e068Smrg # 340f126e068Smrg # It will put a trailing '\' even on the last line, and will use leading 341f126e068Smrg # spaces rather than leading tabs (at least since its commit 0394caf7 342f126e068Smrg # "Emit spaces for -MD"). 343f126e068Smrg "$@" -MD -MF "$tmpdepfile" 344f126e068Smrg stat=$? 345f126e068Smrg if test $stat -ne 0; then 346f126e068Smrg rm -f "$tmpdepfile" 347f126e068Smrg exit $stat 3488b22bf3fSmrg fi 349f126e068Smrg rm -f "$depfile" 350f126e068Smrg # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'. 351f126e068Smrg # We have to change lines of the first kind to '$object: \'. 352f126e068Smrg sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile" 353f126e068Smrg # And for each line of the second kind, we have to emit a 'dep.h:' 354f126e068Smrg # dummy dependency, to avoid the deleted-header problem. 355f126e068Smrg sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile" 3568b22bf3fSmrg rm -f "$tmpdepfile" 3578b22bf3fSmrg ;; 3588b22bf3fSmrg 359f126e068Smrg## The order of this option in the case statement is important, since the 360f126e068Smrg## shell code in configure will try each of these formats in the order 361f126e068Smrg## listed in this file. A plain '-MD' option would be understood by many 362f126e068Smrg## compilers, so we must ensure this comes after the gcc and icc options. 363f126e068Smrgpgcc) 364f126e068Smrg # Portland's C compiler understands '-MD'. 365f126e068Smrg # Will always output deps to 'file.d' where file is the root name of the 366f126e068Smrg # source file under compilation, even if file resides in a subdirectory. 367f126e068Smrg # The object file name does not affect the name of the '.d' file. 368f126e068Smrg # pgcc 10.2 will output 3698b22bf3fSmrg # foo.o: sub/foo.c sub/foo.h 370f126e068Smrg # and will wrap long lines using '\' : 3718b22bf3fSmrg # foo.o: sub/foo.c ... \ 3728b22bf3fSmrg # sub/foo.h ... \ 3738b22bf3fSmrg # ... 374f126e068Smrg set_dir_from "$object" 375f126e068Smrg # Use the source, not the object, to determine the base name, since 376f126e068Smrg # that's sadly what pgcc will do too. 377f126e068Smrg set_base_from "$source" 378f126e068Smrg tmpdepfile=$base.d 379f126e068Smrg 380f126e068Smrg # For projects that build the same source file twice into different object 381f126e068Smrg # files, the pgcc approach of using the *source* file root name can cause 382f126e068Smrg # problems in parallel builds. Use a locking strategy to avoid stomping on 383f126e068Smrg # the same $tmpdepfile. 384f126e068Smrg lockdir=$base.d-lock 385f126e068Smrg trap " 386f126e068Smrg echo '$0: caught signal, cleaning up...' >&2 387f126e068Smrg rmdir '$lockdir' 388f126e068Smrg exit 1 389f126e068Smrg " 1 2 13 15 390f126e068Smrg numtries=100 391f126e068Smrg i=$numtries 392f126e068Smrg while test $i -gt 0; do 393f126e068Smrg # mkdir is a portable test-and-set. 394f126e068Smrg if mkdir "$lockdir" 2>/dev/null; then 395f126e068Smrg # This process acquired the lock. 396f126e068Smrg "$@" -MD 397f126e068Smrg stat=$? 398f126e068Smrg # Release the lock. 399f126e068Smrg rmdir "$lockdir" 400f126e068Smrg break 401f126e068Smrg else 402f126e068Smrg # If the lock is being held by a different process, wait 403f126e068Smrg # until the winning process is done or we timeout. 404f126e068Smrg while test -d "$lockdir" && test $i -gt 0; do 405f126e068Smrg sleep 1 406f126e068Smrg i=`expr $i - 1` 407f126e068Smrg done 408f126e068Smrg fi 409f126e068Smrg i=`expr $i - 1` 410f126e068Smrg done 411f126e068Smrg trap - 1 2 13 15 412f126e068Smrg if test $i -le 0; then 413f126e068Smrg echo "$0: failed to acquire lock after $numtries attempts" >&2 414f126e068Smrg echo "$0: check lockdir '$lockdir'" >&2 415f126e068Smrg exit 1 416f126e068Smrg fi 4178b22bf3fSmrg 418f126e068Smrg if test $stat -ne 0; then 4198b22bf3fSmrg rm -f "$tmpdepfile" 4208b22bf3fSmrg exit $stat 4218b22bf3fSmrg fi 4228b22bf3fSmrg rm -f "$depfile" 4238b22bf3fSmrg # Each line is of the form `foo.o: dependent.h', 4248b22bf3fSmrg # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. 4258b22bf3fSmrg # Do two passes, one to just change these to 4268b22bf3fSmrg # `$object: dependent.h' and one to simply `dependent.h:'. 4278b22bf3fSmrg sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" 4288b22bf3fSmrg # Some versions of the HPUX 10.20 sed can't process this invocation 4298b22bf3fSmrg # correctly. Breaking it into two sed invocations is a workaround. 430f126e068Smrg sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \ 431f126e068Smrg | sed -e 's/$/ :/' >> "$depfile" 4328b22bf3fSmrg rm -f "$tmpdepfile" 4338b22bf3fSmrg ;; 4348b22bf3fSmrg 4358b22bf3fSmrghp2) 4368b22bf3fSmrg # The "hp" stanza above does not work with aCC (C++) and HP's ia64 4378b22bf3fSmrg # compilers, which have integrated preprocessors. The correct option 4388b22bf3fSmrg # to use with these is +Maked; it writes dependencies to a file named 4398b22bf3fSmrg # 'foo.d', which lands next to the object file, wherever that 4408b22bf3fSmrg # happens to be. 4418b22bf3fSmrg # Much of this is similar to the tru64 case; see comments there. 442f126e068Smrg set_dir_from "$object" 443f126e068Smrg set_base_from "$object" 4448b22bf3fSmrg if test "$libtool" = yes; then 4458b22bf3fSmrg tmpdepfile1=$dir$base.d 4468b22bf3fSmrg tmpdepfile2=$dir.libs/$base.d 4478b22bf3fSmrg "$@" -Wc,+Maked 4488b22bf3fSmrg else 4498b22bf3fSmrg tmpdepfile1=$dir$base.d 4508b22bf3fSmrg tmpdepfile2=$dir$base.d 4518b22bf3fSmrg "$@" +Maked 4528b22bf3fSmrg fi 4538b22bf3fSmrg stat=$? 454f126e068Smrg if test $stat -ne 0; then 4558b22bf3fSmrg rm -f "$tmpdepfile1" "$tmpdepfile2" 4568b22bf3fSmrg exit $stat 4578b22bf3fSmrg fi 4588b22bf3fSmrg 4598b22bf3fSmrg for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" 4608b22bf3fSmrg do 4618b22bf3fSmrg test -f "$tmpdepfile" && break 4628b22bf3fSmrg done 4638b22bf3fSmrg if test -f "$tmpdepfile"; then 464f126e068Smrg sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile" 465f126e068Smrg # Add 'dependent.h:' lines. 46696a81b41Smrg sed -ne '2,${ 467f126e068Smrg s/^ *// 468f126e068Smrg s/ \\*$// 469f126e068Smrg s/$/:/ 470f126e068Smrg p 471f126e068Smrg }' "$tmpdepfile" >> "$depfile" 4728b22bf3fSmrg else 473f126e068Smrg make_dummy_depfile 4748b22bf3fSmrg fi 4758b22bf3fSmrg rm -f "$tmpdepfile" "$tmpdepfile2" 4768b22bf3fSmrg ;; 4778b22bf3fSmrg 4788b22bf3fSmrgtru64) 479f126e068Smrg # The Tru64 compiler uses -MD to generate dependencies as a side 480f126e068Smrg # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. 481f126e068Smrg # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put 482f126e068Smrg # dependencies in 'foo.d' instead, so we check for that too. 483f126e068Smrg # Subdirectories are respected. 484f126e068Smrg set_dir_from "$object" 485f126e068Smrg set_base_from "$object" 486f126e068Smrg 487f126e068Smrg if test "$libtool" = yes; then 488f126e068Smrg # Libtool generates 2 separate objects for the 2 libraries. These 489f126e068Smrg # two compilations output dependencies in $dir.libs/$base.o.d and 490f126e068Smrg # in $dir$base.o.d. We have to check for both files, because 491f126e068Smrg # one of the two compilations can be disabled. We should prefer 492f126e068Smrg # $dir$base.o.d over $dir.libs/$base.o.d because the latter is 493f126e068Smrg # automatically cleaned when .libs/ is deleted, while ignoring 494f126e068Smrg # the former would cause a distcleancheck panic. 495f126e068Smrg tmpdepfile1=$dir$base.o.d # libtool 1.5 496f126e068Smrg tmpdepfile2=$dir.libs/$base.o.d # Likewise. 497f126e068Smrg tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504 498f126e068Smrg "$@" -Wc,-MD 499f126e068Smrg else 500f126e068Smrg tmpdepfile1=$dir$base.d 501f126e068Smrg tmpdepfile2=$dir$base.d 502f126e068Smrg tmpdepfile3=$dir$base.d 503f126e068Smrg "$@" -MD 504f126e068Smrg fi 505f126e068Smrg 506f126e068Smrg stat=$? 507f126e068Smrg if test $stat -ne 0; then 508f126e068Smrg rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 509f126e068Smrg exit $stat 510f126e068Smrg fi 511f126e068Smrg 512f126e068Smrg for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 513f126e068Smrg do 514f126e068Smrg test -f "$tmpdepfile" && break 515f126e068Smrg done 516f126e068Smrg # Same post-processing that is required for AIX mode. 517f126e068Smrg aix_post_process_depfile 518f126e068Smrg ;; 519f126e068Smrg 520f126e068Smrgmsvc7) 521f126e068Smrg if test "$libtool" = yes; then 522f126e068Smrg showIncludes=-Wc,-showIncludes 523f126e068Smrg else 524f126e068Smrg showIncludes=-showIncludes 525f126e068Smrg fi 526f126e068Smrg "$@" $showIncludes > "$tmpdepfile" 527f126e068Smrg stat=$? 528f126e068Smrg grep -v '^Note: including file: ' "$tmpdepfile" 529f126e068Smrg if test $stat -ne 0; then 530f126e068Smrg rm -f "$tmpdepfile" 531f126e068Smrg exit $stat 532f126e068Smrg fi 533f126e068Smrg rm -f "$depfile" 534f126e068Smrg echo "$object : \\" > "$depfile" 535f126e068Smrg # The first sed program below extracts the file names and escapes 536f126e068Smrg # backslashes for cygpath. The second sed program outputs the file 537f126e068Smrg # name when reading, but also accumulates all include files in the 538f126e068Smrg # hold buffer in order to output them again at the end. This only 539f126e068Smrg # works with sed implementations that can handle large buffers. 540f126e068Smrg sed < "$tmpdepfile" -n ' 541f126e068Smrg/^Note: including file: *\(.*\)/ { 542f126e068Smrg s//\1/ 543f126e068Smrg s/\\/\\\\/g 544f126e068Smrg p 545f126e068Smrg}' | $cygpath_u | sort -u | sed -n ' 546f126e068Smrgs/ /\\ /g 547f126e068Smrgs/\(.*\)/'"$tab"'\1 \\/p 548f126e068Smrgs/.\(.*\) \\/\1:/ 549f126e068SmrgH 550f126e068Smrg$ { 551f126e068Smrg s/.*/'"$tab"'/ 552f126e068Smrg G 553f126e068Smrg p 554f126e068Smrg}' >> "$depfile" 555f126e068Smrg echo >> "$depfile" # make sure the fragment doesn't end with a backslash 556f126e068Smrg rm -f "$tmpdepfile" 557f126e068Smrg ;; 558f126e068Smrg 559f126e068Smrgmsvc7msys) 560f126e068Smrg # This case exists only to let depend.m4 do its work. It works by 561f126e068Smrg # looking at the text of this script. This case will never be run, 562f126e068Smrg # since it is checked for above. 563f126e068Smrg exit 1 564f126e068Smrg ;; 5658b22bf3fSmrg 5668b22bf3fSmrg#nosideeffect) 5678b22bf3fSmrg # This comment above is used by automake to tell side-effect 5688b22bf3fSmrg # dependency tracking mechanisms from slower ones. 5698b22bf3fSmrg 5708b22bf3fSmrgdashmstdout) 5718b22bf3fSmrg # Important note: in order to support this mode, a compiler *must* 5728b22bf3fSmrg # always write the preprocessed file to stdout, regardless of -o. 5738b22bf3fSmrg "$@" || exit $? 5748b22bf3fSmrg 5758b22bf3fSmrg # Remove the call to Libtool. 5768b22bf3fSmrg if test "$libtool" = yes; then 57796a81b41Smrg while test "X$1" != 'X--mode=compile'; do 5788b22bf3fSmrg shift 5798b22bf3fSmrg done 5808b22bf3fSmrg shift 5818b22bf3fSmrg fi 5828b22bf3fSmrg 583f126e068Smrg # Remove '-o $object'. 5848b22bf3fSmrg IFS=" " 5858b22bf3fSmrg for arg 5868b22bf3fSmrg do 5878b22bf3fSmrg case $arg in 5888b22bf3fSmrg -o) 5898b22bf3fSmrg shift 5908b22bf3fSmrg ;; 5918b22bf3fSmrg $object) 5928b22bf3fSmrg shift 5938b22bf3fSmrg ;; 5948b22bf3fSmrg *) 5958b22bf3fSmrg set fnord "$@" "$arg" 5968b22bf3fSmrg shift # fnord 5978b22bf3fSmrg shift # $arg 5988b22bf3fSmrg ;; 5998b22bf3fSmrg esac 6008b22bf3fSmrg done 6018b22bf3fSmrg 6028b22bf3fSmrg test -z "$dashmflag" && dashmflag=-M 603f126e068Smrg # Require at least two characters before searching for ':' 6048b22bf3fSmrg # in the target name. This is to cope with DOS-style filenames: 605f126e068Smrg # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. 6068b22bf3fSmrg "$@" $dashmflag | 607f126e068Smrg sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile" 6088b22bf3fSmrg rm -f "$depfile" 6098b22bf3fSmrg cat < "$tmpdepfile" > "$depfile" 610f126e068Smrg # Some versions of the HPUX 10.20 sed can't process this sed invocation 611f126e068Smrg # correctly. Breaking it into two sed invocations is a workaround. 612f126e068Smrg tr ' ' "$nl" < "$tmpdepfile" \ 613f126e068Smrg | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ 614f126e068Smrg | sed -e 's/$/ :/' >> "$depfile" 6158b22bf3fSmrg rm -f "$tmpdepfile" 6168b22bf3fSmrg ;; 6178b22bf3fSmrg 6188b22bf3fSmrgdashXmstdout) 6198b22bf3fSmrg # This case only exists to satisfy depend.m4. It is never actually 6208b22bf3fSmrg # run, as this mode is specially recognized in the preamble. 6218b22bf3fSmrg exit 1 6228b22bf3fSmrg ;; 6238b22bf3fSmrg 6248b22bf3fSmrgmakedepend) 6258b22bf3fSmrg "$@" || exit $? 6268b22bf3fSmrg # Remove any Libtool call 6278b22bf3fSmrg if test "$libtool" = yes; then 62896a81b41Smrg while test "X$1" != 'X--mode=compile'; do 6298b22bf3fSmrg shift 6308b22bf3fSmrg done 6318b22bf3fSmrg shift 6328b22bf3fSmrg fi 6338b22bf3fSmrg # X makedepend 6348b22bf3fSmrg shift 63596a81b41Smrg cleared=no eat=no 63696a81b41Smrg for arg 63796a81b41Smrg do 6388b22bf3fSmrg case $cleared in 6398b22bf3fSmrg no) 6408b22bf3fSmrg set ""; shift 6418b22bf3fSmrg cleared=yes ;; 6428b22bf3fSmrg esac 64396a81b41Smrg if test $eat = yes; then 64496a81b41Smrg eat=no 64596a81b41Smrg continue 64696a81b41Smrg fi 6478b22bf3fSmrg case "$arg" in 6488b22bf3fSmrg -D*|-I*) 6498b22bf3fSmrg set fnord "$@" "$arg"; shift ;; 6508b22bf3fSmrg # Strip any option that makedepend may not understand. Remove 6518b22bf3fSmrg # the object too, otherwise makedepend will parse it as a source file. 65296a81b41Smrg -arch) 65396a81b41Smrg eat=yes ;; 6548b22bf3fSmrg -*|$object) 6558b22bf3fSmrg ;; 6568b22bf3fSmrg *) 6578b22bf3fSmrg set fnord "$@" "$arg"; shift ;; 6588b22bf3fSmrg esac 6598b22bf3fSmrg done 66096a81b41Smrg obj_suffix=`echo "$object" | sed 's/^.*\././'` 6618b22bf3fSmrg touch "$tmpdepfile" 6628b22bf3fSmrg ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" 6638b22bf3fSmrg rm -f "$depfile" 664f126e068Smrg # makedepend may prepend the VPATH from the source file name to the object. 665f126e068Smrg # No need to regex-escape $object, excess matching of '.' is harmless. 666f126e068Smrg sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" 667f126e068Smrg # Some versions of the HPUX 10.20 sed can't process the last invocation 668f126e068Smrg # correctly. Breaking it into two sed invocations is a workaround. 669f126e068Smrg sed '1,2d' "$tmpdepfile" \ 670f126e068Smrg | tr ' ' "$nl" \ 671f126e068Smrg | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ 672f126e068Smrg | sed -e 's/$/ :/' >> "$depfile" 6738b22bf3fSmrg rm -f "$tmpdepfile" "$tmpdepfile".bak 6748b22bf3fSmrg ;; 6758b22bf3fSmrg 6768b22bf3fSmrgcpp) 6778b22bf3fSmrg # Important note: in order to support this mode, a compiler *must* 6788b22bf3fSmrg # always write the preprocessed file to stdout. 6798b22bf3fSmrg "$@" || exit $? 6808b22bf3fSmrg 6818b22bf3fSmrg # Remove the call to Libtool. 6828b22bf3fSmrg if test "$libtool" = yes; then 68396a81b41Smrg while test "X$1" != 'X--mode=compile'; do 6848b22bf3fSmrg shift 6858b22bf3fSmrg done 6868b22bf3fSmrg shift 6878b22bf3fSmrg fi 6888b22bf3fSmrg 689f126e068Smrg # Remove '-o $object'. 6908b22bf3fSmrg IFS=" " 6918b22bf3fSmrg for arg 6928b22bf3fSmrg do 6938b22bf3fSmrg case $arg in 6948b22bf3fSmrg -o) 6958b22bf3fSmrg shift 6968b22bf3fSmrg ;; 6978b22bf3fSmrg $object) 6988b22bf3fSmrg shift 6998b22bf3fSmrg ;; 7008b22bf3fSmrg *) 7018b22bf3fSmrg set fnord "$@" "$arg" 7028b22bf3fSmrg shift # fnord 7038b22bf3fSmrg shift # $arg 7048b22bf3fSmrg ;; 7058b22bf3fSmrg esac 7068b22bf3fSmrg done 7078b22bf3fSmrg 708f126e068Smrg "$@" -E \ 709f126e068Smrg | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ 710f126e068Smrg -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ 711f126e068Smrg | sed '$ s: \\$::' > "$tmpdepfile" 7128b22bf3fSmrg rm -f "$depfile" 7138b22bf3fSmrg echo "$object : \\" > "$depfile" 7148b22bf3fSmrg cat < "$tmpdepfile" >> "$depfile" 7158b22bf3fSmrg sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" 7168b22bf3fSmrg rm -f "$tmpdepfile" 7178b22bf3fSmrg ;; 7188b22bf3fSmrg 7198b22bf3fSmrgmsvisualcpp) 7208b22bf3fSmrg # Important note: in order to support this mode, a compiler *must* 72196a81b41Smrg # always write the preprocessed file to stdout. 7228b22bf3fSmrg "$@" || exit $? 72396a81b41Smrg 72496a81b41Smrg # Remove the call to Libtool. 72596a81b41Smrg if test "$libtool" = yes; then 72696a81b41Smrg while test "X$1" != 'X--mode=compile'; do 72796a81b41Smrg shift 72896a81b41Smrg done 72996a81b41Smrg shift 73096a81b41Smrg fi 73196a81b41Smrg 7328b22bf3fSmrg IFS=" " 7338b22bf3fSmrg for arg 7348b22bf3fSmrg do 7358b22bf3fSmrg case "$arg" in 73696a81b41Smrg -o) 73796a81b41Smrg shift 73896a81b41Smrg ;; 73996a81b41Smrg $object) 74096a81b41Smrg shift 74196a81b41Smrg ;; 7428b22bf3fSmrg "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") 743f126e068Smrg set fnord "$@" 744f126e068Smrg shift 745f126e068Smrg shift 746f126e068Smrg ;; 7478b22bf3fSmrg *) 748f126e068Smrg set fnord "$@" "$arg" 749f126e068Smrg shift 750f126e068Smrg shift 751f126e068Smrg ;; 7528b22bf3fSmrg esac 7538b22bf3fSmrg done 75496a81b41Smrg "$@" -E 2>/dev/null | 75596a81b41Smrg sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" 7568b22bf3fSmrg rm -f "$depfile" 7578b22bf3fSmrg echo "$object : \\" > "$depfile" 758f126e068Smrg sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" 759f126e068Smrg echo "$tab" >> "$depfile" 76096a81b41Smrg sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" 7618b22bf3fSmrg rm -f "$tmpdepfile" 7628b22bf3fSmrg ;; 7638b22bf3fSmrg 76496a81b41Smrgmsvcmsys) 76596a81b41Smrg # This case exists only to let depend.m4 do its work. It works by 76696a81b41Smrg # looking at the text of this script. This case will never be run, 76796a81b41Smrg # since it is checked for above. 76896a81b41Smrg exit 1 76996a81b41Smrg ;; 77096a81b41Smrg 7718b22bf3fSmrgnone) 7728b22bf3fSmrg exec "$@" 7738b22bf3fSmrg ;; 7748b22bf3fSmrg 7758b22bf3fSmrg*) 7768b22bf3fSmrg echo "Unknown depmode $depmode" 1>&2 7778b22bf3fSmrg exit 1 7788b22bf3fSmrg ;; 7798b22bf3fSmrgesac 7808b22bf3fSmrg 7818b22bf3fSmrgexit 0 7828b22bf3fSmrg 7838b22bf3fSmrg# Local Variables: 7848b22bf3fSmrg# mode: shell-script 7858b22bf3fSmrg# sh-indentation: 2 7869e1184feSmrg# eval: (add-hook 'before-save-hook 'time-stamp) 7878b22bf3fSmrg# time-stamp-start: "scriptversion=" 7888b22bf3fSmrg# time-stamp-format: "%:y-%02m-%02d.%02H" 7899e1184feSmrg# time-stamp-time-zone: "UTC0" 79096a81b41Smrg# time-stamp-end: "; # UTC" 7918b22bf3fSmrg# End: 792