197e8a2e8Smrg#! /bin/sh 297e8a2e8Smrg# depcomp - compile a program generating dependencies as side-effects 3d7accfefSmrg 4bbfad078Smrgscriptversion=2024-06-19.01; # UTC 5d7accfefSmrg 6bbfad078Smrg# Copyright (C) 1999-2024 Free Software Foundation, Inc. 797e8a2e8Smrg 897e8a2e8Smrg# This program is free software; you can redistribute it and/or modify 997e8a2e8Smrg# it under the terms of the GNU General Public License as published by 1097e8a2e8Smrg# the Free Software Foundation; either version 2, or (at your option) 1197e8a2e8Smrg# any later version. 1297e8a2e8Smrg 1397e8a2e8Smrg# This program is distributed in the hope that it will be useful, 1497e8a2e8Smrg# but WITHOUT ANY WARRANTY; without even the implied warranty of 1597e8a2e8Smrg# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1697e8a2e8Smrg# GNU General Public License for more details. 1797e8a2e8Smrg 1897e8a2e8Smrg# You should have received a copy of the GNU General Public License 19219ffec0Smrg# along with this program. If not, see <https://www.gnu.org/licenses/>. 2097e8a2e8Smrg 2197e8a2e8Smrg# As a special exception to the GNU General Public License, if you 2297e8a2e8Smrg# distribute this file as part of a program that contains a 2397e8a2e8Smrg# configuration script generated by Autoconf, you may include it under 2497e8a2e8Smrg# the same distribution terms that you use for the rest of that program. 2597e8a2e8Smrg 2697e8a2e8Smrg# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>. 2797e8a2e8Smrg 28d7accfefSmrgcase $1 in 29d7accfefSmrg '') 3068af480fSmrg echo "$0: No command. Try '$0 --help' for more information." 1>&2 3168af480fSmrg exit 1; 3268af480fSmrg ;; 33d7accfefSmrg -h | --h*) 34d7accfefSmrg cat <<\EOF 35d7accfefSmrgUsage: depcomp [--help] [--version] PROGRAM [ARGS] 36d7accfefSmrg 37d7accfefSmrgRun PROGRAMS ARGS to compile a file, generating dependencies 38d7accfefSmrgas side-effects. 39d7accfefSmrg 40d7accfefSmrgEnvironment variables: 41d7accfefSmrg depmode Dependency tracking mode. 4268af480fSmrg source Source file read by 'PROGRAMS ARGS'. 4368af480fSmrg object Object file output by 'PROGRAMS ARGS'. 44d7accfefSmrg DEPDIR directory where to store dependencies. 45d7accfefSmrg depfile Dependency file to output. 4668af480fSmrg tmpdepfile Temporary file to use when outputting dependencies. 47d7accfefSmrg libtool Whether libtool is used (yes/no). 48d7accfefSmrg 49d7accfefSmrgReport bugs to <bug-automake@gnu.org>. 50bbfad078SmrgGNU Automake home page: <https://www.gnu.org/software/automake/>. 51bbfad078SmrgGeneral help using GNU software: <https://www.gnu.org/gethelp/>. 52d7accfefSmrgEOF 53d7accfefSmrg exit $? 54d7accfefSmrg ;; 55d7accfefSmrg -v | --v*) 56bbfad078Smrg echo "depcomp (GNU Automake) $scriptversion" 57d7accfefSmrg exit $? 58d7accfefSmrg ;; 59d7accfefSmrgesac 60d7accfefSmrg 6168af480fSmrg# Get the directory component of the given path, and save it in the 6268af480fSmrg# global variables '$dir'. Note that this directory component will 6368af480fSmrg# be either empty or ending with a '/' character. This is deliberate. 6468af480fSmrgset_dir_from () 6568af480fSmrg{ 6668af480fSmrg case $1 in 6768af480fSmrg */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;; 6868af480fSmrg *) dir=;; 6968af480fSmrg esac 7068af480fSmrg} 7168af480fSmrg 7268af480fSmrg# Get the suffix-stripped basename of the given path, and save it the 7368af480fSmrg# global variable '$base'. 7468af480fSmrgset_base_from () 7568af480fSmrg{ 7668af480fSmrg base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'` 7768af480fSmrg} 7868af480fSmrg 7968af480fSmrg# If no dependency file was actually created by the compiler invocation, 8068af480fSmrg# we still have to create a dummy depfile, to avoid errors with the 8168af480fSmrg# Makefile "include basename.Plo" scheme. 8268af480fSmrgmake_dummy_depfile () 8368af480fSmrg{ 8468af480fSmrg echo "#dummy" > "$depfile" 8568af480fSmrg} 8668af480fSmrg 8768af480fSmrg# Factor out some common post-processing of the generated depfile. 8868af480fSmrg# Requires the auxiliary global variable '$tmpdepfile' to be set. 8968af480fSmrgaix_post_process_depfile () 9068af480fSmrg{ 9168af480fSmrg # If the compiler actually managed to produce a dependency file, 9268af480fSmrg # post-process it. 9368af480fSmrg if test -f "$tmpdepfile"; then 9468af480fSmrg # Each line is of the form 'foo.o: dependency.h'. 9568af480fSmrg # Do two passes, one to just change these to 9668af480fSmrg # $object: dependency.h 9768af480fSmrg # and one to simply output 9868af480fSmrg # dependency.h: 9968af480fSmrg # which is needed to avoid the deleted-header problem. 10068af480fSmrg { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile" 10168af480fSmrg sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile" 10268af480fSmrg } > "$depfile" 10368af480fSmrg rm -f "$tmpdepfile" 10468af480fSmrg else 10568af480fSmrg make_dummy_depfile 10668af480fSmrg fi 10768af480fSmrg} 10868af480fSmrg 10968af480fSmrg# A tabulation character. 11068af480fSmrgtab=' ' 11168af480fSmrg# A newline character. 11268af480fSmrgnl=' 11368af480fSmrg' 11468af480fSmrg# Character ranges might be problematic outside the C locale. 11568af480fSmrg# These definitions help. 11668af480fSmrgupper=ABCDEFGHIJKLMNOPQRSTUVWXYZ 11768af480fSmrglower=abcdefghijklmnopqrstuvwxyz 11868af480fSmrgalpha=${upper}${lower} 11968af480fSmrg 12097e8a2e8Smrgif test -z "$depmode" || test -z "$source" || test -z "$object"; then 12197e8a2e8Smrg echo "depcomp: Variables source, object and depmode must be set" 1>&2 12297e8a2e8Smrg exit 1 12397e8a2e8Smrgfi 12497e8a2e8Smrg 125d7accfefSmrg# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. 126d7accfefSmrgdepfile=${depfile-`echo "$object" | 127d7accfefSmrg sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} 12897e8a2e8Smrgtmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} 12997e8a2e8Smrg 13097e8a2e8Smrgrm -f "$tmpdepfile" 13197e8a2e8Smrg 132bbfad078Smrg# Avoid interference from the environment. 13368af480fSmrggccflag= dashmflag= 13468af480fSmrg 13597e8a2e8Smrg# Some modes work just like other modes, but use different flags. We 13697e8a2e8Smrg# parameterize here, but still list the modes in the big case below, 13797e8a2e8Smrg# to make depend.m4 easier to write. Note that we *cannot* use a case 13897e8a2e8Smrg# here, because this file can only contain one case statement. 13997e8a2e8Smrgif test "$depmode" = hp; then 14097e8a2e8Smrg # HP compiler uses -M and no extra arg. 14197e8a2e8Smrg gccflag=-M 14297e8a2e8Smrg depmode=gcc 14397e8a2e8Smrgfi 14497e8a2e8Smrg 14597e8a2e8Smrgif test "$depmode" = dashXmstdout; then 14668af480fSmrg # This is just like dashmstdout with a different argument. 14768af480fSmrg dashmflag=-xM 14868af480fSmrg depmode=dashmstdout 14997e8a2e8Smrgfi 15097e8a2e8Smrg 151d7accfefSmrgcygpath_u="cygpath -u -f -" 152d7accfefSmrgif test "$depmode" = msvcmsys; then 15368af480fSmrg # This is just like msvisualcpp but w/o cygpath translation. 15468af480fSmrg # Just convert the backslash-escaped backslashes to single forward 15568af480fSmrg # slashes to satisfy depend.m4 15668af480fSmrg cygpath_u='sed s,\\\\,/,g' 15768af480fSmrg depmode=msvisualcpp 15868af480fSmrgfi 15968af480fSmrg 16068af480fSmrgif test "$depmode" = msvc7msys; then 16168af480fSmrg # This is just like msvc7 but w/o cygpath translation. 16268af480fSmrg # Just convert the backslash-escaped backslashes to single forward 16368af480fSmrg # slashes to satisfy depend.m4 16468af480fSmrg cygpath_u='sed s,\\\\,/,g' 16568af480fSmrg depmode=msvc7 16668af480fSmrgfi 16768af480fSmrg 16868af480fSmrgif test "$depmode" = xlc; then 16968af480fSmrg # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information. 17068af480fSmrg gccflag=-qmakedep=gcc,-MF 17168af480fSmrg depmode=gcc 172d7accfefSmrgfi 173d7accfefSmrg 17497e8a2e8Smrgcase "$depmode" in 17597e8a2e8Smrggcc3) 17697e8a2e8Smrg## gcc 3 implements dependency tracking that does exactly what 17797e8a2e8Smrg## we want. Yay! Note: for some reason libtool 1.4 doesn't like 17897e8a2e8Smrg## it if -MD -MP comes after the -MF stuff. Hmm. 179d7accfefSmrg## Unfortunately, FreeBSD c89 acceptance of flags depends upon 180d7accfefSmrg## the command line argument order; so add the flags where they 181d7accfefSmrg## appear in depend2.am. Note that the slowdown incurred here 182d7accfefSmrg## affects only configure: in makefiles, %FASTDEP% shortcuts this. 183d7accfefSmrg for arg 184d7accfefSmrg do 185d7accfefSmrg case $arg in 186d7accfefSmrg -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; 187d7accfefSmrg *) set fnord "$@" "$arg" ;; 188d7accfefSmrg esac 189d7accfefSmrg shift # fnord 190d7accfefSmrg shift # $arg 191d7accfefSmrg done 192d7accfefSmrg "$@" 19397e8a2e8Smrg stat=$? 19468af480fSmrg if test $stat -ne 0; then 19597e8a2e8Smrg rm -f "$tmpdepfile" 19697e8a2e8Smrg exit $stat 19797e8a2e8Smrg fi 19897e8a2e8Smrg mv "$tmpdepfile" "$depfile" 19997e8a2e8Smrg ;; 20097e8a2e8Smrg 20197e8a2e8Smrggcc) 202bbfad078Smrg## Note that this doesn't just cater to obsolete pre-3.x GCC compilers. 203bbfad078Smrg## but also to in-use compilers like IBM xlc/xlC and the HP C compiler. 20468af480fSmrg## (see the conditional assignment to $gccflag above). 20597e8a2e8Smrg## There are various ways to get dependency output from gcc. Here's 20697e8a2e8Smrg## why we pick this rather obscure method: 20797e8a2e8Smrg## - Don't want to use -MD because we'd like the dependencies to end 20897e8a2e8Smrg## up in a subdir. Having to rename by hand is ugly. 20997e8a2e8Smrg## (We might end up doing this anyway to support other compilers.) 21097e8a2e8Smrg## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like 21168af480fSmrg## -MM, not -M (despite what the docs say). Also, it might not be 21268af480fSmrg## supported by the other compilers which use the 'gcc' depmode. 21397e8a2e8Smrg## - Using -M directly means running the compiler twice (even worse 21497e8a2e8Smrg## than renaming). 21597e8a2e8Smrg if test -z "$gccflag"; then 21697e8a2e8Smrg gccflag=-MD, 21797e8a2e8Smrg fi 21897e8a2e8Smrg "$@" -Wp,"$gccflag$tmpdepfile" 21997e8a2e8Smrg stat=$? 22068af480fSmrg if test $stat -ne 0; then 22197e8a2e8Smrg rm -f "$tmpdepfile" 22297e8a2e8Smrg exit $stat 22397e8a2e8Smrg fi 22497e8a2e8Smrg rm -f "$depfile" 22597e8a2e8Smrg echo "$object : \\" > "$depfile" 22668af480fSmrg # The second -e expression handles DOS-style file names with drive 22768af480fSmrg # letters. 22897e8a2e8Smrg sed -e 's/^[^:]*: / /' \ 22997e8a2e8Smrg -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" 23068af480fSmrg## This next piece of magic avoids the "deleted header file" problem. 23197e8a2e8Smrg## The problem is that when a header file which appears in a .P file 23297e8a2e8Smrg## is deleted, the dependency causes make to die (because there is 23397e8a2e8Smrg## typically no way to rebuild the header). We avoid this by adding 23497e8a2e8Smrg## dummy dependencies for each header file. Too bad gcc doesn't do 23597e8a2e8Smrg## this for us directly. 23668af480fSmrg## Some versions of gcc put a space before the ':'. On the theory 23797e8a2e8Smrg## that the space means something, we add a space to the output as 23868af480fSmrg## well. hp depmode also adds that space, but also prefixes the VPATH 23968af480fSmrg## to the object. Take care to not repeat it in the output. 24097e8a2e8Smrg## Some versions of the HPUX 10.20 sed can't process this invocation 24197e8a2e8Smrg## correctly. Breaking it into two sed invocations is a workaround. 24268af480fSmrg tr ' ' "$nl" < "$tmpdepfile" \ 24368af480fSmrg | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ 24468af480fSmrg | sed -e 's/$/ :/' >> "$depfile" 24597e8a2e8Smrg rm -f "$tmpdepfile" 24697e8a2e8Smrg ;; 24797e8a2e8Smrg 24897e8a2e8Smrghp) 24997e8a2e8Smrg # This case exists only to let depend.m4 do its work. It works by 25097e8a2e8Smrg # looking at the text of this script. This case will never be run, 25197e8a2e8Smrg # since it is checked for above. 25297e8a2e8Smrg exit 1 25397e8a2e8Smrg ;; 25497e8a2e8Smrg 25597e8a2e8Smrgsgi) 25697e8a2e8Smrg if test "$libtool" = yes; then 25797e8a2e8Smrg "$@" "-Wp,-MDupdate,$tmpdepfile" 25897e8a2e8Smrg else 25997e8a2e8Smrg "$@" -MDupdate "$tmpdepfile" 26097e8a2e8Smrg fi 26197e8a2e8Smrg stat=$? 26268af480fSmrg if test $stat -ne 0; then 26397e8a2e8Smrg rm -f "$tmpdepfile" 26497e8a2e8Smrg exit $stat 26597e8a2e8Smrg fi 26697e8a2e8Smrg rm -f "$depfile" 26797e8a2e8Smrg 26897e8a2e8Smrg if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files 26997e8a2e8Smrg echo "$object : \\" > "$depfile" 27097e8a2e8Smrg # Clip off the initial element (the dependent). Don't try to be 27197e8a2e8Smrg # clever and replace this with sed code, as IRIX sed won't handle 27297e8a2e8Smrg # lines with more than a fixed number of characters (4096 in 27397e8a2e8Smrg # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; 27468af480fSmrg # the IRIX cc adds comments like '#:fec' to the end of the 27597e8a2e8Smrg # dependency line. 27668af480fSmrg tr ' ' "$nl" < "$tmpdepfile" \ 27768af480fSmrg | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \ 27868af480fSmrg | tr "$nl" ' ' >> "$depfile" 279d7accfefSmrg echo >> "$depfile" 28097e8a2e8Smrg # The second pass generates a dummy entry for each header file. 28168af480fSmrg tr ' ' "$nl" < "$tmpdepfile" \ 28268af480fSmrg | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ 28368af480fSmrg >> "$depfile" 28497e8a2e8Smrg else 28568af480fSmrg make_dummy_depfile 28697e8a2e8Smrg fi 28797e8a2e8Smrg rm -f "$tmpdepfile" 28897e8a2e8Smrg ;; 28997e8a2e8Smrg 29068af480fSmrgxlc) 29168af480fSmrg # This case exists only to let depend.m4 do its work. It works by 29268af480fSmrg # looking at the text of this script. This case will never be run, 29368af480fSmrg # since it is checked for above. 29468af480fSmrg exit 1 29568af480fSmrg ;; 29668af480fSmrg 29797e8a2e8Smrgaix) 29897e8a2e8Smrg # The C for AIX Compiler uses -M and outputs the dependencies 29997e8a2e8Smrg # in a .u file. In older versions, this file always lives in the 30068af480fSmrg # current directory. Also, the AIX compiler puts '$object:' at the 30197e8a2e8Smrg # start of each line; $object doesn't have directory information. 30297e8a2e8Smrg # Version 6 uses the directory in both cases. 30368af480fSmrg set_dir_from "$object" 30468af480fSmrg set_base_from "$object" 30597e8a2e8Smrg if test "$libtool" = yes; then 306d7accfefSmrg tmpdepfile1=$dir$base.u 307d7accfefSmrg tmpdepfile2=$base.u 308d7accfefSmrg tmpdepfile3=$dir.libs/$base.u 30997e8a2e8Smrg "$@" -Wc,-M 31097e8a2e8Smrg else 311d7accfefSmrg tmpdepfile1=$dir$base.u 312d7accfefSmrg tmpdepfile2=$dir$base.u 313d7accfefSmrg tmpdepfile3=$dir$base.u 31497e8a2e8Smrg "$@" -M 31597e8a2e8Smrg fi 31697e8a2e8Smrg stat=$? 31768af480fSmrg if test $stat -ne 0; then 318d7accfefSmrg rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 31997e8a2e8Smrg exit $stat 32097e8a2e8Smrg fi 32197e8a2e8Smrg 322d7accfefSmrg for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 323d7accfefSmrg do 324d7accfefSmrg test -f "$tmpdepfile" && break 325d7accfefSmrg done 32668af480fSmrg aix_post_process_depfile 32768af480fSmrg ;; 32868af480fSmrg 32968af480fSmrgtcc) 33068af480fSmrg # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26 33168af480fSmrg # FIXME: That version still under development at the moment of writing. 33268af480fSmrg # Make that this statement remains true also for stable, released 33368af480fSmrg # versions. 33468af480fSmrg # It will wrap lines (doesn't matter whether long or short) with a 33568af480fSmrg # trailing '\', as in: 33668af480fSmrg # 33768af480fSmrg # foo.o : \ 33868af480fSmrg # foo.c \ 33968af480fSmrg # foo.h \ 34068af480fSmrg # 34168af480fSmrg # It will put a trailing '\' even on the last line, and will use leading 34268af480fSmrg # spaces rather than leading tabs (at least since its commit 0394caf7 34368af480fSmrg # "Emit spaces for -MD"). 34468af480fSmrg "$@" -MD -MF "$tmpdepfile" 34568af480fSmrg stat=$? 34668af480fSmrg if test $stat -ne 0; then 34768af480fSmrg rm -f "$tmpdepfile" 34868af480fSmrg exit $stat 34997e8a2e8Smrg fi 35068af480fSmrg rm -f "$depfile" 35168af480fSmrg # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'. 35268af480fSmrg # We have to change lines of the first kind to '$object: \'. 35368af480fSmrg sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile" 35468af480fSmrg # And for each line of the second kind, we have to emit a 'dep.h:' 35568af480fSmrg # dummy dependency, to avoid the deleted-header problem. 35668af480fSmrg sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile" 35797e8a2e8Smrg rm -f "$tmpdepfile" 35897e8a2e8Smrg ;; 35997e8a2e8Smrg 36068af480fSmrg## The order of this option in the case statement is important, since the 36168af480fSmrg## shell code in configure will try each of these formats in the order 36268af480fSmrg## listed in this file. A plain '-MD' option would be understood by many 36368af480fSmrg## compilers, so we must ensure this comes after the gcc and icc options. 36468af480fSmrgpgcc) 36568af480fSmrg # Portland's C compiler understands '-MD'. 36668af480fSmrg # Will always output deps to 'file.d' where file is the root name of the 36768af480fSmrg # source file under compilation, even if file resides in a subdirectory. 36868af480fSmrg # The object file name does not affect the name of the '.d' file. 36968af480fSmrg # pgcc 10.2 will output 37097e8a2e8Smrg # foo.o: sub/foo.c sub/foo.h 37168af480fSmrg # and will wrap long lines using '\' : 37297e8a2e8Smrg # foo.o: sub/foo.c ... \ 37397e8a2e8Smrg # sub/foo.h ... \ 37497e8a2e8Smrg # ... 37568af480fSmrg set_dir_from "$object" 37668af480fSmrg # Use the source, not the object, to determine the base name, since 37768af480fSmrg # that's sadly what pgcc will do too. 37868af480fSmrg set_base_from "$source" 37968af480fSmrg tmpdepfile=$base.d 38068af480fSmrg 38168af480fSmrg # For projects that build the same source file twice into different object 38268af480fSmrg # files, the pgcc approach of using the *source* file root name can cause 38368af480fSmrg # problems in parallel builds. Use a locking strategy to avoid stomping on 38468af480fSmrg # the same $tmpdepfile. 38568af480fSmrg lockdir=$base.d-lock 38668af480fSmrg trap " 38768af480fSmrg echo '$0: caught signal, cleaning up...' >&2 38868af480fSmrg rmdir '$lockdir' 38968af480fSmrg exit 1 39068af480fSmrg " 1 2 13 15 39168af480fSmrg numtries=100 39268af480fSmrg i=$numtries 39368af480fSmrg while test $i -gt 0; do 39468af480fSmrg # mkdir is a portable test-and-set. 39568af480fSmrg if mkdir "$lockdir" 2>/dev/null; then 39668af480fSmrg # This process acquired the lock. 39768af480fSmrg "$@" -MD 39868af480fSmrg stat=$? 39968af480fSmrg # Release the lock. 40068af480fSmrg rmdir "$lockdir" 40168af480fSmrg break 40268af480fSmrg else 40368af480fSmrg # If the lock is being held by a different process, wait 40468af480fSmrg # until the winning process is done or we timeout. 40568af480fSmrg while test -d "$lockdir" && test $i -gt 0; do 40668af480fSmrg sleep 1 40768af480fSmrg i=`expr $i - 1` 40868af480fSmrg done 40968af480fSmrg fi 41068af480fSmrg i=`expr $i - 1` 41168af480fSmrg done 41268af480fSmrg trap - 1 2 13 15 41368af480fSmrg if test $i -le 0; then 41468af480fSmrg echo "$0: failed to acquire lock after $numtries attempts" >&2 41568af480fSmrg echo "$0: check lockdir '$lockdir'" >&2 41668af480fSmrg exit 1 41768af480fSmrg fi 41897e8a2e8Smrg 41968af480fSmrg if test $stat -ne 0; then 42097e8a2e8Smrg rm -f "$tmpdepfile" 42197e8a2e8Smrg exit $stat 42297e8a2e8Smrg fi 42397e8a2e8Smrg rm -f "$depfile" 42497e8a2e8Smrg # Each line is of the form `foo.o: dependent.h', 42597e8a2e8Smrg # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. 42697e8a2e8Smrg # Do two passes, one to just change these to 42797e8a2e8Smrg # `$object: dependent.h' and one to simply `dependent.h:'. 42897e8a2e8Smrg sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" 42997e8a2e8Smrg # Some versions of the HPUX 10.20 sed can't process this invocation 43097e8a2e8Smrg # correctly. Breaking it into two sed invocations is a workaround. 43168af480fSmrg sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \ 43268af480fSmrg | sed -e 's/$/ :/' >> "$depfile" 43397e8a2e8Smrg rm -f "$tmpdepfile" 43497e8a2e8Smrg ;; 43597e8a2e8Smrg 436d7accfefSmrghp2) 437d7accfefSmrg # The "hp" stanza above does not work with aCC (C++) and HP's ia64 438d7accfefSmrg # compilers, which have integrated preprocessors. The correct option 439d7accfefSmrg # to use with these is +Maked; it writes dependencies to a file named 440d7accfefSmrg # 'foo.d', which lands next to the object file, wherever that 441d7accfefSmrg # happens to be. 442d7accfefSmrg # Much of this is similar to the tru64 case; see comments there. 44368af480fSmrg set_dir_from "$object" 44468af480fSmrg set_base_from "$object" 445d7accfefSmrg if test "$libtool" = yes; then 446d7accfefSmrg tmpdepfile1=$dir$base.d 447d7accfefSmrg tmpdepfile2=$dir.libs/$base.d 448d7accfefSmrg "$@" -Wc,+Maked 449d7accfefSmrg else 450d7accfefSmrg tmpdepfile1=$dir$base.d 451d7accfefSmrg tmpdepfile2=$dir$base.d 452d7accfefSmrg "$@" +Maked 453d7accfefSmrg fi 454d7accfefSmrg stat=$? 45568af480fSmrg if test $stat -ne 0; then 456d7accfefSmrg rm -f "$tmpdepfile1" "$tmpdepfile2" 457d7accfefSmrg exit $stat 458d7accfefSmrg fi 459d7accfefSmrg 460d7accfefSmrg for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" 461d7accfefSmrg do 462d7accfefSmrg test -f "$tmpdepfile" && break 463d7accfefSmrg done 464d7accfefSmrg if test -f "$tmpdepfile"; then 46568af480fSmrg sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile" 46668af480fSmrg # Add 'dependent.h:' lines. 467d7accfefSmrg sed -ne '2,${ 46868af480fSmrg s/^ *// 46968af480fSmrg s/ \\*$// 47068af480fSmrg s/$/:/ 47168af480fSmrg p 47268af480fSmrg }' "$tmpdepfile" >> "$depfile" 473d7accfefSmrg else 47468af480fSmrg make_dummy_depfile 475d7accfefSmrg fi 476d7accfefSmrg rm -f "$tmpdepfile" "$tmpdepfile2" 477d7accfefSmrg ;; 478d7accfefSmrg 47997e8a2e8Smrgtru64) 48068af480fSmrg # The Tru64 compiler uses -MD to generate dependencies as a side 48168af480fSmrg # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. 48268af480fSmrg # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put 48368af480fSmrg # dependencies in 'foo.d' instead, so we check for that too. 48468af480fSmrg # Subdirectories are respected. 48568af480fSmrg set_dir_from "$object" 48668af480fSmrg set_base_from "$object" 48768af480fSmrg 48868af480fSmrg if test "$libtool" = yes; then 48968af480fSmrg # Libtool generates 2 separate objects for the 2 libraries. These 49068af480fSmrg # two compilations output dependencies in $dir.libs/$base.o.d and 49168af480fSmrg # in $dir$base.o.d. We have to check for both files, because 49268af480fSmrg # one of the two compilations can be disabled. We should prefer 49368af480fSmrg # $dir$base.o.d over $dir.libs/$base.o.d because the latter is 49468af480fSmrg # automatically cleaned when .libs/ is deleted, while ignoring 49568af480fSmrg # the former would cause a distcleancheck panic. 49668af480fSmrg tmpdepfile1=$dir$base.o.d # libtool 1.5 49768af480fSmrg tmpdepfile2=$dir.libs/$base.o.d # Likewise. 49868af480fSmrg tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504 49968af480fSmrg "$@" -Wc,-MD 50068af480fSmrg else 50168af480fSmrg tmpdepfile1=$dir$base.d 50268af480fSmrg tmpdepfile2=$dir$base.d 50368af480fSmrg tmpdepfile3=$dir$base.d 50468af480fSmrg "$@" -MD 50568af480fSmrg fi 50668af480fSmrg 50768af480fSmrg stat=$? 50868af480fSmrg if test $stat -ne 0; then 50968af480fSmrg rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 51068af480fSmrg exit $stat 51168af480fSmrg fi 51268af480fSmrg 51368af480fSmrg for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 51468af480fSmrg do 51568af480fSmrg test -f "$tmpdepfile" && break 51668af480fSmrg done 51768af480fSmrg # Same post-processing that is required for AIX mode. 51868af480fSmrg aix_post_process_depfile 51968af480fSmrg ;; 52068af480fSmrg 52168af480fSmrgmsvc7) 52268af480fSmrg if test "$libtool" = yes; then 52368af480fSmrg showIncludes=-Wc,-showIncludes 52468af480fSmrg else 52568af480fSmrg showIncludes=-showIncludes 52668af480fSmrg fi 52768af480fSmrg "$@" $showIncludes > "$tmpdepfile" 52868af480fSmrg stat=$? 52968af480fSmrg grep -v '^Note: including file: ' "$tmpdepfile" 53068af480fSmrg if test $stat -ne 0; then 53168af480fSmrg rm -f "$tmpdepfile" 53268af480fSmrg exit $stat 53368af480fSmrg fi 53468af480fSmrg rm -f "$depfile" 53568af480fSmrg echo "$object : \\" > "$depfile" 53668af480fSmrg # The first sed program below extracts the file names and escapes 53768af480fSmrg # backslashes for cygpath. The second sed program outputs the file 53868af480fSmrg # name when reading, but also accumulates all include files in the 53968af480fSmrg # hold buffer in order to output them again at the end. This only 54068af480fSmrg # works with sed implementations that can handle large buffers. 54168af480fSmrg sed < "$tmpdepfile" -n ' 54268af480fSmrg/^Note: including file: *\(.*\)/ { 54368af480fSmrg s//\1/ 54468af480fSmrg s/\\/\\\\/g 54568af480fSmrg p 54668af480fSmrg}' | $cygpath_u | sort -u | sed -n ' 54768af480fSmrgs/ /\\ /g 54868af480fSmrgs/\(.*\)/'"$tab"'\1 \\/p 54968af480fSmrgs/.\(.*\) \\/\1:/ 55068af480fSmrgH 55168af480fSmrg$ { 55268af480fSmrg s/.*/'"$tab"'/ 55368af480fSmrg G 55468af480fSmrg p 55568af480fSmrg}' >> "$depfile" 55668af480fSmrg echo >> "$depfile" # make sure the fragment doesn't end with a backslash 55768af480fSmrg rm -f "$tmpdepfile" 55868af480fSmrg ;; 55968af480fSmrg 56068af480fSmrgmsvc7msys) 56168af480fSmrg # This case exists only to let depend.m4 do its work. It works by 56268af480fSmrg # looking at the text of this script. This case will never be run, 56368af480fSmrg # since it is checked for above. 56468af480fSmrg exit 1 56568af480fSmrg ;; 56697e8a2e8Smrg 56797e8a2e8Smrg#nosideeffect) 56897e8a2e8Smrg # This comment above is used by automake to tell side-effect 56997e8a2e8Smrg # dependency tracking mechanisms from slower ones. 57097e8a2e8Smrg 57197e8a2e8Smrgdashmstdout) 57297e8a2e8Smrg # Important note: in order to support this mode, a compiler *must* 57397e8a2e8Smrg # always write the preprocessed file to stdout, regardless of -o. 57497e8a2e8Smrg "$@" || exit $? 57597e8a2e8Smrg 57697e8a2e8Smrg # Remove the call to Libtool. 57797e8a2e8Smrg if test "$libtool" = yes; then 578d7accfefSmrg while test "X$1" != 'X--mode=compile'; do 57997e8a2e8Smrg shift 58097e8a2e8Smrg done 58197e8a2e8Smrg shift 58297e8a2e8Smrg fi 58397e8a2e8Smrg 58468af480fSmrg # Remove '-o $object'. 58597e8a2e8Smrg IFS=" " 58697e8a2e8Smrg for arg 58797e8a2e8Smrg do 58897e8a2e8Smrg case $arg in 58997e8a2e8Smrg -o) 59097e8a2e8Smrg shift 59197e8a2e8Smrg ;; 59297e8a2e8Smrg $object) 59397e8a2e8Smrg shift 59497e8a2e8Smrg ;; 59597e8a2e8Smrg *) 59697e8a2e8Smrg set fnord "$@" "$arg" 59797e8a2e8Smrg shift # fnord 59897e8a2e8Smrg shift # $arg 59997e8a2e8Smrg ;; 60097e8a2e8Smrg esac 60197e8a2e8Smrg done 60297e8a2e8Smrg 60397e8a2e8Smrg test -z "$dashmflag" && dashmflag=-M 60468af480fSmrg # Require at least two characters before searching for ':' 60597e8a2e8Smrg # in the target name. This is to cope with DOS-style filenames: 60668af480fSmrg # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. 60797e8a2e8Smrg "$@" $dashmflag | 60868af480fSmrg sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile" 60997e8a2e8Smrg rm -f "$depfile" 61097e8a2e8Smrg cat < "$tmpdepfile" > "$depfile" 61168af480fSmrg # Some versions of the HPUX 10.20 sed can't process this sed invocation 61268af480fSmrg # correctly. Breaking it into two sed invocations is a workaround. 61368af480fSmrg tr ' ' "$nl" < "$tmpdepfile" \ 61468af480fSmrg | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ 61568af480fSmrg | sed -e 's/$/ :/' >> "$depfile" 61697e8a2e8Smrg rm -f "$tmpdepfile" 61797e8a2e8Smrg ;; 61897e8a2e8Smrg 61997e8a2e8SmrgdashXmstdout) 62097e8a2e8Smrg # This case only exists to satisfy depend.m4. It is never actually 62197e8a2e8Smrg # run, as this mode is specially recognized in the preamble. 62297e8a2e8Smrg exit 1 62397e8a2e8Smrg ;; 62497e8a2e8Smrg 62597e8a2e8Smrgmakedepend) 62697e8a2e8Smrg "$@" || exit $? 62797e8a2e8Smrg # Remove any Libtool call 62897e8a2e8Smrg if test "$libtool" = yes; then 629d7accfefSmrg while test "X$1" != 'X--mode=compile'; do 63097e8a2e8Smrg shift 63197e8a2e8Smrg done 63297e8a2e8Smrg shift 63397e8a2e8Smrg fi 63497e8a2e8Smrg # X makedepend 63597e8a2e8Smrg shift 636d7accfefSmrg cleared=no eat=no 637d7accfefSmrg for arg 638d7accfefSmrg do 63997e8a2e8Smrg case $cleared in 64097e8a2e8Smrg no) 64197e8a2e8Smrg set ""; shift 64297e8a2e8Smrg cleared=yes ;; 64397e8a2e8Smrg esac 644d7accfefSmrg if test $eat = yes; then 645d7accfefSmrg eat=no 646d7accfefSmrg continue 647d7accfefSmrg fi 64897e8a2e8Smrg case "$arg" in 64997e8a2e8Smrg -D*|-I*) 65097e8a2e8Smrg set fnord "$@" "$arg"; shift ;; 65197e8a2e8Smrg # Strip any option that makedepend may not understand. Remove 65297e8a2e8Smrg # the object too, otherwise makedepend will parse it as a source file. 653d7accfefSmrg -arch) 654d7accfefSmrg eat=yes ;; 65597e8a2e8Smrg -*|$object) 65697e8a2e8Smrg ;; 65797e8a2e8Smrg *) 65897e8a2e8Smrg set fnord "$@" "$arg"; shift ;; 65997e8a2e8Smrg esac 66097e8a2e8Smrg done 661d7accfefSmrg obj_suffix=`echo "$object" | sed 's/^.*\././'` 66297e8a2e8Smrg touch "$tmpdepfile" 66397e8a2e8Smrg ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" 66497e8a2e8Smrg rm -f "$depfile" 66568af480fSmrg # makedepend may prepend the VPATH from the source file name to the object. 66668af480fSmrg # No need to regex-escape $object, excess matching of '.' is harmless. 66768af480fSmrg sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" 66868af480fSmrg # Some versions of the HPUX 10.20 sed can't process the last invocation 66968af480fSmrg # correctly. Breaking it into two sed invocations is a workaround. 67068af480fSmrg sed '1,2d' "$tmpdepfile" \ 67168af480fSmrg | tr ' ' "$nl" \ 67268af480fSmrg | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ 67368af480fSmrg | sed -e 's/$/ :/' >> "$depfile" 67497e8a2e8Smrg rm -f "$tmpdepfile" "$tmpdepfile".bak 67597e8a2e8Smrg ;; 67697e8a2e8Smrg 67797e8a2e8Smrgcpp) 67897e8a2e8Smrg # Important note: in order to support this mode, a compiler *must* 67997e8a2e8Smrg # always write the preprocessed file to stdout. 68097e8a2e8Smrg "$@" || exit $? 68197e8a2e8Smrg 68297e8a2e8Smrg # Remove the call to Libtool. 68397e8a2e8Smrg if test "$libtool" = yes; then 684d7accfefSmrg while test "X$1" != 'X--mode=compile'; do 68597e8a2e8Smrg shift 68697e8a2e8Smrg done 68797e8a2e8Smrg shift 68897e8a2e8Smrg fi 68997e8a2e8Smrg 69068af480fSmrg # Remove '-o $object'. 69197e8a2e8Smrg IFS=" " 69297e8a2e8Smrg for arg 69397e8a2e8Smrg do 69497e8a2e8Smrg case $arg in 69597e8a2e8Smrg -o) 69697e8a2e8Smrg shift 69797e8a2e8Smrg ;; 69897e8a2e8Smrg $object) 69997e8a2e8Smrg shift 70097e8a2e8Smrg ;; 70197e8a2e8Smrg *) 70297e8a2e8Smrg set fnord "$@" "$arg" 70397e8a2e8Smrg shift # fnord 70497e8a2e8Smrg shift # $arg 70597e8a2e8Smrg ;; 70697e8a2e8Smrg esac 70797e8a2e8Smrg done 70897e8a2e8Smrg 70968af480fSmrg "$@" -E \ 71068af480fSmrg | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ 71168af480fSmrg -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ 71268af480fSmrg | sed '$ s: \\$::' > "$tmpdepfile" 71397e8a2e8Smrg rm -f "$depfile" 71497e8a2e8Smrg echo "$object : \\" > "$depfile" 71597e8a2e8Smrg cat < "$tmpdepfile" >> "$depfile" 71697e8a2e8Smrg sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" 71797e8a2e8Smrg rm -f "$tmpdepfile" 71897e8a2e8Smrg ;; 71997e8a2e8Smrg 72097e8a2e8Smrgmsvisualcpp) 72197e8a2e8Smrg # Important note: in order to support this mode, a compiler *must* 722d7accfefSmrg # always write the preprocessed file to stdout. 72397e8a2e8Smrg "$@" || exit $? 724d7accfefSmrg 725d7accfefSmrg # Remove the call to Libtool. 726d7accfefSmrg if test "$libtool" = yes; then 727d7accfefSmrg while test "X$1" != 'X--mode=compile'; do 728d7accfefSmrg shift 729d7accfefSmrg done 730d7accfefSmrg shift 731d7accfefSmrg fi 732d7accfefSmrg 73397e8a2e8Smrg IFS=" " 73497e8a2e8Smrg for arg 73597e8a2e8Smrg do 73697e8a2e8Smrg case "$arg" in 737d7accfefSmrg -o) 738d7accfefSmrg shift 739d7accfefSmrg ;; 740d7accfefSmrg $object) 741d7accfefSmrg shift 742d7accfefSmrg ;; 74397e8a2e8Smrg "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") 74468af480fSmrg set fnord "$@" 74568af480fSmrg shift 74668af480fSmrg shift 74768af480fSmrg ;; 74897e8a2e8Smrg *) 74968af480fSmrg set fnord "$@" "$arg" 75068af480fSmrg shift 75168af480fSmrg shift 75268af480fSmrg ;; 75397e8a2e8Smrg esac 75497e8a2e8Smrg done 755d7accfefSmrg "$@" -E 2>/dev/null | 756d7accfefSmrg sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" 75797e8a2e8Smrg rm -f "$depfile" 75897e8a2e8Smrg echo "$object : \\" > "$depfile" 75968af480fSmrg sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" 76068af480fSmrg echo "$tab" >> "$depfile" 761d7accfefSmrg sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" 76297e8a2e8Smrg rm -f "$tmpdepfile" 76397e8a2e8Smrg ;; 76497e8a2e8Smrg 765d7accfefSmrgmsvcmsys) 766d7accfefSmrg # This case exists only to let depend.m4 do its work. It works by 767d7accfefSmrg # looking at the text of this script. This case will never be run, 768d7accfefSmrg # since it is checked for above. 769d7accfefSmrg exit 1 770d7accfefSmrg ;; 771d7accfefSmrg 77297e8a2e8Smrgnone) 77397e8a2e8Smrg exec "$@" 77497e8a2e8Smrg ;; 77597e8a2e8Smrg 77697e8a2e8Smrg*) 77797e8a2e8Smrg echo "Unknown depmode $depmode" 1>&2 77897e8a2e8Smrg exit 1 77997e8a2e8Smrg ;; 78097e8a2e8Smrgesac 78197e8a2e8Smrg 78297e8a2e8Smrgexit 0 783d7accfefSmrg 784d7accfefSmrg# Local Variables: 785d7accfefSmrg# mode: shell-script 786d7accfefSmrg# sh-indentation: 2 787219ffec0Smrg# eval: (add-hook 'before-save-hook 'time-stamp) 788d7accfefSmrg# time-stamp-start: "scriptversion=" 789d7accfefSmrg# time-stamp-format: "%:y-%02m-%02d.%02H" 790219ffec0Smrg# time-stamp-time-zone: "UTC0" 791d7accfefSmrg# time-stamp-end: "; # UTC" 792d7accfefSmrg# End: 793