167f05d30Smrg#! /bin/sh 267f05d30Smrg# depcomp - compile a program generating dependencies as side-effects 3fffe5102Smrg 4051ceee6Smrgscriptversion=2018-03-07.03; # UTC 5fffe5102Smrg 6051ceee6Smrg# Copyright (C) 1999-2021 Free Software Foundation, Inc. 767f05d30Smrg 867f05d30Smrg# This program is free software; you can redistribute it and/or modify 967f05d30Smrg# it under the terms of the GNU General Public License as published by 1067f05d30Smrg# the Free Software Foundation; either version 2, or (at your option) 1167f05d30Smrg# any later version. 1267f05d30Smrg 1367f05d30Smrg# This program is distributed in the hope that it will be useful, 1467f05d30Smrg# but WITHOUT ANY WARRANTY; without even the implied warranty of 1567f05d30Smrg# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1667f05d30Smrg# GNU General Public License for more details. 1767f05d30Smrg 1867f05d30Smrg# You should have received a copy of the GNU General Public License 19051ceee6Smrg# along with this program. If not, see <https://www.gnu.org/licenses/>. 2067f05d30Smrg 2167f05d30Smrg# As a special exception to the GNU General Public License, if you 2267f05d30Smrg# distribute this file as part of a program that contains a 2367f05d30Smrg# configuration script generated by Autoconf, you may include it under 2467f05d30Smrg# the same distribution terms that you use for the rest of that program. 2567f05d30Smrg 2667f05d30Smrg# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>. 2767f05d30Smrg 28fffe5102Smrgcase $1 in 29fffe5102Smrg '') 30e90eff46Smrg echo "$0: No command. Try '$0 --help' for more information." 1>&2 31e90eff46Smrg exit 1; 32e90eff46Smrg ;; 33fffe5102Smrg -h | --h*) 34fffe5102Smrg cat <<\EOF 35fffe5102SmrgUsage: depcomp [--help] [--version] PROGRAM [ARGS] 36fffe5102Smrg 37fffe5102SmrgRun PROGRAMS ARGS to compile a file, generating dependencies 38fffe5102Smrgas side-effects. 39fffe5102Smrg 40fffe5102SmrgEnvironment variables: 41fffe5102Smrg depmode Dependency tracking mode. 42e90eff46Smrg source Source file read by 'PROGRAMS ARGS'. 43e90eff46Smrg object Object file output by 'PROGRAMS ARGS'. 44fffe5102Smrg DEPDIR directory where to store dependencies. 45fffe5102Smrg depfile Dependency file to output. 466dbd43aaSmrg tmpdepfile Temporary file to use when outputting dependencies. 47fffe5102Smrg libtool Whether libtool is used (yes/no). 48fffe5102Smrg 49fffe5102SmrgReport bugs to <bug-automake@gnu.org>. 50fffe5102SmrgEOF 51fffe5102Smrg exit $? 52fffe5102Smrg ;; 53fffe5102Smrg -v | --v*) 54fffe5102Smrg echo "depcomp $scriptversion" 55fffe5102Smrg exit $? 56fffe5102Smrg ;; 57fffe5102Smrgesac 58fffe5102Smrg 59e90eff46Smrg# Get the directory component of the given path, and save it in the 60e90eff46Smrg# global variables '$dir'. Note that this directory component will 61e90eff46Smrg# be either empty or ending with a '/' character. This is deliberate. 62e90eff46Smrgset_dir_from () 63e90eff46Smrg{ 64e90eff46Smrg case $1 in 65e90eff46Smrg */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;; 66e90eff46Smrg *) dir=;; 67e90eff46Smrg esac 68e90eff46Smrg} 69e90eff46Smrg 70e90eff46Smrg# Get the suffix-stripped basename of the given path, and save it the 71e90eff46Smrg# global variable '$base'. 72e90eff46Smrgset_base_from () 73e90eff46Smrg{ 74e90eff46Smrg base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'` 75e90eff46Smrg} 76e90eff46Smrg 77e90eff46Smrg# If no dependency file was actually created by the compiler invocation, 78e90eff46Smrg# we still have to create a dummy depfile, to avoid errors with the 79e90eff46Smrg# Makefile "include basename.Plo" scheme. 80e90eff46Smrgmake_dummy_depfile () 81e90eff46Smrg{ 82e90eff46Smrg echo "#dummy" > "$depfile" 83e90eff46Smrg} 84e90eff46Smrg 85e90eff46Smrg# Factor out some common post-processing of the generated depfile. 86e90eff46Smrg# Requires the auxiliary global variable '$tmpdepfile' to be set. 87e90eff46Smrgaix_post_process_depfile () 88e90eff46Smrg{ 89e90eff46Smrg # If the compiler actually managed to produce a dependency file, 90e90eff46Smrg # post-process it. 91e90eff46Smrg if test -f "$tmpdepfile"; then 92e90eff46Smrg # Each line is of the form 'foo.o: dependency.h'. 93e90eff46Smrg # Do two passes, one to just change these to 94e90eff46Smrg # $object: dependency.h 95e90eff46Smrg # and one to simply output 96e90eff46Smrg # dependency.h: 97e90eff46Smrg # which is needed to avoid the deleted-header problem. 98e90eff46Smrg { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile" 99e90eff46Smrg sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile" 100e90eff46Smrg } > "$depfile" 101e90eff46Smrg rm -f "$tmpdepfile" 102e90eff46Smrg else 103e90eff46Smrg make_dummy_depfile 104e90eff46Smrg fi 105e90eff46Smrg} 106e90eff46Smrg 107e90eff46Smrg# A tabulation character. 108e90eff46Smrgtab=' ' 109e90eff46Smrg# A newline character. 110e90eff46Smrgnl=' 111e90eff46Smrg' 112e90eff46Smrg# Character ranges might be problematic outside the C locale. 113e90eff46Smrg# These definitions help. 114e90eff46Smrgupper=ABCDEFGHIJKLMNOPQRSTUVWXYZ 115e90eff46Smrglower=abcdefghijklmnopqrstuvwxyz 116e90eff46Smrgdigits=0123456789 117e90eff46Smrgalpha=${upper}${lower} 118e90eff46Smrg 11967f05d30Smrgif test -z "$depmode" || test -z "$source" || test -z "$object"; then 12067f05d30Smrg echo "depcomp: Variables source, object and depmode must be set" 1>&2 12167f05d30Smrg exit 1 12267f05d30Smrgfi 12367f05d30Smrg 124fffe5102Smrg# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. 125fffe5102Smrgdepfile=${depfile-`echo "$object" | 126fffe5102Smrg sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} 12767f05d30Smrgtmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} 12867f05d30Smrg 12967f05d30Smrgrm -f "$tmpdepfile" 13067f05d30Smrg 131e90eff46Smrg# Avoid interferences from the environment. 132e90eff46Smrggccflag= dashmflag= 133e90eff46Smrg 13467f05d30Smrg# Some modes work just like other modes, but use different flags. We 13567f05d30Smrg# parameterize here, but still list the modes in the big case below, 13667f05d30Smrg# to make depend.m4 easier to write. Note that we *cannot* use a case 13767f05d30Smrg# here, because this file can only contain one case statement. 13867f05d30Smrgif test "$depmode" = hp; then 13967f05d30Smrg # HP compiler uses -M and no extra arg. 14067f05d30Smrg gccflag=-M 14167f05d30Smrg depmode=gcc 14267f05d30Smrgfi 14367f05d30Smrg 14467f05d30Smrgif test "$depmode" = dashXmstdout; then 145e90eff46Smrg # This is just like dashmstdout with a different argument. 146e90eff46Smrg dashmflag=-xM 147e90eff46Smrg depmode=dashmstdout 14867f05d30Smrgfi 14967f05d30Smrg 150fffe5102Smrgcygpath_u="cygpath -u -f -" 151fffe5102Smrgif test "$depmode" = msvcmsys; then 152e90eff46Smrg # This is just like msvisualcpp but w/o cygpath translation. 153e90eff46Smrg # Just convert the backslash-escaped backslashes to single forward 154e90eff46Smrg # slashes to satisfy depend.m4 155e90eff46Smrg cygpath_u='sed s,\\\\,/,g' 156e90eff46Smrg depmode=msvisualcpp 157fffe5102Smrgfi 158fffe5102Smrg 1596dbd43aaSmrgif test "$depmode" = msvc7msys; then 160e90eff46Smrg # This is just like msvc7 but w/o cygpath translation. 161e90eff46Smrg # Just convert the backslash-escaped backslashes to single forward 162e90eff46Smrg # slashes to satisfy depend.m4 163e90eff46Smrg cygpath_u='sed s,\\\\,/,g' 164e90eff46Smrg depmode=msvc7 165e90eff46Smrgfi 166e90eff46Smrg 167e90eff46Smrgif test "$depmode" = xlc; then 168e90eff46Smrg # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information. 169e90eff46Smrg gccflag=-qmakedep=gcc,-MF 170e90eff46Smrg depmode=gcc 1716dbd43aaSmrgfi 1726dbd43aaSmrg 17367f05d30Smrgcase "$depmode" in 17467f05d30Smrggcc3) 17567f05d30Smrg## gcc 3 implements dependency tracking that does exactly what 17667f05d30Smrg## we want. Yay! Note: for some reason libtool 1.4 doesn't like 17767f05d30Smrg## it if -MD -MP comes after the -MF stuff. Hmm. 178fffe5102Smrg## Unfortunately, FreeBSD c89 acceptance of flags depends upon 179fffe5102Smrg## the command line argument order; so add the flags where they 180fffe5102Smrg## appear in depend2.am. Note that the slowdown incurred here 181fffe5102Smrg## affects only configure: in makefiles, %FASTDEP% shortcuts this. 182fffe5102Smrg for arg 183fffe5102Smrg do 184fffe5102Smrg case $arg in 185fffe5102Smrg -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; 186fffe5102Smrg *) set fnord "$@" "$arg" ;; 187fffe5102Smrg esac 188fffe5102Smrg shift # fnord 189fffe5102Smrg shift # $arg 190fffe5102Smrg done 191fffe5102Smrg "$@" 19267f05d30Smrg stat=$? 193e90eff46Smrg if test $stat -ne 0; then 19467f05d30Smrg rm -f "$tmpdepfile" 19567f05d30Smrg exit $stat 19667f05d30Smrg fi 19767f05d30Smrg mv "$tmpdepfile" "$depfile" 19867f05d30Smrg ;; 19967f05d30Smrg 20067f05d30Smrggcc) 201e90eff46Smrg## Note that this doesn't just cater to obsosete pre-3.x GCC compilers. 202e90eff46Smrg## but also to in-use compilers like IMB xlc/xlC and the HP C compiler. 203e90eff46Smrg## (see the conditional assignment to $gccflag above). 20467f05d30Smrg## There are various ways to get dependency output from gcc. Here's 20567f05d30Smrg## why we pick this rather obscure method: 20667f05d30Smrg## - Don't want to use -MD because we'd like the dependencies to end 20767f05d30Smrg## up in a subdir. Having to rename by hand is ugly. 20867f05d30Smrg## (We might end up doing this anyway to support other compilers.) 20967f05d30Smrg## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like 210e90eff46Smrg## -MM, not -M (despite what the docs say). Also, it might not be 211e90eff46Smrg## supported by the other compilers which use the 'gcc' depmode. 21267f05d30Smrg## - Using -M directly means running the compiler twice (even worse 21367f05d30Smrg## than renaming). 21467f05d30Smrg if test -z "$gccflag"; then 21567f05d30Smrg gccflag=-MD, 21667f05d30Smrg fi 21767f05d30Smrg "$@" -Wp,"$gccflag$tmpdepfile" 21867f05d30Smrg stat=$? 219e90eff46Smrg if test $stat -ne 0; then 22067f05d30Smrg rm -f "$tmpdepfile" 22167f05d30Smrg exit $stat 22267f05d30Smrg fi 22367f05d30Smrg rm -f "$depfile" 22467f05d30Smrg echo "$object : \\" > "$depfile" 225e90eff46Smrg # The second -e expression handles DOS-style file names with drive 226e90eff46Smrg # letters. 22767f05d30Smrg sed -e 's/^[^:]*: / /' \ 22867f05d30Smrg -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" 229e90eff46Smrg## This next piece of magic avoids the "deleted header file" problem. 23067f05d30Smrg## The problem is that when a header file which appears in a .P file 23167f05d30Smrg## is deleted, the dependency causes make to die (because there is 23267f05d30Smrg## typically no way to rebuild the header). We avoid this by adding 23367f05d30Smrg## dummy dependencies for each header file. Too bad gcc doesn't do 23467f05d30Smrg## this for us directly. 235e90eff46Smrg## Some versions of gcc put a space before the ':'. On the theory 23667f05d30Smrg## that the space means something, we add a space to the output as 2376dbd43aaSmrg## well. hp depmode also adds that space, but also prefixes the VPATH 2386dbd43aaSmrg## to the object. Take care to not repeat it in the output. 23967f05d30Smrg## Some versions of the HPUX 10.20 sed can't process this invocation 24067f05d30Smrg## correctly. Breaking it into two sed invocations is a workaround. 241e90eff46Smrg tr ' ' "$nl" < "$tmpdepfile" \ 242e90eff46Smrg | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ 243e90eff46Smrg | sed -e 's/$/ :/' >> "$depfile" 24467f05d30Smrg rm -f "$tmpdepfile" 24567f05d30Smrg ;; 24667f05d30Smrg 24767f05d30Smrghp) 24867f05d30Smrg # This case exists only to let depend.m4 do its work. It works by 24967f05d30Smrg # looking at the text of this script. This case will never be run, 25067f05d30Smrg # since it is checked for above. 25167f05d30Smrg exit 1 25267f05d30Smrg ;; 25367f05d30Smrg 25467f05d30Smrgsgi) 25567f05d30Smrg if test "$libtool" = yes; then 25667f05d30Smrg "$@" "-Wp,-MDupdate,$tmpdepfile" 25767f05d30Smrg else 25867f05d30Smrg "$@" -MDupdate "$tmpdepfile" 25967f05d30Smrg fi 26067f05d30Smrg stat=$? 261e90eff46Smrg if test $stat -ne 0; then 26267f05d30Smrg rm -f "$tmpdepfile" 26367f05d30Smrg exit $stat 26467f05d30Smrg fi 26567f05d30Smrg rm -f "$depfile" 26667f05d30Smrg 26767f05d30Smrg if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files 26867f05d30Smrg echo "$object : \\" > "$depfile" 26967f05d30Smrg # Clip off the initial element (the dependent). Don't try to be 27067f05d30Smrg # clever and replace this with sed code, as IRIX sed won't handle 27167f05d30Smrg # lines with more than a fixed number of characters (4096 in 27267f05d30Smrg # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; 273e90eff46Smrg # the IRIX cc adds comments like '#:fec' to the end of the 27467f05d30Smrg # dependency line. 275e90eff46Smrg tr ' ' "$nl" < "$tmpdepfile" \ 276e90eff46Smrg | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \ 277e90eff46Smrg | tr "$nl" ' ' >> "$depfile" 278fffe5102Smrg echo >> "$depfile" 27967f05d30Smrg # The second pass generates a dummy entry for each header file. 280e90eff46Smrg tr ' ' "$nl" < "$tmpdepfile" \ 281e90eff46Smrg | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ 282e90eff46Smrg >> "$depfile" 28367f05d30Smrg else 284e90eff46Smrg make_dummy_depfile 28567f05d30Smrg fi 28667f05d30Smrg rm -f "$tmpdepfile" 28767f05d30Smrg ;; 28867f05d30Smrg 289e90eff46Smrgxlc) 290e90eff46Smrg # This case exists only to let depend.m4 do its work. It works by 291e90eff46Smrg # looking at the text of this script. This case will never be run, 292e90eff46Smrg # since it is checked for above. 293e90eff46Smrg exit 1 294e90eff46Smrg ;; 295e90eff46Smrg 29667f05d30Smrgaix) 29767f05d30Smrg # The C for AIX Compiler uses -M and outputs the dependencies 29867f05d30Smrg # in a .u file. In older versions, this file always lives in the 299e90eff46Smrg # current directory. Also, the AIX compiler puts '$object:' at the 30067f05d30Smrg # start of each line; $object doesn't have directory information. 30167f05d30Smrg # Version 6 uses the directory in both cases. 302e90eff46Smrg set_dir_from "$object" 303e90eff46Smrg set_base_from "$object" 30467f05d30Smrg if test "$libtool" = yes; then 305fffe5102Smrg tmpdepfile1=$dir$base.u 306fffe5102Smrg tmpdepfile2=$base.u 307fffe5102Smrg tmpdepfile3=$dir.libs/$base.u 30867f05d30Smrg "$@" -Wc,-M 30967f05d30Smrg else 310fffe5102Smrg tmpdepfile1=$dir$base.u 311fffe5102Smrg tmpdepfile2=$dir$base.u 312fffe5102Smrg tmpdepfile3=$dir$base.u 31367f05d30Smrg "$@" -M 31467f05d30Smrg fi 31567f05d30Smrg stat=$? 316e90eff46Smrg if test $stat -ne 0; then 317fffe5102Smrg rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 31867f05d30Smrg exit $stat 31967f05d30Smrg fi 32067f05d30Smrg 321fffe5102Smrg for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 322fffe5102Smrg do 323fffe5102Smrg test -f "$tmpdepfile" && break 324fffe5102Smrg done 325e90eff46Smrg aix_post_process_depfile 326e90eff46Smrg ;; 327e90eff46Smrg 328e90eff46Smrgtcc) 329e90eff46Smrg # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26 330e90eff46Smrg # FIXME: That version still under development at the moment of writing. 331e90eff46Smrg # Make that this statement remains true also for stable, released 332e90eff46Smrg # versions. 333e90eff46Smrg # It will wrap lines (doesn't matter whether long or short) with a 334e90eff46Smrg # trailing '\', as in: 335e90eff46Smrg # 336e90eff46Smrg # foo.o : \ 337e90eff46Smrg # foo.c \ 338e90eff46Smrg # foo.h \ 339e90eff46Smrg # 340e90eff46Smrg # It will put a trailing '\' even on the last line, and will use leading 341e90eff46Smrg # spaces rather than leading tabs (at least since its commit 0394caf7 342e90eff46Smrg # "Emit spaces for -MD"). 343e90eff46Smrg "$@" -MD -MF "$tmpdepfile" 344e90eff46Smrg stat=$? 345e90eff46Smrg if test $stat -ne 0; then 346e90eff46Smrg rm -f "$tmpdepfile" 347e90eff46Smrg exit $stat 34867f05d30Smrg fi 349e90eff46Smrg rm -f "$depfile" 350e90eff46Smrg # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'. 351e90eff46Smrg # We have to change lines of the first kind to '$object: \'. 352e90eff46Smrg sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile" 353e90eff46Smrg # And for each line of the second kind, we have to emit a 'dep.h:' 354e90eff46Smrg # dummy dependency, to avoid the deleted-header problem. 355e90eff46Smrg sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile" 35667f05d30Smrg rm -f "$tmpdepfile" 35767f05d30Smrg ;; 35867f05d30Smrg 359e90eff46Smrg## The order of this option in the case statement is important, since the 360e90eff46Smrg## shell code in configure will try each of these formats in the order 361e90eff46Smrg## listed in this file. A plain '-MD' option would be understood by many 362e90eff46Smrg## compilers, so we must ensure this comes after the gcc and icc options. 363e90eff46Smrgpgcc) 364e90eff46Smrg # Portland's C compiler understands '-MD'. 365e90eff46Smrg # Will always output deps to 'file.d' where file is the root name of the 366e90eff46Smrg # source file under compilation, even if file resides in a subdirectory. 367e90eff46Smrg # The object file name does not affect the name of the '.d' file. 368e90eff46Smrg # pgcc 10.2 will output 36967f05d30Smrg # foo.o: sub/foo.c sub/foo.h 370e90eff46Smrg # and will wrap long lines using '\' : 37167f05d30Smrg # foo.o: sub/foo.c ... \ 37267f05d30Smrg # sub/foo.h ... \ 37367f05d30Smrg # ... 374e90eff46Smrg set_dir_from "$object" 375e90eff46Smrg # Use the source, not the object, to determine the base name, since 376e90eff46Smrg # that's sadly what pgcc will do too. 377e90eff46Smrg set_base_from "$source" 378e90eff46Smrg tmpdepfile=$base.d 379e90eff46Smrg 380e90eff46Smrg # For projects that build the same source file twice into different object 381e90eff46Smrg # files, the pgcc approach of using the *source* file root name can cause 382e90eff46Smrg # problems in parallel builds. Use a locking strategy to avoid stomping on 383e90eff46Smrg # the same $tmpdepfile. 384e90eff46Smrg lockdir=$base.d-lock 385e90eff46Smrg trap " 386e90eff46Smrg echo '$0: caught signal, cleaning up...' >&2 387e90eff46Smrg rmdir '$lockdir' 388e90eff46Smrg exit 1 389e90eff46Smrg " 1 2 13 15 390e90eff46Smrg numtries=100 391e90eff46Smrg i=$numtries 392e90eff46Smrg while test $i -gt 0; do 393e90eff46Smrg # mkdir is a portable test-and-set. 394e90eff46Smrg if mkdir "$lockdir" 2>/dev/null; then 395e90eff46Smrg # This process acquired the lock. 396e90eff46Smrg "$@" -MD 397e90eff46Smrg stat=$? 398e90eff46Smrg # Release the lock. 399e90eff46Smrg rmdir "$lockdir" 400e90eff46Smrg break 401e90eff46Smrg else 402e90eff46Smrg # If the lock is being held by a different process, wait 403e90eff46Smrg # until the winning process is done or we timeout. 404e90eff46Smrg while test -d "$lockdir" && test $i -gt 0; do 405e90eff46Smrg sleep 1 406e90eff46Smrg i=`expr $i - 1` 407e90eff46Smrg done 408e90eff46Smrg fi 409e90eff46Smrg i=`expr $i - 1` 410e90eff46Smrg done 411e90eff46Smrg trap - 1 2 13 15 412e90eff46Smrg if test $i -le 0; then 413e90eff46Smrg echo "$0: failed to acquire lock after $numtries attempts" >&2 414e90eff46Smrg echo "$0: check lockdir '$lockdir'" >&2 415e90eff46Smrg exit 1 416e90eff46Smrg fi 41767f05d30Smrg 418e90eff46Smrg if test $stat -ne 0; then 41967f05d30Smrg rm -f "$tmpdepfile" 42067f05d30Smrg exit $stat 42167f05d30Smrg fi 42267f05d30Smrg rm -f "$depfile" 42367f05d30Smrg # Each line is of the form `foo.o: dependent.h', 42467f05d30Smrg # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. 42567f05d30Smrg # Do two passes, one to just change these to 42667f05d30Smrg # `$object: dependent.h' and one to simply `dependent.h:'. 42767f05d30Smrg sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" 42867f05d30Smrg # Some versions of the HPUX 10.20 sed can't process this invocation 42967f05d30Smrg # correctly. Breaking it into two sed invocations is a workaround. 430e90eff46Smrg sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \ 431e90eff46Smrg | sed -e 's/$/ :/' >> "$depfile" 43267f05d30Smrg rm -f "$tmpdepfile" 43367f05d30Smrg ;; 43467f05d30Smrg 435fffe5102Smrghp2) 436fffe5102Smrg # The "hp" stanza above does not work with aCC (C++) and HP's ia64 437fffe5102Smrg # compilers, which have integrated preprocessors. The correct option 438fffe5102Smrg # to use with these is +Maked; it writes dependencies to a file named 439fffe5102Smrg # 'foo.d', which lands next to the object file, wherever that 440fffe5102Smrg # happens to be. 441fffe5102Smrg # Much of this is similar to the tru64 case; see comments there. 442e90eff46Smrg set_dir_from "$object" 443e90eff46Smrg set_base_from "$object" 444fffe5102Smrg if test "$libtool" = yes; then 445fffe5102Smrg tmpdepfile1=$dir$base.d 446fffe5102Smrg tmpdepfile2=$dir.libs/$base.d 447fffe5102Smrg "$@" -Wc,+Maked 448fffe5102Smrg else 449fffe5102Smrg tmpdepfile1=$dir$base.d 450fffe5102Smrg tmpdepfile2=$dir$base.d 451fffe5102Smrg "$@" +Maked 452fffe5102Smrg fi 453fffe5102Smrg stat=$? 454e90eff46Smrg if test $stat -ne 0; then 455fffe5102Smrg rm -f "$tmpdepfile1" "$tmpdepfile2" 456fffe5102Smrg exit $stat 457fffe5102Smrg fi 458fffe5102Smrg 459fffe5102Smrg for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" 460fffe5102Smrg do 461fffe5102Smrg test -f "$tmpdepfile" && break 462fffe5102Smrg done 463fffe5102Smrg if test -f "$tmpdepfile"; then 464e90eff46Smrg sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile" 465e90eff46Smrg # Add 'dependent.h:' lines. 466fffe5102Smrg sed -ne '2,${ 467e90eff46Smrg s/^ *// 468e90eff46Smrg s/ \\*$// 469e90eff46Smrg s/$/:/ 470e90eff46Smrg p 471e90eff46Smrg }' "$tmpdepfile" >> "$depfile" 472fffe5102Smrg else 473e90eff46Smrg make_dummy_depfile 474fffe5102Smrg fi 475fffe5102Smrg rm -f "$tmpdepfile" "$tmpdepfile2" 476fffe5102Smrg ;; 477fffe5102Smrg 47867f05d30Smrgtru64) 479e90eff46Smrg # The Tru64 compiler uses -MD to generate dependencies as a side 480e90eff46Smrg # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. 481e90eff46Smrg # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put 482e90eff46Smrg # dependencies in 'foo.d' instead, so we check for that too. 483e90eff46Smrg # Subdirectories are respected. 484e90eff46Smrg set_dir_from "$object" 485e90eff46Smrg set_base_from "$object" 486e90eff46Smrg 487e90eff46Smrg if test "$libtool" = yes; then 488e90eff46Smrg # Libtool generates 2 separate objects for the 2 libraries. These 489e90eff46Smrg # two compilations output dependencies in $dir.libs/$base.o.d and 490e90eff46Smrg # in $dir$base.o.d. We have to check for both files, because 491e90eff46Smrg # one of the two compilations can be disabled. We should prefer 492e90eff46Smrg # $dir$base.o.d over $dir.libs/$base.o.d because the latter is 493e90eff46Smrg # automatically cleaned when .libs/ is deleted, while ignoring 494e90eff46Smrg # the former would cause a distcleancheck panic. 495e90eff46Smrg tmpdepfile1=$dir$base.o.d # libtool 1.5 496e90eff46Smrg tmpdepfile2=$dir.libs/$base.o.d # Likewise. 497e90eff46Smrg tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504 498e90eff46Smrg "$@" -Wc,-MD 499e90eff46Smrg else 500e90eff46Smrg tmpdepfile1=$dir$base.d 501e90eff46Smrg tmpdepfile2=$dir$base.d 502e90eff46Smrg tmpdepfile3=$dir$base.d 503e90eff46Smrg "$@" -MD 504e90eff46Smrg fi 505e90eff46Smrg 506e90eff46Smrg stat=$? 507e90eff46Smrg if test $stat -ne 0; then 508e90eff46Smrg rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 509e90eff46Smrg exit $stat 510e90eff46Smrg fi 511e90eff46Smrg 512e90eff46Smrg for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 513e90eff46Smrg do 514e90eff46Smrg test -f "$tmpdepfile" && break 515e90eff46Smrg done 516e90eff46Smrg # Same post-processing that is required for AIX mode. 517e90eff46Smrg aix_post_process_depfile 518e90eff46Smrg ;; 51967f05d30Smrg 5206dbd43aaSmrgmsvc7) 5216dbd43aaSmrg if test "$libtool" = yes; then 5226dbd43aaSmrg showIncludes=-Wc,-showIncludes 5236dbd43aaSmrg else 5246dbd43aaSmrg showIncludes=-showIncludes 5256dbd43aaSmrg fi 5266dbd43aaSmrg "$@" $showIncludes > "$tmpdepfile" 5276dbd43aaSmrg stat=$? 5286dbd43aaSmrg grep -v '^Note: including file: ' "$tmpdepfile" 529e90eff46Smrg if test $stat -ne 0; then 5306dbd43aaSmrg rm -f "$tmpdepfile" 5316dbd43aaSmrg exit $stat 5326dbd43aaSmrg fi 5336dbd43aaSmrg rm -f "$depfile" 5346dbd43aaSmrg echo "$object : \\" > "$depfile" 5356dbd43aaSmrg # The first sed program below extracts the file names and escapes 5366dbd43aaSmrg # backslashes for cygpath. The second sed program outputs the file 5376dbd43aaSmrg # name when reading, but also accumulates all include files in the 5386dbd43aaSmrg # hold buffer in order to output them again at the end. This only 5396dbd43aaSmrg # works with sed implementations that can handle large buffers. 5406dbd43aaSmrg sed < "$tmpdepfile" -n ' 5416dbd43aaSmrg/^Note: including file: *\(.*\)/ { 5426dbd43aaSmrg s//\1/ 5436dbd43aaSmrg s/\\/\\\\/g 5446dbd43aaSmrg p 5456dbd43aaSmrg}' | $cygpath_u | sort -u | sed -n ' 5466dbd43aaSmrgs/ /\\ /g 547e90eff46Smrgs/\(.*\)/'"$tab"'\1 \\/p 5486dbd43aaSmrgs/.\(.*\) \\/\1:/ 5496dbd43aaSmrgH 5506dbd43aaSmrg$ { 551e90eff46Smrg s/.*/'"$tab"'/ 5526dbd43aaSmrg G 5536dbd43aaSmrg p 5546dbd43aaSmrg}' >> "$depfile" 555e90eff46Smrg echo >> "$depfile" # make sure the fragment doesn't end with a backslash 5566dbd43aaSmrg rm -f "$tmpdepfile" 5576dbd43aaSmrg ;; 5586dbd43aaSmrg 5596dbd43aaSmrgmsvc7msys) 5606dbd43aaSmrg # This case exists only to let depend.m4 do its work. It works by 5616dbd43aaSmrg # looking at the text of this script. This case will never be run, 5626dbd43aaSmrg # since it is checked for above. 5636dbd43aaSmrg exit 1 5646dbd43aaSmrg ;; 5656dbd43aaSmrg 56667f05d30Smrg#nosideeffect) 56767f05d30Smrg # This comment above is used by automake to tell side-effect 56867f05d30Smrg # dependency tracking mechanisms from slower ones. 56967f05d30Smrg 57067f05d30Smrgdashmstdout) 57167f05d30Smrg # Important note: in order to support this mode, a compiler *must* 57267f05d30Smrg # always write the preprocessed file to stdout, regardless of -o. 57367f05d30Smrg "$@" || exit $? 57467f05d30Smrg 57567f05d30Smrg # Remove the call to Libtool. 57667f05d30Smrg if test "$libtool" = yes; then 577fffe5102Smrg while test "X$1" != 'X--mode=compile'; do 57867f05d30Smrg shift 57967f05d30Smrg done 58067f05d30Smrg shift 58167f05d30Smrg fi 58267f05d30Smrg 583e90eff46Smrg # Remove '-o $object'. 58467f05d30Smrg IFS=" " 58567f05d30Smrg for arg 58667f05d30Smrg do 58767f05d30Smrg case $arg in 58867f05d30Smrg -o) 58967f05d30Smrg shift 59067f05d30Smrg ;; 59167f05d30Smrg $object) 59267f05d30Smrg shift 59367f05d30Smrg ;; 59467f05d30Smrg *) 59567f05d30Smrg set fnord "$@" "$arg" 59667f05d30Smrg shift # fnord 59767f05d30Smrg shift # $arg 59867f05d30Smrg ;; 59967f05d30Smrg esac 60067f05d30Smrg done 60167f05d30Smrg 60267f05d30Smrg test -z "$dashmflag" && dashmflag=-M 603e90eff46Smrg # Require at least two characters before searching for ':' 60467f05d30Smrg # in the target name. This is to cope with DOS-style filenames: 605e90eff46Smrg # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. 60667f05d30Smrg "$@" $dashmflag | 607e90eff46Smrg sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile" 60867f05d30Smrg rm -f "$depfile" 60967f05d30Smrg cat < "$tmpdepfile" > "$depfile" 610e90eff46Smrg # Some versions of the HPUX 10.20 sed can't process this sed invocation 611e90eff46Smrg # correctly. Breaking it into two sed invocations is a workaround. 612e90eff46Smrg tr ' ' "$nl" < "$tmpdepfile" \ 613e90eff46Smrg | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ 614e90eff46Smrg | sed -e 's/$/ :/' >> "$depfile" 61567f05d30Smrg rm -f "$tmpdepfile" 61667f05d30Smrg ;; 61767f05d30Smrg 61867f05d30SmrgdashXmstdout) 61967f05d30Smrg # This case only exists to satisfy depend.m4. It is never actually 62067f05d30Smrg # run, as this mode is specially recognized in the preamble. 62167f05d30Smrg exit 1 62267f05d30Smrg ;; 62367f05d30Smrg 62467f05d30Smrgmakedepend) 62567f05d30Smrg "$@" || exit $? 62667f05d30Smrg # Remove any Libtool call 62767f05d30Smrg if test "$libtool" = yes; then 628fffe5102Smrg while test "X$1" != 'X--mode=compile'; do 62967f05d30Smrg shift 63067f05d30Smrg done 63167f05d30Smrg shift 63267f05d30Smrg fi 63367f05d30Smrg # X makedepend 63467f05d30Smrg shift 635fffe5102Smrg cleared=no eat=no 636fffe5102Smrg for arg 637fffe5102Smrg do 63867f05d30Smrg case $cleared in 63967f05d30Smrg no) 64067f05d30Smrg set ""; shift 64167f05d30Smrg cleared=yes ;; 64267f05d30Smrg esac 643fffe5102Smrg if test $eat = yes; then 644fffe5102Smrg eat=no 645fffe5102Smrg continue 646fffe5102Smrg fi 64767f05d30Smrg case "$arg" in 64867f05d30Smrg -D*|-I*) 64967f05d30Smrg set fnord "$@" "$arg"; shift ;; 65067f05d30Smrg # Strip any option that makedepend may not understand. Remove 65167f05d30Smrg # the object too, otherwise makedepend will parse it as a source file. 652fffe5102Smrg -arch) 653fffe5102Smrg eat=yes ;; 65467f05d30Smrg -*|$object) 65567f05d30Smrg ;; 65667f05d30Smrg *) 65767f05d30Smrg set fnord "$@" "$arg"; shift ;; 65867f05d30Smrg esac 65967f05d30Smrg done 660fffe5102Smrg obj_suffix=`echo "$object" | sed 's/^.*\././'` 66167f05d30Smrg touch "$tmpdepfile" 66267f05d30Smrg ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" 66367f05d30Smrg rm -f "$depfile" 6646dbd43aaSmrg # makedepend may prepend the VPATH from the source file name to the object. 6656dbd43aaSmrg # No need to regex-escape $object, excess matching of '.' is harmless. 6666dbd43aaSmrg sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" 667e90eff46Smrg # Some versions of the HPUX 10.20 sed can't process the last invocation 668e90eff46Smrg # correctly. Breaking it into two sed invocations is a workaround. 669e90eff46Smrg sed '1,2d' "$tmpdepfile" \ 670e90eff46Smrg | tr ' ' "$nl" \ 671e90eff46Smrg | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ 672e90eff46Smrg | sed -e 's/$/ :/' >> "$depfile" 67367f05d30Smrg rm -f "$tmpdepfile" "$tmpdepfile".bak 67467f05d30Smrg ;; 67567f05d30Smrg 67667f05d30Smrgcpp) 67767f05d30Smrg # Important note: in order to support this mode, a compiler *must* 67867f05d30Smrg # always write the preprocessed file to stdout. 67967f05d30Smrg "$@" || exit $? 68067f05d30Smrg 68167f05d30Smrg # Remove the call to Libtool. 68267f05d30Smrg if test "$libtool" = yes; then 683fffe5102Smrg while test "X$1" != 'X--mode=compile'; do 68467f05d30Smrg shift 68567f05d30Smrg done 68667f05d30Smrg shift 68767f05d30Smrg fi 68867f05d30Smrg 689e90eff46Smrg # Remove '-o $object'. 69067f05d30Smrg IFS=" " 69167f05d30Smrg for arg 69267f05d30Smrg do 69367f05d30Smrg case $arg in 69467f05d30Smrg -o) 69567f05d30Smrg shift 69667f05d30Smrg ;; 69767f05d30Smrg $object) 69867f05d30Smrg shift 69967f05d30Smrg ;; 70067f05d30Smrg *) 70167f05d30Smrg set fnord "$@" "$arg" 70267f05d30Smrg shift # fnord 70367f05d30Smrg shift # $arg 70467f05d30Smrg ;; 70567f05d30Smrg esac 70667f05d30Smrg done 70767f05d30Smrg 708e90eff46Smrg "$@" -E \ 709e90eff46Smrg | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ 710e90eff46Smrg -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ 711e90eff46Smrg | sed '$ s: \\$::' > "$tmpdepfile" 71267f05d30Smrg rm -f "$depfile" 71367f05d30Smrg echo "$object : \\" > "$depfile" 71467f05d30Smrg cat < "$tmpdepfile" >> "$depfile" 71567f05d30Smrg sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" 71667f05d30Smrg rm -f "$tmpdepfile" 71767f05d30Smrg ;; 71867f05d30Smrg 71967f05d30Smrgmsvisualcpp) 72067f05d30Smrg # Important note: in order to support this mode, a compiler *must* 721fffe5102Smrg # always write the preprocessed file to stdout. 72267f05d30Smrg "$@" || exit $? 723fffe5102Smrg 724fffe5102Smrg # Remove the call to Libtool. 725fffe5102Smrg if test "$libtool" = yes; then 726fffe5102Smrg while test "X$1" != 'X--mode=compile'; do 727fffe5102Smrg shift 728fffe5102Smrg done 729fffe5102Smrg shift 730fffe5102Smrg fi 731fffe5102Smrg 73267f05d30Smrg IFS=" " 73367f05d30Smrg for arg 73467f05d30Smrg do 73567f05d30Smrg case "$arg" in 736fffe5102Smrg -o) 737fffe5102Smrg shift 738fffe5102Smrg ;; 739fffe5102Smrg $object) 740fffe5102Smrg shift 741fffe5102Smrg ;; 74267f05d30Smrg "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") 743e90eff46Smrg set fnord "$@" 744e90eff46Smrg shift 745e90eff46Smrg shift 746e90eff46Smrg ;; 74767f05d30Smrg *) 748e90eff46Smrg set fnord "$@" "$arg" 749e90eff46Smrg shift 750e90eff46Smrg shift 751e90eff46Smrg ;; 75267f05d30Smrg esac 75367f05d30Smrg done 754fffe5102Smrg "$@" -E 2>/dev/null | 755fffe5102Smrg sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" 75667f05d30Smrg rm -f "$depfile" 75767f05d30Smrg echo "$object : \\" > "$depfile" 758e90eff46Smrg sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" 759e90eff46Smrg echo "$tab" >> "$depfile" 760fffe5102Smrg sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" 76167f05d30Smrg rm -f "$tmpdepfile" 76267f05d30Smrg ;; 76367f05d30Smrg 764fffe5102Smrgmsvcmsys) 765fffe5102Smrg # This case exists only to let depend.m4 do its work. It works by 766fffe5102Smrg # looking at the text of this script. This case will never be run, 767fffe5102Smrg # since it is checked for above. 768fffe5102Smrg exit 1 769fffe5102Smrg ;; 770fffe5102Smrg 77167f05d30Smrgnone) 77267f05d30Smrg exec "$@" 77367f05d30Smrg ;; 77467f05d30Smrg 77567f05d30Smrg*) 77667f05d30Smrg echo "Unknown depmode $depmode" 1>&2 77767f05d30Smrg exit 1 77867f05d30Smrg ;; 77967f05d30Smrgesac 78067f05d30Smrg 78167f05d30Smrgexit 0 782fffe5102Smrg 783fffe5102Smrg# Local Variables: 784fffe5102Smrg# mode: shell-script 785fffe5102Smrg# sh-indentation: 2 786051ceee6Smrg# eval: (add-hook 'before-save-hook 'time-stamp) 787fffe5102Smrg# time-stamp-start: "scriptversion=" 788fffe5102Smrg# time-stamp-format: "%:y-%02m-%02d.%02H" 789051ceee6Smrg# time-stamp-time-zone: "UTC0" 790fffe5102Smrg# time-stamp-end: "; # UTC" 791fffe5102Smrg# End: 792