depcomp revision 69ef5f27
1d1333322Smrg#! /bin/sh 2d1333322Smrg# depcomp - compile a program generating dependencies as side-effects 3d1333322Smrg 469ef5f27Smrgscriptversion=2013-05-30.07; # UTC 5d1333322Smrg 669ef5f27Smrg# Copyright (C) 1999-2013 Free Software Foundation, Inc. 7d1333322Smrg 8d1333322Smrg# This program is free software; you can redistribute it and/or modify 9d1333322Smrg# it under the terms of the GNU General Public License as published by 10d1333322Smrg# the Free Software Foundation; either version 2, or (at your option) 11d1333322Smrg# any later version. 12d1333322Smrg 13d1333322Smrg# This program is distributed in the hope that it will be useful, 14d1333322Smrg# but WITHOUT ANY WARRANTY; without even the implied warranty of 15d1333322Smrg# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16d1333322Smrg# GNU General Public License for more details. 17d1333322Smrg 18d1333322Smrg# You should have received a copy of the GNU General Public License 194f9ac78aSmrg# along with this program. If not, see <http://www.gnu.org/licenses/>. 20d1333322Smrg 21d1333322Smrg# As a special exception to the GNU General Public License, if you 22d1333322Smrg# distribute this file as part of a program that contains a 23d1333322Smrg# configuration script generated by Autoconf, you may include it under 24d1333322Smrg# the same distribution terms that you use for the rest of that program. 25d1333322Smrg 26d1333322Smrg# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>. 27d1333322Smrg 28d1333322Smrgcase $1 in 29d1333322Smrg '') 3069ef5f27Smrg echo "$0: No command. Try '$0 --help' for more information." 1>&2 3169ef5f27Smrg exit 1; 3269ef5f27Smrg ;; 33d1333322Smrg -h | --h*) 34d1333322Smrg cat <<\EOF 35d1333322SmrgUsage: depcomp [--help] [--version] PROGRAM [ARGS] 36d1333322Smrg 37d1333322SmrgRun PROGRAMS ARGS to compile a file, generating dependencies 38d1333322Smrgas side-effects. 39d1333322Smrg 40d1333322SmrgEnvironment variables: 41d1333322Smrg depmode Dependency tracking mode. 4269ef5f27Smrg source Source file read by 'PROGRAMS ARGS'. 4369ef5f27Smrg object Object file output by 'PROGRAMS ARGS'. 44d1333322Smrg DEPDIR directory where to store dependencies. 45d1333322Smrg depfile Dependency file to output. 46c27291ebSmrg tmpdepfile Temporary file to use when outputting dependencies. 47d1333322Smrg libtool Whether libtool is used (yes/no). 48d1333322Smrg 49d1333322SmrgReport bugs to <bug-automake@gnu.org>. 50d1333322SmrgEOF 51d1333322Smrg exit $? 52d1333322Smrg ;; 53d1333322Smrg -v | --v*) 54d1333322Smrg echo "depcomp $scriptversion" 55d1333322Smrg exit $? 56d1333322Smrg ;; 57d1333322Smrgesac 58d1333322Smrg 5969ef5f27Smrg# Get the directory component of the given path, and save it in the 6069ef5f27Smrg# global variables '$dir'. Note that this directory component will 6169ef5f27Smrg# be either empty or ending with a '/' character. This is deliberate. 6269ef5f27Smrgset_dir_from () 6369ef5f27Smrg{ 6469ef5f27Smrg case $1 in 6569ef5f27Smrg */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;; 6669ef5f27Smrg *) dir=;; 6769ef5f27Smrg esac 6869ef5f27Smrg} 6969ef5f27Smrg 7069ef5f27Smrg# Get the suffix-stripped basename of the given path, and save it the 7169ef5f27Smrg# global variable '$base'. 7269ef5f27Smrgset_base_from () 7369ef5f27Smrg{ 7469ef5f27Smrg base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'` 7569ef5f27Smrg} 7669ef5f27Smrg 7769ef5f27Smrg# If no dependency file was actually created by the compiler invocation, 7869ef5f27Smrg# we still have to create a dummy depfile, to avoid errors with the 7969ef5f27Smrg# Makefile "include basename.Plo" scheme. 8069ef5f27Smrgmake_dummy_depfile () 8169ef5f27Smrg{ 8269ef5f27Smrg echo "#dummy" > "$depfile" 8369ef5f27Smrg} 8469ef5f27Smrg 8569ef5f27Smrg# Factor out some common post-processing of the generated depfile. 8669ef5f27Smrg# Requires the auxiliary global variable '$tmpdepfile' to be set. 8769ef5f27Smrgaix_post_process_depfile () 8869ef5f27Smrg{ 8969ef5f27Smrg # If the compiler actually managed to produce a dependency file, 9069ef5f27Smrg # post-process it. 9169ef5f27Smrg if test -f "$tmpdepfile"; then 9269ef5f27Smrg # Each line is of the form 'foo.o: dependency.h'. 9369ef5f27Smrg # Do two passes, one to just change these to 9469ef5f27Smrg # $object: dependency.h 9569ef5f27Smrg # and one to simply output 9669ef5f27Smrg # dependency.h: 9769ef5f27Smrg # which is needed to avoid the deleted-header problem. 9869ef5f27Smrg { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile" 9969ef5f27Smrg sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile" 10069ef5f27Smrg } > "$depfile" 10169ef5f27Smrg rm -f "$tmpdepfile" 10269ef5f27Smrg else 10369ef5f27Smrg make_dummy_depfile 10469ef5f27Smrg fi 10569ef5f27Smrg} 10669ef5f27Smrg 10769ef5f27Smrg# A tabulation character. 10869ef5f27Smrgtab=' ' 10969ef5f27Smrg# A newline character. 11069ef5f27Smrgnl=' 11169ef5f27Smrg' 11269ef5f27Smrg# Character ranges might be problematic outside the C locale. 11369ef5f27Smrg# These definitions help. 11469ef5f27Smrgupper=ABCDEFGHIJKLMNOPQRSTUVWXYZ 11569ef5f27Smrglower=abcdefghijklmnopqrstuvwxyz 11669ef5f27Smrgdigits=0123456789 11769ef5f27Smrgalpha=${upper}${lower} 11869ef5f27Smrg 119d1333322Smrgif test -z "$depmode" || test -z "$source" || test -z "$object"; then 120d1333322Smrg echo "depcomp: Variables source, object and depmode must be set" 1>&2 121d1333322Smrg exit 1 122d1333322Smrgfi 123d1333322Smrg 124d1333322Smrg# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. 125d1333322Smrgdepfile=${depfile-`echo "$object" | 126d1333322Smrg sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} 127d1333322Smrgtmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} 128d1333322Smrg 129d1333322Smrgrm -f "$tmpdepfile" 130d1333322Smrg 13169ef5f27Smrg# Avoid interferences from the environment. 13269ef5f27Smrggccflag= dashmflag= 13369ef5f27Smrg 134d1333322Smrg# Some modes work just like other modes, but use different flags. We 135d1333322Smrg# parameterize here, but still list the modes in the big case below, 136d1333322Smrg# to make depend.m4 easier to write. Note that we *cannot* use a case 137d1333322Smrg# here, because this file can only contain one case statement. 138d1333322Smrgif test "$depmode" = hp; then 139d1333322Smrg # HP compiler uses -M and no extra arg. 140d1333322Smrg gccflag=-M 141d1333322Smrg depmode=gcc 142d1333322Smrgfi 143d1333322Smrg 144d1333322Smrgif test "$depmode" = dashXmstdout; then 14569ef5f27Smrg # This is just like dashmstdout with a different argument. 14669ef5f27Smrg dashmflag=-xM 14769ef5f27Smrg depmode=dashmstdout 148d1333322Smrgfi 149d1333322Smrg 1504f9ac78aSmrgcygpath_u="cygpath -u -f -" 1514f9ac78aSmrgif test "$depmode" = msvcmsys; then 15269ef5f27Smrg # This is just like msvisualcpp but w/o cygpath translation. 15369ef5f27Smrg # Just convert the backslash-escaped backslashes to single forward 15469ef5f27Smrg # slashes to satisfy depend.m4 15569ef5f27Smrg cygpath_u='sed s,\\\\,/,g' 15669ef5f27Smrg depmode=msvisualcpp 1574f9ac78aSmrgfi 1584f9ac78aSmrg 159c27291ebSmrgif test "$depmode" = msvc7msys; then 16069ef5f27Smrg # This is just like msvc7 but w/o cygpath translation. 16169ef5f27Smrg # Just convert the backslash-escaped backslashes to single forward 16269ef5f27Smrg # slashes to satisfy depend.m4 16369ef5f27Smrg cygpath_u='sed s,\\\\,/,g' 16469ef5f27Smrg depmode=msvc7 16569ef5f27Smrgfi 16669ef5f27Smrg 16769ef5f27Smrgif test "$depmode" = xlc; then 16869ef5f27Smrg # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information. 16969ef5f27Smrg gccflag=-qmakedep=gcc,-MF 17069ef5f27Smrg depmode=gcc 171c27291ebSmrgfi 172c27291ebSmrg 173d1333322Smrgcase "$depmode" in 174d1333322Smrggcc3) 175d1333322Smrg## gcc 3 implements dependency tracking that does exactly what 176d1333322Smrg## we want. Yay! Note: for some reason libtool 1.4 doesn't like 177d1333322Smrg## it if -MD -MP comes after the -MF stuff. Hmm. 178d1333322Smrg## Unfortunately, FreeBSD c89 acceptance of flags depends upon 179d1333322Smrg## the command line argument order; so add the flags where they 180d1333322Smrg## appear in depend2.am. Note that the slowdown incurred here 181d1333322Smrg## affects only configure: in makefiles, %FASTDEP% shortcuts this. 182d1333322Smrg for arg 183d1333322Smrg do 184d1333322Smrg case $arg in 185d1333322Smrg -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; 186d1333322Smrg *) set fnord "$@" "$arg" ;; 187d1333322Smrg esac 188d1333322Smrg shift # fnord 189d1333322Smrg shift # $arg 190d1333322Smrg done 191d1333322Smrg "$@" 192d1333322Smrg stat=$? 19369ef5f27Smrg if test $stat -ne 0; then 194d1333322Smrg rm -f "$tmpdepfile" 195d1333322Smrg exit $stat 196d1333322Smrg fi 197d1333322Smrg mv "$tmpdepfile" "$depfile" 198d1333322Smrg ;; 199d1333322Smrg 200d1333322Smrggcc) 20169ef5f27Smrg## Note that this doesn't just cater to obsosete pre-3.x GCC compilers. 20269ef5f27Smrg## but also to in-use compilers like IMB xlc/xlC and the HP C compiler. 20369ef5f27Smrg## (see the conditional assignment to $gccflag above). 204d1333322Smrg## There are various ways to get dependency output from gcc. Here's 205d1333322Smrg## why we pick this rather obscure method: 206d1333322Smrg## - Don't want to use -MD because we'd like the dependencies to end 207d1333322Smrg## up in a subdir. Having to rename by hand is ugly. 208d1333322Smrg## (We might end up doing this anyway to support other compilers.) 209d1333322Smrg## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like 21069ef5f27Smrg## -MM, not -M (despite what the docs say). Also, it might not be 21169ef5f27Smrg## supported by the other compilers which use the 'gcc' depmode. 212d1333322Smrg## - Using -M directly means running the compiler twice (even worse 213d1333322Smrg## than renaming). 214d1333322Smrg if test -z "$gccflag"; then 215d1333322Smrg gccflag=-MD, 216d1333322Smrg fi 217d1333322Smrg "$@" -Wp,"$gccflag$tmpdepfile" 218d1333322Smrg stat=$? 21969ef5f27Smrg if test $stat -ne 0; then 220d1333322Smrg rm -f "$tmpdepfile" 221d1333322Smrg exit $stat 222d1333322Smrg fi 223d1333322Smrg rm -f "$depfile" 224d1333322Smrg echo "$object : \\" > "$depfile" 22569ef5f27Smrg # The second -e expression handles DOS-style file names with drive 22669ef5f27Smrg # letters. 227d1333322Smrg sed -e 's/^[^:]*: / /' \ 228d1333322Smrg -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" 22969ef5f27Smrg## This next piece of magic avoids the "deleted header file" problem. 230d1333322Smrg## The problem is that when a header file which appears in a .P file 231d1333322Smrg## is deleted, the dependency causes make to die (because there is 232d1333322Smrg## typically no way to rebuild the header). We avoid this by adding 233d1333322Smrg## dummy dependencies for each header file. Too bad gcc doesn't do 234d1333322Smrg## this for us directly. 23569ef5f27Smrg## Some versions of gcc put a space before the ':'. On the theory 236d1333322Smrg## that the space means something, we add a space to the output as 237c27291ebSmrg## well. hp depmode also adds that space, but also prefixes the VPATH 238c27291ebSmrg## to the object. Take care to not repeat it in the output. 239d1333322Smrg## Some versions of the HPUX 10.20 sed can't process this invocation 240d1333322Smrg## correctly. Breaking it into two sed invocations is a workaround. 24169ef5f27Smrg tr ' ' "$nl" < "$tmpdepfile" \ 24269ef5f27Smrg | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ 24369ef5f27Smrg | sed -e 's/$/ :/' >> "$depfile" 244d1333322Smrg rm -f "$tmpdepfile" 245d1333322Smrg ;; 246d1333322Smrg 247d1333322Smrghp) 248d1333322Smrg # This case exists only to let depend.m4 do its work. It works by 249d1333322Smrg # looking at the text of this script. This case will never be run, 250d1333322Smrg # since it is checked for above. 251d1333322Smrg exit 1 252d1333322Smrg ;; 253d1333322Smrg 254d1333322Smrgsgi) 255d1333322Smrg if test "$libtool" = yes; then 256d1333322Smrg "$@" "-Wp,-MDupdate,$tmpdepfile" 257d1333322Smrg else 258d1333322Smrg "$@" -MDupdate "$tmpdepfile" 259d1333322Smrg fi 260d1333322Smrg stat=$? 26169ef5f27Smrg if test $stat -ne 0; then 262d1333322Smrg rm -f "$tmpdepfile" 263d1333322Smrg exit $stat 264d1333322Smrg fi 265d1333322Smrg rm -f "$depfile" 266d1333322Smrg 267d1333322Smrg if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files 268d1333322Smrg echo "$object : \\" > "$depfile" 269d1333322Smrg # Clip off the initial element (the dependent). Don't try to be 270d1333322Smrg # clever and replace this with sed code, as IRIX sed won't handle 271d1333322Smrg # lines with more than a fixed number of characters (4096 in 272d1333322Smrg # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; 27369ef5f27Smrg # the IRIX cc adds comments like '#:fec' to the end of the 274d1333322Smrg # dependency line. 27569ef5f27Smrg tr ' ' "$nl" < "$tmpdepfile" \ 27669ef5f27Smrg | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \ 27769ef5f27Smrg | tr "$nl" ' ' >> "$depfile" 2784f9ac78aSmrg echo >> "$depfile" 279d1333322Smrg # The second pass generates a dummy entry for each header file. 28069ef5f27Smrg tr ' ' "$nl" < "$tmpdepfile" \ 28169ef5f27Smrg | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ 28269ef5f27Smrg >> "$depfile" 283d1333322Smrg else 28469ef5f27Smrg make_dummy_depfile 285d1333322Smrg fi 286d1333322Smrg rm -f "$tmpdepfile" 287d1333322Smrg ;; 288d1333322Smrg 28969ef5f27Smrgxlc) 29069ef5f27Smrg # This case exists only to let depend.m4 do its work. It works by 29169ef5f27Smrg # looking at the text of this script. This case will never be run, 29269ef5f27Smrg # since it is checked for above. 29369ef5f27Smrg exit 1 29469ef5f27Smrg ;; 29569ef5f27Smrg 296d1333322Smrgaix) 297d1333322Smrg # The C for AIX Compiler uses -M and outputs the dependencies 298d1333322Smrg # in a .u file. In older versions, this file always lives in the 29969ef5f27Smrg # current directory. Also, the AIX compiler puts '$object:' at the 300d1333322Smrg # start of each line; $object doesn't have directory information. 301d1333322Smrg # Version 6 uses the directory in both cases. 30269ef5f27Smrg set_dir_from "$object" 30369ef5f27Smrg set_base_from "$object" 304d1333322Smrg if test "$libtool" = yes; then 3054f9ac78aSmrg tmpdepfile1=$dir$base.u 3064f9ac78aSmrg tmpdepfile2=$base.u 3074f9ac78aSmrg tmpdepfile3=$dir.libs/$base.u 308d1333322Smrg "$@" -Wc,-M 309d1333322Smrg else 3104f9ac78aSmrg tmpdepfile1=$dir$base.u 3114f9ac78aSmrg tmpdepfile2=$dir$base.u 3124f9ac78aSmrg tmpdepfile3=$dir$base.u 313d1333322Smrg "$@" -M 314d1333322Smrg fi 315d1333322Smrg stat=$? 31669ef5f27Smrg if test $stat -ne 0; then 3174f9ac78aSmrg rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 318d1333322Smrg exit $stat 319d1333322Smrg fi 320d1333322Smrg 3214f9ac78aSmrg for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 3224f9ac78aSmrg do 3234f9ac78aSmrg test -f "$tmpdepfile" && break 3244f9ac78aSmrg done 32569ef5f27Smrg aix_post_process_depfile 32669ef5f27Smrg ;; 32769ef5f27Smrg 32869ef5f27Smrgtcc) 32969ef5f27Smrg # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26 33069ef5f27Smrg # FIXME: That version still under development at the moment of writing. 33169ef5f27Smrg # Make that this statement remains true also for stable, released 33269ef5f27Smrg # versions. 33369ef5f27Smrg # It will wrap lines (doesn't matter whether long or short) with a 33469ef5f27Smrg # trailing '\', as in: 33569ef5f27Smrg # 33669ef5f27Smrg # foo.o : \ 33769ef5f27Smrg # foo.c \ 33869ef5f27Smrg # foo.h \ 33969ef5f27Smrg # 34069ef5f27Smrg # It will put a trailing '\' even on the last line, and will use leading 34169ef5f27Smrg # spaces rather than leading tabs (at least since its commit 0394caf7 34269ef5f27Smrg # "Emit spaces for -MD"). 34369ef5f27Smrg "$@" -MD -MF "$tmpdepfile" 34469ef5f27Smrg stat=$? 34569ef5f27Smrg if test $stat -ne 0; then 34669ef5f27Smrg rm -f "$tmpdepfile" 34769ef5f27Smrg exit $stat 348d1333322Smrg fi 34969ef5f27Smrg rm -f "$depfile" 35069ef5f27Smrg # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'. 35169ef5f27Smrg # We have to change lines of the first kind to '$object: \'. 35269ef5f27Smrg sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile" 35369ef5f27Smrg # And for each line of the second kind, we have to emit a 'dep.h:' 35469ef5f27Smrg # dummy dependency, to avoid the deleted-header problem. 35569ef5f27Smrg sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile" 356d1333322Smrg rm -f "$tmpdepfile" 357d1333322Smrg ;; 358d1333322Smrg 35969ef5f27Smrg## The order of this option in the case statement is important, since the 36069ef5f27Smrg## shell code in configure will try each of these formats in the order 36169ef5f27Smrg## listed in this file. A plain '-MD' option would be understood by many 36269ef5f27Smrg## compilers, so we must ensure this comes after the gcc and icc options. 36369ef5f27Smrgpgcc) 36469ef5f27Smrg # Portland's C compiler understands '-MD'. 36569ef5f27Smrg # Will always output deps to 'file.d' where file is the root name of the 36669ef5f27Smrg # source file under compilation, even if file resides in a subdirectory. 36769ef5f27Smrg # The object file name does not affect the name of the '.d' file. 36869ef5f27Smrg # pgcc 10.2 will output 369d1333322Smrg # foo.o: sub/foo.c sub/foo.h 37069ef5f27Smrg # and will wrap long lines using '\' : 371d1333322Smrg # foo.o: sub/foo.c ... \ 372d1333322Smrg # sub/foo.h ... \ 373d1333322Smrg # ... 37469ef5f27Smrg set_dir_from "$object" 37569ef5f27Smrg # Use the source, not the object, to determine the base name, since 37669ef5f27Smrg # that's sadly what pgcc will do too. 37769ef5f27Smrg set_base_from "$source" 37869ef5f27Smrg tmpdepfile=$base.d 37969ef5f27Smrg 38069ef5f27Smrg # For projects that build the same source file twice into different object 38169ef5f27Smrg # files, the pgcc approach of using the *source* file root name can cause 38269ef5f27Smrg # problems in parallel builds. Use a locking strategy to avoid stomping on 38369ef5f27Smrg # the same $tmpdepfile. 38469ef5f27Smrg lockdir=$base.d-lock 38569ef5f27Smrg trap " 38669ef5f27Smrg echo '$0: caught signal, cleaning up...' >&2 38769ef5f27Smrg rmdir '$lockdir' 38869ef5f27Smrg exit 1 38969ef5f27Smrg " 1 2 13 15 39069ef5f27Smrg numtries=100 39169ef5f27Smrg i=$numtries 39269ef5f27Smrg while test $i -gt 0; do 39369ef5f27Smrg # mkdir is a portable test-and-set. 39469ef5f27Smrg if mkdir "$lockdir" 2>/dev/null; then 39569ef5f27Smrg # This process acquired the lock. 39669ef5f27Smrg "$@" -MD 39769ef5f27Smrg stat=$? 39869ef5f27Smrg # Release the lock. 39969ef5f27Smrg rmdir "$lockdir" 40069ef5f27Smrg break 40169ef5f27Smrg else 40269ef5f27Smrg # If the lock is being held by a different process, wait 40369ef5f27Smrg # until the winning process is done or we timeout. 40469ef5f27Smrg while test -d "$lockdir" && test $i -gt 0; do 40569ef5f27Smrg sleep 1 40669ef5f27Smrg i=`expr $i - 1` 40769ef5f27Smrg done 40869ef5f27Smrg fi 40969ef5f27Smrg i=`expr $i - 1` 41069ef5f27Smrg done 41169ef5f27Smrg trap - 1 2 13 15 41269ef5f27Smrg if test $i -le 0; then 41369ef5f27Smrg echo "$0: failed to acquire lock after $numtries attempts" >&2 41469ef5f27Smrg echo "$0: check lockdir '$lockdir'" >&2 41569ef5f27Smrg exit 1 41669ef5f27Smrg fi 417d1333322Smrg 41869ef5f27Smrg if test $stat -ne 0; then 419d1333322Smrg rm -f "$tmpdepfile" 420d1333322Smrg exit $stat 421d1333322Smrg fi 422d1333322Smrg rm -f "$depfile" 423d1333322Smrg # Each line is of the form `foo.o: dependent.h', 424d1333322Smrg # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. 425d1333322Smrg # Do two passes, one to just change these to 426d1333322Smrg # `$object: dependent.h' and one to simply `dependent.h:'. 427d1333322Smrg sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" 428d1333322Smrg # Some versions of the HPUX 10.20 sed can't process this invocation 429d1333322Smrg # correctly. Breaking it into two sed invocations is a workaround. 43069ef5f27Smrg sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \ 43169ef5f27Smrg | sed -e 's/$/ :/' >> "$depfile" 432d1333322Smrg rm -f "$tmpdepfile" 433d1333322Smrg ;; 434d1333322Smrg 435d1333322Smrghp2) 436d1333322Smrg # The "hp" stanza above does not work with aCC (C++) and HP's ia64 437d1333322Smrg # compilers, which have integrated preprocessors. The correct option 438d1333322Smrg # to use with these is +Maked; it writes dependencies to a file named 439d1333322Smrg # 'foo.d', which lands next to the object file, wherever that 440d1333322Smrg # happens to be. 441d1333322Smrg # Much of this is similar to the tru64 case; see comments there. 44269ef5f27Smrg set_dir_from "$object" 44369ef5f27Smrg set_base_from "$object" 444d1333322Smrg if test "$libtool" = yes; then 445d1333322Smrg tmpdepfile1=$dir$base.d 446d1333322Smrg tmpdepfile2=$dir.libs/$base.d 447d1333322Smrg "$@" -Wc,+Maked 448d1333322Smrg else 449d1333322Smrg tmpdepfile1=$dir$base.d 450d1333322Smrg tmpdepfile2=$dir$base.d 451d1333322Smrg "$@" +Maked 452d1333322Smrg fi 453d1333322Smrg stat=$? 45469ef5f27Smrg if test $stat -ne 0; then 455d1333322Smrg rm -f "$tmpdepfile1" "$tmpdepfile2" 456d1333322Smrg exit $stat 457d1333322Smrg fi 458d1333322Smrg 459d1333322Smrg for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" 460d1333322Smrg do 461d1333322Smrg test -f "$tmpdepfile" && break 462d1333322Smrg done 463d1333322Smrg if test -f "$tmpdepfile"; then 46469ef5f27Smrg sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile" 46569ef5f27Smrg # Add 'dependent.h:' lines. 4664f9ac78aSmrg sed -ne '2,${ 46769ef5f27Smrg s/^ *// 46869ef5f27Smrg s/ \\*$// 46969ef5f27Smrg s/$/:/ 47069ef5f27Smrg p 47169ef5f27Smrg }' "$tmpdepfile" >> "$depfile" 472d1333322Smrg else 47369ef5f27Smrg make_dummy_depfile 474d1333322Smrg fi 475d1333322Smrg rm -f "$tmpdepfile" "$tmpdepfile2" 476d1333322Smrg ;; 477d1333322Smrg 478d1333322Smrgtru64) 47969ef5f27Smrg # The Tru64 compiler uses -MD to generate dependencies as a side 48069ef5f27Smrg # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. 48169ef5f27Smrg # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put 48269ef5f27Smrg # dependencies in 'foo.d' instead, so we check for that too. 48369ef5f27Smrg # Subdirectories are respected. 48469ef5f27Smrg set_dir_from "$object" 48569ef5f27Smrg set_base_from "$object" 48669ef5f27Smrg 48769ef5f27Smrg if test "$libtool" = yes; then 48869ef5f27Smrg # Libtool generates 2 separate objects for the 2 libraries. These 48969ef5f27Smrg # two compilations output dependencies in $dir.libs/$base.o.d and 49069ef5f27Smrg # in $dir$base.o.d. We have to check for both files, because 49169ef5f27Smrg # one of the two compilations can be disabled. We should prefer 49269ef5f27Smrg # $dir$base.o.d over $dir.libs/$base.o.d because the latter is 49369ef5f27Smrg # automatically cleaned when .libs/ is deleted, while ignoring 49469ef5f27Smrg # the former would cause a distcleancheck panic. 49569ef5f27Smrg tmpdepfile1=$dir$base.o.d # libtool 1.5 49669ef5f27Smrg tmpdepfile2=$dir.libs/$base.o.d # Likewise. 49769ef5f27Smrg tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504 49869ef5f27Smrg "$@" -Wc,-MD 49969ef5f27Smrg else 50069ef5f27Smrg tmpdepfile1=$dir$base.d 50169ef5f27Smrg tmpdepfile2=$dir$base.d 50269ef5f27Smrg tmpdepfile3=$dir$base.d 50369ef5f27Smrg "$@" -MD 50469ef5f27Smrg fi 50569ef5f27Smrg 50669ef5f27Smrg stat=$? 50769ef5f27Smrg if test $stat -ne 0; then 50869ef5f27Smrg rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 50969ef5f27Smrg exit $stat 51069ef5f27Smrg fi 51169ef5f27Smrg 51269ef5f27Smrg for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 51369ef5f27Smrg do 51469ef5f27Smrg test -f "$tmpdepfile" && break 51569ef5f27Smrg done 51669ef5f27Smrg # Same post-processing that is required for AIX mode. 51769ef5f27Smrg aix_post_process_depfile 51869ef5f27Smrg ;; 519d1333322Smrg 520c27291ebSmrgmsvc7) 521c27291ebSmrg if test "$libtool" = yes; then 522c27291ebSmrg showIncludes=-Wc,-showIncludes 523c27291ebSmrg else 524c27291ebSmrg showIncludes=-showIncludes 525c27291ebSmrg fi 526c27291ebSmrg "$@" $showIncludes > "$tmpdepfile" 527c27291ebSmrg stat=$? 528c27291ebSmrg grep -v '^Note: including file: ' "$tmpdepfile" 52969ef5f27Smrg if test $stat -ne 0; then 530c27291ebSmrg rm -f "$tmpdepfile" 531c27291ebSmrg exit $stat 532c27291ebSmrg fi 533c27291ebSmrg rm -f "$depfile" 534c27291ebSmrg echo "$object : \\" > "$depfile" 535c27291ebSmrg # The first sed program below extracts the file names and escapes 536c27291ebSmrg # backslashes for cygpath. The second sed program outputs the file 537c27291ebSmrg # name when reading, but also accumulates all include files in the 538c27291ebSmrg # hold buffer in order to output them again at the end. This only 539c27291ebSmrg # works with sed implementations that can handle large buffers. 540c27291ebSmrg sed < "$tmpdepfile" -n ' 541c27291ebSmrg/^Note: including file: *\(.*\)/ { 542c27291ebSmrg s//\1/ 543c27291ebSmrg s/\\/\\\\/g 544c27291ebSmrg p 545c27291ebSmrg}' | $cygpath_u | sort -u | sed -n ' 546c27291ebSmrgs/ /\\ /g 54769ef5f27Smrgs/\(.*\)/'"$tab"'\1 \\/p 548c27291ebSmrgs/.\(.*\) \\/\1:/ 549c27291ebSmrgH 550c27291ebSmrg$ { 55169ef5f27Smrg s/.*/'"$tab"'/ 552c27291ebSmrg G 553c27291ebSmrg p 554c27291ebSmrg}' >> "$depfile" 55569ef5f27Smrg echo >> "$depfile" # make sure the fragment doesn't end with a backslash 556c27291ebSmrg rm -f "$tmpdepfile" 557c27291ebSmrg ;; 558c27291ebSmrg 559c27291ebSmrgmsvc7msys) 560c27291ebSmrg # This case exists only to let depend.m4 do its work. It works by 561c27291ebSmrg # looking at the text of this script. This case will never be run, 562c27291ebSmrg # since it is checked for above. 563c27291ebSmrg exit 1 564c27291ebSmrg ;; 565c27291ebSmrg 566d1333322Smrg#nosideeffect) 567d1333322Smrg # This comment above is used by automake to tell side-effect 568d1333322Smrg # dependency tracking mechanisms from slower ones. 569d1333322Smrg 570d1333322Smrgdashmstdout) 571d1333322Smrg # Important note: in order to support this mode, a compiler *must* 572d1333322Smrg # always write the preprocessed file to stdout, regardless of -o. 573d1333322Smrg "$@" || exit $? 574d1333322Smrg 575d1333322Smrg # Remove the call to Libtool. 576d1333322Smrg if test "$libtool" = yes; then 5774f9ac78aSmrg while test "X$1" != 'X--mode=compile'; do 578d1333322Smrg shift 579d1333322Smrg done 580d1333322Smrg shift 581d1333322Smrg fi 582d1333322Smrg 58369ef5f27Smrg # Remove '-o $object'. 584d1333322Smrg IFS=" " 585d1333322Smrg for arg 586d1333322Smrg do 587d1333322Smrg case $arg in 588d1333322Smrg -o) 589d1333322Smrg shift 590d1333322Smrg ;; 591d1333322Smrg $object) 592d1333322Smrg shift 593d1333322Smrg ;; 594d1333322Smrg *) 595d1333322Smrg set fnord "$@" "$arg" 596d1333322Smrg shift # fnord 597d1333322Smrg shift # $arg 598d1333322Smrg ;; 599d1333322Smrg esac 600d1333322Smrg done 601d1333322Smrg 602d1333322Smrg test -z "$dashmflag" && dashmflag=-M 60369ef5f27Smrg # Require at least two characters before searching for ':' 604d1333322Smrg # in the target name. This is to cope with DOS-style filenames: 60569ef5f27Smrg # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. 606d1333322Smrg "$@" $dashmflag | 60769ef5f27Smrg sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile" 608d1333322Smrg rm -f "$depfile" 609d1333322Smrg cat < "$tmpdepfile" > "$depfile" 61069ef5f27Smrg # Some versions of the HPUX 10.20 sed can't process this sed invocation 61169ef5f27Smrg # correctly. Breaking it into two sed invocations is a workaround. 61269ef5f27Smrg tr ' ' "$nl" < "$tmpdepfile" \ 61369ef5f27Smrg | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ 61469ef5f27Smrg | sed -e 's/$/ :/' >> "$depfile" 615d1333322Smrg rm -f "$tmpdepfile" 616d1333322Smrg ;; 617d1333322Smrg 618d1333322SmrgdashXmstdout) 619d1333322Smrg # This case only exists to satisfy depend.m4. It is never actually 620d1333322Smrg # run, as this mode is specially recognized in the preamble. 621d1333322Smrg exit 1 622d1333322Smrg ;; 623d1333322Smrg 624d1333322Smrgmakedepend) 625d1333322Smrg "$@" || exit $? 626d1333322Smrg # Remove any Libtool call 627d1333322Smrg if test "$libtool" = yes; then 6284f9ac78aSmrg while test "X$1" != 'X--mode=compile'; do 629d1333322Smrg shift 630d1333322Smrg done 631d1333322Smrg shift 632d1333322Smrg fi 633d1333322Smrg # X makedepend 634d1333322Smrg shift 6354f9ac78aSmrg cleared=no eat=no 6364f9ac78aSmrg for arg 6374f9ac78aSmrg do 638d1333322Smrg case $cleared in 639d1333322Smrg no) 640d1333322Smrg set ""; shift 641d1333322Smrg cleared=yes ;; 642d1333322Smrg esac 6434f9ac78aSmrg if test $eat = yes; then 6444f9ac78aSmrg eat=no 6454f9ac78aSmrg continue 6464f9ac78aSmrg fi 647d1333322Smrg case "$arg" in 648d1333322Smrg -D*|-I*) 649d1333322Smrg set fnord "$@" "$arg"; shift ;; 650d1333322Smrg # Strip any option that makedepend may not understand. Remove 651d1333322Smrg # the object too, otherwise makedepend will parse it as a source file. 6524f9ac78aSmrg -arch) 6534f9ac78aSmrg eat=yes ;; 654d1333322Smrg -*|$object) 655d1333322Smrg ;; 656d1333322Smrg *) 657d1333322Smrg set fnord "$@" "$arg"; shift ;; 658d1333322Smrg esac 659d1333322Smrg done 6604f9ac78aSmrg obj_suffix=`echo "$object" | sed 's/^.*\././'` 661d1333322Smrg touch "$tmpdepfile" 662d1333322Smrg ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" 663d1333322Smrg rm -f "$depfile" 664c27291ebSmrg # makedepend may prepend the VPATH from the source file name to the object. 665c27291ebSmrg # No need to regex-escape $object, excess matching of '.' is harmless. 666c27291ebSmrg sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" 66769ef5f27Smrg # Some versions of the HPUX 10.20 sed can't process the last invocation 66869ef5f27Smrg # correctly. Breaking it into two sed invocations is a workaround. 66969ef5f27Smrg sed '1,2d' "$tmpdepfile" \ 67069ef5f27Smrg | tr ' ' "$nl" \ 67169ef5f27Smrg | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ 67269ef5f27Smrg | sed -e 's/$/ :/' >> "$depfile" 673d1333322Smrg rm -f "$tmpdepfile" "$tmpdepfile".bak 674d1333322Smrg ;; 675d1333322Smrg 676d1333322Smrgcpp) 677d1333322Smrg # Important note: in order to support this mode, a compiler *must* 678d1333322Smrg # always write the preprocessed file to stdout. 679d1333322Smrg "$@" || exit $? 680d1333322Smrg 681d1333322Smrg # Remove the call to Libtool. 682d1333322Smrg if test "$libtool" = yes; then 6834f9ac78aSmrg while test "X$1" != 'X--mode=compile'; do 684d1333322Smrg shift 685d1333322Smrg done 686d1333322Smrg shift 687d1333322Smrg fi 688d1333322Smrg 68969ef5f27Smrg # Remove '-o $object'. 690d1333322Smrg IFS=" " 691d1333322Smrg for arg 692d1333322Smrg do 693d1333322Smrg case $arg in 694d1333322Smrg -o) 695d1333322Smrg shift 696d1333322Smrg ;; 697d1333322Smrg $object) 698d1333322Smrg shift 699d1333322Smrg ;; 700d1333322Smrg *) 701d1333322Smrg set fnord "$@" "$arg" 702d1333322Smrg shift # fnord 703d1333322Smrg shift # $arg 704d1333322Smrg ;; 705d1333322Smrg esac 706d1333322Smrg done 707d1333322Smrg 70869ef5f27Smrg "$@" -E \ 70969ef5f27Smrg | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ 71069ef5f27Smrg -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ 71169ef5f27Smrg | sed '$ s: \\$::' > "$tmpdepfile" 712d1333322Smrg rm -f "$depfile" 713d1333322Smrg echo "$object : \\" > "$depfile" 714d1333322Smrg cat < "$tmpdepfile" >> "$depfile" 715d1333322Smrg sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" 716d1333322Smrg rm -f "$tmpdepfile" 717d1333322Smrg ;; 718d1333322Smrg 719d1333322Smrgmsvisualcpp) 720d1333322Smrg # Important note: in order to support this mode, a compiler *must* 7214f9ac78aSmrg # always write the preprocessed file to stdout. 722d1333322Smrg "$@" || exit $? 7234f9ac78aSmrg 7244f9ac78aSmrg # Remove the call to Libtool. 7254f9ac78aSmrg if test "$libtool" = yes; then 7264f9ac78aSmrg while test "X$1" != 'X--mode=compile'; do 7274f9ac78aSmrg shift 7284f9ac78aSmrg done 7294f9ac78aSmrg shift 7304f9ac78aSmrg fi 7314f9ac78aSmrg 732d1333322Smrg IFS=" " 733d1333322Smrg for arg 734d1333322Smrg do 735d1333322Smrg case "$arg" in 7364f9ac78aSmrg -o) 7374f9ac78aSmrg shift 7384f9ac78aSmrg ;; 7394f9ac78aSmrg $object) 7404f9ac78aSmrg shift 7414f9ac78aSmrg ;; 742d1333322Smrg "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") 74369ef5f27Smrg set fnord "$@" 74469ef5f27Smrg shift 74569ef5f27Smrg shift 74669ef5f27Smrg ;; 747d1333322Smrg *) 74869ef5f27Smrg set fnord "$@" "$arg" 74969ef5f27Smrg shift 75069ef5f27Smrg shift 75169ef5f27Smrg ;; 752d1333322Smrg esac 753d1333322Smrg done 7544f9ac78aSmrg "$@" -E 2>/dev/null | 7554f9ac78aSmrg sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" 756d1333322Smrg rm -f "$depfile" 757d1333322Smrg echo "$object : \\" > "$depfile" 75869ef5f27Smrg sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" 75969ef5f27Smrg echo "$tab" >> "$depfile" 7604f9ac78aSmrg sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" 761d1333322Smrg rm -f "$tmpdepfile" 762d1333322Smrg ;; 763d1333322Smrg 7644f9ac78aSmrgmsvcmsys) 7654f9ac78aSmrg # This case exists only to let depend.m4 do its work. It works by 7664f9ac78aSmrg # looking at the text of this script. This case will never be run, 7674f9ac78aSmrg # since it is checked for above. 7684f9ac78aSmrg exit 1 7694f9ac78aSmrg ;; 7704f9ac78aSmrg 771d1333322Smrgnone) 772d1333322Smrg exec "$@" 773d1333322Smrg ;; 774d1333322Smrg 775d1333322Smrg*) 776d1333322Smrg echo "Unknown depmode $depmode" 1>&2 777d1333322Smrg exit 1 778d1333322Smrg ;; 779d1333322Smrgesac 780d1333322Smrg 781d1333322Smrgexit 0 782d1333322Smrg 783d1333322Smrg# Local Variables: 784d1333322Smrg# mode: shell-script 785d1333322Smrg# sh-indentation: 2 786d1333322Smrg# eval: (add-hook 'write-file-hooks 'time-stamp) 787d1333322Smrg# time-stamp-start: "scriptversion=" 788d1333322Smrg# time-stamp-format: "%:y-%02m-%02d.%02H" 7894f9ac78aSmrg# time-stamp-time-zone: "UTC" 7904f9ac78aSmrg# time-stamp-end: "; # UTC" 791d1333322Smrg# End: 792