153354cdbSmrg#! /bin/sh 253354cdbSmrg# depcomp - compile a program generating dependencies as side-effects 353354cdbSmrg 4afb14e9bSmrgscriptversion=2018-03-07.03; # UTC 553354cdbSmrg 6afb14e9bSmrg# Copyright (C) 1999-2021 Free Software Foundation, Inc. 753354cdbSmrg 853354cdbSmrg# This program is free software; you can redistribute it and/or modify 953354cdbSmrg# it under the terms of the GNU General Public License as published by 1053354cdbSmrg# the Free Software Foundation; either version 2, or (at your option) 1153354cdbSmrg# any later version. 1253354cdbSmrg 1353354cdbSmrg# This program is distributed in the hope that it will be useful, 1453354cdbSmrg# but WITHOUT ANY WARRANTY; without even the implied warranty of 1553354cdbSmrg# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1653354cdbSmrg# GNU General Public License for more details. 1753354cdbSmrg 1853354cdbSmrg# You should have received a copy of the GNU General Public License 19afb14e9bSmrg# along with this program. If not, see <https://www.gnu.org/licenses/>. 2053354cdbSmrg 2153354cdbSmrg# As a special exception to the GNU General Public License, if you 2253354cdbSmrg# distribute this file as part of a program that contains a 2353354cdbSmrg# configuration script generated by Autoconf, you may include it under 2453354cdbSmrg# the same distribution terms that you use for the rest of that program. 2553354cdbSmrg 2653354cdbSmrg# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>. 2753354cdbSmrg 2853354cdbSmrgcase $1 in 2953354cdbSmrg '') 30ecb85c42Smrg echo "$0: No command. Try '$0 --help' for more information." 1>&2 31ecb85c42Smrg exit 1; 32ecb85c42Smrg ;; 3353354cdbSmrg -h | --h*) 3453354cdbSmrg cat <<\EOF 3553354cdbSmrgUsage: depcomp [--help] [--version] PROGRAM [ARGS] 3653354cdbSmrg 3753354cdbSmrgRun PROGRAMS ARGS to compile a file, generating dependencies 3853354cdbSmrgas side-effects. 3953354cdbSmrg 4053354cdbSmrgEnvironment variables: 4153354cdbSmrg depmode Dependency tracking mode. 42ecb85c42Smrg source Source file read by 'PROGRAMS ARGS'. 43ecb85c42Smrg object Object file output by 'PROGRAMS ARGS'. 4453354cdbSmrg DEPDIR directory where to store dependencies. 4553354cdbSmrg depfile Dependency file to output. 4661c899d4Smrg tmpdepfile Temporary file to use when outputting dependencies. 4753354cdbSmrg libtool Whether libtool is used (yes/no). 4853354cdbSmrg 4953354cdbSmrgReport bugs to <bug-automake@gnu.org>. 5053354cdbSmrgEOF 5153354cdbSmrg exit $? 5253354cdbSmrg ;; 5353354cdbSmrg -v | --v*) 5453354cdbSmrg echo "depcomp $scriptversion" 5553354cdbSmrg exit $? 5653354cdbSmrg ;; 5753354cdbSmrgesac 5853354cdbSmrg 59ecb85c42Smrg# Get the directory component of the given path, and save it in the 60ecb85c42Smrg# global variables '$dir'. Note that this directory component will 61ecb85c42Smrg# be either empty or ending with a '/' character. This is deliberate. 62ecb85c42Smrgset_dir_from () 63ecb85c42Smrg{ 64ecb85c42Smrg case $1 in 65ecb85c42Smrg */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;; 66ecb85c42Smrg *) dir=;; 67ecb85c42Smrg esac 68ecb85c42Smrg} 69ecb85c42Smrg 70ecb85c42Smrg# Get the suffix-stripped basename of the given path, and save it the 71ecb85c42Smrg# global variable '$base'. 72ecb85c42Smrgset_base_from () 73ecb85c42Smrg{ 74ecb85c42Smrg base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'` 75ecb85c42Smrg} 76ecb85c42Smrg 77ecb85c42Smrg# If no dependency file was actually created by the compiler invocation, 78ecb85c42Smrg# we still have to create a dummy depfile, to avoid errors with the 79ecb85c42Smrg# Makefile "include basename.Plo" scheme. 80ecb85c42Smrgmake_dummy_depfile () 81ecb85c42Smrg{ 82ecb85c42Smrg echo "#dummy" > "$depfile" 83ecb85c42Smrg} 84ecb85c42Smrg 85ecb85c42Smrg# Factor out some common post-processing of the generated depfile. 86ecb85c42Smrg# Requires the auxiliary global variable '$tmpdepfile' to be set. 87ecb85c42Smrgaix_post_process_depfile () 88ecb85c42Smrg{ 89ecb85c42Smrg # If the compiler actually managed to produce a dependency file, 90ecb85c42Smrg # post-process it. 91ecb85c42Smrg if test -f "$tmpdepfile"; then 92ecb85c42Smrg # Each line is of the form 'foo.o: dependency.h'. 93ecb85c42Smrg # Do two passes, one to just change these to 94ecb85c42Smrg # $object: dependency.h 95ecb85c42Smrg # and one to simply output 96ecb85c42Smrg # dependency.h: 97ecb85c42Smrg # which is needed to avoid the deleted-header problem. 98ecb85c42Smrg { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile" 99ecb85c42Smrg sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile" 100ecb85c42Smrg } > "$depfile" 101ecb85c42Smrg rm -f "$tmpdepfile" 102ecb85c42Smrg else 103ecb85c42Smrg make_dummy_depfile 104ecb85c42Smrg fi 105ecb85c42Smrg} 106ecb85c42Smrg 107ecb85c42Smrg# A tabulation character. 108ecb85c42Smrgtab=' ' 109ecb85c42Smrg# A newline character. 110ecb85c42Smrgnl=' 111ecb85c42Smrg' 112ecb85c42Smrg# Character ranges might be problematic outside the C locale. 113ecb85c42Smrg# These definitions help. 114ecb85c42Smrgupper=ABCDEFGHIJKLMNOPQRSTUVWXYZ 115ecb85c42Smrglower=abcdefghijklmnopqrstuvwxyz 116ecb85c42Smrgdigits=0123456789 117ecb85c42Smrgalpha=${upper}${lower} 118ecb85c42Smrg 11953354cdbSmrgif test -z "$depmode" || test -z "$source" || test -z "$object"; then 12053354cdbSmrg echo "depcomp: Variables source, object and depmode must be set" 1>&2 12153354cdbSmrg exit 1 12253354cdbSmrgfi 12353354cdbSmrg 12453354cdbSmrg# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. 12553354cdbSmrgdepfile=${depfile-`echo "$object" | 12653354cdbSmrg sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} 12753354cdbSmrgtmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} 12853354cdbSmrg 12953354cdbSmrgrm -f "$tmpdepfile" 13053354cdbSmrg 131ecb85c42Smrg# Avoid interferences from the environment. 132ecb85c42Smrggccflag= dashmflag= 133ecb85c42Smrg 13453354cdbSmrg# Some modes work just like other modes, but use different flags. We 13553354cdbSmrg# parameterize here, but still list the modes in the big case below, 13653354cdbSmrg# to make depend.m4 easier to write. Note that we *cannot* use a case 13753354cdbSmrg# here, because this file can only contain one case statement. 13853354cdbSmrgif test "$depmode" = hp; then 13953354cdbSmrg # HP compiler uses -M and no extra arg. 14053354cdbSmrg gccflag=-M 14153354cdbSmrg depmode=gcc 14253354cdbSmrgfi 14353354cdbSmrg 14453354cdbSmrgif test "$depmode" = dashXmstdout; then 145ecb85c42Smrg # This is just like dashmstdout with a different argument. 146ecb85c42Smrg dashmflag=-xM 147ecb85c42Smrg depmode=dashmstdout 14853354cdbSmrgfi 14953354cdbSmrg 15086bbecbeSmrgcygpath_u="cygpath -u -f -" 15186bbecbeSmrgif test "$depmode" = msvcmsys; then 152ecb85c42Smrg # This is just like msvisualcpp but w/o cygpath translation. 153ecb85c42Smrg # Just convert the backslash-escaped backslashes to single forward 154ecb85c42Smrg # slashes to satisfy depend.m4 155ecb85c42Smrg cygpath_u='sed s,\\\\,/,g' 156ecb85c42Smrg depmode=msvisualcpp 15786bbecbeSmrgfi 15886bbecbeSmrg 15961c899d4Smrgif test "$depmode" = msvc7msys; then 160ecb85c42Smrg # This is just like msvc7 but w/o cygpath translation. 161ecb85c42Smrg # Just convert the backslash-escaped backslashes to single forward 162ecb85c42Smrg # slashes to satisfy depend.m4 163ecb85c42Smrg cygpath_u='sed s,\\\\,/,g' 164ecb85c42Smrg depmode=msvc7 165ecb85c42Smrgfi 166ecb85c42Smrg 167ecb85c42Smrgif test "$depmode" = xlc; then 168ecb85c42Smrg # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information. 169ecb85c42Smrg gccflag=-qmakedep=gcc,-MF 170ecb85c42Smrg depmode=gcc 17161c899d4Smrgfi 17261c899d4Smrg 17353354cdbSmrgcase "$depmode" in 17453354cdbSmrggcc3) 17553354cdbSmrg## gcc 3 implements dependency tracking that does exactly what 17653354cdbSmrg## we want. Yay! Note: for some reason libtool 1.4 doesn't like 17753354cdbSmrg## it if -MD -MP comes after the -MF stuff. Hmm. 17853354cdbSmrg## Unfortunately, FreeBSD c89 acceptance of flags depends upon 17953354cdbSmrg## the command line argument order; so add the flags where they 18053354cdbSmrg## appear in depend2.am. Note that the slowdown incurred here 18153354cdbSmrg## affects only configure: in makefiles, %FASTDEP% shortcuts this. 18253354cdbSmrg for arg 18353354cdbSmrg do 18453354cdbSmrg case $arg in 18553354cdbSmrg -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; 18653354cdbSmrg *) set fnord "$@" "$arg" ;; 18753354cdbSmrg esac 18853354cdbSmrg shift # fnord 18953354cdbSmrg shift # $arg 19053354cdbSmrg done 19153354cdbSmrg "$@" 19253354cdbSmrg stat=$? 193ecb85c42Smrg if test $stat -ne 0; then 19453354cdbSmrg rm -f "$tmpdepfile" 19553354cdbSmrg exit $stat 19653354cdbSmrg fi 19753354cdbSmrg mv "$tmpdepfile" "$depfile" 19853354cdbSmrg ;; 19953354cdbSmrg 20053354cdbSmrggcc) 201ecb85c42Smrg## Note that this doesn't just cater to obsosete pre-3.x GCC compilers. 202ecb85c42Smrg## but also to in-use compilers like IMB xlc/xlC and the HP C compiler. 203ecb85c42Smrg## (see the conditional assignment to $gccflag above). 20453354cdbSmrg## There are various ways to get dependency output from gcc. Here's 20553354cdbSmrg## why we pick this rather obscure method: 20653354cdbSmrg## - Don't want to use -MD because we'd like the dependencies to end 20753354cdbSmrg## up in a subdir. Having to rename by hand is ugly. 20853354cdbSmrg## (We might end up doing this anyway to support other compilers.) 20953354cdbSmrg## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like 210ecb85c42Smrg## -MM, not -M (despite what the docs say). Also, it might not be 211ecb85c42Smrg## supported by the other compilers which use the 'gcc' depmode. 21253354cdbSmrg## - Using -M directly means running the compiler twice (even worse 21353354cdbSmrg## than renaming). 21453354cdbSmrg if test -z "$gccflag"; then 21553354cdbSmrg gccflag=-MD, 21653354cdbSmrg fi 21753354cdbSmrg "$@" -Wp,"$gccflag$tmpdepfile" 21853354cdbSmrg stat=$? 219ecb85c42Smrg if test $stat -ne 0; then 22053354cdbSmrg rm -f "$tmpdepfile" 22153354cdbSmrg exit $stat 22253354cdbSmrg fi 22353354cdbSmrg rm -f "$depfile" 22453354cdbSmrg echo "$object : \\" > "$depfile" 225ecb85c42Smrg # The second -e expression handles DOS-style file names with drive 226ecb85c42Smrg # letters. 22753354cdbSmrg sed -e 's/^[^:]*: / /' \ 22853354cdbSmrg -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" 229ecb85c42Smrg## This next piece of magic avoids the "deleted header file" problem. 23053354cdbSmrg## The problem is that when a header file which appears in a .P file 23153354cdbSmrg## is deleted, the dependency causes make to die (because there is 23253354cdbSmrg## typically no way to rebuild the header). We avoid this by adding 23353354cdbSmrg## dummy dependencies for each header file. Too bad gcc doesn't do 23453354cdbSmrg## this for us directly. 235ecb85c42Smrg## Some versions of gcc put a space before the ':'. On the theory 23653354cdbSmrg## that the space means something, we add a space to the output as 23761c899d4Smrg## well. hp depmode also adds that space, but also prefixes the VPATH 23861c899d4Smrg## to the object. Take care to not repeat it in the output. 23953354cdbSmrg## Some versions of the HPUX 10.20 sed can't process this invocation 24053354cdbSmrg## correctly. Breaking it into two sed invocations is a workaround. 241ecb85c42Smrg tr ' ' "$nl" < "$tmpdepfile" \ 242ecb85c42Smrg | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ 243ecb85c42Smrg | sed -e 's/$/ :/' >> "$depfile" 24453354cdbSmrg rm -f "$tmpdepfile" 24553354cdbSmrg ;; 24653354cdbSmrg 24753354cdbSmrghp) 24853354cdbSmrg # This case exists only to let depend.m4 do its work. It works by 24953354cdbSmrg # looking at the text of this script. This case will never be run, 25053354cdbSmrg # since it is checked for above. 25153354cdbSmrg exit 1 25253354cdbSmrg ;; 25353354cdbSmrg 25453354cdbSmrgsgi) 25553354cdbSmrg if test "$libtool" = yes; then 25653354cdbSmrg "$@" "-Wp,-MDupdate,$tmpdepfile" 25753354cdbSmrg else 25853354cdbSmrg "$@" -MDupdate "$tmpdepfile" 25953354cdbSmrg fi 26053354cdbSmrg stat=$? 261ecb85c42Smrg if test $stat -ne 0; then 26253354cdbSmrg rm -f "$tmpdepfile" 26353354cdbSmrg exit $stat 26453354cdbSmrg fi 26553354cdbSmrg rm -f "$depfile" 26653354cdbSmrg 26753354cdbSmrg if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files 26853354cdbSmrg echo "$object : \\" > "$depfile" 26953354cdbSmrg # Clip off the initial element (the dependent). Don't try to be 27053354cdbSmrg # clever and replace this with sed code, as IRIX sed won't handle 27153354cdbSmrg # lines with more than a fixed number of characters (4096 in 27253354cdbSmrg # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; 273ecb85c42Smrg # the IRIX cc adds comments like '#:fec' to the end of the 27453354cdbSmrg # dependency line. 275ecb85c42Smrg tr ' ' "$nl" < "$tmpdepfile" \ 276ecb85c42Smrg | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \ 277ecb85c42Smrg | tr "$nl" ' ' >> "$depfile" 27886bbecbeSmrg echo >> "$depfile" 27953354cdbSmrg # The second pass generates a dummy entry for each header file. 280ecb85c42Smrg tr ' ' "$nl" < "$tmpdepfile" \ 281ecb85c42Smrg | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ 282ecb85c42Smrg >> "$depfile" 28353354cdbSmrg else 284ecb85c42Smrg make_dummy_depfile 28553354cdbSmrg fi 28653354cdbSmrg rm -f "$tmpdepfile" 28753354cdbSmrg ;; 28853354cdbSmrg 289ecb85c42Smrgxlc) 290ecb85c42Smrg # This case exists only to let depend.m4 do its work. It works by 291ecb85c42Smrg # looking at the text of this script. This case will never be run, 292ecb85c42Smrg # since it is checked for above. 293ecb85c42Smrg exit 1 294ecb85c42Smrg ;; 295ecb85c42Smrg 29653354cdbSmrgaix) 29753354cdbSmrg # The C for AIX Compiler uses -M and outputs the dependencies 29853354cdbSmrg # in a .u file. In older versions, this file always lives in the 299ecb85c42Smrg # current directory. Also, the AIX compiler puts '$object:' at the 30053354cdbSmrg # start of each line; $object doesn't have directory information. 30153354cdbSmrg # Version 6 uses the directory in both cases. 302ecb85c42Smrg set_dir_from "$object" 303ecb85c42Smrg set_base_from "$object" 30453354cdbSmrg if test "$libtool" = yes; then 30586bbecbeSmrg tmpdepfile1=$dir$base.u 30686bbecbeSmrg tmpdepfile2=$base.u 30786bbecbeSmrg tmpdepfile3=$dir.libs/$base.u 30853354cdbSmrg "$@" -Wc,-M 30953354cdbSmrg else 31086bbecbeSmrg tmpdepfile1=$dir$base.u 31186bbecbeSmrg tmpdepfile2=$dir$base.u 31286bbecbeSmrg tmpdepfile3=$dir$base.u 31353354cdbSmrg "$@" -M 31453354cdbSmrg fi 31553354cdbSmrg stat=$? 316ecb85c42Smrg if test $stat -ne 0; then 31786bbecbeSmrg rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 31853354cdbSmrg exit $stat 31953354cdbSmrg fi 32053354cdbSmrg 32186bbecbeSmrg for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 32286bbecbeSmrg do 32386bbecbeSmrg test -f "$tmpdepfile" && break 32486bbecbeSmrg done 325ecb85c42Smrg aix_post_process_depfile 326ecb85c42Smrg ;; 327ecb85c42Smrg 328ecb85c42Smrgtcc) 329ecb85c42Smrg # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26 330ecb85c42Smrg # FIXME: That version still under development at the moment of writing. 331ecb85c42Smrg # Make that this statement remains true also for stable, released 332ecb85c42Smrg # versions. 333ecb85c42Smrg # It will wrap lines (doesn't matter whether long or short) with a 334ecb85c42Smrg # trailing '\', as in: 335ecb85c42Smrg # 336ecb85c42Smrg # foo.o : \ 337ecb85c42Smrg # foo.c \ 338ecb85c42Smrg # foo.h \ 339ecb85c42Smrg # 340ecb85c42Smrg # It will put a trailing '\' even on the last line, and will use leading 341ecb85c42Smrg # spaces rather than leading tabs (at least since its commit 0394caf7 342ecb85c42Smrg # "Emit spaces for -MD"). 343ecb85c42Smrg "$@" -MD -MF "$tmpdepfile" 344ecb85c42Smrg stat=$? 345ecb85c42Smrg if test $stat -ne 0; then 346ecb85c42Smrg rm -f "$tmpdepfile" 347ecb85c42Smrg exit $stat 34853354cdbSmrg fi 349ecb85c42Smrg rm -f "$depfile" 350ecb85c42Smrg # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'. 351ecb85c42Smrg # We have to change lines of the first kind to '$object: \'. 352ecb85c42Smrg sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile" 353ecb85c42Smrg # And for each line of the second kind, we have to emit a 'dep.h:' 354ecb85c42Smrg # dummy dependency, to avoid the deleted-header problem. 355ecb85c42Smrg sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile" 35653354cdbSmrg rm -f "$tmpdepfile" 35753354cdbSmrg ;; 35853354cdbSmrg 359ecb85c42Smrg## The order of this option in the case statement is important, since the 360ecb85c42Smrg## shell code in configure will try each of these formats in the order 361ecb85c42Smrg## listed in this file. A plain '-MD' option would be understood by many 362ecb85c42Smrg## compilers, so we must ensure this comes after the gcc and icc options. 363ecb85c42Smrgpgcc) 364ecb85c42Smrg # Portland's C compiler understands '-MD'. 365ecb85c42Smrg # Will always output deps to 'file.d' where file is the root name of the 366ecb85c42Smrg # source file under compilation, even if file resides in a subdirectory. 367ecb85c42Smrg # The object file name does not affect the name of the '.d' file. 368ecb85c42Smrg # pgcc 10.2 will output 36953354cdbSmrg # foo.o: sub/foo.c sub/foo.h 370ecb85c42Smrg # and will wrap long lines using '\' : 37153354cdbSmrg # foo.o: sub/foo.c ... \ 37253354cdbSmrg # sub/foo.h ... \ 37353354cdbSmrg # ... 374ecb85c42Smrg set_dir_from "$object" 375ecb85c42Smrg # Use the source, not the object, to determine the base name, since 376ecb85c42Smrg # that's sadly what pgcc will do too. 377ecb85c42Smrg set_base_from "$source" 378ecb85c42Smrg tmpdepfile=$base.d 379ecb85c42Smrg 380ecb85c42Smrg # For projects that build the same source file twice into different object 381ecb85c42Smrg # files, the pgcc approach of using the *source* file root name can cause 382ecb85c42Smrg # problems in parallel builds. Use a locking strategy to avoid stomping on 383ecb85c42Smrg # the same $tmpdepfile. 384ecb85c42Smrg lockdir=$base.d-lock 385ecb85c42Smrg trap " 386ecb85c42Smrg echo '$0: caught signal, cleaning up...' >&2 387ecb85c42Smrg rmdir '$lockdir' 388ecb85c42Smrg exit 1 389ecb85c42Smrg " 1 2 13 15 390ecb85c42Smrg numtries=100 391ecb85c42Smrg i=$numtries 392ecb85c42Smrg while test $i -gt 0; do 393ecb85c42Smrg # mkdir is a portable test-and-set. 394ecb85c42Smrg if mkdir "$lockdir" 2>/dev/null; then 395ecb85c42Smrg # This process acquired the lock. 396ecb85c42Smrg "$@" -MD 397ecb85c42Smrg stat=$? 398ecb85c42Smrg # Release the lock. 399ecb85c42Smrg rmdir "$lockdir" 400ecb85c42Smrg break 401ecb85c42Smrg else 402ecb85c42Smrg # If the lock is being held by a different process, wait 403ecb85c42Smrg # until the winning process is done or we timeout. 404ecb85c42Smrg while test -d "$lockdir" && test $i -gt 0; do 405ecb85c42Smrg sleep 1 406ecb85c42Smrg i=`expr $i - 1` 407ecb85c42Smrg done 408ecb85c42Smrg fi 409ecb85c42Smrg i=`expr $i - 1` 410ecb85c42Smrg done 411ecb85c42Smrg trap - 1 2 13 15 412ecb85c42Smrg if test $i -le 0; then 413ecb85c42Smrg echo "$0: failed to acquire lock after $numtries attempts" >&2 414ecb85c42Smrg echo "$0: check lockdir '$lockdir'" >&2 415ecb85c42Smrg exit 1 416ecb85c42Smrg fi 41753354cdbSmrg 418ecb85c42Smrg if test $stat -ne 0; then 41953354cdbSmrg rm -f "$tmpdepfile" 42053354cdbSmrg exit $stat 42153354cdbSmrg fi 42253354cdbSmrg rm -f "$depfile" 42353354cdbSmrg # Each line is of the form `foo.o: dependent.h', 42453354cdbSmrg # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. 42553354cdbSmrg # Do two passes, one to just change these to 42653354cdbSmrg # `$object: dependent.h' and one to simply `dependent.h:'. 42753354cdbSmrg sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" 42853354cdbSmrg # Some versions of the HPUX 10.20 sed can't process this invocation 42953354cdbSmrg # correctly. Breaking it into two sed invocations is a workaround. 430ecb85c42Smrg sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \ 431ecb85c42Smrg | sed -e 's/$/ :/' >> "$depfile" 43253354cdbSmrg rm -f "$tmpdepfile" 43353354cdbSmrg ;; 43453354cdbSmrg 43553354cdbSmrghp2) 43653354cdbSmrg # The "hp" stanza above does not work with aCC (C++) and HP's ia64 43753354cdbSmrg # compilers, which have integrated preprocessors. The correct option 43853354cdbSmrg # to use with these is +Maked; it writes dependencies to a file named 43953354cdbSmrg # 'foo.d', which lands next to the object file, wherever that 44053354cdbSmrg # happens to be. 44153354cdbSmrg # Much of this is similar to the tru64 case; see comments there. 442ecb85c42Smrg set_dir_from "$object" 443ecb85c42Smrg set_base_from "$object" 44453354cdbSmrg if test "$libtool" = yes; then 44553354cdbSmrg tmpdepfile1=$dir$base.d 44653354cdbSmrg tmpdepfile2=$dir.libs/$base.d 44753354cdbSmrg "$@" -Wc,+Maked 44853354cdbSmrg else 44953354cdbSmrg tmpdepfile1=$dir$base.d 45053354cdbSmrg tmpdepfile2=$dir$base.d 45153354cdbSmrg "$@" +Maked 45253354cdbSmrg fi 45353354cdbSmrg stat=$? 454ecb85c42Smrg if test $stat -ne 0; then 45553354cdbSmrg rm -f "$tmpdepfile1" "$tmpdepfile2" 45653354cdbSmrg exit $stat 45753354cdbSmrg fi 45853354cdbSmrg 45953354cdbSmrg for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" 46053354cdbSmrg do 46153354cdbSmrg test -f "$tmpdepfile" && break 46253354cdbSmrg done 46353354cdbSmrg if test -f "$tmpdepfile"; then 464ecb85c42Smrg sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile" 465ecb85c42Smrg # Add 'dependent.h:' lines. 46686bbecbeSmrg sed -ne '2,${ 467ecb85c42Smrg s/^ *// 468ecb85c42Smrg s/ \\*$// 469ecb85c42Smrg s/$/:/ 470ecb85c42Smrg p 471ecb85c42Smrg }' "$tmpdepfile" >> "$depfile" 47253354cdbSmrg else 473ecb85c42Smrg make_dummy_depfile 47453354cdbSmrg fi 47553354cdbSmrg rm -f "$tmpdepfile" "$tmpdepfile2" 47653354cdbSmrg ;; 47753354cdbSmrg 47853354cdbSmrgtru64) 479ecb85c42Smrg # The Tru64 compiler uses -MD to generate dependencies as a side 480ecb85c42Smrg # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. 481ecb85c42Smrg # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put 482ecb85c42Smrg # dependencies in 'foo.d' instead, so we check for that too. 483ecb85c42Smrg # Subdirectories are respected. 484ecb85c42Smrg set_dir_from "$object" 485ecb85c42Smrg set_base_from "$object" 486ecb85c42Smrg 487ecb85c42Smrg if test "$libtool" = yes; then 488ecb85c42Smrg # Libtool generates 2 separate objects for the 2 libraries. These 489ecb85c42Smrg # two compilations output dependencies in $dir.libs/$base.o.d and 490ecb85c42Smrg # in $dir$base.o.d. We have to check for both files, because 491ecb85c42Smrg # one of the two compilations can be disabled. We should prefer 492ecb85c42Smrg # $dir$base.o.d over $dir.libs/$base.o.d because the latter is 493ecb85c42Smrg # automatically cleaned when .libs/ is deleted, while ignoring 494ecb85c42Smrg # the former would cause a distcleancheck panic. 495ecb85c42Smrg tmpdepfile1=$dir$base.o.d # libtool 1.5 496ecb85c42Smrg tmpdepfile2=$dir.libs/$base.o.d # Likewise. 497ecb85c42Smrg tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504 498ecb85c42Smrg "$@" -Wc,-MD 499ecb85c42Smrg else 500ecb85c42Smrg tmpdepfile1=$dir$base.d 501ecb85c42Smrg tmpdepfile2=$dir$base.d 502ecb85c42Smrg tmpdepfile3=$dir$base.d 503ecb85c42Smrg "$@" -MD 504ecb85c42Smrg fi 505ecb85c42Smrg 506ecb85c42Smrg stat=$? 507ecb85c42Smrg if test $stat -ne 0; then 508ecb85c42Smrg rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 509ecb85c42Smrg exit $stat 510ecb85c42Smrg fi 511ecb85c42Smrg 512ecb85c42Smrg for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 513ecb85c42Smrg do 514ecb85c42Smrg test -f "$tmpdepfile" && break 515ecb85c42Smrg done 516ecb85c42Smrg # Same post-processing that is required for AIX mode. 517ecb85c42Smrg aix_post_process_depfile 518ecb85c42Smrg ;; 51953354cdbSmrg 52061c899d4Smrgmsvc7) 52161c899d4Smrg if test "$libtool" = yes; then 52261c899d4Smrg showIncludes=-Wc,-showIncludes 52361c899d4Smrg else 52461c899d4Smrg showIncludes=-showIncludes 52561c899d4Smrg fi 52661c899d4Smrg "$@" $showIncludes > "$tmpdepfile" 52761c899d4Smrg stat=$? 52861c899d4Smrg grep -v '^Note: including file: ' "$tmpdepfile" 529ecb85c42Smrg if test $stat -ne 0; then 53061c899d4Smrg rm -f "$tmpdepfile" 53161c899d4Smrg exit $stat 53261c899d4Smrg fi 53361c899d4Smrg rm -f "$depfile" 53461c899d4Smrg echo "$object : \\" > "$depfile" 53561c899d4Smrg # The first sed program below extracts the file names and escapes 53661c899d4Smrg # backslashes for cygpath. The second sed program outputs the file 53761c899d4Smrg # name when reading, but also accumulates all include files in the 53861c899d4Smrg # hold buffer in order to output them again at the end. This only 53961c899d4Smrg # works with sed implementations that can handle large buffers. 54061c899d4Smrg sed < "$tmpdepfile" -n ' 54161c899d4Smrg/^Note: including file: *\(.*\)/ { 54261c899d4Smrg s//\1/ 54361c899d4Smrg s/\\/\\\\/g 54461c899d4Smrg p 54561c899d4Smrg}' | $cygpath_u | sort -u | sed -n ' 54661c899d4Smrgs/ /\\ /g 547ecb85c42Smrgs/\(.*\)/'"$tab"'\1 \\/p 54861c899d4Smrgs/.\(.*\) \\/\1:/ 54961c899d4SmrgH 55061c899d4Smrg$ { 551ecb85c42Smrg s/.*/'"$tab"'/ 55261c899d4Smrg G 55361c899d4Smrg p 55461c899d4Smrg}' >> "$depfile" 555ecb85c42Smrg echo >> "$depfile" # make sure the fragment doesn't end with a backslash 55661c899d4Smrg rm -f "$tmpdepfile" 55761c899d4Smrg ;; 55861c899d4Smrg 55961c899d4Smrgmsvc7msys) 56061c899d4Smrg # This case exists only to let depend.m4 do its work. It works by 56161c899d4Smrg # looking at the text of this script. This case will never be run, 56261c899d4Smrg # since it is checked for above. 56361c899d4Smrg exit 1 56461c899d4Smrg ;; 56561c899d4Smrg 56653354cdbSmrg#nosideeffect) 56753354cdbSmrg # This comment above is used by automake to tell side-effect 56853354cdbSmrg # dependency tracking mechanisms from slower ones. 56953354cdbSmrg 57053354cdbSmrgdashmstdout) 57153354cdbSmrg # Important note: in order to support this mode, a compiler *must* 57253354cdbSmrg # always write the preprocessed file to stdout, regardless of -o. 57353354cdbSmrg "$@" || exit $? 57453354cdbSmrg 57553354cdbSmrg # Remove the call to Libtool. 57653354cdbSmrg if test "$libtool" = yes; then 57786bbecbeSmrg while test "X$1" != 'X--mode=compile'; do 57853354cdbSmrg shift 57953354cdbSmrg done 58053354cdbSmrg shift 58153354cdbSmrg fi 58253354cdbSmrg 583ecb85c42Smrg # Remove '-o $object'. 58453354cdbSmrg IFS=" " 58553354cdbSmrg for arg 58653354cdbSmrg do 58753354cdbSmrg case $arg in 58853354cdbSmrg -o) 58953354cdbSmrg shift 59053354cdbSmrg ;; 59153354cdbSmrg $object) 59253354cdbSmrg shift 59353354cdbSmrg ;; 59453354cdbSmrg *) 59553354cdbSmrg set fnord "$@" "$arg" 59653354cdbSmrg shift # fnord 59753354cdbSmrg shift # $arg 59853354cdbSmrg ;; 59953354cdbSmrg esac 60053354cdbSmrg done 60153354cdbSmrg 60253354cdbSmrg test -z "$dashmflag" && dashmflag=-M 603ecb85c42Smrg # Require at least two characters before searching for ':' 60453354cdbSmrg # in the target name. This is to cope with DOS-style filenames: 605ecb85c42Smrg # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. 60653354cdbSmrg "$@" $dashmflag | 607ecb85c42Smrg sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile" 60853354cdbSmrg rm -f "$depfile" 60953354cdbSmrg cat < "$tmpdepfile" > "$depfile" 610ecb85c42Smrg # Some versions of the HPUX 10.20 sed can't process this sed invocation 611ecb85c42Smrg # correctly. Breaking it into two sed invocations is a workaround. 612ecb85c42Smrg tr ' ' "$nl" < "$tmpdepfile" \ 613ecb85c42Smrg | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ 614ecb85c42Smrg | sed -e 's/$/ :/' >> "$depfile" 61553354cdbSmrg rm -f "$tmpdepfile" 61653354cdbSmrg ;; 61753354cdbSmrg 61853354cdbSmrgdashXmstdout) 61953354cdbSmrg # This case only exists to satisfy depend.m4. It is never actually 62053354cdbSmrg # run, as this mode is specially recognized in the preamble. 62153354cdbSmrg exit 1 62253354cdbSmrg ;; 62353354cdbSmrg 62453354cdbSmrgmakedepend) 62553354cdbSmrg "$@" || exit $? 62653354cdbSmrg # Remove any Libtool call 62753354cdbSmrg if test "$libtool" = yes; then 62886bbecbeSmrg while test "X$1" != 'X--mode=compile'; do 62953354cdbSmrg shift 63053354cdbSmrg done 63153354cdbSmrg shift 63253354cdbSmrg fi 63353354cdbSmrg # X makedepend 63453354cdbSmrg shift 63586bbecbeSmrg cleared=no eat=no 63686bbecbeSmrg for arg 63786bbecbeSmrg do 63853354cdbSmrg case $cleared in 63953354cdbSmrg no) 64053354cdbSmrg set ""; shift 64153354cdbSmrg cleared=yes ;; 64253354cdbSmrg esac 64386bbecbeSmrg if test $eat = yes; then 64486bbecbeSmrg eat=no 64586bbecbeSmrg continue 64686bbecbeSmrg fi 64753354cdbSmrg case "$arg" in 64853354cdbSmrg -D*|-I*) 64953354cdbSmrg set fnord "$@" "$arg"; shift ;; 65053354cdbSmrg # Strip any option that makedepend may not understand. Remove 65153354cdbSmrg # the object too, otherwise makedepend will parse it as a source file. 65286bbecbeSmrg -arch) 65386bbecbeSmrg eat=yes ;; 65453354cdbSmrg -*|$object) 65553354cdbSmrg ;; 65653354cdbSmrg *) 65753354cdbSmrg set fnord "$@" "$arg"; shift ;; 65853354cdbSmrg esac 65953354cdbSmrg done 66086bbecbeSmrg obj_suffix=`echo "$object" | sed 's/^.*\././'` 66153354cdbSmrg touch "$tmpdepfile" 66253354cdbSmrg ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" 66353354cdbSmrg rm -f "$depfile" 66461c899d4Smrg # makedepend may prepend the VPATH from the source file name to the object. 66561c899d4Smrg # No need to regex-escape $object, excess matching of '.' is harmless. 66661c899d4Smrg sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" 667ecb85c42Smrg # Some versions of the HPUX 10.20 sed can't process the last invocation 668ecb85c42Smrg # correctly. Breaking it into two sed invocations is a workaround. 669ecb85c42Smrg sed '1,2d' "$tmpdepfile" \ 670ecb85c42Smrg | tr ' ' "$nl" \ 671ecb85c42Smrg | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ 672ecb85c42Smrg | sed -e 's/$/ :/' >> "$depfile" 67353354cdbSmrg rm -f "$tmpdepfile" "$tmpdepfile".bak 67453354cdbSmrg ;; 67553354cdbSmrg 67653354cdbSmrgcpp) 67753354cdbSmrg # Important note: in order to support this mode, a compiler *must* 67853354cdbSmrg # always write the preprocessed file to stdout. 67953354cdbSmrg "$@" || exit $? 68053354cdbSmrg 68153354cdbSmrg # Remove the call to Libtool. 68253354cdbSmrg if test "$libtool" = yes; then 68386bbecbeSmrg while test "X$1" != 'X--mode=compile'; do 68453354cdbSmrg shift 68553354cdbSmrg done 68653354cdbSmrg shift 68753354cdbSmrg fi 68853354cdbSmrg 689ecb85c42Smrg # Remove '-o $object'. 69053354cdbSmrg IFS=" " 69153354cdbSmrg for arg 69253354cdbSmrg do 69353354cdbSmrg case $arg in 69453354cdbSmrg -o) 69553354cdbSmrg shift 69653354cdbSmrg ;; 69753354cdbSmrg $object) 69853354cdbSmrg shift 69953354cdbSmrg ;; 70053354cdbSmrg *) 70153354cdbSmrg set fnord "$@" "$arg" 70253354cdbSmrg shift # fnord 70353354cdbSmrg shift # $arg 70453354cdbSmrg ;; 70553354cdbSmrg esac 70653354cdbSmrg done 70753354cdbSmrg 708ecb85c42Smrg "$@" -E \ 709ecb85c42Smrg | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ 710ecb85c42Smrg -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ 711ecb85c42Smrg | sed '$ s: \\$::' > "$tmpdepfile" 71253354cdbSmrg rm -f "$depfile" 71353354cdbSmrg echo "$object : \\" > "$depfile" 71453354cdbSmrg cat < "$tmpdepfile" >> "$depfile" 71553354cdbSmrg sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" 71653354cdbSmrg rm -f "$tmpdepfile" 71753354cdbSmrg ;; 71853354cdbSmrg 71953354cdbSmrgmsvisualcpp) 72053354cdbSmrg # Important note: in order to support this mode, a compiler *must* 72186bbecbeSmrg # always write the preprocessed file to stdout. 72253354cdbSmrg "$@" || exit $? 72386bbecbeSmrg 72486bbecbeSmrg # Remove the call to Libtool. 72586bbecbeSmrg if test "$libtool" = yes; then 72686bbecbeSmrg while test "X$1" != 'X--mode=compile'; do 72786bbecbeSmrg shift 72886bbecbeSmrg done 72986bbecbeSmrg shift 73086bbecbeSmrg fi 73186bbecbeSmrg 73253354cdbSmrg IFS=" " 73353354cdbSmrg for arg 73453354cdbSmrg do 73553354cdbSmrg case "$arg" in 73686bbecbeSmrg -o) 73786bbecbeSmrg shift 73886bbecbeSmrg ;; 73986bbecbeSmrg $object) 74086bbecbeSmrg shift 74186bbecbeSmrg ;; 74253354cdbSmrg "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") 743ecb85c42Smrg set fnord "$@" 744ecb85c42Smrg shift 745ecb85c42Smrg shift 746ecb85c42Smrg ;; 74753354cdbSmrg *) 748ecb85c42Smrg set fnord "$@" "$arg" 749ecb85c42Smrg shift 750ecb85c42Smrg shift 751ecb85c42Smrg ;; 75253354cdbSmrg esac 75353354cdbSmrg done 75486bbecbeSmrg "$@" -E 2>/dev/null | 75586bbecbeSmrg sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" 75653354cdbSmrg rm -f "$depfile" 75753354cdbSmrg echo "$object : \\" > "$depfile" 758ecb85c42Smrg sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" 759ecb85c42Smrg echo "$tab" >> "$depfile" 76086bbecbeSmrg sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" 76153354cdbSmrg rm -f "$tmpdepfile" 76253354cdbSmrg ;; 76353354cdbSmrg 76486bbecbeSmrgmsvcmsys) 76586bbecbeSmrg # This case exists only to let depend.m4 do its work. It works by 76686bbecbeSmrg # looking at the text of this script. This case will never be run, 76786bbecbeSmrg # since it is checked for above. 76886bbecbeSmrg exit 1 76986bbecbeSmrg ;; 77086bbecbeSmrg 77153354cdbSmrgnone) 77253354cdbSmrg exec "$@" 77353354cdbSmrg ;; 77453354cdbSmrg 77553354cdbSmrg*) 77653354cdbSmrg echo "Unknown depmode $depmode" 1>&2 77753354cdbSmrg exit 1 77853354cdbSmrg ;; 77953354cdbSmrgesac 78053354cdbSmrg 78153354cdbSmrgexit 0 78253354cdbSmrg 78353354cdbSmrg# Local Variables: 78453354cdbSmrg# mode: shell-script 78553354cdbSmrg# sh-indentation: 2 786afb14e9bSmrg# eval: (add-hook 'before-save-hook 'time-stamp) 78753354cdbSmrg# time-stamp-start: "scriptversion=" 78853354cdbSmrg# time-stamp-format: "%:y-%02m-%02d.%02H" 789afb14e9bSmrg# time-stamp-time-zone: "UTC0" 79086bbecbeSmrg# time-stamp-end: "; # UTC" 79153354cdbSmrg# End: 792